Skip to content

Commit 2999f2a

Browse files
committed
feat: add OVERWRITE for cassettes and deepdiff
risk: nonprod
1 parent 1c8cffe commit 2999f2a

File tree

6 files changed

+60
-33
lines changed

6 files changed

+60
-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
@@ -34,6 +34,7 @@
3434
CatalogWebhook,
3535
)
3636
from gooddata_sdk.utils import recreate_directory
37+
from tests_support.compare_utils import deep_eq
3738
from tests_support.vcrpy_utils import get_vcr
3839

3940
from tests.catalog.utils import _refresh_workspaces
@@ -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 deep_eq(expected_o, workspaces_o)
170+
assert deep_eq(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 not deep_eq(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 deep_eq(workspace_e, workspace_o)
617+
assert deep_eq(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 deep_eq(workspaces_e, workspaces_o)
639+
assert deep_eq(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 deep_eq(workspace_e, workspace_o)
660+
assert deep_eq(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
@@ -26,6 +26,7 @@
2626
)
2727
from gooddata_sdk.compute.model.filter import AbsoluteDateFilter, RelativeDateFilter
2828
from gooddata_sdk.utils import recreate_directory
29+
from tests_support.compare_utils import deep_eq
2930
from tests_support.vcrpy_utils import get_vcr
3031

3132
from tests.catalog.test_catalog_workspace import _refresh_workspaces
@@ -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 deep_eq(ldm_e, ldm_o)
96+
assert deep_eq(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 not deep_eq(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 deep_eq(ldm_e, ldm_o)
116+
assert deep_eq(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 deep_eq(analytics_model_e, analytics_model_o)
198+
assert deep_eq(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 deep_eq(analytics_model_e, analytics_model_o)
219+
assert deep_eq(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 deep_eq(analytics_model_e, analytics_model_o)
236+
assert deep_eq(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 not deep_eq(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 deep_eq(ldm_e, ldm_o)
255+
assert deep_eq(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 deep_eq(expected_o, analytics_model_o)
274+
assert deep_eq(data, analytics_model_o.to_api().to_dict(camel_case=True))
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 deep_eq(expected_o, analytics_model_o)
291+
assert deep_eq(data, analytics_model_o.to_api().to_dict(camel_case=True))
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 deep_eq(expected_o, ldm_o)
306+
assert deep_eq(data, ldm_o.to_api().to_dict(camel_case=True))
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 deep_eq(ldm, loaded_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 deep_eq(analytics_model, loaded_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 deep_eq(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 deep_eq(analytics_o.analytics.export_definitions, analytics_e.analytics.export_definitions)
500501
finally:
501502
_refresh_workspaces(sdk)

gooddata-sdk/tests/overview.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,12 @@ 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+
It can be imported from `tests_support.compare_utils` in the `deep_eq` function.
74+
This simplifies debugging in case of errors.
75+
See other tests how it is used.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# (C) 2023 GoodData Corporation
2+
from __future__ import annotations
3+
4+
from deepdiff import DeepDiff
5+
6+
7+
def deep_eq(expected: any, actual: any) -> bool:
8+
if expected != actual:
9+
print(DeepDiff(expected, actual))
10+
return False
11+
12+
return True

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)