11# Copyright 2021 The MathWorks, Inc.
22
3- import pytest , asyncio , secrets , datetime , random , json
3+ import pytest , asyncio , secrets , datetime , random , json , re
44from unittest .mock import patch
55from jupyter_matlab_proxy import app
66from jupyter_matlab_proxy .util import mw
@@ -22,13 +22,14 @@ def mwa_api_data_fixture():
2222 The namedtuple contains values required for MW authentication
2323
2424 Returns:
25- namedtuple: A named tuple containing mwa, mhlm end-point URLs, source_id, identity_token, access_token and matlab_release.
25+ namedtuple: A named tuple containing mwa, mhlm end-point URLs (with regex patterns) , source_id, identity_token, access_token and matlab_release.
2626 """
2727
2828 mwa_api_endpoint = "https://login.mathworks.com/authenticationws/service/v4"
29- mhlm_api_endpoint = (
30- "https://licensing.mathworks.com/mls/service/v1/entitlement/list" ,
31- )
29+ mwa_api_endpoint_pattern = re .compile ("^" + mwa_api_endpoint )
30+ mhlm_api_endpoint = "https://licensing.mathworks.com/mls/service/v1/entitlement/list"
31+ mhlm_api_endpoint_pattern = re .compile ("^" + mhlm_api_endpoint )
32+
3233 identity_token = secrets .token_urlsafe (324 )
3334 source_id = secrets .token_urlsafe (21 )
3435 access_token = secrets .token_urlsafe (22 )
@@ -38,7 +39,9 @@ def mwa_api_data_fixture():
3839 "mwa_api_variables" ,
3940 [
4041 "mwa_api_endpoint" ,
42+ "mwa_api_endpoint_pattern" ,
4143 "mhlm_api_endpoint" ,
44+ "mhlm_api_endpoint_pattern" ,
4245 "identity_token" ,
4346 "source_id" ,
4447 "access_token" ,
@@ -48,7 +51,9 @@ def mwa_api_data_fixture():
4851
4952 variables = mwa_api_variables (
5053 mwa_api_endpoint ,
54+ mwa_api_endpoint_pattern ,
5155 mhlm_api_endpoint ,
56+ mhlm_api_endpoint_pattern ,
5257 identity_token ,
5358 source_id ,
5459 access_token ,
@@ -118,9 +123,7 @@ def mock_aiohttp_client_session():
118123 yield m
119124
120125
121- async def test_fetch_access_token (
122- mwa_api_data , fetch_access_token_valid_json , mock_response
123- ):
126+ async def test_fetch_access_token (mwa_api_data , fetch_access_token_valid_json , mock_response ):
124127 """Test to check mw.fetch_access_token method returns valid json response.
125128
126129 The mock_response fixture mocks the aiohttp.ClientSession().post() method to return a custom HTTP response.
@@ -131,11 +134,10 @@ async def test_fetch_access_token(
131134 mock_response: Pytest fixture which yields a aioresponses() object for mocking HTTP response
132135 """
133136 json_data = fetch_access_token_valid_json
134-
135- url = f"{ mwa_api_data .mwa_api_endpoint } /tokens/access?tokenString={ mwa_api_data .identity_token } &type=MWAS&sourceId={ mwa_api_data .source_id } "
136137 payload = dict (accessTokenString = json_data ["accessTokenString" ])
137138
138- mock_response .post (url , payload = payload )
139+ url_pattern = mwa_api_data .mwa_api_endpoint_pattern
140+ mock_response .post (url_pattern , payload = payload )
139141
140142 resp = await mw .fetch_access_token (
141143 mwa_api_data .mwa_api_endpoint ,
@@ -155,10 +157,10 @@ async def test_fetch_access_token_licensing_error(mwa_api_data, mock_response):
155157 mwa_api_data (namedtuple): A pytest fixture which returns a namedtuple containing values for MW authentication
156158 """
157159
158- url = f" { mwa_api_data .mwa_api_endpoint } /tokens/access?tokenString= { mwa_api_data . identity_token } &type=MWAS&sourceId= { mwa_api_data . source_id } "
160+ url_pattern = mwa_api_data .mwa_api_endpoint_pattern
159161
160162 mock_response .post (
161- url , exception = exceptions .OnlineLicensingError ("Communication failed" )
163+ url_pattern , exception = exceptions .OnlineLicensingError ("Communication failed" )
162164 )
163165
164166 with pytest .raises (exceptions .OnlineLicensingError ):
@@ -176,11 +178,13 @@ async def test_fetch_expand_token_licensing_error(mock_response, mwa_api_data):
176178 mock_response: Pytest fixture which yields a aioresponses() object for mocking HTTP response
177179 mwa_api_data (namedtuple): A pytest fixture which returns a namedtuple containing values for MW authentication
178180 """
179- url = f"{ mwa_api_data .mwa_api_endpoint } /tokens?tokenString={ mwa_api_data .identity_token } &tokenPolicyName=R1&sourceId={ mwa_api_data .source_id } "
181+
182+ url_pattern = mwa_api_data .mwa_api_endpoint_pattern
180183
181184 mock_response .post (
182- url , exception = exceptions .OnlineLicensingError ("Communication failed" )
185+ url_pattern , exception = exceptions .OnlineLicensingError ("Communication failed" )
183186 )
187+
184188 with pytest .raises (exceptions .OnlineLicensingError ):
185189 resp = await mw .fetch_expand_token (
186190 mwa_api_data .mwa_api_endpoint ,
@@ -220,9 +224,7 @@ def fetch_expand_token_valid_json_fixture():
220224 return json_data
221225
222226
223- async def test_fetch_expand_token (
224- mock_response , fetch_expand_token_valid_json , mwa_api_data
225- ):
227+ async def test_fetch_expand_token (mock_response , fetch_expand_token_valid_json , mwa_api_data ):
226228 """Test to check if mw.fetch_expand_token returns a correct json response
227229
228230 mock_response is used to mock ClientSession.post method to return a HTTP Response containing a valid json response.
@@ -232,7 +234,8 @@ async def test_fetch_expand_token(
232234 mwa_api_data (namedtuple): A namedtuple which contains info related to mwa.
233235 """
234236 json_data = fetch_expand_token_valid_json
235- url = f"{ mwa_api_data .mwa_api_endpoint } /tokens?tokenString={ mwa_api_data .identity_token } &tokenPolicyName=R1&sourceId={ mwa_api_data .source_id } "
237+
238+ url_pattern = mwa_api_data .mwa_api_endpoint_pattern
236239
237240 referenceDetail = dict (
238241 firstName = json_data ["referenceDetail" ]["firstName" ],
@@ -242,11 +245,9 @@ async def test_fetch_expand_token(
242245 referenceId = json_data ["referenceDetail" ]["referenceId" ],
243246 )
244247
245- payload = dict (
246- expirationDate = json_data ["expirationDate" ], referenceDetail = referenceDetail
247- )
248+ payload = dict (expirationDate = json_data ["expirationDate" ], referenceDetail = referenceDetail )
248249
249- mock_response .post (url , payload = payload )
250+ mock_response .post (url_pattern , payload = payload )
250251
251252 resp = await mw .fetch_expand_token (
252253 mwa_api_data .mwa_api_endpoint ,
@@ -266,10 +267,10 @@ async def test_fetch_entitlements_licensing_error(mock_response, mwa_api_data):
266267 mock_response: Pytest fixture which yields a aioresponses() object for mocking HTTP response
267268 mwa_api_data (namedtuple): A namedtuple which contains info related to mwa.
268269 """
269- url = f" { mwa_api_data .mhlm_api_endpoint } ?token= { mwa_api_data . access_token } &release= { mwa_api_data . matlab_release } &coreProduct=ML&context=jupyter&excludeExpired=true"
270+ url_pattern = mwa_api_data .mhlm_api_endpoint_pattern
270271
271272 mock_response .post (
272- url , exception = exceptions .OnlineLicensingError ("Communication Error" )
273+ url_pattern , exception = exceptions .OnlineLicensingError ("Communication Error" )
273274 )
274275
275276 with pytest .raises (exceptions .OnlineLicensingError ):
@@ -325,9 +326,9 @@ async def test_fetch_entitlements_entitlement_error(
325326 mwa_api_data (namedtuple): A namedtuple which contains info related to mwa.
326327 invalid_entitlements (String): String containing invalid entitlements
327328 """
328- url = f" { mwa_api_data .mhlm_api_endpoint } ?token= { mwa_api_data . access_token } &release= { mwa_api_data . matlab_release } &coreProduct=ML&context=jupyter&excludeExpired=true"
329+ url_pattern = mwa_api_data .mhlm_api_endpoint_pattern
329330
330- mock_response .post (url , body = invalid_entitlements )
331+ mock_response .post (url_pattern , body = invalid_entitlements )
331332
332333 with pytest .raises (exceptions .EntitlementError ):
333334 resp = await mw .fetch_entitlements (
@@ -371,9 +372,9 @@ async def test_fetch_entitlements(mock_response, mwa_api_data, valid_entitlement
371372 valid_entitlements (String): String containing valid entitlements as a response.
372373 """
373374
374- url = f" { mwa_api_data .mhlm_api_endpoint } ?token= { mwa_api_data . access_token } &release= { mwa_api_data . matlab_release } &coreProduct=ML&context=jupyter&excludeExpired=true"
375+ url_pattern = mwa_api_data .mhlm_api_endpoint_pattern
375376
376- mock_response .post (url , body = valid_entitlements )
377+ mock_response .post (url_pattern , body = valid_entitlements )
377378
378379 resp = await mw .fetch_entitlements (
379380 mwa_api_data .mhlm_api_endpoint ,
@@ -447,3 +448,14 @@ def test_parse_other_error():
447448 actual_output = mw .parse_other_error (logs )
448449
449450 assert isinstance (actual_output , expected_output )
451+
452+
453+ def test_range_matlab_connector_ports ():
454+ """This test checks if the generator mw.range _matlab_connector_ports()
455+ yields consecutive port numbers.
456+ """
457+ port_range = mw .range_matlab_connector_ports ()
458+ first_port = next (port_range )
459+ second_port = next (port_range )
460+
461+ assert first_port + 1 == second_port
0 commit comments