33'''
44import unittest
55import os
6- from skyflow .vault ._detokenize import getDetokenizeRequestBody , createDetokenizeResponseBody
6+ from skyflow .vault ._detokenize import getDetokenizeRequestBody , createDetokenizeResponseBody , getBulkDetokenizeRequestBody
77from skyflow .errors ._skyflow_errors import SkyflowError , SkyflowErrorCodes , SkyflowErrorMessages
88from skyflow .vault ._client import Client , Configuration
99from skyflow .service_account import generate_bearer_token
10- from skyflow .vault ._config import RedactionType
10+ from skyflow .vault ._config import DetokenizeOptions , RedactionType
1111from dotenv import dotenv_values
1212import warnings
1313
@@ -115,32 +115,87 @@ def testDetokenizeRedactionInvalidType(self):
115115 def testResponseBodySuccess (self ):
116116 response = {"records" : [{"token" : "abc" , "value" : "secret" }]}
117117 self .add_mock_response (response , 200 )
118- res , partial = createDetokenizeResponseBody (self .mocked_futures )
118+ res , partial = createDetokenizeResponseBody (self .data , self . mocked_futures , DetokenizeOptions () )
119119 self .assertEqual (partial , False )
120- self .assertEqual (res , {"records" : response ["records" ], "errors" : []})
120+ self .assertIn ("records" , res )
121+ self .assertNotIn ("errors" , res )
122+ self .assertEqual (len (res ["records" ]), 1 )
123+ self .assertEqual (res , {"records" : response ["records" ]})
121124
122125 def testResponseBodyPartialSuccess (self ):
123126 success_response = {"records" : [{"token" : "abc" , "value" : "secret" }]}
124127 error_response = {"error" : {"http_code" : 404 , "message" : "not found" }}
125128 self .add_mock_response (success_response , 200 )
126129 self .add_mock_response (error_response , 404 )
127- res , partial = createDetokenizeResponseBody (self .mocked_futures )
130+
131+ detokenizeRecords = {"records" : [self .tokenField , self .tokenField ]}
132+
133+ res , partial = createDetokenizeResponseBody (detokenizeRecords , self .mocked_futures , DetokenizeOptions ())
128134 self .assertTrue (partial )
129- self .assertEqual (res ["records" ], success_response ["records" ])
135+
136+ records = res ["records" ]
137+ self .assertIsNotNone (records )
138+ self .assertEqual (len (records ), 1 )
139+ self .assertEqual (records , success_response ["records" ])
140+
130141 errors = res ["errors" ]
131-
132142 self .assertIsNotNone (errors )
133143 self .assertEqual (len (errors ), 1 )
134144 self .assertEqual (errors [0 ]["error" ]["code" ],
135145 error_response ["error" ]["http_code" ])
136146 self .assertEqual (
137147 errors [0 ]["error" ]["description" ], error_response ["error" ]["message" ])
148+
149+ def testResponseBodyFailure (self ):
150+ error_response = {"error" : {"http_code" : 404 , "message" : "not found" }}
151+ self .add_mock_response (error_response , 404 )
152+
153+ res , partial = createDetokenizeResponseBody (self .data , self .mocked_futures , DetokenizeOptions ())
154+ self .assertFalse (partial )
155+
156+ self .assertNotIn ("records" , res )
157+ errors = res ["errors" ]
158+ self .assertIsNotNone (errors )
159+ self .assertEqual (len (errors ), 1 )
160+ self .assertEqual (errors [0 ]["error" ]["code" ],
161+ error_response ["error" ]["http_code" ])
162+ self .assertEqual (
163+ errors [0 ]["error" ]["description" ], error_response ["error" ]["message" ])
164+
165+ def testResponseBodySuccessWithContinueOnErrorAsFalse (self ):
166+ response = {
167+ "records" : [
168+ {"token" : "abc" , "value" : "secret1" },
169+ {"token" : "def" , "value" : "secret2" }
170+ ]
171+ }
172+ self .add_mock_response (response , 200 )
173+ res , partial = createDetokenizeResponseBody (self .data , self .mocked_futures , DetokenizeOptions (False ))
174+ self .assertEqual (partial , False )
175+ self .assertIn ("records" , res )
176+ self .assertNotIn ("errors" , res )
177+ self .assertEqual (len (res ["records" ]), 2 )
178+ self .assertEqual (res , {"records" : response ["records" ]})
179+
180+ def testResponseBodyFailureWithContinueOnErrorAsFalse (self ):
181+ error_response = {"error" : {"http_code" : 404 , "message" : "not found" }}
182+ self .add_mock_response (error_response , 404 )
183+
184+ res , partial = createDetokenizeResponseBody (self .data , self .mocked_futures , DetokenizeOptions (False ))
185+ self .assertFalse (partial )
186+
187+ self .assertNotIn ("records" , res )
188+ errors = res ["errors" ]
189+ self .assertIsNotNone (errors )
190+ self .assertEqual (len (errors ), 1 )
191+ self .assertEqual (errors [0 ]["error" ]["code" ], error_response ["error" ]["http_code" ])
192+ self .assertEqual (errors [0 ]["error" ]["description" ], error_response ["error" ]["message" ])
138193
139194 def testResponseNotJson (self ):
140195 response = "not a valid json" .encode ()
141196 self .add_mock_response (response , 200 , encode = False )
142197 try :
143- createDetokenizeResponseBody (self .mocked_futures )
198+ createDetokenizeResponseBody (self .data , self . mocked_futures , DetokenizeOptions () )
144199 except SkyflowError as error :
145200 expectedError = SkyflowErrorMessages .RESPONSE_NOT_JSON
146201 self .assertEqual (error .code , 200 )
@@ -181,4 +236,30 @@ def testRequestBodyWithInValidRedaction(self):
181236 except SkyflowError as error :
182237 self .assertTrue (error )
183238 self .assertEqual (error .code , SkyflowErrorCodes .INVALID_INPUT .value )
184- self .assertEqual (error .message , SkyflowErrorMessages .INVALID_REDACTION_TYPE .value % str (type (data ["redaction" ])))
239+ self .assertEqual (error .message , SkyflowErrorMessages .INVALID_REDACTION_TYPE .value % str (type (data ["redaction" ])))
240+
241+ def testGetBulkDetokenizeRequestBody (self ):
242+ expectedOutput = {
243+ "detokenizationParameters" : [
244+ {
245+ "token" : self .testToken ,
246+ "redaction" : "REDACTED"
247+ },
248+ {
249+ "token" : self .testToken ,
250+ "redaction" : "REDACTED"
251+ },
252+ ]
253+ }
254+ data = {
255+ "token" : self .testToken ,
256+ "redaction" : RedactionType .REDACTED
257+ }
258+ try :
259+ requestBody = getBulkDetokenizeRequestBody ([data , data ])
260+ self .assertIn ("detokenizationParameters" , requestBody )
261+ self .assertEqual (len (requestBody ["detokenizationParameters" ]), 2 )
262+ self .assertEqual (expectedOutput , requestBody )
263+ except SkyflowError as e :
264+ self .fail ('Should not have thrown an error' )
265+
0 commit comments