@@ -309,7 +309,7 @@ def test_select_change_schema(mocker: MockerFixture, make_snapshot):
309309
310310 selector = NativeSelector (state_reader_mock , local_models )
311311
312- selected = selector .select_models (["db.parent" ], env_name )
312+ selected , _ = selector .select_models (["db.parent" ], env_name )
313313 assert selected [local_child .fqn ].render_query () != child .render_query ()
314314
315315 _assert_models_equal (
@@ -320,7 +320,7 @@ def test_select_change_schema(mocker: MockerFixture, make_snapshot):
320320 },
321321 )
322322
323- selected = selector .select_models (["db.child" ], env_name )
323+ selected , _ = selector .select_models (["db.child" ], env_name )
324324 assert selected [local_child .fqn ].data_hash == child .data_hash
325325
326326 _assert_models_equal (
@@ -343,12 +343,12 @@ def test_select_models_missing_env(mocker: MockerFixture, make_snapshot):
343343
344344 selector = NativeSelector (state_reader_mock , local_models )
345345
346- assert selector .select_models ([model .name ], "missing_env" ).keys () == {model .fqn }
347- assert not selector .select_models (["missing" ], "missing_env" )
346+ assert selector .select_models ([model .name ], "missing_env" )[ 0 ] .keys () == {model .fqn }
347+ assert not selector .select_models (["missing" ], "missing_env" )[ 0 ]
348348
349349 assert selector .select_models (
350350 [model .name ], "missing_env" , fallback_env_name = "another_missing_env"
351- ).keys () == {model .fqn }
351+ )[ 0 ] .keys () == {model .fqn }
352352
353353 state_reader_mock .get_environment .assert_has_calls (
354354 [
@@ -789,7 +789,7 @@ def test_select_models_local_tags_take_precedence_over_remote(
789789
790790 selector = NativeSelector (state_reader_mock , local_models )
791791
792- selected = selector .select_models (["tag:a" ], env_name )
792+ selected , _ = selector .select_models (["tag:a" ], env_name )
793793
794794 # both should get selected because they both now have the 'a' tag locally, even though one exists in remote state without the 'a' tag
795795 _assert_models_equal (
@@ -801,9 +801,9 @@ def test_select_models_local_tags_take_precedence_over_remote(
801801 )
802802
803803
804- def test_expand_model_selections_with_env (mocker : MockerFixture , make_snapshot ):
805- """expand_model_selections_with_env should include models from the deployed environment,
806- even if they have been deleted locally ."""
804+ def test_select_models_returns_selected_fqns (mocker : MockerFixture , make_snapshot ):
805+ """select_models should return the set of all matched FQNs (including env-only models)
806+ alongside the model dict ."""
807807 local_model = SqlModel (
808808 name = "db.local_model" ,
809809 query = d .parse_one ("SELECT 1 AS a" ),
@@ -835,34 +835,31 @@ def test_expand_model_selections_with_env(mocker: MockerFixture, make_snapshot):
835835
836836 selector = NativeSelector (state_reader_mock , local_models )
837837
838- # Expanding against local models only should NOT find the deleted model.
839- assert selector .expand_model_selections (["db.deleted_model" ]) == set ()
838+ # Selecting a deleted model: selected_fqns includes it even though models dict won't.
839+ _ , selected_fqns = selector .select_models (["db.deleted_model" ], env_name )
840+ assert deleted_model .fqn in selected_fqns
840841
841- # Expanding with env should find the deleted model .
842- result = selector .expand_model_selections_with_env (["db.deleted_model " ], env_name )
843- assert deleted_model .fqn in result
842+ # Selecting a local model: selected_fqns includes it .
843+ _ , selected_fqns = selector .select_models (["db.local_model " ], env_name )
844+ assert local_model .fqn in selected_fqns
844845
845- # Local model should also be reachable.
846- result = selector .expand_model_selections_with_env (["db.local_model" ], env_name )
847- assert local_model .fqn in result
848-
849- # Selecting both should return both.
850- result = selector .expand_model_selections_with_env (
846+ # Mixed selection (active + deleted): both appear in selected_fqns.
847+ _ , selected_fqns = selector .select_models (
851848 ["db.deleted_model" , "db.local_model" ], env_name
852849 )
853- assert result == {deleted_model .fqn , local_model .fqn }
850+ assert selected_fqns == {deleted_model .fqn , local_model .fqn }
854851
855- # Wildcard should match env models too .
856- result = selector .expand_model_selections_with_env (["*_model" ], env_name )
857- assert result == {deleted_model .fqn , local_model .fqn }
852+ # Wildcard should match both local and env models.
853+ _ , selected_fqns = selector .select_models (["*_model" ], env_name )
854+ assert selected_fqns == {deleted_model .fqn , local_model .fqn }
858855
859- # Non-existent model should return empty .
860- result = selector .expand_model_selections_with_env (["db.nonexistent" ], env_name )
861- assert result == set ()
856+ # Non-existent model should not appear .
857+ _ , selected_fqns = selector .select_models (["db.nonexistent" ], env_name )
858+ assert selected_fqns == set ()
862859
863860
864- def test_expand_model_selections_with_env_fallback (mocker : MockerFixture , make_snapshot ):
865- """expand_model_selections_with_env should fall back to the fallback environment."""
861+ def test_select_models_selected_fqns_fallback (mocker : MockerFixture , make_snapshot ):
862+ """select_models selected_fqns should include env models found via fallback environment."""
866863 deleted_model = SqlModel (
867864 name = "db.deleted_model" ,
868865 query = d .parse_one ("SELECT 1 AS a" ),
@@ -890,14 +887,14 @@ def test_expand_model_selections_with_env_fallback(mocker: MockerFixture, make_s
890887 local_models : UniqueKeyDict [str , Model ] = UniqueKeyDict ("models" )
891888 selector = NativeSelector (state_reader_mock , local_models )
892889
893- result = selector .expand_model_selections_with_env (
890+ _ , selected_fqns = selector .select_models (
894891 ["db.deleted_model" ], "missing_env" , fallback_env_name = "prod"
895892 )
896- assert deleted_model .fqn in result
893+ assert deleted_model .fqn in selected_fqns
897894
898895
899- def test_expand_model_selections_with_env_expired (mocker : MockerFixture , make_snapshot ):
900- """expand_model_selections_with_env should ignore expired environments."""
896+ def test_select_models_selected_fqns_expired (mocker : MockerFixture , make_snapshot ):
897+ """select_models should not match env models from expired environments."""
901898 deleted_model = SqlModel (
902899 name = "db.deleted_model" ,
903900 query = d .parse_one ("SELECT 1 AS a" ),
@@ -924,11 +921,17 @@ def test_expand_model_selections_with_env_expired(mocker: MockerFixture, make_sn
924921 local_models : UniqueKeyDict [str , Model ] = UniqueKeyDict ("models" )
925922 selector = NativeSelector (state_reader_mock , local_models )
926923
927- result = selector .expand_model_selections_with_env (["db.deleted_model" ], "test_env" )
928- assert result == set ()
924+ _ , selected_fqns = selector .select_models (["db.deleted_model" ], "test_env" )
925+ assert selected_fqns == set ()
929926
930927
931- def _assert_models_equal (actual : t .Dict [str , Model ], expected : t .Dict [str , Model ]) -> None :
928+ def _assert_models_equal (
929+ actual : t .Union [t .Dict [str , Model ], t .Tuple [t .Dict [str , Model ], t .Set [str ]]],
930+ expected : t .Dict [str , Model ],
931+ ) -> None :
932+ # select_models returns a tuple; unwrap if needed.
933+ if isinstance (actual , tuple ):
934+ actual = actual [0 ]
932935 assert set (actual ) == set (expected )
933936 for name , model in actual .items ():
934937 # Use dict() to make Pydantic V2 happy.
0 commit comments