import time from unittest.mock import patch import pytest from flask import Flask from fittrackee.oauth2.models import OAuth2Client, OAuth2Token from ..mixins import RandomMixin class OAuth2ModelTestCase(RandomMixin): def create_oauth2_client(self) -> OAuth2Client: oauth_client = OAuth2Client( id=self.random_int(), client_id=self.random_string(), client_id_issued_at=1653738796, ) oauth_client.set_client_metadata( { 'client_name': self.random_string(), 'client_description': self.random_string(), 'redirect_uris': [self.random_string()], 'client_uri': self.random_domain(), } ) return oauth_client class TestOAuth2ClientSerialize(OAuth2ModelTestCase): def test_it_returns_oauth_client(self, app: Flask) -> None: oauth_client = self.create_oauth2_client() serialized_oauth_client = oauth_client.serialize() assert serialized_oauth_client['client_id'] == oauth_client.client_id assert ( serialized_oauth_client['client_description'] == oauth_client.client_description ) assert 'client_secret' not in serialized_oauth_client assert ( serialized_oauth_client['issued_at'] == 'Sat, 28 May 2022 11:53:16 GMT' ) assert serialized_oauth_client['id'] == oauth_client.id assert serialized_oauth_client['name'] == oauth_client.client_name assert ( serialized_oauth_client['redirect_uris'] == oauth_client.redirect_uris ) assert serialized_oauth_client['scope'] == oauth_client.scope assert serialized_oauth_client['website'] == oauth_client.client_uri def test_it_returns_oauth_client_with_client_secret( self, app: Flask ) -> None: oauth_client = OAuth2Client( id=self.random_int(), client_id=self.random_string(), client_id_issued_at=self.random_int(), ) oauth_client.set_client_metadata( { 'client_name': self.random_string(), 'redirect_uris': [self.random_string()], 'client_uri': self.random_domain(), } ) serialized_oauth_client = oauth_client.serialize(with_secret=True) assert ( serialized_oauth_client['client_secret'] == oauth_client.client_secret ) class TestOAuth2Token(OAuth2ModelTestCase): @pytest.mark.parametrize( 'input_expiration,expected_status', [(1000, True), (0, False)] ) def test_it_returns_refresh_token_status( self, app: Flask, input_expiration: int, expected_status: bool ) -> None: oauth_client = self.create_oauth2_client() token = OAuth2Token( client_id=oauth_client.client_id, access_token=self.random_string(), refresh_token=self.random_string(), issued_at=int(time.time()), expires_in=input_expiration, ) assert token.is_refresh_token_active() is expected_status def test_it_returns_refresh_token_active_when_below_twice_expiration( self, app: Flask ) -> None: oauth_client = self.create_oauth2_client() issued_at = int(time.time()) expires_in = self.random_int() token = OAuth2Token( client_id=oauth_client.client_id, access_token=self.random_string(), refresh_token=self.random_string(), issued_at=int(time.time()), expires_in=expires_in, ) with patch( 'fittrackee.oauth2.models.time.time', return_value=(issued_at + expires_in * 2 - 1), ): assert token.is_refresh_token_active() is True def test_it_returns_refresh_token_inactive_when_token_revoked( self, app: Flask ) -> None: oauth_client = self.create_oauth2_client() token = OAuth2Token( client_id=oauth_client.client_id, access_token=self.random_string(), refresh_token=self.random_string(), issued_at=int(time.time()), access_token_revoked_at=int(time.time()), expires_in=1000, ) assert token.is_refresh_token_active() is False