1
1
import pytest
2
2
from anyio import Path , open_file
3
3
4
+ from goosebit .db .models import Rollout
5
+
4
6
5
7
@pytest .mark .asyncio
6
8
async def test_create_software_local (async_client , test_data ):
@@ -16,6 +18,21 @@ async def test_create_software_local(async_client, test_data):
16
18
assert software ["id" ] == 4
17
19
18
20
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
+
19
36
@pytest .mark .asyncio
20
37
async def test_create_software_remote (async_client , httpserver , test_data ):
21
38
resolved = await Path (__file__ ).resolve ()
@@ -31,3 +48,64 @@ async def test_create_software_remote(async_client, httpserver, test_data):
31
48
assert response .status_code == 200
32
49
software = response .json ()
33
50
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