22from responses import matchers
33
44from posit .connect .client import Client
5+ from posit .connect .oauth import types
56
67from ..api import load_mock , load_mock_dict
78
@@ -125,9 +126,10 @@ def test(self):
125126
126127 # assert
127128 assert mock_get .call_count == 1
128- assert len (integrations ) == 2
129+ assert len (integrations ) == 3
129130 assert integrations [0 ]["id" ] == "3"
130131 assert integrations [1 ]["id" ] == "4"
132+ assert integrations [2 ]["id" ] == "5"
131133
132134
133135class TestIntegrationsGet :
@@ -148,3 +150,107 @@ def test(self):
148150
149151 assert mock_get .call_count == 1
150152 assert integration ["guid" ] == guid
153+
154+
155+ class TestIntegrationsFindBy :
156+ @responses .activate
157+ def test (self ):
158+ # behavior
159+ responses .get (
160+ "https://connect.example/__api__/v1/oauth/integrations" ,
161+ json = load_mock ("v1/oauth/integrations.json" ),
162+ )
163+
164+ # setup
165+ c = Client ("https://connect.example" , "12345" )
166+ c ._ctx .version = None
167+ integrations = c .oauth .integrations
168+
169+ # invoke and assert
170+ # by guid
171+ found = integrations .find_by (guid = "22644575-a27b-4118-ad06-e24459b05126" )
172+ assert found is not None
173+ assert found ["guid" ] == "22644575-a27b-4118-ad06-e24459b05126"
174+
175+ # by name (exact match)
176+ found = integrations .find_by (name = "^keycloak integration$" )
177+ assert found is not None
178+ assert found ["name" ] == "keycloak integration"
179+
180+ # by name (partial match) - should find first match
181+ found = integrations .find_by (name = "keycloak" )
182+ assert found is not None
183+ assert found ["name" ] == "keycloak integration"
184+
185+ # by description (exact match)
186+ found = integrations .find_by (description = "^integration description$" )
187+ assert found is not None
188+ assert found ["description" ] == "integration description"
189+
190+ # by description (partial match)
191+ found = integrations .find_by (description = "another" )
192+ assert found is not None
193+ assert found ["description" ] == "another integration description"
194+
195+ # by integration_type
196+ found = integrations .find_by (integration_type = types .OAuthIntegrationType .CUSTOM )
197+ assert found is not None
198+ assert found ["template" ] == "custom"
199+ assert found ["name" ] == "keycloak integration" # first one
200+
201+ found = integrations .find_by (integration_type = "custom" )
202+ assert found is not None
203+ assert found ["template" ] == "custom"
204+ assert found ["name" ] == "keycloak integration" # first one
205+
206+ # by auth_type (no match)
207+ found = integrations .find_by (auth_type = types .OAuthIntegrationAuthType .VIEWER )
208+ assert found is None
209+
210+ found = integrations .find_by (auth_type = "Viewer" )
211+ assert found is None
212+
213+ # by config
214+ found = integrations .find_by (config = {"client_id" : "rsconnect-oidc" })
215+ assert found is not None
216+ assert found ["config" ]["client_id" ] == "rsconnect-oidc"
217+ assert found ["name" ] == "keycloak integration" # first one
218+
219+ # by config to find second integration
220+ found = integrations .find_by (config = {"token_endpoint_auth_method" : "client_secret_post" })
221+ assert found is not None
222+ assert found ["config" ]["token_endpoint_auth_method" ] == "client_secret_post"
223+ assert found ["name" ] == "keycloak-post"
224+
225+ # by multiple criteria
226+ found = integrations .find_by (integration_type = "custom" , name = "keycloak-post" )
227+ assert found is not None
228+ assert found ["template" ] == "custom"
229+ assert found ["name" ] == "keycloak-post"
230+
231+ # find connect integration
232+ found = integrations .find_by (integration_type = types .OAuthIntegrationType .CONNECT )
233+ assert found is not None
234+ assert found ["template" ] == "connect"
235+ assert found ["name" ] == "Connect Visitor API Key"
236+
237+ found = integrations .find_by (integration_type = "connect" )
238+ assert found is not None
239+ assert found ["template" ] == "connect"
240+ assert found ["name" ] == "Connect Visitor API Key"
241+
242+ found = integrations .find_by (name = "Connect Visitor API Key" )
243+ assert found is not None
244+ assert found ["name" ] == "Connect Visitor API Key"
245+
246+ found = integrations .find_by (description = "Allows access to Connect APIs" )
247+ assert found is not None
248+ assert found ["description" ] == "Allows access to Connect APIs on behalf of a Connect user."
249+
250+ found = integrations .find_by (config = {"scopes" : "admin" })
251+ assert found is not None
252+ assert found ["config" ]["scopes" ] == "admin"
253+
254+ # no match
255+ found = integrations .find_by (name = "Non-existent Integration" )
256+ assert found is None
0 commit comments