|
14 | 14 | from sqlmesh.core.selector import Selector |
15 | 15 | from sqlmesh.core.snapshot import SnapshotChangeCategory |
16 | 16 | from sqlmesh.utils import UniqueKeyDict |
| 17 | +from sqlmesh.utils.date import now_timestamp |
17 | 18 |
|
18 | 19 |
|
19 | 20 | @pytest.mark.parametrize( |
@@ -185,6 +186,81 @@ def test_select_models(mocker: MockerFixture, make_snapshot, default_catalog: t. |
185 | 186 | ) |
186 | 187 |
|
187 | 188 |
|
| 189 | +def test_select_models_expired_environment(mocker: MockerFixture, make_snapshot): |
| 190 | + modified_model_v1 = SqlModel( |
| 191 | + name="db.modified_model", |
| 192 | + query=d.parse_one("SELECT a + 1 FROM db.added_model"), |
| 193 | + ) |
| 194 | + modified_model_v2 = SqlModel( |
| 195 | + name="db.modified_model", |
| 196 | + query=d.parse_one("SELECT a + 2 FROM db.added_model"), |
| 197 | + ) |
| 198 | + removed_model = SqlModel( |
| 199 | + name="db.removed_model", |
| 200 | + query=d.parse_one("SELECT a FROM db.added_model"), |
| 201 | + ) |
| 202 | + standalone_audit = StandaloneAudit( |
| 203 | + name="test_audit", query=d.parse_one("SELECT * FROM added_model WHERE a IS NULL") |
| 204 | + ) |
| 205 | + |
| 206 | + modified_model_v1_snapshot = make_snapshot(modified_model_v1) |
| 207 | + modified_model_v1_snapshot.categorize_as(SnapshotChangeCategory.BREAKING) |
| 208 | + removed_model_snapshot = make_snapshot(removed_model) |
| 209 | + removed_model_snapshot.categorize_as(SnapshotChangeCategory.BREAKING) |
| 210 | + standalone_audit_snapshot = make_snapshot(standalone_audit) |
| 211 | + standalone_audit_snapshot.categorize_as(SnapshotChangeCategory.BREAKING) |
| 212 | + |
| 213 | + prod_env = Environment( |
| 214 | + name="prod", |
| 215 | + snapshots=[modified_model_v1_snapshot.table_info], |
| 216 | + start_at="2023-01-01", |
| 217 | + end_at="2023-02-01", |
| 218 | + plan_id="test_plan_id", |
| 219 | + ) |
| 220 | + |
| 221 | + env_name = "test_env" |
| 222 | + dev_env = Environment( |
| 223 | + name=env_name, |
| 224 | + snapshots=[modified_model_v1_snapshot.table_info, removed_model_snapshot.table_info], |
| 225 | + start_at="2023-01-01", |
| 226 | + end_at="2023-02-01", |
| 227 | + plan_id="test_plan_id", |
| 228 | + ) |
| 229 | + |
| 230 | + state_reader_mock = mocker.Mock() |
| 231 | + state_reader_mock.get_environment.side_effect = ( |
| 232 | + lambda name: prod_env if name == "prod" else dev_env |
| 233 | + ) |
| 234 | + |
| 235 | + all_snapshots = { |
| 236 | + modified_model_v1_snapshot.snapshot_id: modified_model_v1_snapshot, |
| 237 | + removed_model_snapshot.snapshot_id: removed_model_snapshot, |
| 238 | + } |
| 239 | + state_reader_mock.get_snapshots.side_effect = lambda snapshots: { |
| 240 | + s.snapshot_id: all_snapshots[s.snapshot_id] for s in snapshots |
| 241 | + } |
| 242 | + |
| 243 | + local_models: UniqueKeyDict[str, Model] = UniqueKeyDict("models") |
| 244 | + local_models[modified_model_v2.fqn] = modified_model_v2 |
| 245 | + selector = Selector(state_reader_mock, local_models) |
| 246 | + |
| 247 | + _assert_models_equal( |
| 248 | + selector.select_models(["*.modified_model"], env_name, fallback_env_name="prod"), |
| 249 | + { |
| 250 | + removed_model.fqn: removed_model, |
| 251 | + modified_model_v2.fqn: modified_model_v2, |
| 252 | + }, |
| 253 | + ) |
| 254 | + |
| 255 | + dev_env.expiration_ts = now_timestamp() - 1 |
| 256 | + _assert_models_equal( |
| 257 | + selector.select_models(["*.modified_model"], env_name, fallback_env_name="prod"), |
| 258 | + { |
| 259 | + modified_model_v2.fqn: modified_model_v2, |
| 260 | + }, |
| 261 | + ) |
| 262 | + |
| 263 | + |
188 | 264 | def test_select_change_schema(mocker: MockerFixture, make_snapshot): |
189 | 265 | parent = SqlModel( |
190 | 266 | name="db.parent", |
|
0 commit comments