From ddbe8f8e99a5cd2194f1c950e0e9b41713efb749 Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Sat, 25 Apr 2026 22:35:48 +0200 Subject: [PATCH] fix(perception): Resolve OWN_PROFILE shadowing by OTHER_PROFILE heuristic (TDD) --- GramAddict/core/perception/screen_identity.py | 2 + tests/unit/test_screen_identity_profile.py | 39 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 tests/unit/test_screen_identity_profile.py diff --git a/GramAddict/core/perception/screen_identity.py b/GramAddict/core/perception/screen_identity.py index 9eb8f1e..a965197 100644 --- a/GramAddict/core/perception/screen_identity.py +++ b/GramAddict/core/perception/screen_identity.py @@ -178,6 +178,8 @@ class ScreenIdentity: return ScreenType.FOLLOW_LIST if "profile_header_container" in ids: + if selected_tab == "profile_tab": + return ScreenType.OWN_PROFILE return ScreenType.OTHER_PROFILE # Reels structural markers — present even when Instagram hides the tab bar diff --git a/tests/unit/test_screen_identity_profile.py b/tests/unit/test_screen_identity_profile.py new file mode 100644 index 0000000..c7ec089 --- /dev/null +++ b/tests/unit/test_screen_identity_profile.py @@ -0,0 +1,39 @@ +import pytest +from GramAddict.core.perception.screen_identity import ScreenIdentity, ScreenType + +def test_screen_identity_own_profile_vs_other_profile(): + identity = ScreenIdentity("marisaundmarc") + + # When we are on our OWN profile, 'profile_tab' is selected, + # but 'profile_header_container' is ALSO present. + # The bug is that 'profile_header_container' shadows 'profile_tab' selected=True. + + # Let's create an XML dump that mimics this scenario: + own_profile_xml = """ + + + + + """ + + result = identity.identify(own_profile_xml) + + assert result["screen_type"] == ScreenType.OWN_PROFILE, "Failed! own profile was classified as OTHER_PROFILE because profile_header_container shadowed it." + +def test_screen_identity_other_profile_vs_own_profile(): + identity = ScreenIdentity("marisaundmarc") + + # When we are on someone ELSE's profile, 'profile_tab' is NOT selected + # (or maybe 'feed_tab' or 'search_tab' is selected, or none). + # And 'profile_header_container' is present. + + other_profile_xml = """ + + + + + """ + + result = identity.identify(other_profile_xml) + + assert result["screen_type"] == ScreenType.OTHER_PROFILE, "Failed! other profile was not classified as OTHER_PROFILE."