ecmwf-datastores-client 0.2.0__tar.gz → 0.3.0__tar.gz

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.

Potentially problematic release.


This version of ecmwf-datastores-client might be problematic. Click here for more details.

Files changed (54) hide show
  1. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/.github/workflows/on-push.yml +2 -2
  2. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/PKG-INFO +1 -1
  3. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/ecmwf/datastores/client.py +19 -2
  4. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/ecmwf/datastores/processing.py +8 -1
  5. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/ecmwf/datastores/version.py +1 -1
  6. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/ecmwf_datastores_client.egg-info/PKG-INFO +1 -1
  7. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/ecmwf_datastores_client.egg-info/SOURCES.txt +2 -2
  8. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/tests/conftest.py +1 -4
  9. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/tests/integration_test_20_processing.py +9 -0
  10. ecmwf_datastores_client-0.2.0/tests/integration_test_60_api_client.py → ecmwf_datastores_client-0.3.0/tests/integration_test_60_client.py +9 -9
  11. ecmwf_datastores_client-0.2.0/tests/integration_test_70_legacy_api_client.py → ecmwf_datastores_client-0.3.0/tests/integration_test_70_legacy_client.py +13 -13
  12. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/tests/test_20_processing.py +6 -1
  13. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/.cruft.json +0 -0
  14. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/.github/workflows/on-pr-closed.yml +0 -0
  15. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/.gitignore +0 -0
  16. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/.pre-commit-config-cruft.yaml +0 -0
  17. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/.pre-commit-config.yaml +0 -0
  18. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/Dockerfile +0 -0
  19. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/LICENSE +0 -0
  20. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/Makefile +0 -0
  21. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/README.md +0 -0
  22. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/ci/environment-ci.yml +0 -0
  23. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/ci/environment-integration.yml +0 -0
  24. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/docs/Makefile +0 -0
  25. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/docs/_static/.gitkeep +0 -0
  26. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/docs/_templates/.gitkeep +0 -0
  27. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/docs/conf.py +0 -0
  28. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/docs/index.md +0 -0
  29. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/docs/make.bat +0 -0
  30. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/docs/notebooks/index.md +0 -0
  31. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/docs/notebooks/quick_start.ipynb +0 -0
  32. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/ecmwf/datastores/__init__.py +0 -0
  33. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/ecmwf/datastores/catalogue.py +0 -0
  34. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/ecmwf/datastores/config.py +0 -0
  35. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/ecmwf/datastores/legacy_client.py +0 -0
  36. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/ecmwf/datastores/profile.py +0 -0
  37. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/ecmwf/datastores/py.typed +0 -0
  38. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/ecmwf/datastores/utils.py +0 -0
  39. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/ecmwf_datastores_client.egg-info/dependency_links.txt +0 -0
  40. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/ecmwf_datastores_client.egg-info/requires.txt +0 -0
  41. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/ecmwf_datastores_client.egg-info/top_level.txt +0 -0
  42. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/environment.yml +0 -0
  43. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/pyproject.toml +0 -0
  44. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/setup.cfg +0 -0
  45. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/tests/integration_test_10_catalogue.py +0 -0
  46. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/tests/integration_test_30_remote.py +0 -0
  47. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/tests/integration_test_40_results.py +0 -0
  48. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/tests/integration_test_50_profile.py +0 -0
  49. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/tests/integration_test_80_adaptors.py +0 -0
  50. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/tests/integration_test_90_features.py +0 -0
  51. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/tests/test_00_version.py +0 -0
  52. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/tests/test_01_config.py +0 -0
  53. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/tests/test_10_catalogue.py +0 -0
  54. {ecmwf_datastores_client-0.2.0 → ecmwf_datastores_client-0.3.0}/tests/test_40_results.py +0 -0
@@ -145,7 +145,7 @@ jobs:
145
145
  env:
146
146
  ECMWF_DATASTORES_URL: ${{ secrets.ECMWF_DATASTORES_URL }}
147
147
  ECMWF_DATASTORES_KEY: ${{ secrets.ECMWF_DATASTORES_KEY }}
