"""Test token model.""" from unittest.mock import MagicMock from botocore.exceptions import ClientError import pytest from podcast.connectors import sts from podcast.models import token from podcast.utils import exc @pytest.fixture def fixture_filename(): """Fixture to generate a filename.""" return 'unique_filename' @pytest.fixture def fixture_assume_role_error(): """Fixture for an STS ClientError.""" sts_error = { 'Error': { 'Code': 'AccessDeniedException', 'Message': 'Error assuming role' }, 'ResponseMetadata': { 'HTTPStatusCode': 403 } } return MagicMock(side_effect=ClientError(error_response=sts_error, operation_name='AssumeRole')) @pytest.fixture def fixture_assume_role(): """Fixture for an STS ClientError.""" sts_credentials = { 'Credentials': { 'SessionToken': 'a-token', 'AccessKeyId': 'fake-key', 'SecretAccessKey': 'fake-secret', 'Expiration': 3600 } } return MagicMock(return_value=sts_credentials) def test_get_s3_token_fails_no_sts(monkeypatch, fixture_filename): """Test get_s3_token fails when no sts connection.""" monkeypatch.setattr(sts, 'get_sts_client', MagicMock(return_value=None)) with pytest.raises(exc.OwsError) as err: token.get_s3_token(fixture_filename) assert err.value.status == 500 def test_get_s3_token_failure(monkeypatch, fixture_filename, fixture_assume_role_error): """Test get_s3_token fails when server error.""" sts_client = sts.get_sts_client() monkeypatch.setattr(sts_client, 'assume_role', fixture_assume_role_error) with pytest.raises(exc.OwsError) as err: token.get_s3_token(fixture_filename) assert err.value.status == 403 def test_get_s3_token(monkeypatch, fixture_filename, fixture_assume_role): """Test for getting a successful token.""" sts_client = sts.get_sts_client() monkeypatch.setattr(sts_client, 'assume_role', fixture_assume_role) result = token.get_s3_token(fixture_filename) assert result assert result == { 'token': 'a-token', 'aws_access_key_id': 'fake-key', 'aws_secret_access_key': 'fake-secret', 'expiration': '3600' }