Skip to content

Commit 3e4e2cb

Browse files
committed
feat: add OVERWRITE for cassettes
risk: nonprod
1 parent 1c8cffe commit 3e4e2cb

File tree

5 files changed

+47
-33
lines changed

5 files changed

+47
-33
lines changed

gooddata-sdk/test-requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ urllib3==1.26.9
88
python-dotenv~=1.0.0
99
attrs>=21.4.0,<=24.2.0
1010
cattrs>=22.1.0,<=24.1.1
11+
deepdiff~=8.5.0

gooddata-sdk/tests/catalog/test_catalog_workspace.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from xml.etree import ElementTree as ET
77

88
import yaml
9+
from deepdiff import DeepDiff as dd
910
from gooddata_sdk import (
1011
BasicCredentials,
1112
CatalogAutomationSchedule,
@@ -165,8 +166,8 @@ def test_get_declarative_workspaces(test_config):
165166

166167
expected_o = CatalogDeclarativeWorkspaces.from_dict(data)
167168

168-
assert workspaces_o == expected_o
169-
assert workspaces_o.to_api().to_dict(camel_case=True) == data
169+
assert dd(expected_o, workspaces_o) == {}
170+
assert dd(data, workspaces_o.to_api().to_dict(camel_case=True)) == {}
170171

171172

172173
@gd_vcr.use_cassette(str(_fixtures_dir / "demo_declarative_workspaces.yaml"))
@@ -610,10 +611,10 @@ def test_put_declarative_workspace(test_config):
610611
workspace_o = sdk.catalog_workspace.get_declarative_workspace(
611612
test_config["workspace_test"], exclude=["ACTIVITY_INFO"]
612613
)
613-
assert workspace_e != workspace_o
614+
assert dd(workspace_e, workspace_o) != {}
614615
workspace_e.remove_wdf_refs()
615-
assert workspace_e == workspace_o
616-
assert workspace_e.to_dict() == workspace_o.to_dict()
616+
assert dd(workspace_e, workspace_o) == {}
617+
assert dd(workspace_e.to_dict(), workspace_o.to_dict()) == {}
617618
finally:
618619
_refresh_workspaces(sdk)
619620

@@ -634,8 +635,8 @@ def test_store_declarative_workspace(test_config):
634635
workspace_id=test_config["workspace"], layout_root_path=path
635636
)
636637

637-
assert workspaces_e == workspaces_o
638-
assert workspaces_e.to_dict(camel_case=True) == workspaces_o.to_dict(camel_case=True)
638+
assert dd(workspaces_e, workspaces_o) == {}
639+
assert dd(workspaces_e.to_dict(camel_case=True), workspaces_o.to_dict(camel_case=True)) == {}
639640

640641

641642
@gd_vcr.use_cassette(str(_fixtures_dir / "demo_load_and_put_declarative_workspace.yaml"))
@@ -655,8 +656,8 @@ def test_load_and_put_declarative_workspace(test_config):
655656
workspace_o = sdk.catalog_workspace.get_declarative_workspace(
656657
workspace_id=test_config["workspace"], exclude=["ACTIVITY_INFO"]
657658
)
658-
assert workspace_e == workspace_o
659-
assert workspace_e.to_dict(camel_case=True) == workspace_o.to_dict(camel_case=True)
659+
assert dd(workspace_e, workspace_o) == {}
660+
assert dd(workspace_e.to_dict(camel_case=True), workspace_o.to_dict(camel_case=True)) == {}
660661
finally:
661662
_refresh_workspaces(sdk)
662663

gooddata-sdk/tests/catalog/test_catalog_workspace_content.py

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from unittest.mock import MagicMock
88