148
- ECMWF_DATASTORES_ANON_KEY: ${{ secrets.ECMWF_DATASTORES_ANON_KEY }}
148
+ ANONYMOUS_PAT: ${{ secrets.ECMWF_DATASTORES_ANON_KEY }}
149
149
  run: |
150
150
  make docs-build
151
151
  - uses: rossjrw/pr-preview-action@v1
@@ -199,7 +199,7 @@ jobs:
199
199
  env:
200
200
  ECMWF_DATASTORES_URL: ${{ secrets.ECMWF_DATASTORES_URL }}
201
201
  ECMWF_DATASTORES_KEY: ${{ secrets.ECMWF_DATASTORES_KEY }}
202
- ECMWF_DATASTORES_ANON_KEY: ${{ secrets.ECMWF_DATASTORES_ANON_KEY }}
202
+ ANONYMOUS_PAT: ${{ secrets.ECMWF_DATASTORES_ANON_KEY }}
203
203
  run: |
204
204
  make ci-integration-tests COV_REPORT=xml
205
205
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ecmwf-datastores-client
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: ECMWF Data Stores Service (DSS) API Python client
5
5
  License: Apache License
6
6
  Version 2.0, January 2004
@@ -28,6 +28,8 @@ from ecmwf.datastores.catalogue import Catalogue
28
28
  from ecmwf.datastores.processing import Processing, RequestKwargs
29
29
  from ecmwf.datastores.profile import Profile
30
30
 
31
+ T_STATUS = Literal["accepted", "running", "successful", "failed", "rejected"]
32
+
31
33
 
32
34
  @attrs.define(slots=False)
33
35
  class Client:
@@ -179,6 +181,21 @@ class Client:
179
181
  """
180
182
  return self._profile_api.check_authentication()
181
183
 
184
+ def delete(self, *request_ids: str) -> dict[str, Any]:
185
+ """Delete requests.
186
+
187
+ Parameters
188
+ ----------
189
+ *request_ids: str
190
+ Request IDs.
191
+
192
+ Returns
193
+ -------
194
+ dict[str,Any]
195
+ Content of the response.
196
+ """
197
+ return self._retrieve_api.delete(*request_ids)
198
+
182
199
  def download_results(self, request_id: str, target: str | None = None) -> str:
183
200
  """Download the results of a request.
184
201
 
@@ -259,7 +276,7 @@ class Client:
259
276
  self,
260
277
  limit: int | None = None,
261
278
  sortby: Literal[None, "created", "-created"] = None,
262
- status: Literal[None, "accepted", "running", "successful", "failed"] = None,
279
+ status: None | T_STATUS | list[T_STATUS] = None,
263
280
  ) -> datastores.Jobs:
