66
77import pytest
88import requests
9- from vws import VWS
9+ from beartype import beartype
10+ from vws import VWS , VuMarkService
11+ from vws .exceptions .vws_exceptions import (
12+ InvalidInstanceIdError ,
13+ InvalidTargetTypeError ,
14+ )
15+ from vws .vumark_accept import VuMarkAccept
1016from vws_auth_tools import authorization_header , rfc_1123_date
1117
1218from mock_vws ._constants import ResultCodes
2026_SVG_START = b"<"
2127
2228
29+ @beartype
30+ def _make_vumark_service (
31+ * ,
32+ server_access_key : str ,
33+ server_secret_key : str ,
34+ ) -> VuMarkService :
35+ """Return a VuMark service client."""
36+ return VuMarkService (
37+ server_access_key = server_access_key ,
38+ server_secret_key = server_secret_key ,
39+ )
40+
41+
42+ @beartype
2343def _make_vumark_request (
2444 * ,
2545 server_access_key : str ,
@@ -66,31 +86,56 @@ class TestGenerateInstance:
6686 """Tests for the VuMark instance generation endpoint."""
6787
6888 @pytest .mark .parametrize (
69- argnames = ("accept" , "expected_content_type" , " expected_signature" ),
89+ argnames = ("accept" , "expected_signature" ),
7090 argvalues = [
71- pytest .param ("image/png" , "image/png" , _PNG_SIGNATURE , id = "png" ),
91+ pytest .param (VuMarkAccept . PNG , _PNG_SIGNATURE , id = "png" ),
7292 pytest .param (
73- "image/svg+xml" ,
74- "image/svg+xml" ,
93+ VuMarkAccept .SVG ,
7594 _SVG_START ,
7695 id = "svg" ,
7796 ),
7897 pytest .param (
79- "application/pdf" ,
80- "application/pdf" ,
98+ VuMarkAccept .PDF ,
8199 _PDF_SIGNATURE ,
82100 id = "pdf" ,
83101 ),
84102 ],
85103 )
86104 @staticmethod
87105 def test_generate_instance_format (
88- accept : str ,
89- expected_content_type : str ,
106+ accept : VuMarkAccept ,
90107 expected_signature : bytes ,
91108 vumark_vuforia_database : VuMarkCloudDatabase ,
92109 ) -> None :
93110 """A VuMark instance can be generated in the requested format."""
111+ vumark_client = _make_vumark_service (
112+ server_access_key = vumark_vuforia_database .server_access_key ,
113+ server_secret_key = vumark_vuforia_database .server_secret_key ,
114+ )
115+ vumark_bytes = vumark_client .generate_vumark_instance (
116+ target_id = vumark_vuforia_database .target_id ,
117+ instance_id = uuid4 ().hex ,
118+ accept = accept ,
119+ )
120+
121+ assert vumark_bytes .strip ().startswith (expected_signature )
122+ assert len (vumark_bytes ) > len (expected_signature )
123+
124+ @pytest .mark .parametrize (
125+ argnames = ("accept" , "expected_content_type" ),
126+ argvalues = [
127+ pytest .param ("image/png" , "image/png" , id = "png" ),
128+ pytest .param ("image/svg+xml" , "image/svg+xml" , id = "svg" ),
129+ pytest .param ("application/pdf" , "application/pdf" , id = "pdf" ),
130+ ],
131+ )
132+ @staticmethod
133+ def test_generate_instance_content_type_header (
134+ accept : str ,
135+ expected_content_type : str ,
136+ vumark_vuforia_database : VuMarkCloudDatabase ,
137+ ) -> None :
138+ """VuMark image responses include the expected content type."""
94139 response = _make_vumark_request (
95140 server_access_key = vumark_vuforia_database .server_access_key ,
96141 server_secret_key = vumark_vuforia_database .server_secret_key ,
@@ -104,8 +149,6 @@ def test_generate_instance_format(
104149 response .headers ["Content-Type" ].split (sep = ";" )[0 ]
105150 == expected_content_type
106151 )
107- assert response .content .strip ().startswith (expected_signature )
108- assert len (response .content ) > len (expected_signature )
109152
110153 @staticmethod
111154 def test_invalid_accept_header (
@@ -132,16 +175,21 @@ def test_empty_instance_id(
132175 vumark_vuforia_database : VuMarkCloudDatabase ,
133176 ) -> None :
134177 """An empty instance_id returns InvalidInstanceId."""
135- response = _make_vumark_request (
178+ vumark_client = _make_vumark_service (
136179 server_access_key = vumark_vuforia_database .server_access_key ,
137180 server_secret_key = vumark_vuforia_database .server_secret_key ,
138- target_id = vumark_vuforia_database .target_id ,
139- instance_id = "" ,
140- accept = "image/png" ,
141181 )
182+ with pytest .raises (expected_exception = InvalidInstanceIdError ) as exc :
183+ vumark_client .generate_vumark_instance (
184+ target_id = vumark_vuforia_database .target_id ,
185+ instance_id = "" ,
186+ accept = VuMarkAccept .PNG ,
187+ )
142188
143- assert response .status_code == HTTPStatus .UNPROCESSABLE_ENTITY
144- response_json = response .json ()
189+ assert (
190+ exc .value .response .status_code == HTTPStatus .UNPROCESSABLE_ENTITY
191+ )
192+ response_json = json .loads (s = exc .value .response .text )
145193 assert (
146194 response_json ["result_code" ]
147195 == ResultCodes .INVALID_INSTANCE_ID .value
@@ -154,9 +202,15 @@ def test_non_vumark_database(
154202 """Generating a VuMark instance for a target in a non-VuMark
155203 database returns InvalidTargetType.
156204 """
205+ server_access_key = vuforia_database .server_access_key
206+ server_secret_key = vuforia_database .server_secret_key
157207 vws_client = VWS (
158- server_access_key = vuforia_database .server_access_key ,
159- server_secret_key = vuforia_database .server_secret_key ,
208+ server_access_key = server_access_key ,
209+ server_secret_key = server_secret_key ,
210+ )
211+ vumark_client = _make_vumark_service (
212+ server_access_key = server_access_key ,
213+ server_secret_key = server_secret_key ,
160214 )
161215 image = make_image_file (
162216 file_format = "PNG" ,
@@ -171,15 +225,17 @@ def test_non_vumark_database(
171225 active_flag = True ,
172226 application_metadata = None ,
173227 )
174- response = _make_vumark_request (
175- server_access_key = vuforia_database .server_access_key ,
176- server_secret_key = vuforia_database .server_secret_key ,
177- target_id = target_id ,
178- instance_id = uuid4 ().hex ,
179- accept = "image/png" ,
228+ with pytest .raises (expected_exception = InvalidTargetTypeError ) as exc :
229+ vumark_client .generate_vumark_instance (
230+ target_id = target_id ,
231+ instance_id = uuid4 ().hex ,
232+ accept = VuMarkAccept .PNG ,
233+ )
234+
235+ assert (
236+ exc .value .response .status_code == HTTPStatus .UNPROCESSABLE_ENTITY
180237 )
181- assert response .status_code == HTTPStatus .UNPROCESSABLE_ENTITY
182- response_json = response .json ()
238+ response_json = json .loads (s = exc .value .response .text )
183239 assert (
184240 response_json ["result_code" ]
185241 == ResultCodes .INVALID_TARGET_TYPE .value
0 commit comments