@@ -963,7 +963,9 @@ def test_h5py_attr_limit(tmp_path):
963963 "elem_key" , ["obs" , "var" , "obsm" , "varm" , "layers" , "obsp" , "varp" , "uns" ]
964964)
965965@pytest .mark .parametrize ("store_type" , ["zarr" , "h5ad" ])
966- @pytest .mark .parametrize ("disallow_forward_slash_in_h5ad" , [True , False ])
966+ @pytest .mark .parametrize (
967+ "disallow_forward_slash_in_h5ad" , [True , False ], ids = ["ban_slash" , "allow_slash" ]
968+ )
967969def test_forward_slash_key (
968970 elem_key : Literal ["obs" , "var" , "obsm" , "varm" , "layers" , "obsp" , "varp" , "uns" ],
969971 tmp_path : Path ,
@@ -976,25 +978,34 @@ def test_forward_slash_key(
976978 (10 ,) if elem_key in ["obs" , "var" ] else (10 , 10 )
977979 )
978980 path = tmp_path / f"test.{ store_type } "
981+ can_write_slash_key = (
982+ elem_key in {"uns" , "obs" , "var" }
983+ and store_type == "h5ad"
984+ and not disallow_forward_slash_in_h5ad
985+ )
979986
987+ # try to write bad key and make sure we warn or throw an error
980988 with (
981989 ad .settings .override (
982990 disallow_forward_slash_in_h5ad = disallow_forward_slash_in_h5ad
983991 ),
984- pytest .raises ( ValueError , match = r"Forward slashes" )
985- if disallow_forward_slash_in_h5ad
986- else pytest .warns ( FutureWarning , match = r"Forward slashes" ),
992+ pytest .warns ( FutureWarning , match = r"Forward slashes" )
993+ if can_write_slash_key
994+ else pytest .raises ( ValueError , match = r"Forward slashes" ),
987995 ):
988996 getattr (a , f"write_{ store_type } " )(path )
989997
990- if not disallow_forward_slash_in_h5ad :
991- adata = getattr (ad , f"read_{ store_type } " )(path )
998+ # read and check that bad keys were only written if allowed
999+ elem = getattr (getattr (ad , f"read_{ store_type } " )(path ), elem_key )
1000+ if can_write_slash_key :
9921001 if elem_key in {"obs" , "var" }:
993- assert "bad/key" in getattr (adata , elem_key )
994- elif elem_key == "uns" :
995- assert "bad" in getattr (adata , elem_key )
1002+ assert "bad/key" in elem
9961003 else :
997- assert not getattr (adata , elem_key ).keys ()
1004+ assert "bad" in elem
1005+ elif elem_key in {"obs" , "var" }:
1006+ assert set (elem .columns ) == {"_index" }
1007+ else :
1008+ assert not elem .keys ()
9981009
9991010
10001011@pytest .mark .skipif (
0 commit comments