|
3 | 3 | from unittest.mock import MagicMock, patch |
4 | 4 |
|
5 | 5 | import pytest |
| 6 | +from pytest_django.fixtures import SettingsWrapper |
6 | 7 |
|
7 | | -from canvas_sdk.v1.data.utils import generate_mrn, quantize |
| 8 | +from canvas_sdk.v1.data.utils import generate_mrn, presigned_url, quantize |
8 | 9 |
|
9 | 10 |
|
10 | 11 | @pytest.mark.parametrize( |
@@ -93,3 +94,59 @@ def test_raises_runtime_error_after_max_attempts(mock_patient: MagicMock) -> Non |
93 | 94 | generate_mrn() |
94 | 95 |
|
95 | 96 | assert mock_patient.objects.filter.call_count == 100 |
| 97 | + |
| 98 | + |
| 99 | +def test_presigned_url_generates_valid_url(settings: SettingsWrapper) -> None: |
| 100 | + """Test that presigned_url generates a valid URL with expected components.""" |
| 101 | + settings.AWS_ACCESS_KEY_ID = "test-access-key" |
| 102 | + settings.AWS_SECRET_ACCESS_KEY = "test-secret-key" |
| 103 | + settings.MEDIA_S3_BUCKET_NAME = "test-bucket" |
| 104 | + settings.AWS_REGION = "us-west-2" |
| 105 | + |
| 106 | + url = presigned_url("path/to/file.pdf") |
| 107 | + |
| 108 | + assert url.startswith("https://test-bucket.s3.us-west-2.amazonaws.com/") |
| 109 | + assert "/path/to/file.pdf?" in url |
| 110 | + assert "X-Amz-Algorithm=AWS4-HMAC-SHA256" in url |
| 111 | + assert "X-Amz-Credential=" in url |
| 112 | + assert "X-Amz-Date=" in url |
| 113 | + assert "X-Amz-Expires=3600" in url |
| 114 | + assert "X-Amz-SignedHeaders=host" in url |
| 115 | + assert "X-Amz-Signature=" in url |
| 116 | + |
| 117 | + |
| 118 | +def test_presigned_url_with_custom_expiry(settings: SettingsWrapper) -> None: |
| 119 | + """Test that presigned_url respects custom expiry time.""" |
| 120 | + settings.AWS_ACCESS_KEY_ID = "test-access-key" |
| 121 | + settings.AWS_SECRET_ACCESS_KEY = "test-secret-key" |
| 122 | + settings.MEDIA_S3_BUCKET_NAME = "test-bucket" |
| 123 | + settings.AWS_REGION = "us-west-2" |
| 124 | + |
| 125 | + url = presigned_url("path/to/file.pdf", expires_in=7200) |
| 126 | + |
| 127 | + assert "X-Amz-Expires=7200" in url |
| 128 | + |
| 129 | + |
| 130 | +def test_presigned_url_removes_bucket_prefix(settings: SettingsWrapper) -> None: |
| 131 | + """Test that presigned_url removes bucket prefix from key.""" |
| 132 | + settings.AWS_ACCESS_KEY_ID = "test-access-key" |
| 133 | + settings.AWS_SECRET_ACCESS_KEY = "test-secret-key" |
| 134 | + settings.MEDIA_S3_BUCKET_NAME = "test-bucket" |
| 135 | + settings.AWS_REGION = "us-west-2" |
| 136 | + |
| 137 | + url = presigned_url("test-bucket/path/to/file.pdf") |
| 138 | + |
| 139 | + # The bucket prefix should be removed, so path should be /path/to/file.pdf |
| 140 | + assert "/path/to/file.pdf?" in url |
| 141 | + assert "/test-bucket/path/to/file.pdf?" not in url |
| 142 | + |
| 143 | + |
| 144 | +def test_presigned_url_raises_error_without_credentials(settings: SettingsWrapper) -> None: |
| 145 | + """Test that presigned_url raises ValueError when AWS credentials are missing.""" |
| 146 | + settings.AWS_ACCESS_KEY_ID = "" |
| 147 | + settings.AWS_SECRET_ACCESS_KEY = "" |
| 148 | + settings.MEDIA_S3_BUCKET_NAME = "test-bucket" |
| 149 | + settings.AWS_REGION = "us-west-2" |
| 150 | + |
| 151 | + with pytest.raises(ValueError, match="AWS credentials not configured"): |
| 152 | + presigned_url("path/to/file.pdf") |
0 commit comments