def test_custom_object_update(client): """Test the return value of the update methods. It doesn't test the actual update itself. TODO: See if this is worth testing since we're using a mocking backend """ custom_object = client.custom_objects.create_or_update( types.CustomObjectDraft(container="unittest", key="test-object-1", value=1234)) assert custom_object.key == "test-object-1" custom_object = client.custom_objects.create_or_update( types.CustomObjectDraft(container="unittest", key="test-object-1", value=2345)) assert custom_object.key == "test-object-1"
def test_custom_object_query_by_container(client): """Test filtering by container.""" client.custom_objects.create_or_update( types.CustomObjectDraft(container="unittest", key="test-object-1", value=1234)) client.custom_objects.create_or_update( types.CustomObjectDraft(container="unittest", key="test-object-2", value=1234)) client.custom_objects.create_or_update( types.CustomObjectDraft(container="unittest2", key="test-object-1", value=1234)) result = client.custom_objects.query_by_container("unittest") assert len(result.results) == 2 assert result.total == 2
def test_custom_object_query(client): client.custom_objects.create_or_update( types.CustomObjectDraft(container="unittest", key="test-object-1", value=1234)) client.custom_objects.create_or_update( types.CustomObjectDraft(container="unittest", key="test-object-2", value=1234)) # single sort query result = client.custom_objects.query(sort="id asc") assert len(result.results) == 2 assert result.total == 2 # multiple sort queries result = client.custom_objects.query(sort=["id asc", "name asc"]) assert len(result.results) == 2 assert result.total == 2
def get_order_number_suffix(order: types.Order) -> str: """Return an unique order number using CommerceTools custom objects. We use a custom object to store the current value and increment it for every call. If a conflict occurs (race condition) then we retry it with a max of 20 times. (this number is randomly chosen). """ container = "order-numbers" key = "order-number" ct_client = client.Client() max_tries = 20 for i in range(max_tries): # Retrieve latest order number try: logger.debug("Retrieving latest order number") obj = ct_client.custom_objects.get_by_container_and_key( container=container, key=key ) current_version = obj.version current_value = obj.value except (CommercetoolsError, EnvironmentError): current_value = 1_000_000 current_version = None # Increase order number and retry on conflict try: logger.debug("Increasing order number") response = ct_client.custom_objects.create_or_update( types.CustomObjectDraft( container=container, key=key, value=current_value + 1, version=current_version, ) ) order_number = str(response.value) logger.debug("Return order number: %s", order_number) return order_number except CommercetoolsError as e: if e.response.status_code == 409: logger.warning("Conflict on order number generator") continue else: raise raise ProcessError(f"Could not get order number in {max_tries} tries")
def test_custom_object_get_by_id(client): custom_object = client.custom_objects.create_or_update( types.CustomObjectDraft(container="unittest", key="test-object", value=1234)) assert custom_object.id assert custom_object.container == "unittest" assert custom_object.key == "test-object" assert custom_object.value == 1234 custom_object = client.custom_objects.get_by_id(custom_object.id) assert custom_object.container == "unittest" assert custom_object.key == "test-object" assert custom_object.value == 1234 with pytest.raises(HTTPError): client.custom_objects.get_by_id("invalid")
def post_load(self, data): return types.CustomObjectDraft(**data)