def test_basic_encoding(): class Request: path_info = '/myURL/path/' method = 'POST' body = json.dumps({'key': 'value'}).encode("UTF-8") request = Request() obj = BasicKeyEncoder() enc_key = obj.encode_key(request, 'MyKey') assert enc_key == 'da44e9b4dd5bc8e7853a43c8e8f2d2c2de4394f6614ab37dd5507b6f5988aac4'
def test_basic_encoding(): class Request: path_info = "/myURL/path/" method = "POST" body = json.dumps({"key": "value"}).encode("UTF-8") request = Request() obj = BasicKeyEncoder() enc_key = obj.encode_key(request, "MyKey") assert enc_key == "da44e9b4dd5bc8e7853a43c8e8f2d2c2de4394f6614ab37dd5507b6f5988aac4"
def test_basic_encoder_null_key(): class Request: path_info = "/myURL/path/" method = "POST" body = json.dumps({"key": "value"}).encode("UTF-8") request = Request() obj = BasicKeyEncoder() with pytest.raises(MissingIdempotencyKeyError) as e_info: obj.encode_key(request, None) assert e_info.value.args[0] == "Idempotency key cannot be None."
def test_basic_encoder_null_key(): class Request: path_info = '/myURL/path/' method = 'POST' body = json.dumps({'key': 'value'}).encode("UTF-8") request = Request() obj = BasicKeyEncoder() with pytest.raises(MissingIdempotencyKeyError) as e_info: obj.encode_key(request, None) assert e_info.value.args[0] == 'Idempotency key cannot be None.'
def test_middleware_duplicate_request(self, client): voucher_data = {"id": 1, "name": "myvoucher0", "internal_name": "myvoucher0"} response = client.post( self.urls["create"], voucher_data, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key, ) assert status.HTTP_201_CREATED == response.status_code response2 = client.post( self.urls["create"], voucher_data, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key, ) assert response2.status_code == status.HTTP_409_CONFLICT request = response2.wsgi_request assert request.idempotency_key_exists is True assert request.idempotency_key_exempt is False assert request.idempotency_key_manual is False assert request.idempotency_key_encoded_key == BasicKeyEncoder().encode_key( request, self.the_key )
def test_middleware_storage_cache_name_provides_default_name(self, client): """ Tests @idempotency_key(cache_name='FiveMinuteCache') decorator """ caches["FiveMinuteCache"].clear() voucher_data = {"id": 1, "name": "myvoucher0", "internal_name": "myvoucher0"} response = client.post( self.urls["create"], voucher_data, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key, ) assert response.status_code == status.HTTP_201_CREATED response2 = client.post( self.urls["create"], voucher_data, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key, ) assert response2.status_code == status.HTTP_409_CONFLICT request = response2.wsgi_request assert request.idempotency_key_exists is True assert request.idempotency_key_response == response2 assert request.idempotency_key_exempt is False assert request.idempotency_key_manual is False assert request.idempotency_key_encoded_key == BasicKeyEncoder().encode_key( request, self.the_key ) assert request.idempotency_key_cache_name == "FiveMinuteCache"
def test_middleware_custom_storage(self, client): """ In this test to prove the new custom storage class is being used by creating one that does not to store any information. Therefore a 409 conflict should never occur and the key will never exist. """ voucher_data = {"id": 1, "name": "myvoucher0", "internal_name": "myvoucher0"} response = client.post( self.urls["create"], voucher_data, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key, ) assert status.HTTP_201_CREATED == response.status_code response2 = client.post( self.urls["create"], voucher_data, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key, ) assert response2.status_code == status.HTTP_201_CREATED request = response2.wsgi_request assert request.idempotency_key_exists is False assert request.idempotency_key_exempt is False assert request.idempotency_key_manual is False assert request.idempotency_key_encoded_key == BasicKeyEncoder().encode_key( request, self.the_key )
def test_middleware_duplicate_request_manual_override(self, client): voucher_data = {"id": 1, "name": "myvoucher0", "internal_name": "myvoucher0"} response = client.post( self.urls["create-manual"], voucher_data, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key, ) assert status.HTTP_201_CREATED == response.status_code response2 = client.post( self.urls["create-manual"], voucher_data, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key, ) # The view code forces a 200 OK to be returned if this is a repeated request. assert response2.status_code == status.HTTP_200_OK request = response2.wsgi_request assert request.idempotency_key_exists is True assert request.idempotency_key_exempt is False assert request.idempotency_key_manual is True assert request.idempotency_key_encoded_key == BasicKeyEncoder().encode_key( request, self.the_key )
def test_store_on_statuses_does_store(self, client, settings): settings.IDEMPOTENCY_KEY = { 'STORAGE': { 'STORE_ON_STATUSES': [status.HTTP_201_CREATED] }, } voucher_data = { 'id': 1, 'name': 'myvoucher0', 'internal_name': 'myvoucher0', } response = client.post(self.urls['create'], voucher_data, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key) assert response.status_code == status.HTTP_201_CREATED response2 = client.post(self.urls['create'], voucher_data, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key) assert response2.status_code == status.HTTP_409_CONFLICT request = response2.wsgi_request assert request.idempotency_key_exists is True assert request.idempotency_key_response == response assert request.idempotency_key_exempt is False assert request.idempotency_key_manual is False assert request.idempotency_key_encoded_key == BasicKeyEncoder( ).encode_key(request, self.the_key)
def test_middleware_cache_storage(self, client, settings): """ Test Django cache storage """ settings.IDEMPOTENCY_KEY = { 'STORAGE_CLASS': 'idempotency_key.storage.CacheKeyStorage' } cache.clear() voucher_data = { 'id': 1, 'name': 'myvoucher0', 'internal_name': 'myvoucher0', } response = client.post(self.urls['create'], voucher_data, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key) assert response.status_code == status.HTTP_201_CREATED response2 = client.post(self.urls['create'], voucher_data, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key) assert response2.status_code == status.HTTP_409_CONFLICT request = response2.wsgi_request assert request.idempotency_key_exists is True assert request.idempotency_key_response == response2 assert request.idempotency_key_exempt is False assert request.idempotency_key_encoded_key == BasicKeyEncoder( ).encode_key(request, self.the_key)
def test_idempotency_key_decorator(self, client): voucher_data = { 'id': 1, 'name': 'myvoucher0', 'internal_name': 'myvoucher0', } response = client.post(self.urls['create'], voucher_data, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key) assert status.HTTP_201_CREATED == response.status_code response2 = client.post(self.urls['create'], voucher_data, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key) assert response2.status_code == status.HTTP_409_CONFLICT request = response2.wsgi_request assert request.idempotency_key_exists is True assert request.idempotency_key_response == response assert request.idempotency_key_exempt is False assert request.idempotency_key_manual is False assert request.idempotency_key_encoded_key == BasicKeyEncoder( ).encode_key(request, self.the_key)
def test_middleware_custom_storage(self, client, settings): """ In this test to prove the new custom storage class is being used by creating one that does not to store any information. Therefore a 409 conflict should never occur and the key will never exist. """ settings.IDEMPOTENCY_KEY = { 'STORAGE': { 'CLASS': 'tests.tests.test_middleware.MyStorage' }, } voucher_data = { 'id': 1, 'name': 'myvoucher0', 'internal_name': 'myvoucher0', } response = client.post(self.urls['create'], voucher_data, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key) assert status.HTTP_201_CREATED == response.status_code response2 = client.post(self.urls['create'], voucher_data, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key) assert response2.status_code == status.HTTP_201_CREATED request = response2.wsgi_request assert request.idempotency_key_exists is False assert request.idempotency_key_response is None assert request.idempotency_key_exempt is False assert request.idempotency_key_manual is False assert request.idempotency_key_encoded_key == BasicKeyEncoder( ).encode_key(request, self.the_key)
def test_middleware_duplicate_request_use_different_status_code( self, client, settings): settings.IDEMPOTENCY_KEY = {'CONFLICT_STATUS_CODE': status.HTTP_200_OK} voucher_data = { 'id': 1, 'name': 'myvoucher0', 'internal_name': 'myvoucher0', } response = client.post(self.urls['create'], voucher_data, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key) assert status.HTTP_201_CREATED == response.status_code response2 = client.post(self.urls['create'], voucher_data, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key) assert response2.status_code == status.HTTP_200_OK request = response2.wsgi_request assert request.idempotency_key_exists is True assert request.idempotency_key_response == response assert request.idempotency_key_exempt is False assert request.idempotency_key_manual is False assert request.idempotency_key_encoded_key == BasicKeyEncoder( ).encode_key(request, self.the_key)
def test_middleware_storage_cache_name_provides_default_name(self, client, settings): """ Tests @idempotency_key(cache_name='FiveMinuteCache') decorator """ settings.IDEMPOTENCY_KEY = { 'STORAGE': { 'CLASS': 'idempotency_key.storage.CacheKeyStorage', 'CACHE_NAME': 'FiveMinuteCache', # This should be overridden by the decorator }, } caches['FiveMinuteCache'].clear() voucher_data = { 'id': 1, 'name': 'myvoucher0', 'internal_name': 'myvoucher0', } response = client.post(self.urls['create'], voucher_data, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key) assert response.status_code == status.HTTP_201_CREATED response2 = client.post(self.urls['create'], voucher_data, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key) assert response2.status_code == status.HTTP_409_CONFLICT request = response2.wsgi_request assert request.idempotency_key_exists is True assert request.idempotency_key_response == response2 assert request.idempotency_key_exempt is False assert request.idempotency_key_manual is False assert request.idempotency_key_encoded_key == BasicKeyEncoder().encode_key(request, self.the_key) assert request.idempotency_key_cache_name == 'FiveMinuteCache'
def test_post_no_decorators(self, client): response = client.post( self.urls["create-no-decorators"], data={}, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key, ) assert response.status_code == status.HTTP_201_CREATED request = response.wsgi_request assert request.idempotency_key_exempt is False assert request.idempotency_key_manual is False response = client.post( self.urls["create-no-decorators"], data={}, secure=True, HTTP_IDEMPOTENCY_KEY=self.the_key, ) assert response.status_code == status.HTTP_409_CONFLICT request = response.wsgi_request assert request.idempotency_key_exists is True assert request.idempotency_key_exempt is False assert request.idempotency_key_manual is False assert request.idempotency_key_encoded_key == BasicKeyEncoder().encode_key( request, self.the_key )