Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
split to functions according to code
and added idempotency_key_is_not_present check
  • Loading branch information
axshani committed Aug 14, 2022
commit 3a820cd11496c30662013474c4417d6f0c2f7da0
6 changes: 4 additions & 2 deletions e2e_tests/application_test.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import os
import unittest
import uuid
from datetime import timedelta
from unit import Unit
from unit.models.application import *
Expand All @@ -20,7 +20,8 @@ def create_individual_application():
Address("1600 Pennsylvania Avenue Northwest", "Washington", "CA", "20500", "US"), "[email protected]",
Phone("1", "2025550108"),
ssn="000000003",
device_fingerprints=[device_fingerprint]
device_fingerprints=[device_fingerprint],
idempotency_key=uuid.uuid1().__str__()
)

return client.applications.create(request)
Expand Down Expand Up @@ -72,3 +73,4 @@ def test_update_business_application():
updated = client.applications.update(PatchApplicationRequest(app.data.id, "businessApplication",
tags={"patch": "test-patch"}))
assert updated.data.type == "businessApplication"

34 changes: 27 additions & 7 deletions unit/api/base_resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,29 @@
MAX_DURATION = 300


def fatal_code(e):
def backoff_handler(e):
code = e.status_code
return 500 <= code < 600 or code == 408 or code == 429
return (is_timeout(code) or is_rete_limit(code) or is_server_error(code)) and idempotency_key_is_not_present(e)


def is_timeout(code):
return code == 408


def is_rete_limit(code):
return code == 429


def is_server_error(code):
return 500 <= code <= 599


def idempotency_key_is_not_present(e):
body = json.loads(e.request.body)
if body is None:
return True

return body["data"]["attributes"].get("idempotencyKey") is None


class BaseResource(object):
Expand All @@ -27,15 +47,15 @@ def __init__(self, api_url, token, retries_amount):
retries = retries_amount

@backoff.on_predicate(backoff.expo,
fatal_code,
backoff_handler,
max_tries=retries,
max_time=MAX_DURATION,
jitter=backoff.random_jitter)
def get(self, resource: str, params: Dict = None, headers: Optional[Dict[str, str]] = None):
return requests.get(f"{self.api_url}/{resource}", params=params, headers=self.__merge_headers(headers))

@backoff.on_predicate(backoff.expo,
fatal_code,
backoff_handler,
max_tries=retries,
max_time=MAX_DURATION,
jitter=backoff.random_jitter)
Expand All @@ -44,7 +64,7 @@ def post(self, resource: str, data: Optional[Dict] = None, headers: Optional[Dic
return requests.post(f"{self.api_url}/{resource}", data=data, headers=self.__merge_headers(headers))

@backoff.on_predicate(backoff.expo,
fatal_code,
backoff_handler,
max_tries=retries,
max_time="",
jitter=backoff.random_jitter)
Expand All @@ -53,7 +73,7 @@ def patch(self, resource: str, data: Optional[Dict] = None, headers: Optional[Di
return requests.patch(f"{self.api_url}/{resource}", data=data, headers=self.__merge_headers(headers))

@backoff.on_predicate(backoff.expo,
fatal_code,
backoff_handler,
max_tries=retries,
max_time=MAX_DURATION,
jitter=backoff.random_jitter)
Expand All @@ -62,7 +82,7 @@ def delete(self, resource: str, data: Dict = None, headers: Optional[Dict[str, s
return requests.delete(f"{self.api_url}/{resource}", data=data, headers=self.__merge_headers(headers))

@backoff.on_predicate(backoff.expo,
fatal_code,
backoff_handler,
max_tries=retries,
max_time=MAX_DURATION,
jitter=backoff.random_jitter)
Expand Down