264
281
  """Retrieve submitted jobs.
265
282
 
@@ -269,7 +286,7 @@ class Client:
269
286
  Number of jobs per page.
270
287
  sortby: {None, 'created', '-created'}
271
288
  Field to sort results by.
272
- status: {None, 'accepted', 'running', 'successful', 'failed'}
289
+ status: None or {'accepted', 'running', 'successful', 'failed', 'rejected'} or list
273
290
  Status of the results.
274
291
 
275
292
  Returns
@@ -467,7 +467,7 @@ class Remote:
467
467
  return True
468
468
  if status in ("accepted", "running"):
469
469
  return False
470
- if status == "failed":
470
+ if status in ("failed", "rejected"):
471
471
  results = self._make_results(wait=False)
472
472
  raise ProcessingFailedError(error_json_to_message(results._json_dict))
473
473
  if status in ("dismissed", "deleted"):
@@ -705,6 +705,13 @@ class Processing:
705
705
  log_callback=self.log_callback,
706
706
  )
707
707
 
708
+ def delete(self, *job_ids: str) -> dict[str, Any]:
709
+ url = f"{self.url}/jobs/delete"
710
+ response = ApiResponse.from_request(
711
+ "post", url, json={"job_ids": job_ids}, **self._request_kwargs
712
+ )
713
+ return response._json_dict
714
+
708
715
  def get_processes(self, **params: Any) -> Processes:
709
716
  url = f"{self.url}/processes"
710
717
  return Processes.from_request("get", url, params=params, **self._request_kwargs)
@@ -1,2 +1,2 @@
1
1
  # Do not change! Do not track in version control!
2
- __version__ = "0.2.0"
2
+ __version__ = "0.3.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ecmwf-datastores-client
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: ECMWF Data Stores Service (DSS) API Python client
5
5
  License: Apache License
6
6
  Version 2.0, January 2004
@@ -41,8 +41,8 @@ tests/integration_test_20_processing.py
41
41
  tests/integration_test_30_remote.py
42
42
  tests/integration_test_40_results.py
43
43
  tests/integration_test_50_profile.py
44
- tests/integration_test_60_api_client.py
45
- tests/integration_test_70_legacy_api_client.py
44
+ tests/integration_test_60_client.py
45
+ tests/integration_test_70_legacy_client.py
46
46
  tests/integration_test_80_adaptors.py
47
47
  tests/integration_test_90_features.py
48
48
  tests/test_00_version.py
@@ -21,10 +21,7 @@ def api_root_url() -> str:
21
21
 
22
22
  @pytest.fixture
23
23
  def api_anon_key() -> str:
24
- return os.getenv(
25
- "ECMWF_DATASTORES_ANON_KEY",
26
- "00112233-4455-6677-c899-aabbccddeeff", # gitleaks:allow
27
- )
24
+ return os.getenv("ANONYMOUS_PAT", "00112233-4455-6677-c899-aabbccddeeff")
28
25
 
29
26
 
30
27
  @pytest.fixture
@@ -73,3 +73,12 @@ def test_processing_get_jobs_sortby(api_anon_client: Client) -> None:
73
73
  ids = api_anon_client.get_jobs(sortby="-created").request_ids
74
74
  assert ids.index(id2) < ids.index(id1)
75
75
  assert [id2] != api_anon_client.get_jobs(sortby="created", limit=1).request_ids
76
+
77
+
78
+ def test_processing_delete(api_anon_client: Client) -> None:
79
+ id1 = api_anon_client.submit("test-adaptor-dummy", {}).request_id
80
+ id2 = api_anon_client.submit("test-adaptor-dummy", {}).request_id
81
+ job1, job2 = api_anon_client.delete(id1, id2)["jobs"]
82
+ assert job1["status"] == job2["status"] == "dismissed"
83
+ assert job1["jobID"] == id1
84
+ assert job2["jobID"] == id2
@@ -9,7 +9,7 @@ from urllib3.exceptions import InsecureRequestWarning
9
9
  from ecmwf.datastores import Client, Remote, Results, processing
10
10
 
11
11
 
12
- def test_api_client_download_results(
12
+ def test_client_download_results(
13
13
  api_anon_client: Client, tmp_path: pathlib.Path
14
14
  ) -> None:
15
15
  remote = api_anon_client.submit("test-adaptor-dummy", {})
@@ -20,27 +20,27 @@ def test_api_client_download_results(
20
20
  assert os.path.exists(result)
21
21
 
22
22
 
23
- def test_api_client_get_process(api_anon_client: Client) -> None:
23
+ def test_client_get_process(api_anon_client: Client) -> None:
24
24
  process = api_anon_client.get_process("test-adaptor-dummy")
25
25
  assert isinstance(process, processing.Process)
26
26
  assert process.id == "test-adaptor-dummy"
27
27
  assert set(process.headers) == {"User-Agent", "PRIVATE-TOKEN"}
28
28
 
29
29
 
30
- def test_api_client_get_remote(api_anon_client: Client) -> None:
30
+ def test_client_get_remote(api_anon_client: Client) -> None:
31
31
  request_id = api_anon_client.submit("test-adaptor-dummy", {}).request_id
32
32
  remote = api_anon_client.get_remote(request_id)
33
33
  assert remote.request_id == request_id
34
34
  assert set(remote.headers) == {"User-Agent", "PRIVATE-TOKEN"}
35
35
 
36
36
 
37
- def test_api_client_get_results(api_anon_client: Client) -> None:
37
+ def test_client_get_results(api_anon_client: Client) -> None:
38
38
  request_id = api_anon_client.submit("test-adaptor-dummy", {}).request_id
39
39
  results = api_anon_client.get_results(request_id)
40
40
  assert isinstance(results, Results)
41
41
 
42
42
 
43
- def test_api_client_retrieve(
43
+ def test_client_retrieve(
44
44
  api_anon_client: Client,
45
45
  tmp_path: pathlib.Path,
46
46
  ) -> None:
@@ -54,24 +54,24 @@ def test_api_client_retrieve(
54
54
  assert os.path.getsize(actual_target) == 1
55
55
 
56
56
 
57
- def test_api_client_submit(api_anon_client: Client) -> None:
57
+ def test_client_submit(api_anon_client: Client) -> None:
58
58
  remote = api_anon_client.submit("test-adaptor-dummy", {})
59
59
  assert isinstance(remote, Remote)
60
60
 
61
61
 
62
- def test_api_client_submit_and_wait_on_results(api_anon_client: Client) -> None:
62
+ def test_client_submit_and_wait_on_results(api_anon_client: Client) -> None:
63
63
  results = api_anon_client.submit_and_wait_on_results("test-adaptor-dummy", {})
64
64
  assert isinstance(results, Results)
65
65
 
66
66
 
67
- def test_api_client_verify(api_root_url: str, api_anon_key: str) -> None:
67
+ def test_client_verify(api_root_url: str, api_anon_key: str) -> None:
68
68
  if not api_root_url.startswith("https"):
69
69
  pytest.skip(f"{api_root_url=} does not use https protocol")
70
70
  with pytest.warns(InsecureRequestWarning):
71
71
  Client(url=api_root_url, key=api_anon_key, verify=False, maximum_tries=0)
72
72
 
73
73
 
74
- def test_api_client_timeout(
74
+ def test_client_timeout(
75
75
  api_root_url: str,
76
76
  api_anon_key: str,
77
77
  tmp_path: pathlib.Path,
@@ -54,7 +54,7 @@ def legacy_update(remote: processing.Remote) -> None:
54
54
  )
55
55
 
56
56
 
57
- def test_legacy_api_client_retrieve(
57
+ def test_legacy_client_retrieve(
58
58
  tmp_path: pathlib.Path, legacy_client: LegacyClient
59
59
  ) -> None:
60
60
  collection_id = "test-adaptor-dummy"
@@ -65,7 +65,7 @@ def test_legacy_api_client_retrieve(
65
65
  assert os.path.getsize(target) == 1
66
66
 
67
67
 
68
- def test_legacy_api_client_result(
68
+ def test_legacy_client_result(
69
69
  monkeypatch: pytest.MonkeyPatch,
70
70
  tmp_path: pathlib.Path,
71
71
  legacy_client: LegacyClient,
@@ -92,7 +92,7 @@ def test_legacy_api_client_result(
92
92
 
93
93
 
94
94
  @pytest.mark.parametrize("quiet", [True, False])
95
- def test_legacy_api_client_quiet(
95
+ def test_legacy_client_quiet(
96
96
  caplog: pytest.LogCaptureFixture,
97
97
  api_root_url: str,
98
98
  api_anon_key: str,
@@ -105,7 +105,7 @@ def test_legacy_api_client_quiet(
105
105
 
106
106
 
107
107
  @pytest.mark.parametrize("debug", [True, False])
108
- def test_legacy_api_client_debug(
108
+ def test_legacy_client_debug(
109
109
  caplog: pytest.LogCaptureFixture,
110
110
  api_root_url: str,
111
111
  api_anon_key: str,
@@ -120,7 +120,7 @@ def test_legacy_api_client_debug(
120
120
  "wait_until_complete,expected_type",
121
121
  [(True, processing.Results), (False, processing.Remote)],
122
122
  )
123
- def test_legacy_api_client_wait_until_complete(
123
+ def test_legacy_client_wait_until_complete(
124
124
  tmp_path: pathlib.Path,
125
125
  api_root_url: str,
126
126
  api_anon_key: str,
@@ -156,7 +156,7 @@ def test_legacy_api_client_wait_until_complete(
156
156
  ),
157
157
  ],
158
158
  )
159
- def test_legacy_api_client_update(
159
+ def test_legacy_client_update(
160
160
  api_root_url: str,
161
161
  api_anon_key: str,
162
162
  collection_id: str,
@@ -173,7 +173,7 @@ def test_legacy_api_client_update(
173
173
 
174
174
 
175
175
  @pytest.mark.filterwarnings("ignore:Unverified HTTPS")
176
- def test_legacy_api_client_kwargs(api_root_url: str, api_anon_key: str) -> None:
176
+ def test_legacy_client_kwargs(api_root_url: str, api_anon_key: str) -> None:
177
177
  session = requests.Session()
178
178
  client = LegacyClient(
179
179
  url=api_root_url,
@@ -198,7 +198,7 @@ def test_legacy_api_client_kwargs(api_root_url: str, api_anon_key: str) -> None:
198
198
  assert client.client.session is session
199
199
 
200
200
 
201
- def test_legacy_api_client_logging(
201
+ def test_legacy_client_logging(
202
202
  caplog: pytest.LogCaptureFixture,
203
203
  api_root_url: str,
204
204
  api_anon_key: str,
@@ -226,7 +226,7 @@ def test_legacy_api_client_logging(
226
226
  ]
227
227
 
228
228
 
229
- def test_legacy_api_client_download(
229
+ def test_legacy_client_download(
230
230
  tmp_path: pathlib.Path,
231
231
  monkeypatch: pytest.MonkeyPatch,
232
232
  api_root_url: str,
@@ -258,7 +258,7 @@ def test_legacy_api_client_download(
258
258
  assert all(os.path.getsize(target) == 1 for target in targets)
259
259
 
260
260
 
261
- def test_legacy_api_client_status(legacy_client: LegacyClient) -> None:
261
+ def test_legacy_client_status(legacy_client: LegacyClient) -> None:
262
262
  status = legacy_client.status()
263
263
  assert set(status) <= {
264
264
  "critical",
@@ -277,7 +277,7 @@ def test_legacy_api_client_status(legacy_client: LegacyClient) -> None:
277
277
  )
278
278
 
279
279
 
280
- def test_legacy_api_client_remote(
280
+ def test_legacy_client_remote(
281
281
  legacy_client: LegacyClient, tmp_path: pathlib.Path
282
282
  ) -> None:
283
283
  results = legacy_client.retrieve("test-adaptor-dummy", {"size": 1})
@@ -288,7 +288,7 @@ def test_legacy_api_client_remote(
288
288
  assert os.path.getsize(target) == 1
289
289
 
290
290
 
291
- def test_legacy_api_client_warning(
291
+ def test_legacy_client_warning(
292
292
  api_root_url: str,
293
293
  api_anon_key: str,
294
294
  ) -> None:
@@ -305,7 +305,7 @@ def test_legacy_api_client_warning(
305
305
  )
306
306
 
307
307
 
308
- def test_legacy_api_client_toolbox(legacy_client: LegacyClient) -> None:
308
+ def test_legacy_client_toolbox(legacy_client: LegacyClient) -> None:
309
309
  with pytest.raises(NotImplementedError):
310
310
  legacy_client.service("service")
311
311
  with pytest.raises(NotImplementedError):
@@ -411,8 +411,12 @@ def test_wait_on_result(cat: catalogue.Catalogue) -> None:
411
411
  remote._wait_on_results()
412
412
 
413
413
 
414
+ @pytest.mark.parametrize("status", ["failed", "rejected"])
414
415
  @responses.activate
415
- def test_wait_on_result_failed(cat: catalogue.Catalogue) -> None:
416
+ def test_wait_on_result_failed(
417
+ cat: catalogue.Catalogue, status: str, monkeypatch: pytest.MonkeyPatch
418
+ ) -> None:
419
+ monkeypatch.setitem(JOB_FAILED_JSON, "status", status)
416
420
  responses_add()
417
421
 
418
422
  collection = cat.get_collection(COLLECTION_ID)
@@ -424,6 +428,7 @@ def test_wait_on_result_failed(cat: catalogue.Catalogue) -> None:
424
428
  ):
425
429
  remote._wait_on_results()
426
430
 
431
+ assert remote.status == status
427
432
  assert remote.created_at.isoformat() == "2022-09-02T17:30:48.201213+00:00"
428
433
  assert remote.started_at is not None
429
434
  assert remote.started_at.isoformat() == "2022-09-02T17:32:43.890617+00:00"