From 998cc4e86db508d728ddbc91b3276722ad932bab Mon Sep 17 00:00:00 2001 From: Luke Rogerson Date: Thu, 28 Mar 2024 16:47:33 +0000 Subject: [PATCH] Fix create orders partial failure response (#174) 1. Fix create orders partial failure response (in case that one order was created and another failed, return details about the created order and what went wrong with the other) 2. Update e2e tests --- e2e/maker/requirements.txt | 2 +- e2e/tests/conftest.py | 1 - e2e/tests/maker_endpoints_test.py | 95 ++++++++++++++++++++++++++++++- e2e/tests/requirements.txt | 2 +- transport/rest/create_orders.go | 2 +- 5 files changed, 97 insertions(+), 5 deletions(-) diff --git a/e2e/maker/requirements.txt b/e2e/maker/requirements.txt index 58a03f6b..1736ccee 100644 --- a/e2e/maker/requirements.txt +++ b/e2e/maker/requirements.txt @@ -1,2 +1,2 @@ -orbs-orderbook-sdk==0.9.1 +orbs-orderbook-sdk==0.10.1 requests==2.31.0 \ No newline at end of file diff --git a/e2e/tests/conftest.py b/e2e/tests/conftest.py index d2a60d71..e4f4a285 100644 --- a/e2e/tests/conftest.py +++ b/e2e/tests/conftest.py @@ -18,7 +18,6 @@ @pytest.fixture def ob_client(): - print("HI") yield OrderBookSDK(base_url=BASE_URL, api_key=API_KEY) diff --git a/e2e/tests/maker_endpoints_test.py b/e2e/tests/maker_endpoints_test.py index 0b4e8a90..ec55d79b 100644 --- a/e2e/tests/maker_endpoints_test.py +++ b/e2e/tests/maker_endpoints_test.py @@ -5,7 +5,11 @@ """ import pytest -from orbs_orderbook import CreateOrderInput +from orbs_orderbook import ( + CreateMultipleOrdersInput, + CreateOrderInput, + OrderWithSignature, +) from orbs_orderbook.exceptions import ErrApiRequest from conftest import CLIENT_OID, SIZE, SYMBOL, API_KEY @@ -147,3 +151,92 @@ def test_get_orders_for_user(ob_client, ob_signer, create_new_orders): assert res.data[0]["size"], "size not returned" assert res.data[0]["side"], "side not returned" assert res.data[0]["symbol"], "symbol not returned" + + +def test_create_multiple_orders_successfully(ob_client, ob_signer): + order_one = CreateOrderInput( + price="0.86500000", + size="40", + symbol="MATIC-USDC", + side="buy", + client_order_id="550e8400-e29b-41d4-a716-446655440000", + ) + order_one_sig, order_one_msg = ob_signer.prepare_and_sign_order(order_one) + + order_two = CreateOrderInput( + price="0.87", + size="40", + symbol="MATIC-USDC", + side="sell", + client_order_id="650e8400-e29b-41d4-a716-446655440001", + ) + order_two_sig, order_two_msg = ob_signer.prepare_and_sign_order(order_two) + + create_orders_input = CreateMultipleOrdersInput( + symbol="MATIC-USDC", + orders=[ + OrderWithSignature( + order=order_one, + signature=order_one_sig, + message=order_one_msg, + ), + OrderWithSignature( + order=order_two, + signature=order_two_sig, + message=order_two_msg, + ), + ], + ) + + res = ob_client.create_multiple_orders(create_orders_input) + + assert len(res.created) == 2 + assert res.status == 201 + + +def test_create_multiple_orders_rejects_order_with_same_client_oid( + ob_client, ob_signer +): + """ + Test that given two orders with the same clientOrderId, the API will reject the second order. + """ + same_client_oid = "550e8400-e29b-41d4-a716-446655440000" + + order_one = CreateOrderInput( + price="0.86500000", + size="40", + symbol="MATIC-USDC", + side="buy", + client_order_id=same_client_oid, + ) + order_one_sig, order_one_msg = ob_signer.prepare_and_sign_order(order_one) + + order_two = CreateOrderInput( + price="0.87", + size="40", + symbol="MATIC-USDC", + side="sell", + client_order_id=same_client_oid, + ) + order_two_sig, order_two_msg = ob_signer.prepare_and_sign_order(order_two) + + create_orders_input = CreateMultipleOrdersInput( + symbol="MATIC-USDC", + orders=[ + OrderWithSignature( + order=order_one, + signature=order_one_sig, + message=order_one_msg, + ), + OrderWithSignature( + order=order_two, + signature=order_two_sig, + message=order_two_msg, + ), + ], + ) + + res = ob_client.create_multiple_orders(create_orders_input) + + assert len(res.created) == 1 + assert res.status == 409 diff --git a/e2e/tests/requirements.txt b/e2e/tests/requirements.txt index ca522aae..b552dc98 100644 --- a/e2e/tests/requirements.txt +++ b/e2e/tests/requirements.txt @@ -1,3 +1,3 @@ -orbs-orderbook-sdk==0.9.2 +orbs-orderbook-sdk==0.10.1 pytest==7.4.4 redis==5.0.3 \ No newline at end of file diff --git a/transport/rest/create_orders.go b/transport/rest/create_orders.go index 65592a47..a71fd9e1 100644 --- a/transport/rest/create_orders.go +++ b/transport/rest/create_orders.go @@ -154,7 +154,7 @@ func (h *Handler) CreateOrders(w http.ResponseWriter, r *http.Request) { if len(createdOrders) != len(args.Orders) { logctx.Warn(ctx, "not all orders were created", logger.String("userId", user.Id.String()), logger.Int("numOfOrders", len(createdOrders)), logger.Int("numOfOrdersRequested", len(args.Orders))) - restutils.WriteJSONResponse(ctx, w, http.StatusBadRequest, response, logger.String("userId", user.Id.String())) + restutils.WriteJSONResponse(ctx, w, http.StatusMultiStatus, response, logger.String("userId", user.Id.String())) return }