package org.knowm.xchange.btcmarkets.dto;
import static org.fest.assertions.api.Assertions.assertThat;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import org.junit.Test;
import org.knowm.xchange.btcmarkets.BtcMarketsAssert;
import org.knowm.xchange.btcmarkets.dto.account.BTCMarketsBalance;
import org.knowm.xchange.btcmarkets.dto.marketdata.BTCMarketsOrderBook;
import org.knowm.xchange.btcmarkets.dto.marketdata.BTCMarketsTicker;
import org.knowm.xchange.btcmarkets.dto.trade.BTCMarketsCancelOrderRequest;
import org.knowm.xchange.btcmarkets.dto.trade.BTCMarketsCancelOrderResponse;
import org.knowm.xchange.btcmarkets.dto.trade.BTCMarketsMyTradingRequest;
import org.knowm.xchange.btcmarkets.dto.trade.BTCMarketsOrder;
import org.knowm.xchange.btcmarkets.dto.trade.BTCMarketsOrders;
import org.knowm.xchange.btcmarkets.dto.trade.BTCMarketsPlaceOrderResponse;
import org.knowm.xchange.btcmarkets.dto.trade.BTCMarketsTradeHistory;
import org.knowm.xchange.btcmarkets.dto.trade.BTCMarketsUserTrade;
import org.knowm.xchange.btcmarkets.service.BTCMarketsTestSupport;
import org.knowm.xchange.currency.CurrencyPair;
import org.knowm.xchange.dto.Order;
import org.knowm.xchange.dto.trade.LimitOrder;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
@SuppressWarnings("ThrowableResultOfMethodCallIgnored")
public class BTCMarketsDtoTest extends BTCMarketsTestSupport {
@Test
public void shouldParseBalances() throws IOException {
final BTCMarketsBalance[] response = parse(BTCMarketsBalance[].class);
assertThat(response).hasSize(3);
assertThat(response[2].getCurrency()).isEqualTo("LTC");
assertThat(response[2].getBalance()).isEqualTo(new BigDecimal("10.00000000"));
assertThat(response[2].getPendingFunds()).isEqualTo(new BigDecimal("0E-8"));
assertThat(response[2].toString()).isEqualTo("BTCMarketsBalance{pendingFunds=0E-8, balance=10.00000000, currency='LTC'}");
}
@Test
public void shouldParseNullAvailabilityBalances() throws IOException {
// given
final BTCMarketsBalance[] expectedBtcMarketsBalances = expectedBtcMarketsBalances();
// when
final BTCMarketsBalance[] response = parse("NullAvailabilityBalances", BTCMarketsBalance[].class);
// then
assertThat(response).hasSize(3);
for (int i = 0; i < response.length; i++) {
BtcMarketsAssert.assertEquals(response[i], expectedBtcMarketsBalances[i]);
}
}
@Test
public void shouldSerializeCancelOrderRequest() throws UnsupportedEncodingException, JsonProcessingException {
assertThatSerializesCorrectly(new BTCMarketsCancelOrderRequest(6840125478L));
}
@Test
public void shouldFailWhenParsingFailedCancelOrderResponseAsResponse() throws IOException {
try {
parse(BTCMarketsCancelOrderResponse.class);
assertThat(true).as("Should throw exception").isFalse();
} catch (JsonMappingException ignored) {
}
}
@Test
public void shouldParseEmptyCancelOrderResponse() throws IOException {
// when
final BTCMarketsCancelOrderResponse response = parse("EmptyCancelOrderResponse", BTCMarketsCancelOrderResponse.class);
// then
assertThat(response.getSuccess()).isTrue();
assertThat(response.getErrorCode()).isNull();
assertThat(response.getErrorMessage()).isNull();
;
}
@Test
public void shouldParseNullCancelOrderResponse() throws IOException {
// when
final BTCMarketsCancelOrderResponse response = parse("NullCancelOrderResponse", BTCMarketsCancelOrderResponse.class);
// then
assertThat(response.getSuccess()).isTrue();
assertThat(response.getErrorCode()).isNull();
assertThat(response.getErrorMessage()).isNull();
;
}
@Test
public void shouldParseCancelOrderResponseAsException() throws IOException {
// when
final BTCMarketsException ex = parse("CancelOrderResponse", BTCMarketsException.class);
// then
assertThat(ex.getSuccess()).isTrue();
assertThat(ex.getErrorCode()).isNull();
List<BTCMarketsException> responses = ex.getResponses();
assertThat(responses).hasSize(2);
BTCMarketsException response1 = responses.get(0);
assertThat(response1.getSuccess()).isTrue();
assertThat(response1.getErrorCode()).isNull();
;
assertThat(response1.getMessage()).contains("(HTTP status code: 0)");
assertThat(response1.getId()).isEqualTo(6840125484L);
BTCMarketsException response2 = responses.get(1);
assertThat(response2.getSuccess()).isFalse();
assertThat(response2.getErrorCode()).isEqualTo(3);
assertThat(response2.getMessage()).contains("order does not exist.");
assertThat(response2.getId()).isEqualTo(6840125478L);
}
@Test
public void shouldFailWhenParsingFailedPlaceOrderResponseAsResponse() throws IOException {
try {
parse("Error-PlaceOrderResponse", BTCMarketsPlaceOrderResponse.class);
assertThat(true).as("Should throw exception").isFalse();
} catch (JsonMappingException ignored) {
}
}
@Test
public void shouldParseFailedPlaceOrderResponseAsException() throws IOException {
// when
final BTCMarketsException ex = parse("Error-PlaceOrderResponse", BTCMarketsException.class);
// then
assertThat(ex.getSuccess()).isFalse();
assertThat(ex.getErrorCode()).isEqualTo(3);
assertThat(ex.getMessage()).contains("Invalid argument.");
assertThat(ex.getResponses()).isNull();
assertThat(ex.getId()).isEqualTo(0);
assertThat(ex.getClientRequestId()).isEqualTo("abc-cdf-1000");
}
@Test
public void shouldSerializeMyTradingRequest() throws UnsupportedEncodingException, JsonProcessingException {
final BTCMarketsMyTradingRequest request = new BTCMarketsMyTradingRequest("AUD", "BTC", 10, new Date(33434568724000L));
assertThatSerializesCorrectly(request);
}
@Test
public void shouldSerializePlaceOrderRequest() throws UnsupportedEncodingException, JsonProcessingException {
assertThatSerializesCorrectly(new BTCMarketsOrder(new BigDecimal("0.10000000"), new BigDecimal("130.00000000"), "AUD", "BTC",
BTCMarketsOrder.Side.Bid, BTCMarketsOrder.Type.Limit, "abc-cdf-1000"));
}
@Test
public void shoudParseOrderBook() throws IOException {
// given
final LimitOrder[] expectedAsks = expectedAsks();
final LimitOrder[] expectedBids = expectedBids();
// when
final BTCMarketsOrderBook response = parse("ShortOrderBook", BTCMarketsOrderBook.class);
// then
assertThat(response.getCurrency()).isEqualTo("AUD");
assertThat(response.getInstrument()).isEqualTo("BTC");
assertThat(response.getTimestamp().getTime()).isEqualTo(1442997827000L);
List<BigDecimal[]> asks = response.getAsks();
assertThat(asks).hasSize(3);
for (int i = 0; i < asks.size(); i++) {
BtcMarketsAssert.assertEquals(expectedAsks[i], Order.OrderType.ASK, CurrencyPair.BTC_AUD, asks.get(i));
}
List<BigDecimal[]> bids = response.getBids();
assertThat(bids).hasSize(2);
for (int i = 0; i < bids.size(); i++) {
BtcMarketsAssert.assertEquals(expectedBids[i], Order.OrderType.BID, CurrencyPair.BTC_AUD, bids.get(i));
}
assertThat(response.toString())
.isEqualTo(String.format("BTCMarketsOrderBook{currency='AUD', instrument='BTC', timestamp=%s, bids=2, asks=3}", new Date(1442997827000L)));
}
@Test
public void shouldParseOrders() throws IOException {
// given
final BTCMarketsOrder[] expectedParsedBtcMarketsOrders = expectedParsedBtcMarketsOrders();
// when
final BTCMarketsOrders response = parse(BTCMarketsOrders.class);
// then
assertThat(response.getSuccess()).isTrue();
assertThat(response.getErrorCode()).isNull();
assertThat(response.getErrorMessage()).isNull();
List<BTCMarketsOrder> ordersList = response.getOrders();
assertThat(ordersList).hasSize(2);
for (int i = 0; i < ordersList.size(); i++) {
BtcMarketsAssert.assertEquals(ordersList.get(i), expectedParsedBtcMarketsOrders[i]);
}
}
@Test
public void shouldParsePlaceOrderResponse() throws IOException {
// when
final BTCMarketsPlaceOrderResponse response = parse(BTCMarketsPlaceOrderResponse.class);
// then
assertThat(response.getSuccess()).isTrue();
assertThat(response.getErrorCode()).isNull();
assertThat(response.getErrorMessage()).isNull();
assertThat(response.getId()).isEqualTo(100);
assertThat(response.getClientRequestId()).isEqualTo("abc-cdf-1000");
assertThat(response.toString()).isEqualTo("BTCMarketsPlaceOrderResponse{success=true, errorMessage='null', errorCode=null}");
}
@Test
public void shouldParseTicker() throws IOException {
// when
final BTCMarketsTicker response = parse(BTCMarketsTicker.class);
// then
BtcMarketsAssert.assertEquals(response, EXPECTED_BTC_MARKETS_TICKER);
}
@Test
public void shouldParseTradeHistory() throws IOException {
// given
final List<BTCMarketsUserTrade> expectedParsedBtcMarketsUserTrades = expectedParsedBtcMarketsUserTrades();
// when
final BTCMarketsTradeHistory response = parse(BTCMarketsTradeHistory.class);
// then
assertThat(response.getSuccess()).isTrue();
assertThat(response.getErrorCode()).isNull();
assertThat(response.getErrorMessage()).isNull();
List<BTCMarketsUserTrade> userTrades = response.getTrades();
assertThat(userTrades).hasSize(3);
for (int i = 0; i < userTrades.size(); i++) {
BtcMarketsAssert.assertEquals(userTrades.get(i), expectedParsedBtcMarketsUserTrades.get(i));
}
}
private <T> void assertThatSerializesCorrectly(T request) throws JsonProcessingException, UnsupportedEncodingException {
final String json = new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(request);
final InputStream expected = getStream(getBaseFileName(request.getClass()));
assertThat(new ByteArrayInputStream(json.getBytes("UTF-8"))).hasContentEqualTo(expected);
}
}