From aa1cb718c177aa1200e705f978ad461027467bc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=BCller?= Date: Sat, 9 Nov 2024 14:34:09 +0100 Subject: [PATCH] Add tests for software upload edge cases --- tests/api/v1/software/software-header-2.swu | Bin 0 -> 12000 bytes tests/api/v1/software/test_routes.py | 78 ++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 tests/api/v1/software/software-header-2.swu diff --git a/tests/api/v1/software/software-header-2.swu b/tests/api/v1/software/software-header-2.swu new file mode 100644 index 0000000000000000000000000000000000000000..4fa6112b44ce91e24d49df689447ff04d09e180c GIT binary patch literal 12000 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 OFsq15a-SLrru;84GXvfL literal 0 HcmV?d00001 diff --git a/tests/api/v1/software/test_routes.py b/tests/api/v1/software/test_routes.py index 5eb686e8..41bcbbc1 100644 --- a/tests/api/v1/software/test_routes.py +++ b/tests/api/v1/software/test_routes.py @@ -1,6 +1,8 @@ import pytest from anyio import Path, open_file +from goosebit.db.models import Rollout + @pytest.mark.asyncio async def test_create_software_local(async_client, test_data): @@ -16,6 +18,21 @@ async def test_create_software_local(async_client, test_data): assert software["id"] == 4 +@pytest.mark.asyncio +async def test_create_software_local_twice(async_client, test_data): + resolved = await Path(__file__).resolve() + path = resolved.parent / "software-header.swu" + with open(path, "rb") as file: + files = {"file": file} + response = await async_client.post(f"/api/v1/software", files=files) + assert response.status_code == 200 + + with open(path, "rb") as file: + files = {"file": file} + response = await async_client.post(f"/api/v1/software", files=files) + assert response.status_code == 409 + + @pytest.mark.asyncio async def test_create_software_remote(async_client, httpserver, test_data): resolved = await Path(__file__).resolve() @@ -31,3 +48,64 @@ async def test_create_software_remote(async_client, httpserver, test_data): assert response.status_code == 200 software = response.json() assert software["id"] == 4 + + +@pytest.mark.asyncio +async def test_create_software_remote_twice_same_content_different_url(async_client, httpserver, test_data): + response = await _upload_software(async_client, httpserver, "software-header.swu", "/software-header.swu") + assert response.status_code == 200 + + response = await _upload_software(async_client, httpserver, "software-header.swu", "/software-header-2.swu") + assert response.status_code == 409 + + +@pytest.mark.asyncio +async def test_create_software_remote_twice_different_content_different_url(async_client, httpserver, test_data): + response = await _upload_software(async_client, httpserver, "software-header.swu", "/software-header.swu") + assert response.status_code == 200 + software = response.json() + software_id = software["id"] + + response = await _upload_software(async_client, httpserver, "software-header-2.swu", "/software-header-2.swu") + assert response.status_code == 200 + software = response.json() + assert software_id != software["id"], "added second software" + + +@pytest.mark.asyncio +async def test_create_software_remote_twice_different_content_same_url(async_client, httpserver, test_data): + response = await _upload_software(async_client, httpserver, "software-header.swu", "/software-header.swu") + assert response.status_code == 200 + software = response.json() + software_id = software["id"] + + response = await _upload_software(async_client, httpserver, "software-header-2.swu", "/software-header.swu") + assert response.status_code == 200 + software = response.json() + assert software_id != software["id"], "added second software" + + +@pytest.mark.asyncio +async def test_create_software_remote_twice_different_content_same_url_referenced_by_rollout( + async_client, httpserver, test_data +): + response = await _upload_software(async_client, httpserver, "software-header.swu", "/software-header.swu") + assert response.status_code == 200 + software = response.json() + software_id = software["id"] + + await Rollout.create(name=f"Test rollout", software_id=software_id) + + response = await _upload_software(async_client, httpserver, "software-header-2.swu", "/software-header.swu") + assert response.status_code == 409 + + +async def _upload_software(async_client, httpserver, software_file, download_url): + resolved = await Path(__file__).resolve() + path = resolved.parent / software_file + with open(path, "rb") as file: + byte_array = file.read() + httpserver.expect_request(download_url).respond_with_data(byte_array) + software_url = httpserver.url_for(download_url) + response = await async_client.post(f"/api/v1/software", data={"url": software_url}) + return response