diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index c5ba3a66..3cc891ec 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -36,12 +36,12 @@ jobs: - name: "Run validation & test" run: make check-all -# - name: "Run E2E test" -# run: make e2e args="--reportportal --rp-launch=$RP_LAUNCH --rp-api-key=$RP_API_KEY --rp-endpoint=$RP_ENDPOINT" -# env: -# RP_LAUNCH: github-e2e-${{ github.event_name }}-${{ github.event.pull_request.number || github.run_number }} -# RP_ENDPOINT: ${{ secrets.RP_ENDPOINT }} -# RP_API_KEY: ${{ secrets.RP_API_KEY }} + - name: "Run E2E test" + run: make e2e args="--reportportal --rp-launch=$RP_LAUNCH --rp-api-key=$RP_API_KEY --rp-endpoint=$RP_ENDPOINT" + env: + RP_LAUNCH: github-e2e-${{ github.event_name }}-${{ github.event.pull_request.number || github.run_number }} + RP_ENDPOINT: ${{ secrets.RP_ENDPOINT }} + RP_API_KEY: ${{ secrets.RP_API_KEY }} - name: "Run SonarCloud Scan" uses: SonarSource/sonarqube-scan-action@master diff --git a/mpt_api_client/http/async_client.py b/mpt_api_client/http/async_client.py index 71be9dcc..128439ca 100644 --- a/mpt_api_client/http/async_client.py +++ b/mpt_api_client/http/async_client.py @@ -27,7 +27,7 @@ def __init__( *, base_url: str | None = None, api_token: str | None = None, - timeout: float = 10.0, + timeout: float = 20.0, retries: int = 5, ): api_token = api_token or os.getenv("MPT_TOKEN") diff --git a/mpt_api_client/http/client.py b/mpt_api_client/http/client.py index f244b689..29bd2566 100644 --- a/mpt_api_client/http/client.py +++ b/mpt_api_client/http/client.py @@ -40,7 +40,7 @@ def __init__( *, base_url: str | None = None, api_token: str | None = None, - timeout: float = 10.0, + timeout: float = 20.0, retries: int = 5, ): api_token = api_token or os.getenv("MPT_TOKEN") diff --git a/prod.Dockerfile b/prod.Dockerfile deleted file mode 100644 index 4166009a..00000000 --- a/prod.Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim - -COPY . /mpt_api_client -WORKDIR /mpt_api_client - -RUN uv venv /opt/venv - -ENV VIRTUAL_ENV=/opt/venv -ENV PATH=/opt/venv/bin:$PATH - -RUN uv sync --frozen --no-cache --all-groups --active - -CMD ["bash"] diff --git a/tests/e2e/catalog/price_lists/conftest.py b/tests/e2e/catalog/price_lists/conftest.py index cb2a7207..4ee95df4 100644 --- a/tests/e2e/catalog/price_lists/conftest.py +++ b/tests/e2e/catalog/price_lists/conftest.py @@ -26,5 +26,5 @@ def created_price_list(price_lists_service, price_list_data): @pytest.fixture -def price_list_id(created_price_list): - return created_price_list.id +def price_list_id(e2e_config): + return e2e_config["catalog.price_list.id"] diff --git a/tests/e2e/catalog/price_lists/items/conftest.py b/tests/e2e/catalog/price_lists/items/conftest.py index effaa340..fd27684e 100644 --- a/tests/e2e/catalog/price_lists/items/conftest.py +++ b/tests/e2e/catalog/price_lists/items/conftest.py @@ -1,5 +1,7 @@ import pytest +from mpt_api_client import RQLQuery + @pytest.fixture def price_list_items_service(mpt_ops, price_list_id): @@ -21,6 +23,10 @@ def price_list_item_data(short_uuid): @pytest.fixture -def price_list_item(price_list_items_service): - price_list_items = price_list_items_service.fetch_page(1) - return price_list_items[0] +def price_list_item(price_list_items_service, item_id): + return next(price_list_items_service.filter(RQLQuery(item__id=item_id)).iterate()) + + +@pytest.fixture +def price_list_item_id(price_list_item): + return price_list_item.id diff --git a/tests/e2e/catalog/price_lists/items/test_async_price_list_items.py b/tests/e2e/catalog/price_lists/items/test_async_price_list_items.py index 051f8f85..48cfb454 100644 --- a/tests/e2e/catalog/price_lists/items/test_async_price_list_items.py +++ b/tests/e2e/catalog/price_lists/items/test_async_price_list_items.py @@ -8,22 +8,22 @@ pytestmark = [pytest.mark.flaky] -async def test_get_price_list_item(async_price_list_items_service, price_list_item): - result = await async_price_list_items_service.get(price_list_item.id) +async def test_get_price_list_item(async_price_list_items_service, price_list_item_id): + result = await async_price_list_items_service.get(price_list_item_id) - assert result.id == price_list_item.id + assert result.id == price_list_item_id -async def test_filter_price_list_items(async_price_list_items_service, price_list_item): +async def test_filter_price_list_items(async_price_list_items_service, price_list_item_id): await assert_async_service_filter_with_iterate( - async_price_list_items_service, price_list_item.id, ["-notes"] + async_price_list_items_service, price_list_item_id, ["-notes"] ) # act async def test_update_price_list_item( - async_price_list_items_service, price_list_item, price_list_item_data + async_price_list_items_service, price_list_item_id, price_list_item_data ): - result = await async_price_list_items_service.update(price_list_item.id, price_list_item_data) + result = await async_price_list_items_service.update(price_list_item_id, price_list_item_data) assert result.reason_for_change == price_list_item_data["reasonForChange"] @@ -35,8 +35,10 @@ async def test_get_price_list_item_not_found(async_price_list_items_service): await async_price_list_items_service.get(bogus_id) -async def test_create_price_list_item_invalid_data(async_price_list_items_service, price_list_item): - invalid_data = {"unitPP": "0"} +async def test_update_price_list_item_invalid_data( + async_price_list_items_service, price_list_item_id +): + invalid_data = {"unitPP": "NaN"} with pytest.raises(MPTAPIError, match=r"400 Bad Request"): - await async_price_list_items_service.update(price_list_item.id, invalid_data) + await async_price_list_items_service.update(price_list_item_id, invalid_data) diff --git a/tests/e2e/catalog/price_lists/items/test_sync_price_list_items.py b/tests/e2e/catalog/price_lists/items/test_sync_price_list_items.py index e1a7601d..02383b79 100644 --- a/tests/e2e/catalog/price_lists/items/test_sync_price_list_items.py +++ b/tests/e2e/catalog/price_lists/items/test_sync_price_list_items.py @@ -8,20 +8,20 @@ pytestmark = [pytest.mark.flaky] -def test_get_price_list_item(price_list_items_service, price_list_item): - result = price_list_items_service.get(price_list_item.id) +def test_get_price_list_item(price_list_items_service, price_list_item_id): + result = price_list_items_service.get(price_list_item_id) - assert result.id == price_list_item.id + assert result.id == price_list_item_id -def test_filter_price_list_items(price_list_items_service, price_list_item): +def test_filter_price_list_items(price_list_items_service, price_list_item_id): assert_service_filter_with_iterate( - price_list_items_service, price_list_item.id, ["-notes"] + price_list_items_service, price_list_item_id, ["-notes"] ) # act -def test_update_price_list_item(price_list_items_service, price_list_item, price_list_item_data): - result = price_list_items_service.update(price_list_item.id, price_list_item_data) +def test_update_price_list_item(price_list_items_service, price_list_item_id, price_list_item_data): + result = price_list_items_service.update(price_list_item_id, price_list_item_data) assert result.reason_for_change == price_list_item_data["reasonForChange"] @@ -33,8 +33,8 @@ def test_get_price_list_item_not_found(price_list_items_service): price_list_items_service.get(bogus_id) -def test_create_price_list_item_invalid_data(price_list_items_service, price_list_item): - invalid_data = {"unitPP": "0"} +def test_update_price_list_item_invalid_data(price_list_items_service, price_list_item_id): + invalid_data = {"unitPP": "NaN"} with pytest.raises(MPTAPIError, match=r"400 Bad Request"): - price_list_items_service.update(price_list_item.id, invalid_data) + price_list_items_service.update(price_list_item_id, invalid_data) diff --git a/tests/e2e/catalog/price_lists/test_async_price_lists.py b/tests/e2e/catalog/price_lists/test_async_price_lists.py index c2218eb3..d3deaccb 100644 --- a/tests/e2e/catalog/price_lists/test_async_price_lists.py +++ b/tests/e2e/catalog/price_lists/test_async_price_lists.py @@ -29,28 +29,22 @@ def test_create_price_list(async_created_price_list, product_id): assert result.product.id == product_id -async def test_get_price_list(async_price_lists_service, async_created_price_list): - result = await async_price_lists_service.get(async_created_price_list.id) - - assert result.id == async_created_price_list.id - - -async def test_get_price_list_by_id(async_price_lists_service, price_list_id): +async def test_get_price_list(async_price_lists_service, price_list_id): result = await async_price_lists_service.get(price_list_id) assert result.id == price_list_id -async def test_filter_price_lists(async_price_lists_service, async_created_price_list): +async def test_filter_price_lists(async_price_lists_service, price_list_id): await assert_async_service_filter_with_iterate( - async_price_lists_service, async_created_price_list.id, ["-product"] + async_price_lists_service, price_list_id, ["-product"] ) # act -async def test_update_price_list(async_price_lists_service, async_created_price_list, short_uuid): +async def test_update_price_list(async_price_lists_service, price_list_id, short_uuid): await assert_async_update_resource( async_price_lists_service, - async_created_price_list.id, + price_list_id, "notes", f"Updated notes {short_uuid}", ) # act diff --git a/tests/e2e/catalog/price_lists/test_sync_price_lists.py b/tests/e2e/catalog/price_lists/test_sync_price_lists.py index b404a625..d1714765 100644 --- a/tests/e2e/catalog/price_lists/test_sync_price_lists.py +++ b/tests/e2e/catalog/price_lists/test_sync_price_lists.py @@ -15,10 +15,10 @@ def test_create_price_list(created_price_list, product_id): assert result.product.id == product_id -def test_get_price_list(price_lists_service, created_price_list): - result = price_lists_service.get(created_price_list.id) +def test_get_price_list(price_lists_service, price_list_id): + result = price_lists_service.get(price_list_id) - assert result.id == created_price_list.id + assert result.id == price_list_id def test_get_price_list_by_id(price_lists_service, price_list_id): @@ -27,23 +27,21 @@ def test_get_price_list_by_id(price_lists_service, price_list_id): assert result.id == price_list_id -def test_iterate_price_lists(price_lists_service, created_price_list): +def test_iterate_price_lists(price_lists_service, price_list_id): price_lists = list(price_lists_service.iterate()) - result = any(price_list.id == created_price_list.id for price_list in price_lists) + result = any(price_list.id == price_list_id for price_list in price_lists) assert result is True -def test_filter_price_lists(price_lists_service, created_price_list): - assert_service_filter_with_iterate( - price_lists_service, created_price_list.id, ["-product"] - ) # act +def test_filter_price_lists(price_lists_service, price_list_id): + assert_service_filter_with_iterate(price_lists_service, price_list_id, ["-product"]) # act -def test_update_price_list(price_lists_service, created_price_list, short_uuid): +def test_update_price_list(price_lists_service, price_list_id, short_uuid): assert_update_resource( - price_lists_service, created_price_list.id, "notes", f"Updated notes {short_uuid}" + price_lists_service, price_list_id, "notes", f"Updated notes {short_uuid}" ) # act diff --git a/tests/e2e/conftest.py b/tests/e2e/conftest.py index e073a477..50373cf9 100644 --- a/tests/e2e/conftest.py +++ b/tests/e2e/conftest.py @@ -108,8 +108,8 @@ def uuid_str(): @pytest.fixture -def logo_fd(): - file_path = pathlib.Path("tests/data/logo.png").resolve() +def logo_fd(project_root_path): + file_path = project_root_path / "tests/data/logo.png" return file_path.open("rb") diff --git a/tests/unit/http/test_async_client.py b/tests/unit/http/test_async_client.py index b578c89d..db51c35e 100644 --- a/tests/unit/http/test_async_client.py +++ b/tests/unit/http/test_async_client.py @@ -32,7 +32,7 @@ def test_async_http_initialization(mocker): "User-Agent": "swo-marketplace-client/1.0", "Authorization": "Bearer test-token", }, - timeout=10.0, + timeout=20.0, transport=mocker.ANY, ) @@ -51,7 +51,7 @@ def test_async_env_initialization(monkeypatch, mocker): "User-Agent": "swo-marketplace-client/1.0", "Authorization": f"Bearer {API_TOKEN}", }, - timeout=10.0, + timeout=20.0, transport=mocker.ANY, ) diff --git a/tests/unit/http/test_client.py b/tests/unit/http/test_client.py index 23b0c1ac..02b9f632 100644 --- a/tests/unit/http/test_client.py +++ b/tests/unit/http/test_client.py @@ -22,7 +22,7 @@ def test_http_initialization(mocker): "User-Agent": "swo-marketplace-client/1.0", "Authorization": "Bearer test-token", }, - timeout=10.0, + timeout=20.0, transport=mocker.ANY, ) @@ -41,7 +41,7 @@ def test_env_initialization(monkeypatch, mocker): "User-Agent": "swo-marketplace-client/1.0", "Authorization": f"Bearer {API_TOKEN}", }, - timeout=10.0, + timeout=20.0, transport=mocker.ANY, )