arkindex-base-worker 0.4.0b2__py3-none-any.whl → 0.4.0rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -109,7 +109,7 @@ def test_create_missing_types(responses, mock_elements_worker):
109
109
  )
110
110
 
111
111
 
112
- def test_list_elements_elements_list_arg_wrong_type(
112
+ def test_get_elements_elements_list_arg_wrong_type(
113
113
  monkeypatch, tmp_path, mock_elements_worker
114
114
  ):
115
115
  elements_path = tmp_path / "elements.json"
@@ -120,10 +120,10 @@ def test_list_elements_elements_list_arg_wrong_type(
120
120
  worker.configure()
121
121
 
122
122
  with pytest.raises(AssertionError, match="Elements list must be a list"):
123
- worker.list_elements()
123
+ worker.get_elements()
124
124
 
125
125
 
126
- def test_list_elements_elements_list_arg_empty_list(
126
+ def test_get_elements_elements_list_arg_empty_list(
127
127
  monkeypatch, tmp_path, mock_elements_worker
128
128
  ):
129
129
  elements_path = tmp_path / "elements.json"
@@ -134,10 +134,10 @@ def test_list_elements_elements_list_arg_empty_list(
134
134
  worker.configure()
135
135
 
136
136
  with pytest.raises(AssertionError, match="No elements in elements list"):
137
- worker.list_elements()
137
+ worker.get_elements()
138
138
 
139
139
 
140
- def test_list_elements_elements_list_arg_missing_id(
140
+ def test_get_elements_elements_list_arg_missing_id(
141
141
  monkeypatch, tmp_path, mock_elements_worker
142
142
  ):
143
143
  elements_path = tmp_path / "elements.json"
@@ -147,12 +147,12 @@ def test_list_elements_elements_list_arg_missing_id(
147
147
  worker = ElementsWorker()
148
148
  worker.configure()
149
149
 
150
- elt_list = worker.list_elements()
150
+ elt_list = worker.get_elements()
151
151
 
152
152
  assert elt_list == []
153
153
 
154
154
 
155
- def test_list_elements_elements_list_arg_not_uuid(
155
+ def test_get_elements_elements_list_arg_not_uuid(
156
156
  monkeypatch, tmp_path, mock_elements_worker
157
157
  ):
158
158
  elements_path = tmp_path / "elements.json"
@@ -175,10 +175,10 @@ def test_list_elements_elements_list_arg_not_uuid(
175
175
  Exception,
176
176
  match="These element IDs are invalid: volumeid, pageid, actid, surfaceid",
177
177
  ):
178
- worker.list_elements()
178
+ worker.get_elements()
179
179
 
180
180
 
181
- def test_list_elements_elements_list_arg(monkeypatch, tmp_path, mock_elements_worker):
181
+ def test_get_elements_elements_list_arg(monkeypatch, tmp_path, mock_elements_worker):
182
182
  elements_path = tmp_path / "elements.json"
183
183
  elements_path.write_text(
184
184
  json.dumps(
@@ -194,7 +194,7 @@ def test_list_elements_elements_list_arg(monkeypatch, tmp_path, mock_elements_wo
194
194
  worker = ElementsWorker()
195
195
  worker.configure()
196
196
 
197
- elt_list = worker.list_elements()
197
+ elt_list = worker.get_elements()
198
198
 
199
199
  assert elt_list == [
200
200
  "11111111-1111-1111-1111-111111111111",
@@ -203,7 +203,7 @@ def test_list_elements_elements_list_arg(monkeypatch, tmp_path, mock_elements_wo
203
203
  ]
204
204
 
205
205
 
206
- def test_list_elements_element_arg_not_uuid(mocker, mock_elements_worker):
206
+ def test_get_elements_element_arg_not_uuid(mocker, mock_elements_worker):
207
207
  mocker.patch(
208
208
  "arkindex_worker.worker.base.argparse.ArgumentParser.parse_args",
209
209
  return_value=Namespace(
@@ -221,10 +221,10 @@ def test_list_elements_element_arg_not_uuid(mocker, mock_elements_worker):
221
221
  with pytest.raises(
222
222
  Exception, match="These element IDs are invalid: volumeid, pageid"
223
223
  ):
224
- worker.list_elements()
224
+ worker.get_elements()
225
225
 
226
226
 
227
- def test_list_elements_element_arg(mocker, mock_elements_worker):
227
+ def test_get_elements_element_arg(mocker, mock_elements_worker):
228
228
  mocker.patch(
229
229
  "arkindex_worker.worker.base.argparse.ArgumentParser.parse_args",
230
230
  return_value=Namespace(
@@ -242,7 +242,7 @@ def test_list_elements_element_arg(mocker, mock_elements_worker):
242
242
  worker = ElementsWorker()
243
243
  worker.configure()
244
244
 
245
- elt_list = worker.list_elements()
245
+ elt_list = worker.get_elements()
246
246
 
247
247
  assert elt_list == [
248
248
  "11111111-1111-1111-1111-111111111111",
@@ -250,7 +250,7 @@ def test_list_elements_element_arg(mocker, mock_elements_worker):
250
250
  ]
251
251
 
252
252
 
253
- def test_list_elements_both_args_error(mocker, mock_elements_worker, tmp_path):
253
+ def test_get_elements_both_args_error(mocker, mock_elements_worker, tmp_path):
254
254
  elements_path = tmp_path / "elements.json"
255
255
  elements_path.write_text(
256
256
  json.dumps(
@@ -279,7 +279,7 @@ def test_list_elements_both_args_error(mocker, mock_elements_worker, tmp_path):
279
279
  with pytest.raises(
280
280
  AssertionError, match="elements-list and element CLI args shouldn't be both set"
281
281
  ):
282
- worker.list_elements()
282
+ worker.get_elements()
283
283
 
284
284
 
285
285
  def test_database_arg(mocker, mock_elements_worker, tmp_path):
@@ -1500,6 +1500,139 @@ def test_create_element_parent(responses, mock_elements_worker):
1500
1500
  }
1501
1501
 
1502
1502
 
1503
+ @pytest.mark.parametrize(
1504
+ ("arg_name", "data", "error_message"),
1505
+ [
1506
+ (
1507
+ "parent",
1508
+ None,
1509
+ "parent shouldn't be null and should be of type Element",
1510
+ ),
1511
+ (
1512
+ "parent",
1513
+ "not element type",
1514
+ "parent shouldn't be null and should be of type Element",
1515
+ ),
1516
+ (
1517
+ "children",
1518
+ None,
1519
+ "children shouldn't be null and should be of type list",
1520
+ ),
1521
+ (
1522
+ "children",
1523
+ "not a list",
1524
+ "children shouldn't be null and should be of type list",
1525
+ ),
1526
+ (
1527
+ "children",
1528
+ [
1529
+ Element({"id": "11111111-1111-1111-1111-111111111111"}),
1530
+ "not element type",
1531
+ ],
1532
+ "Child at index 1 in children: Should be of type Element",
1533
+ ),
1534
+ ],
1535
+ )
1536
+ def test_create_element_children_wrong_params(
1537
+ arg_name, data, error_message, mock_elements_worker
1538
+ ):
1539
+ with pytest.raises(AssertionError, match=error_message):
1540
+ mock_elements_worker.create_element_children(
1541
+ **{
1542
+ "parent": Element({"id": "12341234-1234-1234-1234-123412341234"}),
1543
+ "children": [
1544
+ Element({"id": "11111111-1111-1111-1111-111111111111"}),
1545
+ Element({"id": "22222222-2222-2222-2222-222222222222"}),
1546
+ ],
1547
+ # Overwrite with wrong data
1548
+ arg_name: data,
1549
+ },
1550
+ )
1551
+
1552
+
1553
+ def test_create_element_children_api_error(responses, mock_elements_worker):
1554
+ parent = Element({"id": "12341234-1234-1234-1234-123412341234"})
1555
+ responses.add(
1556
+ responses.POST,
1557
+ f"http://testserver/api/v1/element/parent/{parent.id}/",
1558
+ status=418,
1559
+ )
1560
+
1561
+ with pytest.raises(ErrorResponse):
1562
+ mock_elements_worker.create_element_children(
1563
+ parent=parent,
1564
+ children=[
1565
+ Element({"id": "11111111-1111-1111-1111-111111111111"}),
1566
+ Element({"id": "22222222-2222-2222-2222-222222222222"}),
1567
+ ],
1568
+ )
1569
+
1570
+ assert len(responses.calls) == len(BASE_API_CALLS) + 1
1571
+ assert [
1572
+ (call.request.method, call.request.url) for call in responses.calls
1573
+ ] == BASE_API_CALLS + [
1574
+ (
1575
+ "POST",
1576
+ f"http://testserver/api/v1/element/parent/{parent.id}/",
1577
+ )
1578
+ ]
1579
+
1580
+
1581
+ @pytest.mark.parametrize("batch_size", [DEFAULT_BATCH_SIZE, 1])
1582
+ def test_create_element_children(batch_size, responses, mock_elements_worker):
1583
+ parent = Element({"id": "12341234-1234-1234-1234-123412341234"})
1584
+
1585
+ first_child = Element({"id": "11111111-1111-1111-1111-111111111111"})
1586
+ second_child = Element({"id": "22222222-2222-2222-2222-222222222222"})
1587
+
1588
+ responses.add(
1589
+ responses.POST,
1590
+ f"http://testserver/api/v1/element/parent/{parent.id}/",
1591
+ status=200,
1592
+ json={"children": []},
1593
+ )
1594
+
1595
+ mock_elements_worker.create_element_children(
1596
+ parent=parent,
1597
+ children=[first_child, second_child],
1598
+ batch_size=batch_size,
1599
+ )
1600
+
1601
+ bulk_api_calls = [
1602
+ (
1603
+ "POST",
1604
+ f"http://testserver/api/v1/element/parent/{parent.id}/",
1605
+ )
1606
+ ]
1607
+ if batch_size != DEFAULT_BATCH_SIZE:
1608
+ bulk_api_calls.append(
1609
+ (
1610
+ "POST",
1611
+ f"http://testserver/api/v1/element/parent/{parent.id}/",
1612
+ )
1613
+ )
1614
+
1615
+ assert len(responses.calls) == len(BASE_API_CALLS) + len(bulk_api_calls)
1616
+ assert [
1617
+ (call.request.method, call.request.url) for call in responses.calls
1618
+ ] == BASE_API_CALLS + bulk_api_calls
1619
+
1620
+ bodies = []
1621
+ first_call_idx = None
1622
+ if batch_size > 1:
1623
+ first_call_idx = -1
1624
+ bodies.append({"children": [first_child.id, second_child.id]})
1625
+ else:
1626
+ first_call_idx = -2
1627
+ bodies.append({"children": [first_child.id]})
1628
+ bodies.append({"children": [second_child.id]})
1629
+
1630
+ assert [
1631
+ json.loads(bulk_call.request.body)
1632
+ for bulk_call in responses.calls[first_call_idx:]
1633
+ ] == bodies
1634
+
1635
+
1503
1636
  @pytest.mark.parametrize(
1504
1637
  ("payload", "error"),
1505
1638
  [
@@ -1825,6 +1958,433 @@ def test_partial_update_element_confidence(
1825
1958
  assert cached_element.confidence == confidence
1826
1959
 
1827
1960
 
1961
+ def test_list_elements_wrong_folder(mock_elements_worker):
1962
+ with pytest.raises(AssertionError, match="folder should be of type bool"):
1963
+ mock_elements_worker.list_elements(folder="not bool")
1964
+
1965
+
1966
+ def test_list_elements_wrong_name(mock_elements_worker):
1967
+ with pytest.raises(AssertionError, match="name should be of type str"):
1968
+ mock_elements_worker.list_elements(name=1234)
1969
+
1970
+
1971
+ def test_list_elements_wrong_top_level(mock_elements_worker):
1972
+ with pytest.raises(AssertionError, match="top_level should be of type bool"):
1973
+ mock_elements_worker.list_elements(top_level="not bool")
1974
+
1975
+
1976
+ def test_list_elements_wrong_type(mock_elements_worker):
1977
+ with pytest.raises(AssertionError, match="type should be of type str"):
1978
+ mock_elements_worker.list_elements(type=1234)
1979
+
1980
+
1981
+ def test_list_elements_wrong_with_classes(mock_elements_worker):
1982
+ with pytest.raises(AssertionError, match="with_classes should be of type bool"):
1983
+ mock_elements_worker.list_elements(with_classes="not bool")
1984
+
1985
+
1986
+ def test_list_elements_wrong_with_corpus(mock_elements_worker):
1987
+ with pytest.raises(AssertionError, match="with_corpus should be of type bool"):
1988
+ mock_elements_worker.list_elements(with_corpus="not bool")
1989
+
1990
+
1991
+ def test_list_elements_wrong_with_has_children(mock_elements_worker):
1992
+ with pytest.raises(
1993
+ AssertionError, match="with_has_children should be of type bool"
1994
+ ):
1995
+ mock_elements_worker.list_elements(with_has_children="not bool")
1996
+
1997
+
1998
+ def test_list_elements_wrong_with_zone(mock_elements_worker):
1999
+ with pytest.raises(AssertionError, match="with_zone should be of type bool"):
2000
+ mock_elements_worker.list_elements(with_zone="not bool")
2001
+
2002
+
2003
+ def test_list_elements_wrong_with_metadata(mock_elements_worker):
2004
+ with pytest.raises(AssertionError, match="with_metadata should be of type bool"):
2005
+ mock_elements_worker.list_elements(with_metadata="not bool")
2006
+
2007
+
2008
+ @pytest.mark.parametrize(
2009
+ ("param", "value"),
2010
+ [
2011
+ ("worker_run", 1234),
2012
+ ("transcription_worker_run", 1234),
2013
+ ],
2014
+ )
2015
+ def test_list_elements_wrong_worker_run(mock_elements_worker, param, value):
2016
+ with pytest.raises(AssertionError, match=f"{param} should be of type str or bool"):
2017
+ mock_elements_worker.list_elements(**{param: value})
2018
+
2019
+
2020
+ @pytest.mark.parametrize(
2021
+ ("param", "alternative", "value"),
2022
+ [
2023
+ ("worker_version", "worker_run", 1234),
2024
+ ("transcription_worker_version", "transcription_worker_run", 1234),
2025
+ ],
2026
+ )
2027
+ def test_list_elements_wrong_worker_version(
2028
+ mock_elements_worker, param, alternative, value
2029
+ ):
2030
+ # WARNING: pytest.deprecated_call must be placed BEFORE pytest.raises, otherwise `match` argument won't be checked
2031
+ with (
2032
+ pytest.deprecated_call(
2033
+ match=f"`{param}` usage is deprecated. Consider using `{alternative}` instead."
2034
+ ),
2035
+ pytest.raises(AssertionError, match=f"{param} should be of type str or bool"),
2036
+ ):
2037
+ mock_elements_worker.list_elements(**{param: value})
2038
+
2039
+
2040
+ @pytest.mark.parametrize(
2041
+ "param",
2042
+ [
2043
+ "worker_run",
2044
+ "transcription_worker_run",
2045
+ ],
2046
+ )
2047
+ def test_list_elements_wrong_bool_worker_run(mock_elements_worker, param):
2048
+ with pytest.raises(
2049
+ AssertionError, match=f"if of type bool, {param} can only be set to False"
2050
+ ):
2051
+ mock_elements_worker.list_elements(**{param: True})
2052
+
2053
+
2054
+ @pytest.mark.parametrize(
2055
+ ("param", "alternative"),
2056
+ [
2057
+ ("worker_version", "worker_run"),
2058
+ ("transcription_worker_version", "transcription_worker_run"),
2059
+ ],
2060
+ )
2061
+ def test_list_elements_wrong_bool_worker_version(
2062
+ mock_elements_worker, param, alternative
2063
+ ):
2064
+ # WARNING: pytest.deprecated_call must be placed BEFORE pytest.raises, otherwise `match` argument won't be checked
2065
+ with (
2066
+ pytest.deprecated_call(
2067
+ match=f"`{param}` usage is deprecated. Consider using `{alternative}` instead."
2068
+ ),
2069
+ pytest.raises(
2070
+ AssertionError, match=f"if of type bool, {param} can only be set to False"
2071
+ ),
2072
+ ):
2073
+ mock_elements_worker.list_elements(**{param: True})
2074
+
2075
+
2076
+ def test_list_elements_api_error(responses, mock_elements_worker):
2077
+ responses.add(
2078
+ responses.GET,
2079
+ f"http://testserver/api/v1/corpus/{mock_elements_worker.corpus_id}/elements/",
2080
+ status=418,
2081
+ )
2082
+
2083
+ with pytest.raises(
2084
+ Exception, match="Stopping pagination as data will be incomplete"
2085
+ ):
2086
+ next(mock_elements_worker.list_elements())
2087
+
2088
+ assert len(responses.calls) == len(BASE_API_CALLS) + 5
2089
+ assert [
2090
+ (call.request.method, call.request.url) for call in responses.calls
2091
+ ] == BASE_API_CALLS + [
2092
+ # We do 5 retries
2093
+ (
2094
+ "GET",
2095
+ f"http://testserver/api/v1/corpus/{mock_elements_worker.corpus_id}/elements/",
2096
+ ),
2097
+ (
2098
+ "GET",
2099
+ f"http://testserver/api/v1/corpus/{mock_elements_worker.corpus_id}/elements/",
2100
+ ),
2101
+ (
2102
+ "GET",
2103
+ f"http://testserver/api/v1/corpus/{mock_elements_worker.corpus_id}/elements/",
2104
+ ),
2105
+ (
2106
+ "GET",
2107
+ f"http://testserver/api/v1/corpus/{mock_elements_worker.corpus_id}/elements/",
2108
+ ),
2109
+ (
2110
+ "GET",
2111
+ f"http://testserver/api/v1/corpus/{mock_elements_worker.corpus_id}/elements/",
2112
+ ),
2113
+ ]
2114
+
2115
+
2116
+ def test_list_elements(responses, mock_elements_worker):
2117
+ expected_children = [
2118
+ {
2119
+ "id": "0000",
2120
+ "type": "page",
2121
+ "name": "Test",
2122
+ "corpus": {},
2123
+ "thumbnail_url": None,
2124
+ "zone": {},
2125
+ "best_classes": None,
2126
+ "has_children": None,
2127
+ "worker_version_id": None,
2128
+ "worker_run_id": None,
2129
+ },
2130
+ {
2131
+ "id": "1111",
2132
+ "type": "page",
2133
+ "name": "Test 2",
2134
+ "corpus": {},
2135
+ "thumbnail_url": None,
2136
+ "zone": {},
2137
+ "best_classes": None,
2138
+ "has_children": None,
2139
+ "worker_version_id": None,
2140
+ "worker_run_id": None,
2141
+ },
2142
+ {
2143
+ "id": "2222",
2144
+ "type": "page",
2145
+ "name": "Test 3",
2146
+ "corpus": {},
2147
+ "thumbnail_url": None,
2148
+ "zone": {},
2149
+ "best_classes": None,
2150
+ "has_children": None,
2151
+ "worker_version_id": None,
2152
+ "worker_run_id": None,
2153
+ },
2154
+ ]
2155
+ responses.add(
2156
+ responses.GET,
2157
+ f"http://testserver/api/v1/corpus/{mock_elements_worker.corpus_id}/elements/",
2158
+ status=200,
2159
+ json={
2160
+ "count": 3,
2161
+ "next": None,
2162
+ "results": expected_children,
2163
+ },
2164
+ )
2165
+
2166
+ for idx, child in enumerate(mock_elements_worker.list_elements()):
2167
+ assert child == expected_children[idx]
2168
+
2169
+ assert len(responses.calls) == len(BASE_API_CALLS) + 1
2170
+ assert [
2171
+ (call.request.method, call.request.url) for call in responses.calls
2172
+ ] == BASE_API_CALLS + [
2173
+ (
2174
+ "GET",
2175
+ f"http://testserver/api/v1/corpus/{mock_elements_worker.corpus_id}/elements/",
2176
+ ),
2177
+ ]
2178
+
2179
+
2180
+ def test_list_elements_manual_worker_version(responses, mock_elements_worker):
2181
+ expected_children = [
2182
+ {
2183
+ "id": "0000",
2184
+ "type": "page",
2185
+ "name": "Test",
2186
+ "corpus": {},
2187
+ "thumbnail_url": None,
2188
+ "zone": {},
2189
+ "best_classes": None,
2190
+ "has_children": None,
2191
+ "worker_version_id": None,
2192
+ "worker_run_id": None,
2193
+ }
2194
+ ]
2195
+ responses.add(
2196
+ responses.GET,
2197
+ f"http://testserver/api/v1/corpus/{mock_elements_worker.corpus_id}/elements/?worker_version=False",
2198
+ status=200,
2199
+ json={
2200
+ "count": 1,
2201
+ "next": None,
2202
+ "results": expected_children,
2203
+ },
2204
+ )
2205
+
2206
+ with pytest.deprecated_call(
2207
+ match="`worker_version` usage is deprecated. Consider using `worker_run` instead."
2208
+ ):
2209
+ for idx, child in enumerate(
2210
+ mock_elements_worker.list_elements(worker_version=False)
2211
+ ):
2212
+ assert child == expected_children[idx]
2213
+
2214
+ assert len(responses.calls) == len(BASE_API_CALLS) + 1
2215
+ assert [
2216
+ (call.request.method, call.request.url) for call in responses.calls
2217
+ ] == BASE_API_CALLS + [
2218
+ (
2219
+ "GET",
2220
+ f"http://testserver/api/v1/corpus/{mock_elements_worker.corpus_id}/elements/?worker_version=False",
2221
+ ),
2222
+ ]
2223
+
2224
+
2225
+ def test_list_elements_manual_worker_run(responses, mock_elements_worker):
2226
+ expected_children = [
2227
+ {
2228
+ "id": "0000",
2229
+ "type": "page",
2230
+ "name": "Test",
2231
+ "corpus": {},
2232
+ "thumbnail_url": None,
2233
+ "zone": {},
2234
+ "best_classes": None,
2235
+ "has_children": None,
2236
+ "worker_version_id": None,
2237
+ "worker_run_id": None,
2238
+ }
2239
+ ]
2240
+ responses.add(
2241
+ responses.GET,
2242
+ f"http://testserver/api/v1/corpus/{mock_elements_worker.corpus_id}/elements/?worker_run=False",
2243
+ status=200,
2244
+ json={
2245
+ "count": 1,
2246
+ "next": None,
2247
+ "results": expected_children,
2248
+ },
2249
+ )
2250
+
2251
+ for idx, child in enumerate(mock_elements_worker.list_elements(worker_run=False)):
2252
+ assert child == expected_children[idx]
2253
+
2254
+ assert len(responses.calls) == len(BASE_API_CALLS) + 1
2255
+ assert [
2256
+ (call.request.method, call.request.url) for call in responses.calls
2257
+ ] == BASE_API_CALLS + [
2258
+ (
2259
+ "GET",
2260
+ f"http://testserver/api/v1/corpus/{mock_elements_worker.corpus_id}/elements/?worker_run=False",
2261
+ ),
2262
+ ]
2263
+
2264
+
2265
+ def test_list_elements_with_cache_unhandled_param(mock_elements_worker_with_cache):
2266
+ with pytest.raises(
2267
+ AssertionError,
2268
+ match="When using the local cache, you can only filter by 'type' and/or 'worker_version' and/or 'worker_run'",
2269
+ ):
2270
+ mock_elements_worker_with_cache.list_elements(with_corpus=True)
2271
+
2272
+
2273
+ @pytest.mark.usefixtures("_mock_cached_elements")
2274
+ @pytest.mark.parametrize(
2275
+ ("filters", "expected_ids"),
2276
+ [
2277
+ # Filter on element should give all elements inserted
2278
+ (
2279
+ {},
2280
+ (
2281
+ "99999999-9999-9999-9999-999999999999",
2282
+ "12341234-1234-1234-1234-123412341234",
2283
+ "11111111-1111-1111-1111-111111111111",
2284
+ "22222222-2222-2222-2222-222222222222",
2285
+ "33333333-3333-3333-3333-333333333333",
2286
+ ),
2287
+ ),
2288
+ # Filter on element and page should give the second element
2289
+ (
2290
+ {"type": "page"},
2291
+ ("22222222-2222-2222-2222-222222222222",),
2292
+ ),
2293
+ # Filter on element and worker run should give second
2294
+ (
2295
+ {
2296
+ "worker_run": "56785678-5678-5678-5678-567856785678",
2297
+ },
2298
+ (
2299
+ "12341234-1234-1234-1234-123412341234",
2300
+ "22222222-2222-2222-2222-222222222222",
2301
+ ),
2302
+ ),
2303
+ # Filter on element, manual worker run should give first and third
2304
+ (
2305
+ {"worker_run": False},
2306
+ (
2307
+ "99999999-9999-9999-9999-999999999999",
2308
+ "11111111-1111-1111-1111-111111111111",
2309
+ "33333333-3333-3333-3333-333333333333",
2310
+ ),
2311
+ ),
2312
+ ],
2313
+ )
2314
+ def test_list_elements_with_cache(
2315
+ responses, mock_elements_worker_with_cache, filters, expected_ids
2316
+ ):
2317
+ # Check we have 5 elements already present in database
2318
+ assert CachedElement.select().count() == 5
2319
+
2320
+ # Query database through cache
2321
+ elements = mock_elements_worker_with_cache.list_elements(**filters)
2322
+ assert elements.count() == len(expected_ids)
2323
+ for child, expected_id in zip(elements.order_by("id"), expected_ids, strict=True):
2324
+ assert child.id == UUID(expected_id)
2325
+
2326
+ # Check the worker never hits the API for elements
2327
+ assert len(responses.calls) == len(BASE_API_CALLS)
2328
+ assert [
2329
+ (call.request.method, call.request.url) for call in responses.calls
2330
+ ] == BASE_API_CALLS
2331
+
2332
+
2333
+ @pytest.mark.usefixtures("_mock_cached_elements")
2334
+ @pytest.mark.parametrize(
2335
+ ("filters", "expected_ids"),
2336
+ [
2337
+ # Filter on element and worker version
2338
+ (
2339
+ {
2340
+ "worker_version": "56785678-5678-5678-5678-567856785678",
2341
+ },
2342
+ (
2343
+ "12341234-1234-1234-1234-123412341234",
2344
+ "11111111-1111-1111-1111-111111111111",
2345
+ "22222222-2222-2222-2222-222222222222",
2346
+ ),
2347
+ ),
2348
+ # Filter on element, type double_page and worker version
2349
+ (
2350
+ {"type": "page", "worker_version": "56785678-5678-5678-5678-567856785678"},
2351
+ ("22222222-2222-2222-2222-222222222222",),
2352
+ ),
2353
+ # Filter on element, manual worker version
2354
+ (
2355
+ {"worker_version": False},
2356
+ (
2357
+ "99999999-9999-9999-9999-999999999999",
2358
+ "33333333-3333-3333-3333-333333333333",
2359
+ ),
2360
+ ),
2361
+ ],
2362
+ )
2363
+ def test_list_elements_with_cache_deprecation(
2364
+ responses,
2365
+ mock_elements_worker_with_cache,
2366
+ filters,
2367
+ expected_ids,
2368
+ ):
2369
+ # Check we have 5 elements already present in database
2370
+ assert CachedElement.select().count() == 5
2371
+
2372
+ with pytest.deprecated_call(
2373
+ match="`worker_version` usage is deprecated. Consider using `worker_run` instead."
2374
+ ):
2375
+ # Query database through cache
2376
+ elements = mock_elements_worker_with_cache.list_elements(**filters)
2377
+ assert elements.count() == len(expected_ids)
2378
+ for child, expected_id in zip(elements.order_by("id"), expected_ids, strict=True):
2379
+ assert child.id == UUID(expected_id)
2380
+
2381
+ # Check the worker never hits the API for elements
2382
+ assert len(responses.calls) == len(BASE_API_CALLS)
2383
+ assert [
2384
+ (call.request.method, call.request.url) for call in responses.calls
2385
+ ] == BASE_API_CALLS
2386
+
2387
+
1828
2388
  def test_list_element_children_wrong_element(mock_elements_worker):
1829
2389
  with pytest.raises(
1830
2390
  AssertionError,