Skip to content

Commit

Permalink
Feature/integration tests (#3)
Browse files Browse the repository at this point in the history
* Added integration tests
* Made FutuesApi.GetOrdersAsync status parameter required
* Updated CryptoExchange.Net
  • Loading branch information
JKorf authored Jul 26, 2024
1 parent 60b5e1c commit 765196a
Show file tree
Hide file tree
Showing 7 changed files with 198 additions and 7 deletions.
25 changes: 25 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Integration Testing

on:
schedule:
- cron: "0 0 * * *"

jobs:
build:

runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
dotnet-version: 6.0.x
- name: Set GitHub package source
run: dotnet nuget add source --username JKorf --password ${{ secrets.GITHUB_TOKEN }} --store-password-in-clear-text --name github "https://nuget.pkg.github.com/JKorf/index.json"
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Test
run: dotnet test --no-build --verbosity normal -e INTEGRATION=1
166 changes: 166 additions & 0 deletions GateIo.Net.UnitTests/GateIoRestIntegrationTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
using GateIo.Net.Clients;
using GateIo.Net.Objects;
using CryptoExchange.Net.Authentication;
using CryptoExchange.Net.Testing;
using Microsoft.Extensions.Logging;
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CoinEx.Net.UnitTests
{
[NonParallelizable]
internal class GateIoRestIntegrationTests : RestIntergrationTest<GateIoRestClient>
{
public override bool Run { get; set; }

public GateIoRestIntegrationTests()
{
}

public override GateIoRestClient GetClient(ILoggerFactory loggerFactory)
{
var key = Environment.GetEnvironmentVariable("APIKEY");
var sec = Environment.GetEnvironmentVariable("APISECRET");

Authenticated = key != null && sec != null;
return new GateIoRestClient(null, loggerFactory, opts =>
{
opts.OutputOriginalData = true;
opts.ApiCredentials = Authenticated ? new ApiCredentials(key, sec) : null;
});
}

[Test]
public async Task TestErrorResponseParsing()
{
if (!ShouldRun())
return;

var result = await CreateClient().SpotApi.ExchangeData.GetTickersAsync("TSTTST", default);

Assert.That(result.Success, Is.False);
Assert.That(result.Error.Message, Contains.Substring("INVALID_CURRENCY_PAIR"));
}

[Test]
public async Task TestSpotAccount()
{
await RunAndCheckResult(client => client.SpotApi.Account.GetBalancesAsync(default, default), true);
await RunAndCheckResult(client => client.SpotApi.Account.GetLedgerAsync(default, default, default, default, default, default, default), true);
await RunAndCheckResult(client => client.SpotApi.Account.GetWithdrawalsAsync(default, default, default, default, default, default), true);
await RunAndCheckResult(client => client.SpotApi.Account.GetDepositsAsync(default, default, default, default, default, default), true);
await RunAndCheckResult(client => client.SpotApi.Account.GetWithdrawStatusAsync(default, default), true);
await RunAndCheckResult(client => client.SpotApi.Account.GetTradingFeeAsync(default, default, default), true);
await RunAndCheckResult(client => client.SpotApi.Account.GetAccountBalancesAsync(default, default), true);
await RunAndCheckResult(client => client.SpotApi.Account.GetSmallBalancesAsync(default), true);
await RunAndCheckResult(client => client.SpotApi.Account.GetSmallBalanceConversionsAsync(default, default, default, default), true);

await RunAndCheckResult(client => client.SpotApi.Account.GetAccountInfoAsync(default), true);
await RunAndCheckResult(client => client.SpotApi.Account.GetMarginAccountsAsync(default, default), true);
await RunAndCheckResult(client => client.SpotApi.Account.GetMarginBalanceHistoryAsync(default, default, default, default, default, default, default, default), true);
await RunAndCheckResult(client => client.SpotApi.Account.GetMarginFundingAccountsAsync(default, default), true);
await RunAndCheckResult(client => client.SpotApi.Account.GetMarginAutoRepayAsync(default), true);
await RunAndCheckResult(client => client.SpotApi.Account.GetMarginMaxTransferableAsync("ETH", default, default), true);


await RunAndCheckResult(client => client.SpotApi.Account.GetMarginEstimatedInterestRatesAsync(new[] { "ETH" }, default), true);
await RunAndCheckResult(client => client.SpotApi.Account.GetMarginLoansAsync(default, default, default, default, default), true);
await RunAndCheckResult(client => client.SpotApi.Account.GetMarginLoanHistoryAsync(default, default, default, default, default, default), true);
await RunAndCheckResult(client => client.SpotApi.Account.GetMarginInterestHistoryAsync(default, default, default, default, default, default, default), true);
await RunAndCheckResult(client => client.SpotApi.Account.GetMarginMaxBorrowableAsync("ETH", "ETH_USDT", default), true);
await RunAndCheckResult(client => client.SpotApi.Account.GetGTDeductionStatusAsync(default), true);

// Needs Unified account
//await RunAndCheckResult(client => client.SpotApi.Account.GetUnifiedAccountInfoAsync(default, default), true);
//await RunAndCheckResult(client => client.SpotApi.Account.GetUnifiedAccountBorrowableAsync("ETH", default), true);
//await RunAndCheckResult(client => client.SpotApi.Account.GetUnifiedAccountTransferableAsync("ETH", default), true);
//await RunAndCheckResult(client => client.SpotApi.Account.GetUnifiedAccountLoansAsync(default, default, default, default, default), true);
//await RunAndCheckResult(client => client.SpotApi.Account.GetUnifiedAccountLoanHistoryAsync(default, default, default, default, default), true);
//await RunAndCheckResult(client => client.SpotApi.Account.GetUnifiedAccountRiskUnitsAsync(default), true);
//await RunAndCheckResult(client => client.SpotApi.Account.GetUnifiedAccountModeAsync(default), true);

// Needs cross margin account
//await RunAndCheckResult(client => client.SpotApi.Account.GetCrossMarginAccountsAsync(default), true);
//await RunAndCheckResult(client => client.SpotApi.Account.GetCrossMarginBalanceHistoryAsync(default, default, default, default, default, default, default), true);
//await RunAndCheckResult(client => client.SpotApi.Account.GetCrossMarginLoansAsync(default, default, default, default, default), true);
//await RunAndCheckResult(client => client.SpotApi.Account.GetCrossMarginRepaymentsAsync(default, default, default, default, default, default), true);
//await RunAndCheckResult(client => client.SpotApi.Account.GetCrossMarginInterestHistoryAsync(default, default, default, default, default, default), true);
//await RunAndCheckResult(client => client.SpotApi.Account.GetCrossMarginMaxTransferableAsync("ETH", default), true);
//await RunAndCheckResult(client => client.SpotApi.Account.GetCrossMarginEstimatedInterestRatesAsync(new[] { "ETH" }, default), true);
//await RunAndCheckResult(client => client.SpotApi.Account.GetCrossMarginMaxBorrowableAsync("ETH", default), true);
}

[Test]
public async Task TestSpotExchangeData()
{
await RunAndCheckResult(client => client.SpotApi.ExchangeData.GetServerTimeAsync(default), false);
await RunAndCheckResult(client => client.SpotApi.ExchangeData.GetAssetsAsync(default), false);
await RunAndCheckResult(client => client.SpotApi.ExchangeData.GetAssetAsync("ETH", default), false);
await RunAndCheckResult(client => client.SpotApi.ExchangeData.GetSymbolAsync("ETH_USDT", default), false);
await RunAndCheckResult(client => client.SpotApi.ExchangeData.GetSymbolsAsync(default), false);
await RunAndCheckResult(client => client.SpotApi.ExchangeData.GetTickersAsync(default, default, default), false);
await RunAndCheckResult(client => client.SpotApi.ExchangeData.GetOrderBookAsync("ETH_USDT", default, default, default), false);
await RunAndCheckResult(client => client.SpotApi.ExchangeData.GetTradesAsync("ETH_USDT", default, default, default, default, default, default, default), false);
await RunAndCheckResult(client => client.SpotApi.ExchangeData.GetKlinesAsync("ETH_USDT", GateIo.Net.Enums.KlineInterval.OneDay, default, default, default, default), false);
await RunAndCheckResult(client => client.SpotApi.ExchangeData.GetNetworksAsync("ETH", default), false);
await RunAndCheckResult(client => client.SpotApi.ExchangeData.GetDiscountTiersAsync(default), false);
await RunAndCheckResult(client => client.SpotApi.ExchangeData.GetLoanMarginTiersAsync(default), false);
await RunAndCheckResult(client => client.SpotApi.ExchangeData.GetCrossMarginAssetAsync("ETH", default), false);
await RunAndCheckResult(client => client.SpotApi.ExchangeData.GetCrossMarginAssetsAsync(default), false);
await RunAndCheckResult(client => client.SpotApi.ExchangeData.GetLendingSymbolsAsync(default), false);
await RunAndCheckResult(client => client.SpotApi.ExchangeData.GetLendingSymbolAsync("ETH_USDT", default), false);
}

[Test]
public async Task TestSpotTrading()
{
await RunAndCheckResult(client => client.SpotApi.Trading.GetOpenOrdersAsync(default, default, default, default), true);
await RunAndCheckResult(client => client.SpotApi.Trading.GetOrdersAsync(false, default, default, default, default, default, default, default, default), true);
await RunAndCheckResult(client => client.SpotApi.Trading.GetUserTradesAsync(default, default, default, default, default, default, default, default), true);
await RunAndCheckResult(client => client.SpotApi.Trading.GetTriggerOrdersAsync(false, default, default, default, default, default), true);
}

[Test]
public async Task TestPerpetualFuturesAccount()
{
await RunAndCheckResult(client => client.PerpetualFuturesApi.Account.GetAccountAsync("usdt", default), true);
await RunAndCheckResult(client => client.PerpetualFuturesApi.Account.GetLedgerAsync("usdt", default, default, default, default, default, default, default), true);
await RunAndCheckResult(client => client.PerpetualFuturesApi.Account.GetTradingFeeAsync("usdt", default, default), true);
}

[Test]
public async Task TestPerpetualFuturesExchangeData()
{
await RunAndCheckResult(client => client.PerpetualFuturesApi.ExchangeData.GetServerTimeAsync(default), false);
await RunAndCheckResult(client => client.PerpetualFuturesApi.ExchangeData.GetContractsAsync("usdt", default), false);
await RunAndCheckResult(client => client.PerpetualFuturesApi.ExchangeData.GetContractAsync("usdt", "ETH_USDT", default), false);
await RunAndCheckResult(client => client.PerpetualFuturesApi.ExchangeData.GetOrderBookAsync("usdt", "ETH_USDT", default, default, default), false);
await RunAndCheckResult(client => client.PerpetualFuturesApi.ExchangeData.GetTradesAsync("usdt", "ETH_USDT", default, default, default, default, default, default), false);
await RunAndCheckResult(client => client.PerpetualFuturesApi.ExchangeData.GetKlinesAsync("usdt", "ETH_USDT", GateIo.Net.Enums.KlineInterval.OneDay, default, default, default, default), false);
await RunAndCheckResult(client => client.PerpetualFuturesApi.ExchangeData.GetIndexKlinesAsync("usdt", "ETH_USDT", GateIo.Net.Enums.KlineInterval.FiveMinutes, default, default, default, default), false);
await RunAndCheckResult(client => client.PerpetualFuturesApi.ExchangeData.GetTickersAsync("usdt", default, default), false);
await RunAndCheckResult(client => client.PerpetualFuturesApi.ExchangeData.GetFundingRateHistoryAsync("usdt", "ETH_USDT", default, default), false);
await RunAndCheckResult(client => client.PerpetualFuturesApi.ExchangeData.GetInsuranceBalanceHistoryAsync("usdt", default, default), false);
await RunAndCheckResult(client => client.PerpetualFuturesApi.ExchangeData.GetContractStatsAsync("usdt", "ETH_USDT", default, default, default), false);
await RunAndCheckResult(client => client.PerpetualFuturesApi.ExchangeData.GetIndexConstituentsAsync("usdt", "ETH_USDT", default), false);
await RunAndCheckResult(client => client.PerpetualFuturesApi.ExchangeData.GetLiquidationsAsync("usdt", default, default, default, default, default), false);
await RunAndCheckResult(client => client.PerpetualFuturesApi.ExchangeData.GetRiskLimitTiersAsync("usdt", "ETH_USDT", default, default, default), false);
}

[Test]
public async Task TestPerpetualFuturesTrading()
{
await RunAndCheckResult(client => client.PerpetualFuturesApi.Trading.GetPositionsAsync("usdt", default, default, default, default), true);
await RunAndCheckResult(client => client.PerpetualFuturesApi.Trading.GetOrdersAsync("usdt", GateIo.Net.Enums.OrderStatus.Open, default, default, default, default, default), true);
await RunAndCheckResult(client => client.PerpetualFuturesApi.Trading.GetUserTradesAsync("usdt", default, default, default, default, default, default), true);
await RunAndCheckResult(client => client.PerpetualFuturesApi.Trading.GetPositionCloseHistoryAsync("usdt", default, default, default, default, default, default, default, default), true);
await RunAndCheckResult(client => client.PerpetualFuturesApi.Trading.GetLiquidationHistoryAsync("usdt", default, default, default), true);
await RunAndCheckResult(client => client.PerpetualFuturesApi.Trading.GetAutoDeleveragingHistoryAsync("usdt", default, default, default), true);
await RunAndCheckResult(client => client.PerpetualFuturesApi.Trading.GetTriggerOrdersAsync("usdt", false, default, default, default, default), true);
}
}
}
2 changes: 1 addition & 1 deletion GateIo.Net.UnitTests/RestRequestTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ public async Task ValidatePerpFuturesTradingDataCalls()
await tester.ValidateAsync(client => client.PerpetualFuturesApi.Trading.UpdateDualModePositionRiskLimitAsync("usdt", "ETH_USDT", 10), "UpdateDualModePositionRiskLimit");
await tester.ValidateAsync(client => client.PerpetualFuturesApi.Trading.PlaceOrderAsync("usdt", "ETH_USDT", OrderSide.Buy, 1), "PlaceOrder");
await tester.ValidateAsync(client => client.PerpetualFuturesApi.Trading.PlaceMultipleOrderAsync("usdt", new[] { new GateIoPerpBatchPlaceRequest() }), "PlaceMultipleOrder");
await tester.ValidateAsync(client => client.PerpetualFuturesApi.Trading.GetOrdersAsync("usdt", "ETH_USDT"), "GetOrders");
await tester.ValidateAsync(client => client.PerpetualFuturesApi.Trading.GetOrdersAsync("usdt", OrderStatus.Canceled), "GetOrders");
await tester.ValidateAsync(client => client.PerpetualFuturesApi.Trading.GetOrdersByTimestampAsync("usdt", "ETH_USDT"), "GetOrdersByTime");
await tester.ValidateAsync(client => client.PerpetualFuturesApi.Trading.CancelAllOrdersAsync("usdt", "ETH_USDT"), "CancelAllOrders");
await tester.ValidateAsync(client => client.PerpetualFuturesApi.Trading.GetOrderAsync("usdt", 123), "GetOrder");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,16 +201,16 @@ public async Task<WebCallResult<IEnumerable<GateIoPerpOrder>>> PlaceMultipleOrde
/// <inheritdoc />
public async Task<WebCallResult<IEnumerable<GateIoPerpOrder>>> GetOrdersAsync(
string settlementAsset,
OrderStatus status,
string? contract = null,
OrderStatus? status = null,
int? limit = null,
int? offset = null,
string? lastId = null,
CancellationToken ct = default)
{
var parameters = new ParameterCollection();
parameters.AddOptional("contract", contract);
parameters.AddOptionalEnum("status", status);
parameters.AddEnum("status", status);
parameters.AddOptional("limit", limit);
parameters.AddOptional("offset", offset);
parameters.AddOptional("last_id", lastId);
Expand Down
2 changes: 1 addition & 1 deletion GateIo.Net/GateIo.Net.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,10 @@
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="CryptoExchange.Net" Version="7.9.0" />
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="8.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="CryptoExchange.Net" Version="7.10.0" />
</ItemGroup>
</Project>
4 changes: 2 additions & 2 deletions GateIo.Net/GateIo.Net.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -174,8 +174,8 @@ Task<WebCallResult<IEnumerable<GateIoPerpOrder>>> PlaceMultipleOrderAsync(
/// <returns></returns>
Task<WebCallResult<IEnumerable<GateIoPerpOrder>>> GetOrdersAsync(
string settlementAsset,
OrderStatus status,
string? contract = null,
OrderStatus? status = null,
int? limit = null,
int? offset = null,
string? lastId = null,
Expand Down

0 comments on commit 765196a

Please sign in to comment.