Skip to content

Commit aa1cb71

Browse files
committed
Add tests for software upload edge cases
1 parent b1d856d commit aa1cb71

File tree

2 files changed

+78
-0
lines changed

2 files changed

+78
-0
lines changed
11.7 KB
Binary file not shown.

tests/api/v1/software/test_routes.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import pytest
22
from anyio import Path, open_file
33

4+
from goosebit.db.models import Rollout
5+
46

57
@pytest.mark.asyncio
68
async def test_create_software_local(async_client, test_data):
@@ -16,6 +18,21 @@ async def test_create_software_local(async_client, test_data):
1618
assert software["id"] == 4
1719

1820

21+
@pytest.mark.asyncio
22+
async def test_create_software_local_twice(async_client, test_data):
23+
resolved = await Path(__file__).resolve()
24+
path = resolved.parent / "software-header.swu"
25+
with open(path, "rb") as file:
26+
files = {"file": file}
27+
response = await async_client.post(f"/api/v1/software", files=files)
28+
assert response.status_code == 200
29+
30+
with open(path, "rb") as file:
31+
files = {"file": file}
32+
response = await async_client.post(f"/api/v1/software", files=files)
33+
assert response.status_code == 409
34+
35+
1936
@pytest.mark.asyncio
2037
async def test_create_software_remote(async_client, httpserver, test_data):
2138
resolved = await Path(__file__).resolve()
@@ -31,3 +48,64 @@ async def test_create_software_remote(async_client, httpserver, test_data):
3148
assert response.status_code == 200
3249
software = response.json()
3350
assert software["id"] == 4
51+
52+
53+
@pytest.mark.asyncio
54+
async def test_create_software_remote_twice_same_content_different_url(async_client, httpserver, test_data):
55+
response = await _upload_software(async_client, httpserver, "software-header.swu", "/software-header.swu")
56+
assert response.status_code == 200
57+
58+
response = await _upload_software(async_client, httpserver, "software-header.swu", "/software-header-2.swu")
59+
assert response.status_code == 409
60+
61+
62+
@pytest.mark.asyncio
63+
async def test_create_software_remote_twice_different_content_different_url(async_client, httpserver, test_data):
64+
response = await _upload_software(async_client, httpserver, "software-header.swu", "/software-header.swu")
65+
assert response.status_code == 200
66+
software = response.json()
67+
software_id = software["id"]
68+
69+
response = await _upload_software(async_client, httpserver, "software-header-2.swu", "/software-header-2.swu")
70+
assert response.status_code == 200
71+
software = response.json()
72+
assert software_id != software["id"], "added second software"
73+
74+
75+
@pytest.mark.asyncio
76+
async def test_create_software_remote_twice_different_content_same_url(async_client, httpserver, test_data):
77+
response = await _upload_software(async_client, httpserver, "software-header.swu", "/software-header.swu")
78+
assert response.status_code == 200
79+
software = response.json()
80+
software_id = software["id"]
81+
82+
response = await _upload_software(async_client, httpserver, "software-header-2.swu", "/software-header.swu")
83+
assert response.status_code == 200
84+
software = response.json()
85+
assert software_id != software["id"], "added second software"
86+
87+
88+
@pytest.mark.asyncio
89+
async def test_create_software_remote_twice_different_content_same_url_referenced_by_rollout(
90+
async_client, httpserver, test_data
91+
):
92+
response = await _upload_software(async_client, httpserver, "software-header.swu", "/software-header.swu")
93+
assert response.status_code == 200
94+
software = response.json()
95+
software_id = software["id"]
96+
97+
await Rollout.create(name=f"Test rollout", software_id=software_id)
98+
99+
response = await _upload_software(async_client, httpserver, "software-header-2.swu", "/software-header.swu")
100+
assert response.status_code == 409
101+
102+
103+
async def _upload_software(async_client, httpserver, software_file, download_url):
104+
resolved = await Path(__file__).resolve()
105+
path = resolved.parent / software_file
106+
with open(path, "rb") as file:
107+
byte_array = file.read()
108+
httpserver.expect_request(download_url).respond_with_data(byte_array)
109+
software_url = httpserver.url_for(download_url)
110+
response = await async_client.post(f"/api/v1/software", data={"url": software_url})
111+
return response

0 commit comments

Comments
 (0)