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
示例#4
0
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")
示例#5
0
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")
示例#6
0
 def post_load(self, data):
     return types.CustomObjectDraft(**data)