Skip to content

Commit

Permalink
Rename Namespaces, use Globals (#6)
Browse files Browse the repository at this point in the history
* feat: rename of namespaces

* feat: use Globals instad of Config in ValidateSubscription

* feat: reference to Lean\Tests

* refactor: missed Lean in namespaces

* fix: workflow dotnet test path to dll

* feat: init globals providers

* feat: return null in GetHistory

* feat: missed resolution warning flag
rename: make more sense of variables
  • Loading branch information
Romazes committed Feb 27, 2024
1 parent 3fed7cc commit cbacfbb
Show file tree
Hide file tree
Showing 12 changed files with 104 additions and 93 deletions.
12 changes: 6 additions & 6 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,11 @@ jobs:
image: quantconnect/lean:foundation
options: -v /home/runner/work:/__w --workdir /__w/Lean.DataSource.AlphaVantage/Lean.DataSource.AlphaVantage -e QC_JOB_USER_ID=${{ secrets.QC_JOB_USER_ID }} -e QC_API_ACCESS_TOKEN=${{ secrets.QC_API_ACCESS_TOKEN }} -e QC_JOB_ORGANIZATION_ID=${{ secrets.QC_JOB_ORGANIZATION_ID }} -e QC_ALPHA_VANTAGE_API_KEY=${{ secrets.QC_ALPHA_VANTAGE_API_KEY }}

- name: Build QuantConnect.AlphaVantage
run: dotnet build ./QuantConnect.AlphaVantage/QuantConnect.AlphaVantage.csproj /p:Configuration=Release /v:quiet /p:WarningLevel=1
- name: Build QuantConnect.DataSource.AlphaVantage
run: dotnet build ./QuantConnect.AlphaVantage/QuantConnect.DataSource.AlphaVantage.csproj /p:Configuration=Release /v:quiet /p:WarningLevel=1

- name: Build QuantConnect.AlphaVantage.Tests
run: dotnet build ./QuantConnect.AlphaVantage.Tests/QuantConnect.AlphaVantage.Tests.csproj /p:Configuration=Release /v:quiet /p:WarningLevel=1
- name: Build QuantConnect.DataSource.AlphaVantage.Tests
run: dotnet build ./QuantConnect.AlphaVantage.Tests/QuantConnect.DataSource.AlphaVantage.Tests.csproj /p:Configuration=Release /v:quiet /p:WarningLevel=1

- name: Run QuantConnect.AlphaVantage.Tests
run: dotnet test ./QuantConnect.AlphaVantage.Tests/bin/Release/QuantConnect.AlphaVantage.Tests.dll
- name: Run QuantConnect.DataSource.AlphaVantage.Tests
run: dotnet test ./QuantConnect.AlphaVantage.Tests/bin/Release/QuantConnect.Lean.DataSource.AlphaVantage.Tests.dll
4 changes: 2 additions & 2 deletions Lean.DataSource.AlphaVantage.sln
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.002.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuantConnect.AlphaVantage", "QuantConnect.AlphaVantage\QuantConnect.AlphaVantage.csproj", "{0230D4D2-9D1B-42AF-A17C-6B7ADE5F6CC1}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuantConnect.DataSource.AlphaVantage", "QuantConnect.AlphaVantage\QuantConnect.DataSource.AlphaVantage.csproj", "{0230D4D2-9D1B-42AF-A17C-6B7ADE5F6CC1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuantConnect.AlphaVantage.Tests", "QuantConnect.AlphaVantage.Tests\QuantConnect.AlphaVantage.Tests.csproj", "{C7B6B18A-92D8-4CE7-86AE-9DB5A1BBA27D}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuantConnect.DataSource.AlphaVantage.Tests", "QuantConnect.AlphaVantage.Tests\QuantConnect.DataSource.AlphaVantage.Tests.csproj", "{C7B6B18A-92D8-4CE7-86AE-9DB5A1BBA27D}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
using NUnit.Framework;
using QuantConnect.Configuration;

namespace QuantConnect.AlphaVantage.Tests
namespace QuantConnect.Lean.DataSource.AlphaVantage.Tests
{
[TestFixture]
public class AlphaVantageDataDownloaderAdditionalTests
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
using QuantConnect.Data.Market;
using System.Collections.Generic;

namespace QuantConnect.AlphaVantage.Tests
namespace QuantConnect.Lean.DataSource.AlphaVantage.Tests
{
[TestFixture]
public class AlphaVantageDataDownloaderMockTests
Expand All @@ -34,6 +34,16 @@ public class AlphaVantageDataDownloaderMockTests
private AlphaVantageDataDownloader _downloader;
private readonly TradeBarComparer _tradeBarComparer = new TradeBarComparer();

private Symbol AAPL;
private Symbol IBM;

[OneTimeSetUp]
public void OneTimeSetUp()
{
AAPL = new Symbol(SecurityIdentifier.GenerateEquity("AAPL", Market.USA, false), "AAPL");
IBM = new Symbol(SecurityIdentifier.GenerateEquity("IBM", Market.USA, false), "IBM");
}

[SetUp]
public void SetUp()
{
Expand All @@ -46,7 +56,7 @@ public void SetUp()
[TearDown]
public void TearDown()
{
if (_downloader != null )
if (_downloader != null)
{
_downloader.Dispose();
}
Expand All @@ -55,16 +65,14 @@ public void TearDown()
[Test]
public void GetDailyLessThan100DaysGetsCompactDailyData()
{
var ticker = "AAPL";
var symbol = Symbol.Create(ticker, SecurityType.Equity, Market.USA);
var resolution = Resolution.Daily;
var start = new DateTime(2021, 4, 4);
var end = new DateTime(2021, 7, 12);

var expectedBars = new[]
{
new TradeBar(DateTime.Parse("2021-04-05"), symbol, 133.64m, 136.69m, 133.40m, 135.93m, 5471616),
new TradeBar(DateTime.Parse("2021-04-06"), symbol, 135.58m, 135.64m, 134.09m, 134.22m, 3620964),
new TradeBar(DateTime.Parse("2021-04-05"), AAPL, 133.64m, 136.69m, 133.40m, 135.93m, 5471616),
new TradeBar(DateTime.Parse("2021-04-06"), AAPL, 135.58m, 135.64m, 134.09m, 134.22m, 3620964),
};

IRestRequest request = null;
Expand All @@ -80,7 +88,7 @@ public void GetDailyLessThan100DaysGetsCompactDailyData()
})
.Verifiable();

var result = _downloader.Get(new DataDownloaderGetParameters(symbol, resolution, start, end));
var result = _downloader.Get(new DataDownloaderGetParameters(AAPL, resolution, start, end));

_avClient.Verify();
var requestUrl = BuildUrl(request);
Expand All @@ -97,16 +105,14 @@ public void GetDailyLessThan100DaysGetsCompactDailyData()
[Test]
public void GetDailyGreaterThan100DaysGetsFullDailyData()
{
var ticker = "AAPL";
var symbol = Symbol.Create(ticker, SecurityType.Equity, Market.USA);
var resolution = Resolution.Daily;
var start = new DateTime(2021, 4, 4);
var end = new DateTime(2024, 1, 1);

var expectedBars = new[]
{
new TradeBar(DateTime.Parse("2021-04-05"), symbol, 133.64m, 136.69m, 133.40m, 135.93m, 5471616),
new TradeBar(DateTime.Parse("2021-04-06"), symbol, 135.58m, 135.64m, 134.09m, 134.22m, 3620964),
new TradeBar(DateTime.Parse("2021-04-05"), AAPL, 133.64m, 136.69m, 133.40m, 135.93m, 5471616),
new TradeBar(DateTime.Parse("2021-04-06"), AAPL, 135.58m, 135.64m, 134.09m, 134.22m, 3620964),
};

IRestRequest request = null;
Expand All @@ -122,7 +128,7 @@ public void GetDailyGreaterThan100DaysGetsFullDailyData()
})
.Verifiable();

var result = _downloader.Get(new DataDownloaderGetParameters(symbol, resolution, start, end));
var result = _downloader.Get(new DataDownloaderGetParameters(AAPL, resolution, start, end));

_avClient.Verify();
var requestUrl = BuildUrl(request);
Expand All @@ -140,18 +146,16 @@ public void GetDailyGreaterThan100DaysGetsFullDailyData()
[TestCase(Resolution.Hour, "60min")]
public void GetMinuteHourGetsIntradayData(Resolution resolution, string interval)
{
var ticker = "IBM";
var symbol = Symbol.Create(ticker, SecurityType.Equity, Market.USA);
var year = DateTime.UtcNow.Year - 1;
var start = new DateTime(year, 04, 05, 0, 0, 0);
var end = new DateTime(year, 05, 06, 15, 0, 0);

var expectedBars = new[]
{
new TradeBar(start.AddHours(9.5), symbol, 133.71m, 133.72m, 133.62m, 133.62m, 1977),
new TradeBar(start.AddHours(10.5), symbol, 134.30m, 134.56m, 134.245m, 134.34m, 154723),
new TradeBar(end.AddHours(-5.5), symbol, 135.54m, 135.56m, 135.26m, 135.28m, 2315),
new TradeBar(end.AddHours(-4.5), symbol, 134.905m,134.949m, 134.65m, 134.65m, 101997),
new TradeBar(start.AddHours(9.5), IBM, 133.71m, 133.72m, 133.62m, 133.62m, 1977),
new TradeBar(start.AddHours(10.5), IBM, 134.30m, 134.56m, 134.245m, 134.34m, 154723),
new TradeBar(end.AddHours(-5.5), IBM, 135.54m, 135.56m, 135.26m, 135.28m, 2315),
new TradeBar(end.AddHours(-4.5), IBM, 134.905m,134.949m, 134.65m, 134.65m, 101997),
};

var responses = new[]
Expand All @@ -176,7 +180,7 @@ public void GetMinuteHourGetsIntradayData(Resolution resolution, string interval
})
.Verifiable();

var result = _downloader.Get(new DataDownloaderGetParameters(symbol, resolution, start, end)).ToList();
var result = _downloader.Get(new DataDownloaderGetParameters(IBM, resolution, start, end)).ToList();

_avClient.Verify();
Assert.AreEqual(2, requestUrls.Count);
Expand All @@ -195,21 +199,17 @@ public void GetMinuteHourGetsIntradayData(Resolution resolution, string interval
[TestCase(Resolution.Second)]
public void GetUnsupportedResolutionThrowsException(Resolution resolution)
{
var ticker = "IBM";
var symbol = Symbol.Create(ticker, SecurityType.Equity, Market.USA);
var start = DateTime.UtcNow.AddMonths(-2);
var end = DateTime.UtcNow;

Assert.Throws<ArgumentOutOfRangeException>(() => _downloader.Get(new DataDownloaderGetParameters(symbol, resolution, start, end)).ToList());
Assert.IsNull(_downloader.Get(new DataDownloaderGetParameters(IBM, resolution, start, end))?.ToList());
}

[TestCase(Resolution.Minute)]
[TestCase(Resolution.Hour)]
[TestCase(Resolution.Daily)]
public void UnexpectedResponseContentTypeThrowsException(Resolution resolution)
{
var ticker = "IBM";
var symbol = Symbol.Create(ticker, SecurityType.Equity, Market.USA);
var start = DateTime.UtcNow.AddMonths(-2);
var end = DateTime.UtcNow;

Expand All @@ -221,22 +221,20 @@ public void UnexpectedResponseContentTypeThrowsException(Resolution resolution)
})
.Verifiable();

Assert.Throws<FormatException>(() => _downloader.Get(new DataDownloaderGetParameters(symbol, resolution, start, end)).ToList());
Assert.Throws<FormatException>(() => _downloader.Get(new DataDownloaderGetParameters(IBM, resolution, start, end)).ToList());
}

[Test]
public void GetIntradayDataGreaterThanTwoYears()
{
var ticker = "IBM";
var symbol = Symbol.Create(ticker, SecurityType.Equity, Market.USA);
var resolution = Resolution.Minute;
var start = new DateTime(2020, 4, 4);
var end = new DateTime(2020, 6, 5);

var expectedBars = new[]
{
new TradeBar(DateTime.Parse("2020-04-05 7:34:00"), symbol, 133.64m, 136.69m, 133.40m, 135.93m, 5471616),
new TradeBar(DateTime.Parse("2020-04-05 7:35:00"), symbol, 135.58m, 135.64m, 134.09m, 134.22m, 3620964),
new TradeBar(DateTime.Parse("2020-04-05 7:34:00"), IBM, 133.64m, 136.69m, 133.40m, 135.93m, 5471616),
new TradeBar(DateTime.Parse("2020-04-05 7:35:00"), IBM, 135.58m, 135.64m, 134.09m, 134.22m, 3620964),
};

IRestRequest request = null;
Expand All @@ -257,7 +255,7 @@ public void GetIntradayDataGreaterThanTwoYears()
})
.Verifiable();

var result = _downloader.Get(new DataDownloaderGetParameters(symbol, resolution, start, end)).ToList();
var result = _downloader.Get(new DataDownloaderGetParameters(IBM, resolution, start, end)).ToList();

_avClient.Verify();
var requestUrl = BuildUrl(request);
Expand Down
44 changes: 17 additions & 27 deletions QuantConnect.AlphaVantage.Tests/AlphaVantageDataDownloaderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
using QuantConnect.Data.Market;
using System.Collections.Generic;

namespace QuantConnect.AlphaVantage.Tests
namespace QuantConnect.Lean.DataSource.AlphaVantage.Tests
{
[TestFixture]
public class AlphaVantageDataDownloaderTests
Expand Down Expand Up @@ -57,13 +57,12 @@ public static IEnumerable<TestCaseData> DownloaderValidCaseData
{
get
{
var symbol = Symbol.Create("AAPL", SecurityType.Equity, Market.USA);

yield return new TestCaseData(symbol, Resolution.Minute, new DateTime(2024, 1, 1, 5, 30, 0), new DateTime(2024, 2, 1, 20, 0, 0), TickType.Trade);
yield return new TestCaseData(symbol, Resolution.Minute, new DateTime(2024, 1, 8, 9, 30, 0), new DateTime(2024, 1, 12, 16, 0, 0), TickType.Trade);
yield return new TestCaseData(symbol, Resolution.Minute, new DateTime(2015, 2, 2, 9, 30, 0), new DateTime(2015, 3, 1, 16, 0, 0), TickType.Trade);
yield return new TestCaseData(symbol, Resolution.Hour, new DateTime(2023, 11, 8, 9, 30, 0), new DateTime(2024, 2, 2, 16, 0, 0), TickType.Trade);
yield return new TestCaseData(symbol, Resolution.Daily, new DateTime(2023, 1, 8, 9, 30, 0), new DateTime(2024, 2, 2, 16, 0, 0), TickType.Trade);
var AAPL = new Symbol(SecurityIdentifier.GenerateEquity("AAPL", Market.USA, false), "AAPL");
yield return new TestCaseData(AAPL, Resolution.Minute, new DateTime(2024, 1, 1, 5, 30, 0), new DateTime(2024, 2, 1, 20, 0, 0), TickType.Trade);
yield return new TestCaseData(AAPL, Resolution.Minute, new DateTime(2024, 1, 8, 9, 30, 0), new DateTime(2024, 1, 12, 16, 0, 0), TickType.Trade);
yield return new TestCaseData(AAPL, Resolution.Minute, new DateTime(2015, 2, 2, 9, 30, 0), new DateTime(2015, 3, 1, 16, 0, 0), TickType.Trade);
yield return new TestCaseData(AAPL, Resolution.Hour, new DateTime(2023, 11, 8, 9, 30, 0), new DateTime(2024, 2, 2, 16, 0, 0), TickType.Trade);
yield return new TestCaseData(AAPL, Resolution.Daily, new DateTime(2023, 1, 8, 9, 30, 0), new DateTime(2024, 2, 2, 16, 0, 0), TickType.Trade);
}
}

Expand Down Expand Up @@ -94,42 +93,33 @@ public static IEnumerable<TestCaseData> DownloaderInvalidCaseData
{
get
{
var symbol = Symbol.Create("AAPL", SecurityType.Equity, Market.USA);

var startUtc = new DateTime(2024, 1, 1);
var endUtc = new DateTime(2024, 2, 1);
var AAPL = new Symbol(SecurityIdentifier.GenerateEquity("AAPL", Market.USA, false), "AAPL");

yield return new TestCaseData(symbol, Resolution.Minute, startUtc, endUtc, TickType.Quote, false)
yield return new TestCaseData(AAPL, Resolution.Minute, startUtc, endUtc, TickType.Quote)
.SetDescription($"Not supported {nameof(TickType.Quote)} -> empty result");
yield return new TestCaseData(symbol, Resolution.Minute, startUtc, endUtc, TickType.OpenInterest, false)
yield return new TestCaseData(AAPL, Resolution.Minute, startUtc, endUtc, TickType.OpenInterest)
.SetDescription($"Not supported {nameof(TickType.OpenInterest)} -> empty result");
yield return new TestCaseData(symbol, Resolution.Tick, startUtc, endUtc, TickType.Trade, true)
yield return new TestCaseData(AAPL, Resolution.Tick, startUtc, endUtc, TickType.Trade)
.SetDescription($"Not supported {nameof(Resolution.Tick)} -> throw Exception");
yield return new TestCaseData(symbol, Resolution.Second, startUtc, endUtc, TickType.Trade, true)
yield return new TestCaseData(AAPL, Resolution.Second, startUtc, endUtc, TickType.Trade)
.SetDescription($"Not supported {nameof(Resolution.Second)} -> throw Exception");
yield return new TestCaseData(symbol, Resolution.Minute, endUtc, startUtc, TickType.Trade, false)
yield return new TestCaseData(AAPL, Resolution.Minute, endUtc, startUtc, TickType.Trade)
.SetDescription("startDateTime > endDateTime -> empty result");
yield return new TestCaseData(Symbol.Create("USDJPY", SecurityType.Forex, Market.Oanda), Resolution.Minute, startUtc, endUtc, TickType.Trade, false)
yield return new TestCaseData(Symbol.Create("USDJPY", SecurityType.Forex, Market.Oanda), Resolution.Minute, startUtc, endUtc, TickType.Trade)
.SetDescription($"Not supported {nameof(SecurityType.Forex)} -> empty result");
yield return new TestCaseData(Symbol.Create("BTCUSD", SecurityType.Crypto, Market.Coinbase), Resolution.Minute, startUtc, endUtc, TickType.Trade, false)
yield return new TestCaseData(Symbol.Create("BTCUSD", SecurityType.Crypto, Market.Coinbase), Resolution.Minute, startUtc, endUtc, TickType.Trade)
.SetDescription($"Not supported {nameof(SecurityType.Crypto)} -> empty result");
}
}

[TestCaseSource(nameof(DownloaderInvalidCaseData))]
public void DownloadDataWithDifferentInvalidParameters(Symbol symbol, Resolution resolution, DateTime start, DateTime end, TickType tickType, bool isThrowException)
public void DownloadDataWithDifferentInvalidParameters(Symbol symbol, Resolution resolution, DateTime start, DateTime end, TickType tickType)
{
var downloadParameters = new DataDownloaderGetParameters(symbol, resolution, start, end, tickType);

if (isThrowException)
{
Assert.Throws<ArgumentOutOfRangeException>(() => _downloader.Get(downloadParameters).ToList());
return;
}

var baseData = _downloader.Get(downloadParameters).ToList();

Assert.IsEmpty(baseData);
Assert.IsNull(_downloader.Get(downloadParameters)?.ToList());
}

private DateTime ConvertUtcTimeToSymbolExchange(Symbol symbol, DateTime dateTimeUtc)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
<IsPackable>false</IsPackable>
<TestProjectType>UnitTest</TestProjectType>
<OutputPath>bin\$(Configuration)\</OutputPath>
<Product>QuantConnect.AlphaVantage.Tests</Product>
<AssemblyName>QuantConnect.AlphaVantage.Tests</AssemblyName>
<RootNamespace>QuantConnect.AlphaVantage.Tests</RootNamespace>
<AssemblyTitle>QuantConnect.AlphaVantage.Tests</AssemblyTitle>
<Product>QuantConnect.Lean.DataSource.AlphaVantage.Tests</Product>
<AssemblyName>QuantConnect.Lean.DataSource.AlphaVantage.Tests</AssemblyName>
<RootNamespace>QuantConnect.Lean.DataSource.AlphaVantage.Tests</RootNamespace>
<AssemblyTitle>QuantConnect.Lean.DataSource.AlphaVantage.Tests</AssemblyTitle>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
</PropertyGroup>

Expand All @@ -27,7 +27,8 @@
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\QuantConnect.AlphaVantage\QuantConnect.AlphaVantage.csproj" />
<ProjectReference Include="..\QuantConnect.AlphaVantage\QuantConnect.DataSource.AlphaVantage.csproj" />
<ProjectReference Include="..\..\Lean\Tests\QuantConnect.Tests.csproj" />
</ItemGroup>

<ItemGroup>
Expand Down
5 changes: 4 additions & 1 deletion QuantConnect.AlphaVantage.Tests/TestSetup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,11 @@
using System.IO;
using NUnit.Framework;
using System.Collections;
using QuantConnect.Tests;
using QuantConnect.Logging;
using QuantConnect.Configuration;

namespace QuantConnect.AlphaVantage.Tests
namespace QuantConnect.Lean.DataSource.AlphaVantage.Tests
{
[SetUpFixture]
public class TestSetup
Expand Down Expand Up @@ -61,6 +62,8 @@ private static void ReloadConfiguration()

// resets the version among other things
Globals.Reset();
// Initialize providers dependency
TestGlobals.Initialize();
}
}
}
2 changes: 1 addition & 1 deletion QuantConnect.AlphaVantage/AlphaVantageAuthenticator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
using RestSharp;
using RestSharp.Authenticators;

namespace QuantConnect.AlphaVantage
namespace QuantConnect.Lean.DataSource.AlphaVantage
{
/// <summary>
/// Implements authentication for Alpha Vantage API
Expand Down

0 comments on commit cbacfbb

Please sign in to comment.