|
11 | 11 | from marquez_client import MarquezClient |
12 | 12 | from marquez_client.constants import ( |
13 | 13 | DEFAULT_LIMIT, |
14 | | - DEFAULT_OFFSET |
| 14 | + DEFAULT_OFFSET, |
| 15 | + DEFAULT_DEPTH, |
| 16 | + DEFAULT_WITH_DOWNSTREAM |
15 | 17 | ) |
16 | 18 | from marquez_client.models import ( |
17 | 19 | DatasetType, |
|
237 | 239 | 'producer': PRODUCER |
238 | 240 | } |
239 | 241 |
|
| 242 | +COLUMN_LINEAGE = [ |
| 243 | + { |
| 244 | + 'id': 'datasetField:namespace:commonDataset:columnA', |
| 245 | + 'type': 'DATASET_FIELD', |
| 246 | + 'data': { |
| 247 | + 'type': 'DATASET_FIELD', |
| 248 | + 'namespace': 'namespace', |
| 249 | + 'dataset': 'otherDataset', |
| 250 | + 'field': 'columnA', |
| 251 | + 'fieldType': 'integer', |
| 252 | + 'transformationDescription': 'identical', |
| 253 | + 'transformationType': 'IDENTITY', |
| 254 | + 'inputFields': [ |
| 255 | + { 'namespace': 'namespace', 'dataset': 'otherDataset', 'field': 'columnB'} |
| 256 | + ] |
| 257 | + }, |
| 258 | + 'inEdges': [ |
| 259 | + { |
| 260 | + 'origin': 'datasetField:namespace:otherDataset:columnB', |
| 261 | + 'destination': 'datasetField:namespace:commonDataset:columnA' |
| 262 | + } |
| 263 | + ], |
| 264 | + 'outEdges': [ |
| 265 | + { |
| 266 | + 'origin': 'datasetField:namespace:commonDataset:columnA', |
| 267 | + 'destination': 'datasetField:namespace:otherDataset:columnC' |
| 268 | + } |
| 269 | + ] |
| 270 | + } |
| 271 | +] |
| 272 | + |
240 | 273 |
|
241 | 274 | @pytest.fixture |
242 | 275 | def client(): |
@@ -938,3 +971,86 @@ def test_list_tags(mock_get, client): |
938 | 971 | }, |
939 | 972 | timeout=mock.ANY |
940 | 973 | ) |
| 974 | + |
| 975 | + |
| 976 | +@mock.patch('requests.get') |
| 977 | +def test_get_column_lineage_by_dataset(mock_get, client): |
| 978 | + mock_get.return_value.status_code.return_value = HTTPStatus.OK |
| 979 | + mock_get.return_value.json.return_value = COLUMN_LINEAGE |
| 980 | + |
| 981 | + column_lineage = client.get_column_lineage_by_dataset( |
| 982 | + "namespace_a", |
| 983 | + "dataset_a", |
| 984 | + DEFAULT_DEPTH, |
| 985 | + DEFAULT_WITH_DOWNSTREAM |
| 986 | + ) |
| 987 | + |
| 988 | + assert column_lineage == COLUMN_LINEAGE |
| 989 | + |
| 990 | + mock_get.assert_called_once_with( |
| 991 | + url=client._url( |
| 992 | + '/column-lineage' |
| 993 | + ), |
| 994 | + headers=mock.ANY, |
| 995 | + params={ |
| 996 | + 'nodeId': 'dataset:namespace_a:dataset_a', |
| 997 | + 'depth': DEFAULT_DEPTH, |
| 998 | + 'withDownstream': DEFAULT_WITH_DOWNSTREAM |
| 999 | + }, |
| 1000 | + timeout=mock.ANY |
| 1001 | + ) |
| 1002 | + |
| 1003 | +@mock.patch('requests.get') |
| 1004 | +def test_get_column_lineage_by_dataset_field(mock_get, client): |
| 1005 | + mock_get.return_value.status_code.return_value = HTTPStatus.OK |
| 1006 | + mock_get.return_value.json.return_value = COLUMN_LINEAGE |
| 1007 | + |
| 1008 | + column_lineage = client.get_column_lineage_by_dataset_field( |
| 1009 | + "namespace_a", |
| 1010 | + "dataset_a", |
| 1011 | + "field_a", |
| 1012 | + DEFAULT_DEPTH, |
| 1013 | + DEFAULT_WITH_DOWNSTREAM |
| 1014 | + ) |
| 1015 | + |
| 1016 | + assert column_lineage == COLUMN_LINEAGE |
| 1017 | + |
| 1018 | + mock_get.assert_called_once_with( |
| 1019 | + url=client._url( |
| 1020 | + '/column-lineage' |
| 1021 | + ), |
| 1022 | + headers=mock.ANY, |
| 1023 | + params={ |
| 1024 | + 'nodeId': 'dataset_field:namespace_a:dataset_a:field_a', |
| 1025 | + 'depth': DEFAULT_DEPTH, |
| 1026 | + 'withDownstream': DEFAULT_WITH_DOWNSTREAM |
| 1027 | + }, |
| 1028 | + timeout=mock.ANY |
| 1029 | + ) |
| 1030 | + |
| 1031 | +@mock.patch('requests.get') |
| 1032 | +def test_get_column_lineage_by_job(mock_get, client): |
| 1033 | + mock_get.return_value.status_code.return_value = HTTPStatus.OK |
| 1034 | + mock_get.return_value.json.return_value = COLUMN_LINEAGE |
| 1035 | + |
| 1036 | + column_lineage = client.get_column_lineage_by_job( |
| 1037 | + "namespace_a", |
| 1038 | + "job_a", |
| 1039 | + DEFAULT_DEPTH, |
| 1040 | + DEFAULT_WITH_DOWNSTREAM |
| 1041 | + ) |
| 1042 | + |
| 1043 | + assert column_lineage == COLUMN_LINEAGE |
| 1044 | + |
| 1045 | + mock_get.assert_called_once_with( |
| 1046 | + url=client._url( |
| 1047 | + '/column-lineage' |
| 1048 | + ), |
| 1049 | + headers=mock.ANY, |
| 1050 | + params={ |
| 1051 | + 'nodeId': 'job:namespace_a:job_a', |
| 1052 | + 'depth': DEFAULT_DEPTH, |
| 1053 | + 'withDownstream': DEFAULT_WITH_DOWNSTREAM |
| 1054 | + }, |
| 1055 | + timeout=mock.ANY |
| 1056 | + ) |
0 commit comments