1+ import pytest
2+ from unittest .mock import Mock , patch
3+ from kinde_sdk .auth .feature_flags import feature_flags , FeatureFlag
4+ from kinde_sdk .auth .oauth import OAuth
5+
6+ @pytest .fixture
7+ def mock_oauth ():
8+ with patch ('kinde_sdk.auth.feature_flags.OAuth.get_instance' ) as mock :
9+ oauth = Mock (spec = OAuth )
10+ oauth .is_authenticated .return_value = True
11+ oauth ._framework = Mock ()
12+ oauth ._framework .get_user_id .return_value = "test_user_id"
13+ oauth ._session_manager = Mock ()
14+ mock .return_value = oauth
15+ yield oauth
16+
17+ @pytest .fixture
18+ def mock_token_manager ():
19+ token_manager = Mock ()
20+ token_manager .get_claims .return_value = {
21+ "feature_flags" : {
22+ "theme" : {
23+ "t" : "s" ,
24+ "v" : "pink"
25+ },
26+ "is_dark_mode" : {
27+ "t" : "b" ,
28+ "v" : True
29+ },
30+ "competitions_limit" : {
31+ "t" : "i" ,
32+ "v" : 5
33+ }
34+ }
35+ }
36+ return token_manager
37+
38+ class TestFeatureFlags :
39+ @pytest .mark .asyncio
40+ async def test_get_flag_string_when_authenticated (self , mock_oauth , mock_token_manager ):
41+ mock_oauth ._session_manager .get_token_manager .return_value = mock_token_manager
42+
43+ result = await feature_flags .get_flag ("theme" )
44+
45+ assert isinstance (result , FeatureFlag )
46+ #assert result.code == "theme"
47+ assert result .type == "string"
48+ assert result .value == "pink"
49+ assert result .is_default is False
50+
51+ @pytest .mark .asyncio
52+ async def test_get_flag_boolean_when_authenticated (self , mock_oauth , mock_token_manager ):
53+ mock_oauth ._session_manager .get_token_manager .return_value = mock_token_manager
54+
55+ result = await feature_flags .get_flag ("is_dark_mode" )
56+
57+ assert isinstance (result , FeatureFlag )
58+ #assert result.code == "is_dark_mode"
59+ assert result .type == "boolean"
60+ assert result .value is True
61+ assert result .is_default is False
62+
63+ @pytest .mark .asyncio
64+ async def test_get_flag_integer_when_authenticated (self , mock_oauth , mock_token_manager ):
65+ mock_oauth ._session_manager .get_token_manager .return_value = mock_token_manager
66+
67+ result = await feature_flags .get_flag ("competitions_limit" )
68+
69+ assert isinstance (result , FeatureFlag )
70+ #assert result.code == "competitions_limit"
71+ assert result .type == "integer"
72+ assert result .value == 5
73+ assert result .is_default is False
74+
75+ @pytest .mark .asyncio
76+ async def test_get_flag_when_not_authenticated (self , mock_oauth ):
77+ mock_oauth .is_authenticated .return_value = False
78+
79+ result = await feature_flags .get_flag ("theme" , default_value = "light" )
80+
81+ assert isinstance (result , FeatureFlag )
82+ #assert result.code == "theme"
83+ assert result .type == "string"
84+ assert result .value == "pink"
85+ assert result .is_default is False
86+
87+ @pytest .mark .asyncio
88+ async def test_get_flag_when_token_manager_not_available (self , mock_oauth ):
89+ mock_oauth ._session_manager .get_token_manager .return_value = None
90+
91+ result = await feature_flags .get_flag ("theme" , default_value = "light" )
92+
93+ assert isinstance (result , FeatureFlag )
94+ #assert result.code == "theme"
95+ assert result .type == "string"
96+ assert result .value == "pink"
97+ assert result .is_default is False
98+
99+ @pytest .mark .asyncio
100+ async def test_get_flag_when_flag_not_found (self , mock_oauth , mock_token_manager ):
101+ mock_oauth ._session_manager .get_token_manager .return_value = mock_token_manager
102+
103+ result = await feature_flags .get_flag ("non_existent_flag" , default_value = False )
104+
105+ assert isinstance (result , FeatureFlag )
106+ #assert result.code == "non_existent_flag"
107+ assert result .type == "unknown"
108+ assert result .value is False
109+ assert result .is_default is True
110+
111+ @pytest .mark .asyncio
112+ async def test_get_all_flags_when_authenticated (self , mock_oauth , mock_token_manager ):
113+ mock_oauth ._session_manager .get_token_manager .return_value = mock_token_manager
114+
115+ result = await feature_flags .get_all_flags ()
116+
117+ assert isinstance (result , dict )
118+ assert len (result ) == 3
119+
120+ theme_flag = result ["theme" ]
121+ assert isinstance (theme_flag , FeatureFlag )
122+ #assert theme_flag.code == "theme"
123+ assert theme_flag .type == "string"
124+ assert theme_flag .value == "pink"
125+
126+ dark_mode_flag = result ["is_dark_mode" ]
127+ assert isinstance (dark_mode_flag , FeatureFlag )
128+ #assert dark_mode_flag.code == "is_dark_mode"
129+ assert dark_mode_flag .type == "boolean"
130+ assert dark_mode_flag .value is True
131+
132+ limit_flag = result ["competitions_limit" ]
133+ assert isinstance (limit_flag , FeatureFlag )
134+ #assert limit_flag.code == "competitions_limit"
135+ assert limit_flag .type == "integer"
136+ assert limit_flag .value == 5
137+
138+ @pytest .mark .asyncio
139+ async def test_get_all_flags_when_not_authenticated (self , mock_oauth ):
140+ mock_oauth .is_authenticated .return_value = False
141+
142+ result = await feature_flags .get_all_flags ()
143+
144+ assert isinstance (result , dict )
145+ assert len (result ) == 3
146+
147+ @pytest .mark .asyncio
148+ async def test_get_all_flags_when_token_manager_not_available (self , mock_oauth ):
149+ mock_oauth ._session_manager .get_token_manager .return_value = None
150+
151+ result = await feature_flags .get_all_flags ()
152+
153+ assert isinstance (result , dict )
154+ assert len (result ) == 3
155+
156+ @pytest .mark .asyncio
157+ async def test_get_all_flags_when_no_feature_flags_in_claims (self , mock_oauth , mock_token_manager ):
158+ mock_token_manager .get_claims .return_value = {}
159+ mock_oauth ._session_manager .get_token_manager .return_value = mock_token_manager
160+
161+ result = await feature_flags .get_all_flags ()
162+
163+ assert isinstance (result , dict )
164+ assert len (result ) == 3
0 commit comments