Beispiel #1
0
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'
Beispiel #2
0
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"
Beispiel #3
0
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."
Beispiel #4
0
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)
Beispiel #14
0
    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'
Beispiel #15
0
    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
        )