1+ import pytest
2+ import json
3+ from unittest .mock import AsyncMock , MagicMock
4+ from unittest .mock import ANY
5+ from auth0_server_python .auth_server .my_account_client import MyAccountClient
6+ from auth0_server_python .auth_types import (
7+ ConnectAccountRequest ,
8+ ConnectAccountResponse ,
9+ CompleteConnectAccountRequest ,
10+ CompleteConnectAccountResponse ,
11+ ConnectParams
12+ )
13+ from auth0_server_python .error import (
14+ MyAccountApiError ,
15+ ApiError
16+ )
17+
18+ @pytest .mark .asyncio
19+ async def test_connect_account_success (mocker ):
20+ # Arrange
21+ client = MyAccountClient (domain = "auth0.local" )
22+ response = AsyncMock ()
23+ response .status_code = 201
24+ response .json = MagicMock (return_value = {
25+ "connect_uri" : "https://auth0.local/connect" ,
26+ "auth_session" : "<auth_session>" ,
27+ "connect_params" : {"ticket" : "<auth_ticket>" },
28+ "expires_in" : 3600
29+ })
30+
31+ mock_post = mocker .patch ("httpx.AsyncClient.post" , new_callable = AsyncMock , return_value = response )
32+ request = ConnectAccountRequest (
33+ connection = "<connection>" ,
34+ redirect_uri = "<redirect_uri>" ,
35+ state = "<state_xyz>" ,
36+ code_challenge = "<code_challenge>" ,
37+ code_challenge_method = "S256"
38+ )
39+
40+ # Act
41+ result = await client .connect_account (access_token = "<access_token>" , request = request )
42+
43+ # Assert
44+ mock_post .assert_awaited_with (
45+ url = "https://auth0.local/me/v1/connected-accounts/connect" ,
46+ json = {
47+ "connection" : "<connection>" ,
48+ "redirect_uri" : "<redirect_uri>" ,
49+ "state" : "<state_xyz>" ,
50+ "code_challenge" : "<code_challenge>" ,
51+ "code_challenge_method" : "S256" ,
52+ },
53+ auth = ANY
54+ )
55+ assert result == ConnectAccountResponse (
56+ connect_uri = "https://auth0.local/connect" ,
57+ auth_session = "<auth_session>" ,
58+ connect_params = ConnectParams (ticket = "<auth_ticket>" ),
59+ expires_in = 3600
60+ )
61+
62+ @pytest .mark .asyncio
63+ async def test_connect_account_api_response_failure (mocker ):
64+ # Arrange
65+ client = MyAccountClient (domain = "auth0.local" )
66+ response = AsyncMock ()
67+ response .status_code = 401
68+ response .json = MagicMock (return_value = {
69+ "title" : "Invalid Token" ,
70+ "type" : "https://auth0.com/api-errors/A0E-401-0003" ,
71+ "detail" : "Invalid Token" ,
72+ "status" : 401
73+ })
74+
75+ mock_post = mocker .patch ("httpx.AsyncClient.post" , new_callable = AsyncMock , return_value = response )
76+ request = ConnectAccountRequest (
77+ connection = "<connection>" ,
78+ redirect_uri = "<redirect_uri>" ,
79+ state = "<state_xyz>" ,
80+ code_challenge = "<code_challenge>" ,
81+ code_challenge_method = "S256"
82+ )
83+
84+ # Act
85+
86+ with pytest .raises (MyAccountApiError ) as exc :
87+ await client .connect_account (access_token = "<access_token>" , request = request )
88+
89+ # Assert
90+ mock_post .assert_awaited_once ()
91+ assert "Invalid Token" in str (exc .value )
92+
93+
94+ @pytest .mark .asyncio
95+ async def test_complete_connect_account_success (mocker ):
96+ # Arrange
97+ client = MyAccountClient (domain = "auth0.local" )
98+ response = AsyncMock ()
99+ response .status_code = 201
100+ response .json = MagicMock (return_value = {
101+ "id" : "<id>" ,
102+ "connection" : "<connection>" ,
103+ "access_type" : "<access_type>" ,
104+ "scopes" : ["<some_scope>" ],
105+ "created_at" : "<created_at>" ,
106+ })
107+
108+ mock_post = mocker .patch ("httpx.AsyncClient.post" , new_callable = AsyncMock , return_value = response )
109+ request = CompleteConnectAccountRequest (
110+ auth_session = "<auth_session>" ,
111+ connect_code = "<connect_code>" ,
112+ redirect_uri = "<redirect_uri>" ,
113+ )
114+
115+ # Act
116+ result = await client .complete_connect_account (access_token = "<access_token>" , request = request )
117+
118+ # Assert
119+ mock_post .assert_awaited_with (
120+ url = "https://auth0.local/me/v1/connected-accounts/complete" ,
121+ json = {
122+ "auth_session" : "<auth_session>" ,
123+ "connect_code" : "<connect_code>" ,
124+ "redirect_uri" : "<redirect_uri>"
125+ },
126+ auth = ANY
127+ )
128+ assert result == CompleteConnectAccountResponse (
129+ id = "<id>" ,
130+ connection = "<connection>" ,
131+ access_type = "<access_type>" ,
132+ scopes = ["<some_scope>" ],
133+ created_at = "<created_at>" ,
134+ )
135+
136+ @pytest .mark .asyncio
137+ async def test_complete_connect_account_api_response_failure (mocker ):
138+ # Arrange
139+ client = MyAccountClient (domain = "auth0.local" )
140+ response = AsyncMock ()
141+ response .status_code = 401
142+ response .json = MagicMock (return_value = {
143+ "title" : "Invalid Token" ,
144+ "type" : "https://auth0.com/api-errors/A0E-401-0003" ,
145+ "detail" : "Invalid Token" ,
146+ "status" : 401
147+ })
148+
149+ mock_post = mocker .patch ("httpx.AsyncClient.post" , new_callable = AsyncMock , return_value = response )
150+ request = CompleteConnectAccountRequest (
151+ auth_session = "<auth_session>" ,
152+ connect_code = "<connect_code>" ,
153+ redirect_uri = "<redirect_uri>" ,
154+ )
155+
156+ # Act
157+
158+ with pytest .raises (MyAccountApiError ) as exc :
159+ await client .complete_connect_account (access_token = "<access_token>" , request = request )
160+
161+ # Assert
162+ mock_post .assert_awaited_once ()
163+ assert "Invalid Token" in str (exc .value )
0 commit comments