99
import attrs
10+
from deepdiff import DeepDiff as dd
1011
from gooddata_sdk import (
1112
CatalogDatasetWorkspaceDataFilterIdentifier,
1213
CatalogDeclarativeAnalytics,
@@ -91,8 +92,8 @@ def test_store_declarative_ldm(test_config):
9192
sdk.catalog_workspace_content.store_declarative_ldm(workspace_id, path)
9293
ldm_o = sdk.catalog_workspace_content.load_declarative_ldm(workspace_id, path)
9394

94-
assert ldm_e == ldm_o
95-
assert ldm_e.to_api().to_dict() == ldm_o.to_api().to_dict()
95+
assert dd(ldm_e, ldm_o) == {}
96+
assert dd(ldm_e.to_api().to_dict(), ldm_o.to_api().to_dict()) == {}
9697

9798

9899
@gd_vcr.use_cassette(str(_fixtures_dir / "demo_load_and_put_declarative_ldm.yaml"))
@@ -109,10 +110,10 @@ def test_load_and_put_declarative_ldm(test_config):
109110

110111
sdk.catalog_workspace_content.load_and_put_declarative_ldm(identifier, path, standalone_copy=True)
111112
ldm_o = sdk.catalog_workspace_content.get_declarative_ldm(identifier)
112-
assert ldm_e != ldm_o
113+
assert dd(ldm_e, ldm_o) != {}
113114
ldm_e.remove_wdf_refs()
114-
assert ldm_e == ldm_o
115-
assert ldm_e.to_api().to_dict() == ldm_o.to_api().to_dict()
115+
assert dd(ldm_e, ldm_o) == {}
116+
assert dd(ldm_e.to_api().to_dict(), ldm_o.to_api().to_dict()) == {}
116117
finally:
117118
_refresh_workspaces(sdk)
118119

@@ -193,8 +194,8 @@ def test_store_declarative_analytics_model(test_config):
193194
sdk.catalog_workspace_content.store_declarative_analytics_model(workspace_id, path)
194195
analytics_model_o = sdk.catalog_workspace_content.load_declarative_analytics_model(workspace_id, path)
195196

196-
assert analytics_model_e == analytics_model_o
197-
assert analytics_model_e.to_api().to_dict() == analytics_model_o.to_api().to_dict()
197+
assert dd(analytics_model_e, analytics_model_o) == {}
198+
assert dd(analytics_model_e.to_api().to_dict(), analytics_model_o.to_api().to_dict()) == {}
198199

199200

200201
@gd_vcr.use_cassette(str(_fixtures_dir / "demo_load_and_put_declarative_analytics_model.yaml"))
@@ -214,8 +215,8 @@ def test_load_and_put_declarative_analytics_model(test_config):
214215
analytics_model_o = sdk.catalog_workspace_content.get_declarative_analytics_model(
215216
identifier, exclude=["ACTIVITY_INFO"]
216217
)
217-
assert analytics_model_e == analytics_model_o
218-
assert analytics_model_e.to_api().to_dict() == analytics_model_o.to_api().to_dict()
218+
assert dd(analytics_model_e, analytics_model_o) == {}
219+
assert dd(analytics_model_e.to_api().to_dict(), analytics_model_o.to_api().to_dict()) == {}
219220
finally:
220221
_refresh_workspaces(sdk)
221222

@@ -231,8 +232,8 @@ def test_put_declarative_analytics_model(test_config):
231232

232233
sdk.catalog_workspace_content.put_declarative_analytics_model(identifier, analytics_model_e)
233234
analytics_model_o = sdk.catalog_workspace_content.get_declarative_analytics_model(identifier)
234-
assert analytics_model_e == analytics_model_o
235-
assert analytics_model_e.to_api().to_dict() == analytics_model_o.to_api().to_dict()
235+
assert dd(analytics_model_e, analytics_model_o) == {}
236+
assert dd(analytics_model_e.to_api().to_dict(), analytics_model_o.to_api().to_dict()) == {}
236237
finally:
237238
_refresh_workspaces(sdk)
238239

@@ -248,10 +249,10 @@ def test_put_declarative_ldm(test_config):
248249
try:
249250
sdk.catalog_workspace_content.put_declarative_ldm(identifier, ldm_e, standalone_copy=True)
250251
ldm_o = sdk.catalog_workspace_content.get_declarative_ldm(identifier)
251-
assert ldm_e != ldm_o
252+
assert dd(ldm_e, ldm_o) != {}
252253
ldm_e.remove_wdf_refs()
253-
assert ldm_e == ldm_o
254-
assert ldm_e.to_api().to_dict() == ldm_o.to_api().to_dict()
254+
assert dd(ldm_e, ldm_o) == {}
255+
assert dd(ldm_e.to_api().to_dict(), ldm_o.to_api().to_dict()) == {}
255256
finally:
256257
_refresh_workspaces(sdk)
257258

@@ -269,8 +270,8 @@ def test_get_declarative_analytics_model(test_config):
269270

270271
expected_o = CatalogDeclarativeAnalytics.from_dict(data)
271272

272-
assert analytics_model_o == expected_o
273-
assert analytics_model_o.to_api().to_dict(camel_case=True) == data
273+
assert dd(analytics_model_o, expected_o) == {}
274+
assert dd(analytics_model_o.to_api().to_dict(camel_case=True), data) == {}
274275

275276

276277
@gd_vcr.use_cassette(str(_fixtures_dir / "demo_get_declarative_analytics_model_child.yaml"))
@@ -286,8 +287,8 @@ def test_get_declarative_analytics_model_child(test_config):
286287

287288
expected_o = CatalogDeclarativeAnalytics.from_dict(data)
288289

289-
assert analytics_model_o == expected_o
290-
assert analytics_model_o.to_api().to_dict(camel_case=True) == data
290+
assert dd(analytics_model_o, expected_o) == {}
291+
assert dd(analytics_model_o.to_api().to_dict(camel_case=True), data) == {}
291292

292293

293294
@gd_vcr.use_cassette(str(_fixtures_dir / "demo_get_declarative_ldm.yaml"))
@@ -301,8 +302,8 @@ def test_get_declarative_ldm(test_config):
301302

302303
expected_o = CatalogDeclarativeModel.from_dict(data)
303304

304-
assert ldm_o == expected_o
305-
assert ldm_o.to_api().to_dict(camel_case=True) == data
305+
assert dd(ldm_o, expected_o) == {}
306+
assert dd(ldm_o.to_api().to_dict(camel_case=True), data) == {}
306307

307308

308309
@gd_vcr.use_cassette(str(_fixtures_dir / "demo_catalog.yaml"))
@@ -367,7 +368,7 @@ def test_ldm_store_load(test_config):
367368

368369
sdk.catalog_workspace_content.store_ldm_to_disk(test_config["workspace"], path)
369370
loaded_ldm = sdk.catalog_workspace_content.load_ldm_from_disk(path)
370-
assert loaded_ldm == ldm
371+
assert dd(loaded_ldm, ldm) == {}
371372

372373

373374
@gd_vcr.use_cassette(str(_fixtures_dir / "analytics_store_load.yaml"))
@@ -378,7 +379,7 @@ def test_analytics_store_load(test_config):
378379

379380
sdk.catalog_workspace_content.store_analytics_model_to_disk(test_config["workspace"], path)
380381
loaded_analytics_model = sdk.catalog_workspace_content.load_analytics_model_from_disk(path)
381-
assert loaded_analytics_model == analytics_model
382+
assert dd(loaded_analytics_model, analytics_model) == {}
382383

383384

384385
@gd_vcr.use_cassette(str(_fixtures_dir / "label_elements.yaml"))
@@ -468,7 +469,7 @@ def test_explicit_workspace_data_filter(test_config):
468469

469470
updated_ldm = sdk.catalog_workspace_content.get_declarative_ldm(workspace_id=test_config["workspace"])
470471

471-
assert model_cpy == updated_ldm
472+
assert dd(model_cpy, updated_ldm) == {}
472473

473474
dataset = sdk.catalog_workspace_content.get_full_catalog(workspace_id=test_config["workspace"]).get_dataset(
474475
dataset_id
@@ -496,6 +497,6 @@ def test_export_definition_analytics_layout(test_config):
496497
analytics_e = sdk.catalog_workspace_content.get_declarative_analytics_model(
497498
test_config["workspace"], exclude=["ACTIVITY_INFO"]
498499
)
499-
assert analytics_o.analytics.export_definitions == analytics_e.analytics.export_definitions
500+
assert dd(analytics_o.analytics.export_definitions, analytics_e.analytics.export_definitions) == {}
500501
finally:
501502
_refresh_workspaces(sdk)

gooddata-sdk/tests/overview.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,11 @@ def test_something():
6464
```
6565

6666
**NOTE**: you do not have to set token value in config file unless you are going to create new recordings.
67+
68+
You can set the envvar `OVERWRITE=1` when you want to rerecord existing cassettes.
69+
70+
## Testing on bigger structures
71+
72+
You are welcome and actually encouraged to use DeepDiff when you are comparing bigger structures.
73+
This simplifies comparison in case of errors.
74+
See other tests how it is used.

tests-support/tests_support/vcrpy_utils.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22
from __future__ import annotations
33

44
import json
5+
import os
56
import typing
67
from json import JSONDecodeError
78
from typing import Any, Optional
89

910
import vcr
1011
import yaml
12+
from vcr.record_mode import RecordMode
1113

1214
VCR_MATCH_ON = ("method", "scheme", "host", "port", "path", "query", "body")
1315
NON_STATIC_HEADERS = ["DATE", "X-GDC-TRACE-ID"]
@@ -22,6 +24,7 @@ def get_vcr() -> vcr.VCR:
2224
before_record_request=custom_before_request,
2325
before_record_response=custom_before_response,
2426
decode_compressed_response=True,
27+
record_mode=RecordMode.ALL if "OVERWRITE" in os.environ else RecordMode.ONCE,
2528
)
2629

2730
gd_vcr.register_serializer("custom", CustomSerializerYaml())

0 commit comments

Comments
 (0)