2
2
import uuid
3
3
from datetime import datetime , timedelta
4
4
5
+ import pytest
6
+
5
7
from ..conftest import create_collection , create_item
6
8
7
9
ROUTES = {
31
33
}
32
34
33
35
36
+ @pytest .mark .asyncio
34
37
async def test_post_search_content_type (app_client , ctx ):
35
38
params = {"limit" : 1 }
36
39
resp = await app_client .post ("/search" , json = params )
37
40
assert resp .headers ["content-type" ] == "application/geo+json"
38
41
39
42
43
+ @pytest .mark .asyncio
40
44
async def test_get_search_content_type (app_client , ctx ):
41
45
resp = await app_client .get ("/search" )
42
46
assert resp .headers ["content-type" ] == "application/geo+json"
43
47
44
48
49
+ @pytest .mark .asyncio
45
50
async def test_api_headers (app_client ):
46
51
resp = await app_client .get ("/api" )
47
52
assert (
@@ -50,11 +55,13 @@ async def test_api_headers(app_client):
50
55
assert resp .status_code == 200
51
56
52
57
58
+ @pytest .mark .asyncio
53
59
async def test_router (app ):
54
60
api_routes = set ([f"{ list (route .methods )[0 ]} { route .path } " for route in app .routes ])
55
61
assert len (api_routes - ROUTES ) == 0
56
62
57
63
64
+ @pytest .mark .asyncio
58
65
async def test_app_transaction_extension (app_client , ctx ):
59
66
item = copy .deepcopy (ctx .item )
60
67
item ["id" ] = str (uuid .uuid4 ())
@@ -64,6 +71,7 @@ async def test_app_transaction_extension(app_client, ctx):
64
71
await app_client .delete (f"/collections/{ item ['collection' ]} /items/{ item ['id' ]} " )
65
72
66
73
74
+ @pytest .mark .asyncio
67
75
async def test_app_search_response (app_client , ctx ):
68
76
resp = await app_client .get ("/search" , params = {"ids" : ["test-item" ]})
69
77
assert resp .status_code == 200
@@ -75,6 +83,7 @@ async def test_app_search_response(app_client, ctx):
75
83
assert resp_json .get ("stac_extensions" ) is None
76
84
77
85
86
+ @pytest .mark .asyncio
78
87
async def test_app_context_extension (app_client , ctx , txn_client ):
79
88
test_item = ctx .item
80
89
test_item ["id" ] = "test-item-2"
@@ -108,13 +117,15 @@ async def test_app_context_extension(app_client, ctx, txn_client):
108
117
assert matched == 1
109
118
110
119
120
+ @pytest .mark .asyncio
111
121
async def test_app_fields_extension (app_client , ctx , txn_client ):
112
122
resp = await app_client .get ("/search" , params = {"collections" : ["test-collection" ]})
113
123
assert resp .status_code == 200
114
124
resp_json = resp .json ()
115
125
assert list (resp_json ["features" ][0 ]["properties" ]) == ["datetime" ]
116
126
117
127
128
+ @pytest .mark .asyncio
118
129
async def test_app_fields_extension_query (app_client , ctx , txn_client ):
119
130
resp = await app_client .post (
120
131
"/search" ,
@@ -128,6 +139,7 @@ async def test_app_fields_extension_query(app_client, ctx, txn_client):
128
139
assert list (resp_json ["features" ][0 ]["properties" ]) == ["datetime" , "proj:epsg" ]
129
140
130
141
142
+ @pytest .mark .asyncio
131
143
async def test_app_fields_extension_no_properties_get (app_client , ctx , txn_client ):
132
144
resp = await app_client .get (
133
145
"/search" , params = {"collections" : ["test-collection" ], "fields" : "-properties" }
@@ -137,6 +149,7 @@ async def test_app_fields_extension_no_properties_get(app_client, ctx, txn_clien
137
149
assert "properties" not in resp_json ["features" ][0 ]
138
150
139
151
152
+ @pytest .mark .asyncio
140
153
async def test_app_fields_extension_no_properties_post (app_client , ctx , txn_client ):
141
154
resp = await app_client .post (
142
155
"/search" ,
@@ -150,6 +163,7 @@ async def test_app_fields_extension_no_properties_post(app_client, ctx, txn_clie
150
163
assert "properties" not in resp_json ["features" ][0 ]
151
164
152
165
166
+ @pytest .mark .asyncio
153
167
async def test_app_fields_extension_return_all_properties (app_client , ctx , txn_client ):
154
168
item = ctx .item
155
169
resp = await app_client .get (
@@ -166,6 +180,7 @@ async def test_app_fields_extension_return_all_properties(app_client, ctx, txn_c
166
180
assert feature ["properties" ][expected_prop ] == expected_value
167
181
168
182
183
+ @pytest .mark .asyncio
169
184
async def test_app_query_extension_gt (app_client , ctx ):
170
185
params = {"query" : {"proj:epsg" : {"gt" : ctx .item ["properties" ]["proj:epsg" ]}}}
171
186
resp = await app_client .post ("/search" , json = params )
@@ -174,6 +189,7 @@ async def test_app_query_extension_gt(app_client, ctx):
174
189
assert len (resp_json ["features" ]) == 0
175
190
176
191
192
+ @pytest .mark .asyncio
177
193
async def test_app_query_extension_gte (app_client , ctx ):
178
194
params = {"query" : {"proj:epsg" : {"gte" : ctx .item ["properties" ]["proj:epsg" ]}}}
179
195
resp = await app_client .post ("/search" , json = params )
@@ -182,21 +198,95 @@ async def test_app_query_extension_gte(app_client, ctx):
182
198
assert len (resp .json ()["features" ]) == 1
183
199
184
200
201
+ @pytest .mark .asyncio
185
202
async def test_app_query_extension_limit_lt0 (app_client ):
186
203
assert (await app_client .post ("/search" , json = {"limit" : - 1 })).status_code == 400
187
204
188
205
206
+ @pytest .mark .asyncio
189
207
async def test_app_query_extension_limit_gt10000 (app_client ):
190
208
assert (await app_client .post ("/search" , json = {"limit" : 10001 })).status_code == 400
191
209
192
210
211
+ @pytest .mark .asyncio
193
212
async def test_app_query_extension_limit_10000 (app_client ):
194
213
params = {"limit" : 10000 }
195
214
resp = await app_client .post ("/search" , json = params )
196
215
assert resp .status_code == 200
197
216
198
217
199
- async def test_app_sort_extension (app_client , txn_client , ctx ):
218
+ @pytest .mark .asyncio
219
+ async def test_app_sort_extension_get_asc (app_client , txn_client , ctx ):
220
+ first_item = ctx .item
221
+ item_date = datetime .strptime (
222
+ first_item ["properties" ]["datetime" ], "%Y-%m-%dT%H:%M:%SZ"
223
+ )
224
+
225
+ second_item = dict (first_item )
226
+ second_item ["id" ] = "another-item"
227
+ another_item_date = item_date - timedelta (days = 1 )
228
+ second_item ["properties" ]["datetime" ] = another_item_date .strftime (
229
+ "%Y-%m-%dT%H:%M:%SZ"
230
+ )
231
+ await create_item (txn_client , second_item )
232
+
233
+ resp = await app_client .get ("/search?sortby=+properties.datetime" )
234
+ assert resp .status_code == 200
235
+ resp_json = resp .json ()
236
+ assert resp_json ["features" ][1 ]["id" ] == first_item ["id" ]
237
+ assert resp_json ["features" ][0 ]["id" ] == second_item ["id" ]
238
+
239
+
240
+ @pytest .mark .asyncio
241
+ async def test_app_sort_extension_get_desc (app_client , txn_client , ctx ):
242
+ first_item = ctx .item
243
+ item_date = datetime .strptime (
244
+ first_item ["properties" ]["datetime" ], "%Y-%m-%dT%H:%M:%SZ"
245
+ )
246
+
247
+ second_item = dict (first_item )
248
+ second_item ["id" ] = "another-item"
249
+ another_item_date = item_date - timedelta (days = 1 )
250
+ second_item ["properties" ]["datetime" ] = another_item_date .strftime (
251
+ "%Y-%m-%dT%H:%M:%SZ"
252
+ )
253
+ await create_item (txn_client , second_item )
254
+
255
+ resp = await app_client .get ("/search?sortby=-properties.datetime" )
256
+ assert resp .status_code == 200
257
+ resp_json = resp .json ()
258
+ assert resp_json ["features" ][0 ]["id" ] == first_item ["id" ]
259
+ assert resp_json ["features" ][1 ]["id" ] == second_item ["id" ]
260
+
261
+
262
+ @pytest .mark .asyncio
263
+ async def test_app_sort_extension_post_asc (app_client , txn_client , ctx ):
264
+ first_item = ctx .item
265
+ item_date = datetime .strptime (
266
+ first_item ["properties" ]["datetime" ], "%Y-%m-%dT%H:%M:%SZ"
267
+ )
268
+
269
+ second_item = dict (first_item )
270
+ second_item ["id" ] = "another-item"
271
+ another_item_date = item_date - timedelta (days = 1 )
272
+ second_item ["properties" ]["datetime" ] = another_item_date .strftime (
273
+ "%Y-%m-%dT%H:%M:%SZ"
274
+ )
275
+ await create_item (txn_client , second_item )
276
+
277
+ params = {
278
+ "collections" : [first_item ["collection" ]],
279
+ "sortby" : [{"field" : "properties.datetime" , "direction" : "asc" }],
280
+ }
281
+ resp = await app_client .post ("/search" , json = params )
282
+ assert resp .status_code == 200
283
+ resp_json = resp .json ()
284
+ assert resp_json ["features" ][1 ]["id" ] == first_item ["id" ]
285
+ assert resp_json ["features" ][0 ]["id" ] == second_item ["id" ]
286
+
287
+
288
+ @pytest .mark .asyncio
289
+ async def test_app_sort_extension_post_desc (app_client , txn_client , ctx ):
200
290
first_item = ctx .item
201
291
item_date = datetime .strptime (
202
292
first_item ["properties" ]["datetime" ], "%Y-%m-%dT%H:%M:%SZ"
@@ -221,6 +311,7 @@ async def test_app_sort_extension(app_client, txn_client, ctx):
221
311
assert resp_json ["features" ][1 ]["id" ] == second_item ["id" ]
222
312
223
313
314
+ @pytest .mark .asyncio
224
315
async def test_search_invalid_date (app_client , ctx ):
225
316
params = {
226
317
"datetime" : "2020-XX-01/2020-10-30" ,
@@ -231,6 +322,7 @@ async def test_search_invalid_date(app_client, ctx):
231
322
assert resp .status_code == 400
232
323
233
324
325
+ @pytest .mark .asyncio
234
326
async def test_search_point_intersects (app_client , ctx ):
235
327
point = [150.04 , - 33.14 ]
236
328
intersects = {"type" : "Point" , "coordinates" : point }
@@ -246,6 +338,7 @@ async def test_search_point_intersects(app_client, ctx):
246
338
assert len (resp_json ["features" ]) == 1
247
339
248
340
341
+ @pytest .mark .asyncio
249
342
async def test_search_point_does_not_intersect (app_client , ctx ):
250
343
point = [15.04 , - 3.14 ]
251
344
intersects = {"type" : "Point" , "coordinates" : point }
@@ -261,6 +354,7 @@ async def test_search_point_does_not_intersect(app_client, ctx):
261
354
assert len (resp_json ["features" ]) == 0
262
355
263
356
357
+ @pytest .mark .asyncio
264
358
async def test_datetime_non_interval (app_client , ctx ):
265
359
dt_formats = [
266
360
"2020-02-12T12:30:22+00:00" ,
@@ -282,6 +376,7 @@ async def test_datetime_non_interval(app_client, ctx):
282
376
assert resp_json ["features" ][0 ]["properties" ]["datetime" ][0 :19 ] == dt [0 :19 ]
283
377
284
378
379
+ @pytest .mark .asyncio
285
380
async def test_bbox_3d (app_client , ctx ):
286
381
australia_bbox = [106.343365 , - 47.199523 , 0.1 , 168.218365 , - 19.437288 , 0.1 ]
287
382
params = {
@@ -294,6 +389,7 @@ async def test_bbox_3d(app_client, ctx):
294
389
assert len (resp_json ["features" ]) == 1
295
390
296
391
392
+ @pytest .mark .asyncio
297
393
async def test_search_line_string_intersects (app_client , ctx ):
298
394
line = [[150.04 , - 33.14 ], [150.22 , - 33.89 ]]
299
395
intersects = {"type" : "LineString" , "coordinates" : line }
0 commit comments