1+ import os
2+ from unittest .mock import AsyncMock , patch
3+
14import pytest
5+ from azure .identity import ClientSecretCredential
6+ from kiota_authentication_azure .azure_identity_authentication_provider \
7+ import AzureIdentityAuthenticationProvider
8+ from kiota_http .httpx_request_adapter import HttpxRequestAdapter
9+ from dotenv import load_dotenv
10+
11+ from msgraph_core .tasks .page_iterator import PageIterator # pylint: disable=import-error, no-name-in-module
12+ from msgraph_core .models .page_result import PageResult # pylint: disable=no-name-in-module, import-error
213
3- from kiota_abstractions .request_adapter import RequestAdapter
4- from kiota_abstractions .request_information import RequestInformation
5- from kiota_serialization_json import JsonNodeFactory
6- from kiota_serialization_json import JsonParseNode
7- from kiota_http_python .exceptions import KiotaHTTPXError
8- from ...src .msgraph_core .page_iterator import PageIterator
914
1015@pytest .fixture
1116def first_page_data ():
1217 return {
13- "@odata.context" : "https://graph.microsoft.com/v1.0/$metadata#users" ,
14- "@odata.nextLink" : "https://graph.microsoft.com/v1.0/users?skip=2&page=10" ,
18+ "@odata.context" :
19+ "https://graph.microsoft.com/v1.0/$metadata#users" ,
20+ "@odata.next_link" :
21+ "https://graph.microsoft.com/v1.0/users?skip=2&page=10" ,
1522 "value" : [
1623 {
1724 "businessPhones" : [],
@@ -25,11 +32,8 @@ def first_page_data():
2532 "surname" : None ,
2633 "userPrincipalName" : "Adams@contoso.com" ,
2734 "id" : "6ea91a8d-e32e-41a1-b7bd-d2d185eed0e0"
28- },
29- {
30- "businessPhones" : [
31- "425-555-0100"
32- ],
35+ }, {
36+ "businessPhones" : ["425-555-0100" ],
3337 "displayName" : "MOD Administrator 1" ,
3438 "givenName" : "MOD" ,
3539 "jobTitle" : None ,
@@ -44,10 +48,12 @@ def first_page_data():
4448 ]
4549 }
4650
51+
4752@pytest .fixture
4853def second_page_data ():
4954 return {
50- "@odata.context" : "https://graph.microsoft.com/v1.0/$metadata#users" ,
55+ "@odata.context" :
56+ "https://graph.microsoft.com/v1.0/$metadata#users" ,
5157 "value" : [
5258 {
5359 "businessPhones" : [],
@@ -61,11 +67,8 @@ def second_page_data():
6167 "surname" : None ,
6268 "userPrincipalName" : "Adams@contoso.com" ,
6369 "id" : "6ea91a8d-e32e-41a1-b7bd-d2d185eed0e0"
64- },
65- {
66- "businessPhones" : [
67- "425-555-0100"
68- ],
70+ }, {
71+ "businessPhones" : ["425-555-0100" ],
6972 "displayName" : "MOD Administrator 2" ,
7073 "givenName" : "MOD" ,
7174 "jobTitle" : None ,
@@ -80,12 +83,36 @@ def second_page_data():
8083 ]
8184 }
8285
83- def test_handler_can_work (first_page_data , second_page_data ):
84- with requests_mock .Mocker () as m :
85- m .get ('https://graph.microsoft.com/v1.0/users' , json = first_page_data )
86- m .get ('https://graph.microsoft.com/v1.0/users?skip=2&page=10' , json = second_page_data )
8786
88- page_iterator = PageIterator (first_page_data , RequestAdapter ())
89- count = 0
90- page_iterator .iterate (lambda _ : count + 1 )
91- assert count == 4
87+ load_dotenv () # take environment variables from .env.
88+
89+ credential = ClientSecretCredential (
90+ os .getenv ('tenant_id' ), os .getenv ('client_id' ), os .getenv ('client_secret' )
91+ )
92+ auth_provider = AzureIdentityAuthenticationProvider (credential )
93+
94+ request_adapter = HttpxRequestAdapter (authentication_provider = auth_provider )
95+
96+
97+ def test_convert_to_page (first_page_data ): # pylint: disable=redefined-outer-name
98+
99+ page_iterator = PageIterator (first_page_data , request_adapter )
100+ first_page = page_iterator .convert_to_page (first_page_data )
101+ first_page .set_value (first_page_data ['value' ])
102+ first_page .odata_next_link = first_page_data ['@odata.next_link' ]
103+ assert isinstance (first_page , PageResult )
104+ assert first_page_data ['value' ] == first_page .value
105+ assert first_page_data ['@odata.next_link' ] == first_page .odata_next_link
106+
107+
108+ @pytest .mark .asyncio
109+ async def test_iterate ():
110+ # Mock the next method to return None after the first call
111+ with patch .object (PageIterator , 'next' , new_callable = AsyncMock ) as mock_next :
112+ mock_next .side_effect = [True , None ]
113+
114+ with patch .object (PageIterator , 'enumerate' , return_value = True ) as mock_enumerate :
115+ page_iterator = PageIterator (first_page_data , request_adapter )
116+ await page_iterator .iterate (lambda _ : True )
117+ assert mock_next .call_count == 2
118+ assert mock_enumerate .call_count == 2
0 commit comments