|
1 | 1 | import pytest
|
2 | 2 |
|
3 |
| -from airbyte_cdk.sources.declarative.transformations.dpath_flatten_fields import DpathFlattenFields |
| 3 | +from airbyte_cdk.sources.declarative.transformations.dpath_flatten_fields import ( |
| 4 | + DpathFlattenFields, |
| 5 | + KeyTransformation, |
| 6 | +) |
4 | 7 |
|
5 | 8 | _ANY_VALUE = -1
|
6 | 9 | _DELETE_ORIGIN_VALUE = True
|
7 | 10 | _REPLACE_WITH_VALUE = True
|
8 | 11 | _DO_NOT_DELETE_ORIGIN_VALUE = False
|
9 | 12 | _DO_NOT_REPLACE_WITH_VALUE = False
|
| 13 | +_NO_KEY_PREFIX = None |
| 14 | +_NO_KEY_SUFFIX = None |
| 15 | +_NO_KEY_TRANSFORMATIONS = None |
10 | 16 |
|
11 | 17 |
|
12 | 18 | @pytest.mark.parametrize(
|
|
16 | 22 | "field_path",
|
17 | 23 | "delete_origin_value",
|
18 | 24 | "replace_record",
|
| 25 | + "key_transformation", |
19 | 26 | "expected_record",
|
20 | 27 | ],
|
21 | 28 | [
|
|
25 | 32 | ["field2"],
|
26 | 33 | _DO_NOT_DELETE_ORIGIN_VALUE,
|
27 | 34 | _DO_NOT_REPLACE_WITH_VALUE,
|
| 35 | + _NO_KEY_TRANSFORMATIONS, |
28 | 36 | {"field1": _ANY_VALUE, "field2": {"field3": _ANY_VALUE}, "field3": _ANY_VALUE},
|
29 | 37 | id="flatten by dpath, don't delete origin value",
|
30 | 38 | ),
|
|
34 | 42 | ["field2"],
|
35 | 43 | _DELETE_ORIGIN_VALUE,
|
36 | 44 | _DO_NOT_REPLACE_WITH_VALUE,
|
| 45 | + _NO_KEY_TRANSFORMATIONS, |
37 | 46 | {"field1": _ANY_VALUE, "field3": _ANY_VALUE},
|
38 | 47 | id="flatten by dpath, delete origin value",
|
39 | 48 | ),
|
|
46 | 55 | ["field2", "*", "field4"],
|
47 | 56 | _DO_NOT_DELETE_ORIGIN_VALUE,
|
48 | 57 | _DO_NOT_REPLACE_WITH_VALUE,
|
| 58 | + _NO_KEY_TRANSFORMATIONS, |
49 | 59 | {
|
50 | 60 | "field1": _ANY_VALUE,
|
51 | 61 | "field2": {"field3": {"field4": {"field5": _ANY_VALUE}}},
|
|
62 | 72 | ["field2", "*", "field4"],
|
63 | 73 | _DELETE_ORIGIN_VALUE,
|
64 | 74 | _DO_NOT_REPLACE_WITH_VALUE,
|
| 75 | + _NO_KEY_TRANSFORMATIONS, |
65 | 76 | {"field1": _ANY_VALUE, "field2": {"field3": {}}, "field5": _ANY_VALUE},
|
66 | 77 | id="flatten by dpath with *, delete origin value",
|
67 | 78 | ),
|
|
71 | 82 | ["{{ config['field_path'] }}"],
|
72 | 83 | _DO_NOT_DELETE_ORIGIN_VALUE,
|
73 | 84 | _DO_NOT_REPLACE_WITH_VALUE,
|
| 85 | + _NO_KEY_TRANSFORMATIONS, |
74 | 86 | {"field1": _ANY_VALUE, "field2": {"field3": _ANY_VALUE}, "field3": _ANY_VALUE},
|
75 | 87 | id="flatten by dpath from config, don't delete origin value",
|
76 | 88 | ),
|
|
80 | 92 | ["non-existing-field"],
|
81 | 93 | _DO_NOT_DELETE_ORIGIN_VALUE,
|
82 | 94 | _DO_NOT_REPLACE_WITH_VALUE,
|
| 95 | + _NO_KEY_TRANSFORMATIONS, |
83 | 96 | {"field1": _ANY_VALUE, "field2": {"field3": _ANY_VALUE}},
|
84 | 97 | id="flatten by non-existing dpath, don't delete origin value",
|
85 | 98 | ),
|
|
89 | 102 | ["*", "non-existing-field"],
|
90 | 103 | _DO_NOT_DELETE_ORIGIN_VALUE,
|
91 | 104 | _DO_NOT_REPLACE_WITH_VALUE,
|
| 105 | + _NO_KEY_TRANSFORMATIONS, |
92 | 106 | {"field1": _ANY_VALUE, "field2": {"field3": _ANY_VALUE}},
|
93 | 107 | id="flatten by non-existing dpath with *, don't delete origin value",
|
94 | 108 | ),
|
|
98 | 112 | ["field2"],
|
99 | 113 | _DO_NOT_DELETE_ORIGIN_VALUE,
|
100 | 114 | _DO_NOT_REPLACE_WITH_VALUE,
|
| 115 | + _NO_KEY_TRANSFORMATIONS, |
101 | 116 | {"field1": _ANY_VALUE, "field2": {"field3": _ANY_VALUE}, "field3": _ANY_VALUE},
|
102 | 117 | id="flatten by dpath, not to update when record has field conflicts, don't delete origin value",
|
103 | 118 | ),
|
|
107 | 122 | ["field2"],
|
108 | 123 | _DO_NOT_DELETE_ORIGIN_VALUE,
|
109 | 124 | _DO_NOT_REPLACE_WITH_VALUE,
|
| 125 | + _NO_KEY_TRANSFORMATIONS, |
110 | 126 | {"field1": _ANY_VALUE, "field2": {"field3": _ANY_VALUE}, "field3": _ANY_VALUE},
|
111 | 127 | id="flatten by dpath, not to update when record has field conflicts, delete origin value",
|
112 | 128 | ),
|
|
116 | 132 | ["field2"],
|
117 | 133 | _DO_NOT_DELETE_ORIGIN_VALUE,
|
118 | 134 | _REPLACE_WITH_VALUE,
|
| 135 | + _NO_KEY_TRANSFORMATIONS, |
119 | 136 | {"field3": _ANY_VALUE},
|
120 | 137 | id="flatten by dpath, replace with value",
|
121 | 138 | ),
|
|
125 | 142 | ["field2"],
|
126 | 143 | _DELETE_ORIGIN_VALUE,
|
127 | 144 | _REPLACE_WITH_VALUE,
|
| 145 | + _NO_KEY_TRANSFORMATIONS, |
128 | 146 | {"field3": _ANY_VALUE},
|
129 | 147 | id="flatten by dpath, delete_origin_value do not affect to replace_record",
|
130 | 148 | ),
|
| 149 | + pytest.param( |
| 150 | + {"field1": _ANY_VALUE, "field2": {"field3": _ANY_VALUE}}, |
| 151 | + {}, |
| 152 | + ["field2"], |
| 153 | + _DO_NOT_DELETE_ORIGIN_VALUE, |
| 154 | + _REPLACE_WITH_VALUE, |
| 155 | + ("prefix_", _NO_KEY_SUFFIX), |
| 156 | + {"prefix_field3": _ANY_VALUE}, |
| 157 | + id="flatten by dpath, not delete origin value, replace record, add keys prefix", |
| 158 | + ), |
| 159 | + pytest.param( |
| 160 | + {"field1": _ANY_VALUE, "field2": {"field3": _ANY_VALUE}}, |
| 161 | + {}, |
| 162 | + ["field2"], |
| 163 | + _DO_NOT_DELETE_ORIGIN_VALUE, |
| 164 | + _REPLACE_WITH_VALUE, |
| 165 | + (_NO_KEY_PREFIX, "_suffix"), |
| 166 | + {"field3_suffix": _ANY_VALUE}, |
| 167 | + id="flatten by dpath, not delete origin value, replace record, add keys suffix", |
| 168 | + ), |
| 169 | + pytest.param( |
| 170 | + {"field1": _ANY_VALUE, "field2": {"field3": _ANY_VALUE}}, |
| 171 | + {}, |
| 172 | + ["field2"], |
| 173 | + _DO_NOT_DELETE_ORIGIN_VALUE, |
| 174 | + _REPLACE_WITH_VALUE, |
| 175 | + ("prefix_", "_suffix"), |
| 176 | + {"prefix_field3_suffix": _ANY_VALUE}, |
| 177 | + id="flatten by dpath, not delete origin value, replace record, add keys prefix and suffix", |
| 178 | + ), |
131 | 179 | ],
|
132 | 180 | )
|
133 | 181 | def test_dpath_flatten_lists(
|
134 |
| - input_record, config, field_path, delete_origin_value, replace_record, expected_record |
| 182 | + input_record, |
| 183 | + config, |
| 184 | + field_path, |
| 185 | + delete_origin_value, |
| 186 | + replace_record, |
| 187 | + key_transformation, |
| 188 | + expected_record, |
135 | 189 | ):
|
| 190 | + if key_transformation: |
| 191 | + key_transformation = KeyTransformation(config, {}, *key_transformation) |
| 192 | + |
136 | 193 | flattener = DpathFlattenFields(
|
137 | 194 | field_path=field_path,
|
138 | 195 | parameters={},
|
139 | 196 | config=config,
|
140 | 197 | delete_origin_value=delete_origin_value,
|
141 | 198 | replace_record=replace_record,
|
| 199 | + key_transformation=key_transformation, |
142 | 200 | )
|
143 | 201 | flattener.transform(input_record)
|
144 | 202 | assert input_record == expected_record
|
0 commit comments