"""Cloudfront logic tests.""" import base64 import json from unittest.mock import MagicMock, call from pytest_mock import MockerFixture from video.logic import cloudfront as cloudfront_logic def test_set_signed_cookies(mocker: MockerFixture) -> None: """Test set signed cookies.""" mock_generate_policy: MagicMock = mocker.patch.object( cloudfront_logic, "generate_policy", return_value=(b'{"statement": ""}', "POLICY_BASE64"), ) mock_signer = MagicMock(name="generate_cookies") mock_signer.generate_cookies.return_value = { "CloudFront-Key-Pair-Id": "CLOUDFRONT_KEY_PAIR_ID", "CloudFront-Policy": "POLICY_BASE64", "CloudFront-Signature": "SIGNATURE_BASE64", } mocker.patch.object(cloudfront_logic, "Signer", return_value=mock_signer) mock_response = MagicMock() domain = "theorchard.io" resource = "https://test-video-thumbnails.theorchard.io/*" expire_at = 1000 cloudfront_logic.set_signed_cookies(mock_response, domain, resource, expire_at) mock_generate_policy.assert_called_once_with(resource, expire_at) mock_response.set_cookie.assert_has_calls( [ call( "CloudFront-Key-Pair-Id", "CLOUDFRONT_KEY_PAIR_ID", domain=domain, secure=True, httponly=True, ), call( "CloudFront-Policy", "POLICY_BASE64", domain=domain, secure=True, httponly=True, ), call( "CloudFront-Signature", "SIGNATURE_BASE64", domain=domain, secure=True, httponly=True, ), ] ) def test_get_signed_url(mocker: MockerFixture) -> None: """Test get signed url.""" mock_generate_policy2: MagicMock = mocker.patch.object( cloudfront_logic, "generate_policy", return_value=(b"POLICY_BYTES", "POLICY_BASE64"), ) mocker.patch.object( cloudfront_logic, "rsa_signer", return_value=base64.b64encode("SIGNATURE_BASE64".encode()), ) url = "https://test-video-thumbnails.theorchard.io/original-size/1/1.jpg" expire_at = 1000 result = cloudfront_logic.get_signed_url(url, expire_at) mock_generate_policy2.assert_called_once_with(url, expire_at) assert result == ( "https://test-video-thumbnails.theorchard.io" "/original-size/1/1.jpg" "?Policy=UE9MSUNZX0JZVEVT" "&Signature=VTBsSFRrRlVWVkpGWDBKQlUwVTJOQT09" "&Key-Pair-Id=CLOUDFRONT_KEY_PAIR_ID" ) def test_generate_policy(mocker: MockerFixture) -> None: """Test generate policy.""" resource = "https://test-video-thumbnails.theorchard.io/*" expire_at = 1000 expected_policy = { "Statement": [ { "Resource": resource, "Condition": {"DateLessThan": {"AWS:EpochTime": expire_at}}, } ] } expected_policy_bytes = json.dumps(expected_policy, separators=(",", ":")).encode( "utf-8" ) mocker.patch.object(base64, "b64encode", return_value=b"POLICY_BASE64") policy_bytes, policy_base64 = cloudfront_logic.generate_policy(resource, expire_at) assert policy_bytes == expected_policy_bytes assert policy_base64 == "POLICY_BASE64"