66from tornado .httpclient import HTTPError
77
88from jupyter_server .auth import Authorizer , IdentityProvider , User
9+ from jupyter_server .auth .identity import PasswordIdentityProvider
910
1011
1112async def test_get_spec (jp_fetch ):
@@ -50,6 +51,22 @@ async def get_user(self, handler):
5051 return self .mock_user
5152
5253
54+ class MockPasswordIdentityProvider (PasswordIdentityProvider ):
55+ mock_user : MockUser
56+
57+ async def get_user (self , handler ):
58+ # super returns a UUID
59+ # return our mock user instead, as long as the request is authorized
60+ _authenticated = super ().get_user (handler )
61+ if isinstance (_authenticated , Awaitable ):
62+ _authenticated = await _authenticated
63+ authenticated = _authenticated
64+ if isinstance (self .mock_user , dict ):
65+ self .mock_user = MockUser (** self .mock_user )
66+ if authenticated :
67+ return self .mock_user
68+
69+
5370class MockAuthorizer (Authorizer ):
5471 def is_authorized (self , handler , user , action , resource ):
5572 permissions = user .permissions
@@ -70,6 +87,17 @@ def identity_provider(jp_serverapp):
7087 yield idp
7188
7289
90+ @pytest .fixture
91+ def password_identity_provider (jp_serverapp ):
92+ idp = MockPasswordIdentityProvider (parent = jp_serverapp )
93+ authorizer = MockAuthorizer (parent = jp_serverapp )
94+ with mock .patch .dict (
95+ jp_serverapp .web_app .settings ,
96+ {"identity_provider" : idp , "authorizer" : authorizer },
97+ ):
98+ yield idp
99+
100+
73101@pytest .mark .parametrize (
74102 "identity, expected" ,
75103 [
@@ -118,9 +146,44 @@ async def test_identity(jp_fetch, identity, expected, identity_provider):
118146
119147
120148@pytest .mark .parametrize ("identity" , [{"username" : "user.username" }])
121- async def test_update_user_success (jp_fetch , identity , identity_provider ):
149+ async def test_update_user_not_implemented_update (jp_fetch , identity , identity_provider ):
150+ """Test successful user update."""
151+ identity_provider .mock_user = MockUser (** identity )
152+ payload = {
153+ "color" : "#000000" ,
154+ }
155+ with pytest .raises (HTTPError ) as exc :
156+ await jp_fetch (
157+ "/api/me" ,
158+ method = "PATCH" ,
159+ body = json .dumps (payload ),
160+ headers = {"Content-Type" : "application/json" },
161+ )
162+ assert exc .value .code == 501
163+
164+
165+ @pytest .mark .parametrize ("identity" , [{"username" : "user.username" }])
166+ async def test_update_user_not_implemented_persist (jp_fetch , identity , identity_provider ):
122167 """Test successful user update."""
123168 identity_provider .mock_user = MockUser (** identity )
169+ identity_provider .update_user_model = lambda * args , ** kwargs : identity_provider .mock_user
170+ payload = {
171+ "color" : "#000000" ,
172+ }
173+ with pytest .raises (HTTPError ) as exc :
174+ await jp_fetch (
175+ "/api/me" ,
176+ method = "PATCH" ,
177+ body = json .dumps (payload ),
178+ headers = {"Content-Type" : "application/json" },
179+ )
180+ assert exc .value .code == 501
181+
182+
183+ @pytest .mark .parametrize ("identity" , [{"username" : "user.username" }])
184+ async def test_update_user_success (jp_fetch , identity , password_identity_provider ):
185+ """Test successful user update."""
186+ password_identity_provider .mock_user = MockUser (** identity )
124187 payload = {
125188 "color" : "#000000" ,
126189 }
@@ -137,12 +200,12 @@ async def test_update_user_success(jp_fetch, identity, identity_provider):
137200
138201
139202@pytest .mark .parametrize ("identity" , [{"username" : "user.username" }])
140- async def test_update_user_raise (jp_fetch , identity , identity_provider ):
203+ async def test_update_user_raise (jp_fetch , identity , password_identity_provider ):
141204 """Test failing user update."""
142- identity_provider .mock_user = MockUser (** identity )
205+ password_identity_provider .mock_user = MockUser (** identity )
143206 payload = {
144207 "name" : "Updated Name" ,
145- "color " : "#000000 " ,
208+ "fake_prop " : "anything " ,
146209 }
147210 with pytest .raises (HTTPError ) as exc :
148211 await jp_fetch (
@@ -151,6 +214,7 @@ async def test_update_user_raise(jp_fetch, identity, identity_provider):
151214 body = json .dumps (payload ),
152215 headers = {"Content-Type" : "application/json" },
153216 )
217+ assert exc .value .code == 400
154218
155219
156220@pytest .mark .parametrize (
@@ -168,10 +232,10 @@ async def test_update_user_raise(jp_fetch, identity, identity_provider):
168232 ],
169233)
170234async def test_update_user_success_custom_updatable_fields (
171- jp_fetch , identity , expected , identity_provider
235+ jp_fetch , identity , expected , password_identity_provider
172236):
173237 """Test successful user update."""
174- identity_provider .mock_user = MockUser (** identity )
238+ password_identity_provider .mock_user = MockUser (** identity )
175239 identity_provider .updatable_fields = ["name" , "display_name" , "color" ]
176240 payload = {
177241 "name" : expected ["name" ],
0 commit comments