# ...
class EComSDK:
    # ...
    def list_products(self, store_id, sort_by=ProductSort.PRICE, sort_order=ProductSortOrder.ASC):
        try:
            r = requests.get(
                self.api_url + f"/store/{store_id}/product",
                headers={"X-API-KEY": self.api_key},
                params={"sort_by": sort_by, "sort_order": sort_order},
                timeout=HTTP_TIMEOUT_SECONDS,
            )
            r.raise_for_status()
        except requests.exceptions.ConnectionError as err:
            raise ValueError("Connection error, check `EComSDK.api_url` is set correctly") from err
        except requests.exceptions.HTTPError as err:
            if err.response.status_code == 403:
                raise ValueError("Authentication error, check `EComSDK.api_key` is set correctly") from err
            else:
                raise

        return r.json()
```

The `list_products()` function accepts named parameters `sort_by` and `sort_order`. If the `list_products()` function is called with named parameters, the parameters are added to the `params` dictionary to be included in the request's HTTP query parameters.

An SDK user can call the `list_products()` function with the string `list_products(sort_by="quantity")` or with the safer equivalent using Enums: `list_products(sort_by=sdk.ProductSort.QUANTITY)`. By encouraging the user to use Enums in this way, we prevent HTTP error requests that don't clearly identify what went wrong should a user mistype a string, for example, "prise" instead of "price".

Now add another test at the bottom of the `test_sdk.py` file:

```python filename="tests/test_sdk.py"