1- from io import BytesIO
1+ from unittest . mock import MagicMock , patch
22
33from django .urls import reverse
44
5- from sentry .objectstore import get_preprod_session
65from sentry .testutils .cases import APITestCase
7- from sentry .testutils .skips import requires_objectstore
86
97
108class ProjectPreprodArtifactImageTest (APITestCase ):
@@ -26,12 +24,22 @@ def _get_url(self, image_id=None):
2624 args = [self .org .slug , self .project .slug , image_id ],
2725 )
2826
29- @requires_objectstore
30- def test_successful_image_retrieval_png (self ):
31- png_data = b"\x89 PNG\r \n \x1a \n " + b"fake png content" * 100
27+ def _create_mock_session (self , image_data , content_type ):
28+ """Create a mock object store session that returns the given data and content type."""
29+ mock_result = MagicMock ()
30+ mock_result .payload .read .return_value = image_data
31+ mock_result .metadata .content_type = content_type
32+
33+ mock_session = MagicMock ()
34+ mock_session .get .return_value = mock_result
35+
36+ return mock_session
3237
33- client = get_preprod_session (self .org .id , self .project .id )
34- client .put (BytesIO (png_data ), key = f"{ self .org .id } /{ self .project .id } /test-image-123" )
38+ @patch ("sentry.preprod.api.endpoints.project_preprod_artifact_image.get_preprod_session" )
39+ def test_successful_image_retrieval_png (self , mock_get_session ):
40+ png_data = b"\x89 PNG\r \n \x1a \n " + b"fake png content" * 100
41+ mock_session = self ._create_mock_session (png_data , "image/png" )
42+ mock_get_session .return_value = mock_session
3543
3644 url = self ._get_url ()
3745 response = self .client .get (
@@ -41,13 +49,14 @@ def test_successful_image_retrieval_png(self):
4149 assert response .status_code == 200
4250 assert response .content == png_data
4351 assert response ["Content-Type" ] == "image/png"
52+ mock_get_session .assert_called_once_with (self .org .id , self .project .id )
53+ mock_session .get .assert_called_once_with (f"{ self .org .id } /{ self .project .id } /{ self .image_id } " )
4454
45- @requires_objectstore
46- def test_successful_image_retrieval_jpeg (self ):
55+ @patch ( "sentry.preprod.api.endpoints.project_preprod_artifact_image.get_preprod_session" )
56+ def test_successful_image_retrieval_jpeg (self , mock_get_session ):
4757 jpeg_data = b"\xff \xd8 \xff " + b"fake jpeg content" * 100
48-
49- client = get_preprod_session (self .org .id , self .project .id )
50- client .put (BytesIO (jpeg_data ), key = f"{ self .org .id } /{ self .project .id } /test-image-123" )
58+ mock_session = self ._create_mock_session (jpeg_data , "image/jpeg" )
59+ mock_get_session .return_value = mock_session
5160
5261 url = self ._get_url ()
5362 response = self .client .get (
@@ -57,13 +66,14 @@ def test_successful_image_retrieval_jpeg(self):
5766 assert response .status_code == 200
5867 assert response .content == jpeg_data
5968 assert response ["Content-Type" ] == "image/jpeg"
69+ mock_get_session .assert_called_once_with (self .org .id , self .project .id )
70+ mock_session .get .assert_called_once_with (f"{ self .org .id } /{ self .project .id } /{ self .image_id } " )
6071
61- @requires_objectstore
62- def test_successful_image_retrieval_webp (self ):
72+ @patch ( "sentry.preprod.api.endpoints.project_preprod_artifact_image.get_preprod_session" )
73+ def test_successful_image_retrieval_webp (self , mock_get_session ):
6374 webp_data = b"RIFF" + b"1234" + b"WEBP" + b"fake webp content" * 100
64-
65- client = get_preprod_session (self .org .id , self .project .id )
66- client .put (BytesIO (webp_data ), key = f"{ self .org .id } /{ self .project .id } /test-image-123" )
75+ mock_session = self ._create_mock_session (webp_data , "image/webp" )
76+ mock_get_session .return_value = mock_session
6777
6878 url = self ._get_url ()
6979 response = self .client .get (
@@ -73,38 +83,14 @@ def test_successful_image_retrieval_webp(self):
7383 assert response .status_code == 200
7484 assert response .content == webp_data
7585 assert response ["Content-Type" ] == "image/webp"
86+ mock_get_session .assert_called_once_with (self .org .id , self .project .id )
87+ mock_session .get .assert_called_once_with (f"{ self .org .id } /{ self .project .id } /{ self .image_id } " )
7688
77- def test_successful_image_retrieval_heic (self ):
78- heic_data = b"RIFF" + b"ftypheic" + b"fake heic content" * 100
79-
80- client = get_preprod_session (self .org .id , self .project .id )
81- client .put (BytesIO (heic_data ), key = f"{ self .org .id } /{ self .project .id } /test-image-123" )
82-
83- url = self ._get_url ()
84- response = self .client .get (
85- url , format = "json" , HTTP_AUTHORIZATION = f"Bearer { self .api_token .token } "
86- )
87-
88- assert response .status_code == 200
89- assert response .content == heic_data
90- assert response ["Content-Type" ] == "image/heic"
91-
92- @requires_objectstore
93- def test_image_not_found (self ):
94- url = self ._get_url ()
95- response = self .client .get (
96- url , format = "json" , HTTP_AUTHORIZATION = f"Bearer { self .api_token .token } "
97- )
98-
99- assert response .status_code == 404
100- assert response .content == b'{"error":"Not found"}'
101-
102- @requires_objectstore
103- def test_unknown_image_format (self ):
89+ @patch ("sentry.preprod.api.endpoints.project_preprod_artifact_image.get_preprod_session" )
90+ def test_unknown_image_format (self , mock_get_session ):
10491 unknown_data = b"unknown binary data" * 50
105-
106- client = get_preprod_session (self .org .id , self .project .id )
107- client .put (BytesIO (unknown_data ), key = f"{ self .org .id } /{ self .project .id } /test-image-123" )
92+ mock_session = self ._create_mock_session (unknown_data , "application/octet-stream" )
93+ mock_get_session .return_value = mock_session
10894
10995 url = self ._get_url ()
11096 response = self .client .get (
@@ -114,6 +100,8 @@ def test_unknown_image_format(self):
114100 assert response .status_code == 200
115101 assert response .content == unknown_data
116102 assert response ["Content-Type" ] == "application/octet-stream"
103+ mock_get_session .assert_called_once_with (self .org .id , self .project .id )
104+ mock_session .get .assert_called_once_with (f"{ self .org .id } /{ self .project .id } /{ self .image_id } " )
117105
118106 def test_endpoint_requires_project_access (self ):
119107 other_user = self .create_user ()
0 commit comments