from fnmatch import fnmatch import pytest from atlas_um.caching.strategies import ( BaseCachingStrategy, ClaimNamesCache, ClaimValuesCache, DNAAccountsCache, DNAAccountsDetailsCache, ) from atlas_um.caching.strategies import ResourceGroupsCache class TestBaseCachingStrategy: @pytest.fixture def test_strategy(self, faker): class TestStrategy(BaseCachingStrategy): _TEST_INVALIDATION_PATTERN = [faker.pystr()] BASE_PREFIX = faker.pystr() PREFIX_ARGS = (faker.pystr(),) PREFIX_TO_OBJECT_MAPPING = {PREFIX_ARGS[0]: faker.pystr()} return TestStrategy def test_key(self, test_strategy, faker): test_key = faker.pystr() test_value = faker.pystr() test_args = {test_strategy.PREFIX_ARGS[0]: test_value} obj = test_strategy(test_args, test_key) assert ( obj.key == f"/{test_strategy.BASE_PREFIX}" f"/{test_strategy.PREFIX_ARGS[0]}" f"={test_value}/{test_key}" ) def test_prefix(self, test_strategy, faker): test_key = faker.pystr() test_value = faker.pystr() test_args = {test_strategy.PREFIX_ARGS[0]: test_value} obj = test_strategy(test_args, test_key) assert ( obj.prefix == f"{test_strategy.BASE_PREFIX}" f"/{test_strategy.PREFIX_ARGS[0]}" f"={test_value}" ) def test_invalidation_patterns(self, test_strategy, faker): test_key = faker.pystr() test_value = faker.pystr() test_args = {test_strategy.PREFIX_ARGS[0]: test_value} obj = test_strategy(test_args, test_key) assert obj.invalidation_patterns == [ f"*{obj.BASE_PREFIX}*", f"*{obj.params_string}*", ] def test_params(self, test_strategy, faker): test_key = faker.pystr() test_value = faker.pystr() test_args = {test_strategy.PREFIX_ARGS[0]: test_value} obj = test_strategy(test_args, test_key) assert obj.params == set( [f"{test_strategy.PREFIX_ARGS[0]}={test_value}"] ) def test_from_object(self, test_strategy, faker, mocker): mocked_obj = mocker.MagicMock() test_value = faker.pystr() prefix_arg, attr = list( test_strategy.PREFIX_TO_OBJECT_MAPPING.items() )[0] setattr( mocked_obj, attr, test_value, ) strategy_instance = test_strategy.from_object(mocked_obj) assert strategy_instance._args == {prefix_arg: [test_value]} class BaseStrategyTest: STRATEGY = None INITIAL_KEYS = { "cache/users_cache/user_id=sme-dna|5456ea11b1bc85e3eebf2120aa9d8e96:resource_group_id=apollo:claim_name_id=home_market//api/users/sme-dna|5456ea11b1bc85e3eebf2120aa9d8e96/resource_groups/apollo/claims/home_marketbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache/user_id=sme-dna|5456ea11b1bc85e3eebf2120aa9d8e96:resource_group_id=apollo//api/users/sme-dna|5456ea11b1bc85e3eebf2120aa9d8e96/resource_groups/apollo/claimsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache/user_id=sme-dna|5456ea11b1bc85e3eebf2120aa9d8e96//api/users/sme-dna|5456ea11b1bc85e3eebf2120aa9d8e96/resource_groupsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache/resource_group_id=apollo:claim_name_id=home_market:claim_id=2//api/resource_groups/apollo/claims/home_market/2/usersbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache///api/usersbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/claim_values_cache/resource_group_id=apollo:claim_name_id=home_market//api/resource_groups/apollo/claims/home_marketbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/claim_names_cache/resource_group_id=apollo//api/resource_groups/apollo/claimsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/resource_groups_cache///api/resource_groupsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/claim_values_cache/resource_group_id=decibel:claim_name_id=labels//api/resource_groups/decibel/claims/labelsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache/user_id=sme-dna|5cf0091d6c91d310fe6fcdc6//api/users/sme-dna|5cf0091d6c91d310fe6fcdc6/resource_groupsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache/resource_group_id=decibel:claim_name_id=labels:claim_id=7//api/resource_groups/decibel/claims/labels/7/usersbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache/user_id=sme-dna|5cf0091d6c91d310fe6fcdc6:resource_group_id=decibel//api/users/sme-dna|5cf0091d6c91d310fe6fcdc6/resource_groups/decibel/claimsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/claim_names_cache/resource_group_id=decibel//api/resource_groups/decibel/claimsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache/user_id=sme-dna|5cf0091d6c91d310fe6fcdc6:resource_group_id=decibel:claim_name_id=labels//api/users/sme-dna|5cf0091d6c91d310fe6fcdc6/resource_groups/decibel/claims/labelsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa } EXPECTED_RESULT_KEYS = {} def test_strategy(self): delete_keys = [] for pattern in self.STRATEGY.invalidation_patterns: delete_keys.extend( k for k in self.INITIAL_KEYS if fnmatch(k, pattern) ) assert ( self.INITIAL_KEYS - set(delete_keys) == self.EXPECTED_RESULT_KEYS ) class TestResourceGroupsCache(BaseStrategyTest): STRATEGY = ResourceGroupsCache(args={"resource_group_id": "apollo"}) EXPECTED_RESULT_KEYS = { "cache/users_cache/user_id=sme-dna|5456ea11b1bc85e3eebf2120aa9d8e96//api/users/sme-dna|5456ea11b1bc85e3eebf2120aa9d8e96/resource_groupsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache///api/usersbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/claim_values_cache/resource_group_id=decibel:claim_name_id=labels//api/resource_groups/decibel/claims/labelsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache/user_id=sme-dna|5cf0091d6c91d310fe6fcdc6//api/users/sme-dna|5cf0091d6c91d310fe6fcdc6/resource_groupsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache/resource_group_id=decibel:claim_name_id=labels:claim_id=7//api/resource_groups/decibel/claims/labels/7/usersbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache/user_id=sme-dna|5cf0091d6c91d310fe6fcdc6:resource_group_id=decibel//api/users/sme-dna|5cf0091d6c91d310fe6fcdc6/resource_groups/decibel/claimsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/claim_names_cache/resource_group_id=decibel//api/resource_groups/decibel/claimsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache/user_id=sme-dna|5cf0091d6c91d310fe6fcdc6:resource_group_id=decibel:claim_name_id=labels//api/users/sme-dna|5cf0091d6c91d310fe6fcdc6/resource_groups/decibel/claims/labelsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa } class TestClaimNamesCache(BaseStrategyTest): STRATEGY = ClaimNamesCache( args={"resource_group_id": "apollo", "claim_name_id": "home_market"} ) EXPECTED_RESULT_KEYS = { "cache/users_cache/user_id=sme-dna|5456ea11b1bc85e3eebf2120aa9d8e96//api/users/sme-dna|5456ea11b1bc85e3eebf2120aa9d8e96/resource_groupsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache///api/usersbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/resource_groups_cache///api/resource_groupsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/claim_values_cache/resource_group_id=decibel:claim_name_id=labels//api/resource_groups/decibel/claims/labelsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache/user_id=sme-dna|5cf0091d6c91d310fe6fcdc6//api/users/sme-dna|5cf0091d6c91d310fe6fcdc6/resource_groupsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache/resource_group_id=decibel:claim_name_id=labels:claim_id=7//api/resource_groups/decibel/claims/labels/7/usersbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache/user_id=sme-dna|5cf0091d6c91d310fe6fcdc6:resource_group_id=decibel//api/users/sme-dna|5cf0091d6c91d310fe6fcdc6/resource_groups/decibel/claimsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache/user_id=sme-dna|5cf0091d6c91d310fe6fcdc6:resource_group_id=decibel:claim_name_id=labels//api/users/sme-dna|5cf0091d6c91d310fe6fcdc6/resource_groups/decibel/claims/labelsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa } class TestClaimValuesCache(BaseStrategyTest): STRATEGY = ClaimValuesCache( args={"claim_name_id": "home_market", "claim_value_id": "2"} ) EXPECTED_RESULT_KEYS = { "cache/users_cache/user_id=sme-dna|5456ea11b1bc85e3eebf2120aa9d8e96:resource_group_id=apollo//api/users/sme-dna|5456ea11b1bc85e3eebf2120aa9d8e96/resource_groups/apollo/claimsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache/user_id=sme-dna|5456ea11b1bc85e3eebf2120aa9d8e96//api/users/sme-dna|5456ea11b1bc85e3eebf2120aa9d8e96/resource_groupsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache///api/usersbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/claim_names_cache/resource_group_id=apollo//api/resource_groups/apollo/claimsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/resource_groups_cache///api/resource_groupsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache/user_id=sme-dna|5cf0091d6c91d310fe6fcdc6//api/users/sme-dna|5cf0091d6c91d310fe6fcdc6/resource_groupsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache/resource_group_id=decibel:claim_name_id=labels:claim_id=7//api/resource_groups/decibel/claims/labels/7/usersbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache/user_id=sme-dna|5cf0091d6c91d310fe6fcdc6:resource_group_id=decibel//api/users/sme-dna|5cf0091d6c91d310fe6fcdc6/resource_groups/decibel/claimsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/claim_names_cache/resource_group_id=decibel//api/resource_groups/decibel/claimsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/users_cache/user_id=sme-dna|5cf0091d6c91d310fe6fcdc6:resource_group_id=decibel:claim_name_id=labels//api/users/sme-dna|5cf0091d6c91d310fe6fcdc6/resource_groups/decibel/claims/labelsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa } class TestDNAAccountsCache(BaseStrategyTest): STRATEGY = DNAAccountsCache( args={"user_id": "sme-dna|5456ea11b1bc85e3eebf2120aa9d8e96"} ) EXPECTED_RESULT_KEYS = { "cache/claim_values_cache/resource_group_id=apollo:claim_name_id=home_market//api/resource_groups/apollo/claims/home_marketbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/claim_names_cache/resource_group_id=apollo//api/resource_groups/apollo/claimsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/resource_groups_cache///api/resource_groupsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/claim_values_cache/resource_group_id=decibel:claim_name_id=labels//api/resource_groups/decibel/claims/labelsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/claim_names_cache/resource_group_id=decibel//api/resource_groups/decibel/claimsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa } class TestDNAAccountsDetailsCache(BaseStrategyTest): STRATEGY = DNAAccountsDetailsCache(args={}) EXPECTED_RESULT_KEYS = { "cache/claim_values_cache/resource_group_id=apollo:claim_name_id=home_market//api/resource_groups/apollo/claims/home_marketbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/claim_names_cache/resource_group_id=apollo//api/resource_groups/apollo/claimsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/resource_groups_cache///api/resource_groupsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/claim_values_cache/resource_group_id=decibel:claim_name_id=labels//api/resource_groups/decibel/claims/labelsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa "cache/claim_names_cache/resource_group_id=decibel//api/resource_groups/decibel/claimsbcd8b0c2eb1fce714eab6cef0d771acc", # noqa }