@@ -627,3 +627,112 @@ def side_effect(*_args, **kwargs):
627627 )
628628 assert ps_auto .arn in result
629629 assert ps_manual .arn not in result
630+
631+
632+ class TestGetCachedUserInfo :
633+ """Tests for _get_cached_user_info re-fetching user info on cache miss."""
634+
635+ def test_cache_hit_returns_cached_values (self , import_main ):
636+ """When group_ids are cached, returns cached values without API calls."""
637+ main = import_main
638+ main .user_view_map .clear ()
639+
640+ view_key = "U_CACHED:request_for__account_access_submitted"
641+ main .user_view_map [f"{ view_key } :group_ids" ] = {"group-1" }
642+ main .user_view_map [f"{ view_key } :user_email" ] = "cached@test.com"
643+
644+ mock_client = MagicMock ()
645+
646+ with (
647+ patch .object (main .sso , "get_identity_store_id" ) as mock_get_id ,
648+ patch .object (main .sso , "get_user_principal_id_by_email" ) as mock_get_principal ,
649+ patch .object (main .sso , "get_user_group_ids" ) as mock_get_groups ,
650+ ):
651+ group_ids , email = main ._get_cached_user_info (view_key , "U_CACHED" , mock_client )
652+
653+ mock_get_id .assert_not_called ()
654+ mock_get_principal .assert_not_called ()
655+ mock_get_groups .assert_not_called ()
656+
657+ assert group_ids == {"group-1" }
658+ assert email == "cached@test.com"
659+
660+ def test_cache_miss_refetches_from_identity_center (self , import_main ):
661+ """When group_ids are not cached, re-fetches from Identity Center."""
662+ main = import_main
663+ main .user_view_map .clear ()
664+
665+ view_key = "U_COLD:request_for__account_access_submitted"
666+ refetched_groups = {"group-dev" , "group-admin" }
667+
668+ mock_client = MagicMock ()
669+
670+ with (
671+ patch .object (main .sso , "get_identity_store_id" , return_value = "d-123456" ),
672+ patch .object (
673+ main .slack_helpers ,
674+ "get_user" ,
675+ return_value = entities .slack .User (id = "U_COLD" , email = "cold@test.com" , real_name = "Cold User" ),
676+ ),
677+ patch .object (main .sso , "get_user_principal_id_by_email" , return_value = ("principal-cold" , None )),
678+ patch .object (main .sso , "get_user_group_ids" , return_value = refetched_groups ) as mock_get_groups ,
679+ ):
680+ group_ids , email = main ._get_cached_user_info (view_key , "U_COLD" , mock_client )
681+
682+ mock_get_groups .assert_called_once ()
683+
684+ assert group_ids == refetched_groups
685+ assert email == "cold@test.com"
686+
687+ def test_cache_miss_repopulates_cache (self , import_main ):
688+ """After re-fetching, user info is stored back in the cache."""
689+ main = import_main
690+ main .user_view_map .clear ()
691+
692+ view_key = "U_REPOP:request_for__account_access_submitted"
693+ mock_client = MagicMock ()
694+
695+ with (
696+ patch .object (main .sso , "get_identity_store_id" , return_value = "d-123456" ),
697+ patch .object (
698+ main .slack_helpers ,
699+ "get_user" ,
700+ return_value = entities .slack .User (id = "U_REPOP" , email = "repop@test.com" , real_name = "Repop User" ),
701+ ),
702+ patch .object (main .sso , "get_user_principal_id_by_email" , return_value = ("principal-repop" , None )),
703+ patch .object (main .sso , "get_user_group_ids" , return_value = {"group-x" }),
704+ ):
705+ main ._get_cached_user_info (view_key , "U_REPOP" , mock_client )
706+
707+ assert main .user_view_map [f"{ view_key } :group_ids" ] == {"group-x" }
708+ assert main .user_view_map [f"{ view_key } :user_principal_id" ] == "principal-repop"
709+ assert main .user_view_map [f"{ view_key } :user_email" ] == "repop@test.com"
710+
711+ def test_second_call_after_refetch_uses_cache (self , import_main ):
712+ """After a cache miss repopulates, the next call uses the cache."""
713+ main = import_main
714+ main .user_view_map .clear ()
715+
716+ view_key = "U_TWICE:request_for__account_access_submitted"
717+ mock_client = MagicMock ()
718+
719+ with (
720+ patch .object (main .sso , "get_identity_store_id" , return_value = "d-123456" ),
721+ patch .object (
722+ main .slack_helpers ,
723+ "get_user" ,
724+ return_value = entities .slack .User (id = "U_TWICE" , email = "twice@test.com" , real_name = "Twice User" ),
725+ ),
726+ patch .object (main .sso , "get_user_principal_id_by_email" , return_value = ("principal-twice" , None )),
727+ patch .object (main .sso , "get_user_group_ids" , return_value = {"group-y" }) as mock_get_groups ,
728+ ):
729+ # First call: cache miss, re-fetches
730+ main ._get_cached_user_info (view_key , "U_TWICE" , mock_client )
731+ assert mock_get_groups .call_count == 1
732+
733+ # Second call: cache hit, no re-fetch
734+ group_ids , email = main ._get_cached_user_info (view_key , "U_TWICE" , mock_client )
735+ assert mock_get_groups .call_count == 1 # still 1, not 2
736+
737+ assert group_ids == {"group-y" }
738+ assert email == "twice@test.com"
0 commit comments