Loading StockAdvisoryWebApi.Tests/StockWebApiTests.cs +71 −9 Original line number Diff line number Diff line Loading @@ -31,7 +31,7 @@ public class StockWebApiTests Directory.CreateDirectory("filesystem"); string[] sourceNames = {"ark_holdings_apr11.csv", "ark_holdings_mar31.csv"}; string[] destNames = {"2022-04-11-13_01_00.csv", "2022-03-31-20_48_00.csv"}; string[] destNames = {"2022-04-11-00_00_00.csv", "2022-03-31-00_00_00.csv"}; foreach (var (sourceName, destName) in sourceNames.Zip(destNames)) { var sourcePath = $"csv{Path.DirectorySeparatorChar}{sourceName}"; Loading Loading @@ -107,6 +107,60 @@ public class StockWebApiTests SetupFiles(); } [Test] public async Task Test_WhenTwoDatesArePassed_And_FilesDoesNotExist_Then_NotFoundIsReturned() { var client = _factory.CreateClient(); //first file var parameters = "date1=2022-04-11T00:00:00.000Z&date2=2010-03-03T00:00:00.000Z"; var response = await client.GetAsync($"/StockAdvisory?{parameters}"); Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode); //second file parameters = "date1=2022-04-10T00:00:00.000Z&date2=2022-04-11T00:00:00.000Z"; response = await client.GetAsync($"/StockAdvisory?{parameters}"); Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode); //both files parameters = "date1=2022-04-10T00:00:00.000Z&date2=2022-04-15T00:00:00.000Z"; response = await client.GetAsync($"/StockAdvisory?{parameters}"); Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode); } [Test] public async Task Test_WhenNoDatesArePassed_Then_LastTwoDaysAreCompared() //TODO { var client = _factory.CreateClient(); var stockParser = new StockParser(); var parameters = ""; var response = await client.GetAsync($"/StockAdvisory?{parameters}"); Assert.True(response.IsSuccessStatusCode); var returned = await response.Content.ReadFromJsonAsync<StockDifferences>(); Assert.NotNull(returned); var analyzer = new StockDifferenceAnalyzerFactory() .CreateAnalyzer( stockParser.Parse("filesystem/2022-04-11-13_01_00.csv"), stockParser.Parse("filesystem/2022-04-12-13_01_00.csv") ); var expected = new StockDifferences { AddedStocks = analyzer.AddedStocks(), RemovedStocks = analyzer.RemovedStocks(), DifferentStocks = analyzer.ChangedPositions() }; CollectionAssert.AreEqual(expected.AddedStocks, returned.AddedStocks); CollectionAssert.AreEqual(expected.RemovedStocks, returned.RemovedStocks); CollectionAssert.AreEqual(expected.DifferentStocks, returned.DifferentStocks); } [Test] public async Task Test_WhenTwoDatesArePassed_Then_TwoDaysAreCompared() { Loading @@ -115,8 +169,8 @@ public class StockWebApiTests var stockParser = new StockParser(); var analyzer = new StockDifferenceAnalyzerFactory() .CreateAnalyzer( stockParser.Parse("filesystem/2022-03-31-20_48_00.csv"), stockParser.Parse("filesystem/2022-04-11-13_01_00.csv") stockParser.Parse("filesystem/2022-03-31-00_00_00.csv"), stockParser.Parse("filesystem/2022-04-11-00_00_00.csv") ); var expected = new StockDifferences Loading @@ -127,7 +181,7 @@ public class StockWebApiTests }; var parameters = "date1=2022-04-11T13:01:00.000Z&date2=2022-03-31T20:48:00.000Z"; var parameters = "date1=2022-04-11T00:00:00.000Z&date2=2022-03-31T00:00:00.000Z"; var response = await client.GetAsync($"/StockAdvisory?{parameters}"); Assert.True(response.IsSuccessStatusCode); Loading @@ -140,13 +194,21 @@ public class StockWebApiTests } [Test] public async Task Test_WhenTwoDatesArePassed_And_OneDoesNotExist_Then_NotFoundIsReturned() public async Task Test_WhenOneOfDatesAreMissing_Then_NotFoundIsReturned() { var client = _factory.CreateClient(); var parameters = "date1=2022-04-11T13:01:00.000Z&date2=2010-03-03T00:00:00.000Z"; var stockParser = new StockParser(); var parameters = "date1=2022-04-11T00:00:00.000Z&date2=2022-03-31T00:00:00.000Z"; var response = await client.GetAsync($"/StockAdvisory?{parameters}"); Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode); Assert.True(response.IsSuccessStatusCode); var returned = await response.Content.ReadFromJsonAsync<StockDifferences>(); Assert.NotNull(returned); } } StockAdvisoryWebApi/Controllers/StockAdvisoryController.cs +16 −21 Original line number Diff line number Diff line Loading @@ -34,9 +34,7 @@ public class StockAdvisoryController : ControllerBase [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task<IActionResult> GetDifferences([FromQuery] DateTime? date1, [FromQuery] DateTime? date2) { var diff = date1 is null || date2 is null ? await GetDifferencesFromLastTwoDays() : GetStockDifferencesFromDates(date1.Value, date2.Value); var diff = await GetStockDifferencesFromDates(date1, date2); if (diff is not null) return Ok(diff); Loading @@ -44,30 +42,27 @@ public class StockAdvisoryController : ControllerBase return NotFound(); } private async Task<StockDifferences?> GetDifferencesFromLastTwoDays() private async Task<StockDifferences> GetStockDifferencesFromDates(DateTime? date1, DateTime? date2) { try if (date1 is null && date2 is null) { var (_, latest) = await _fileManager.DownloadLatest(); var records = _fileManager.ListAvailableRecords(); var yesterdayDate = _clock.GetCurrentInstant().ToDateTimeUtc().Date.Subtract(TimeSpan.FromDays(1)); var yesterdaysLatest = records .OrderByDescending(d => d) .First(d => d.Date.CompareTo(yesterdayDate) == 0); return GetStockDifferencesFromDates(latest, yesterdaysLatest); date1 = _clock.GetCurrentInstant().ToDateTimeUtc().Date; //today date2 = _clock.GetCurrentInstant().ToDateTimeUtc().Date.Subtract(TimeSpan.FromDays(1)); //yesterday } catch (Exception) else if (date1 is null || date2 is null) { return null; } } private StockDifferences? GetStockDifferencesFromDates(DateTime date1, DateTime date2) var path1 = _fileManager.GetRecordFilePath((DateTime) date1); var path2 = _fileManager.GetRecordFilePath((DateTime) date2); if (path1 is null && date1.Equals(_clock.GetCurrentInstant().ToDateTimeUtc().Date)) { var path1 = _fileManager.GetRecordFilePath(date1); var path2 = _fileManager.GetRecordFilePath(date2); (path1, _) = await _fileManager.DownloadLatest(); } if (path1 is null || path2 is null) if (path1 == null || path2 == null) { return null; } Loading Loading
StockAdvisoryWebApi.Tests/StockWebApiTests.cs +71 −9 Original line number Diff line number Diff line Loading @@ -31,7 +31,7 @@ public class StockWebApiTests Directory.CreateDirectory("filesystem"); string[] sourceNames = {"ark_holdings_apr11.csv", "ark_holdings_mar31.csv"}; string[] destNames = {"2022-04-11-13_01_00.csv", "2022-03-31-20_48_00.csv"}; string[] destNames = {"2022-04-11-00_00_00.csv", "2022-03-31-00_00_00.csv"}; foreach (var (sourceName, destName) in sourceNames.Zip(destNames)) { var sourcePath = $"csv{Path.DirectorySeparatorChar}{sourceName}"; Loading Loading @@ -107,6 +107,60 @@ public class StockWebApiTests SetupFiles(); } [Test] public async Task Test_WhenTwoDatesArePassed_And_FilesDoesNotExist_Then_NotFoundIsReturned() { var client = _factory.CreateClient(); //first file var parameters = "date1=2022-04-11T00:00:00.000Z&date2=2010-03-03T00:00:00.000Z"; var response = await client.GetAsync($"/StockAdvisory?{parameters}"); Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode); //second file parameters = "date1=2022-04-10T00:00:00.000Z&date2=2022-04-11T00:00:00.000Z"; response = await client.GetAsync($"/StockAdvisory?{parameters}"); Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode); //both files parameters = "date1=2022-04-10T00:00:00.000Z&date2=2022-04-15T00:00:00.000Z"; response = await client.GetAsync($"/StockAdvisory?{parameters}"); Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode); } [Test] public async Task Test_WhenNoDatesArePassed_Then_LastTwoDaysAreCompared() //TODO { var client = _factory.CreateClient(); var stockParser = new StockParser(); var parameters = ""; var response = await client.GetAsync($"/StockAdvisory?{parameters}"); Assert.True(response.IsSuccessStatusCode); var returned = await response.Content.ReadFromJsonAsync<StockDifferences>(); Assert.NotNull(returned); var analyzer = new StockDifferenceAnalyzerFactory() .CreateAnalyzer( stockParser.Parse("filesystem/2022-04-11-13_01_00.csv"), stockParser.Parse("filesystem/2022-04-12-13_01_00.csv") ); var expected = new StockDifferences { AddedStocks = analyzer.AddedStocks(), RemovedStocks = analyzer.RemovedStocks(), DifferentStocks = analyzer.ChangedPositions() }; CollectionAssert.AreEqual(expected.AddedStocks, returned.AddedStocks); CollectionAssert.AreEqual(expected.RemovedStocks, returned.RemovedStocks); CollectionAssert.AreEqual(expected.DifferentStocks, returned.DifferentStocks); } [Test] public async Task Test_WhenTwoDatesArePassed_Then_TwoDaysAreCompared() { Loading @@ -115,8 +169,8 @@ public class StockWebApiTests var stockParser = new StockParser(); var analyzer = new StockDifferenceAnalyzerFactory() .CreateAnalyzer( stockParser.Parse("filesystem/2022-03-31-20_48_00.csv"), stockParser.Parse("filesystem/2022-04-11-13_01_00.csv") stockParser.Parse("filesystem/2022-03-31-00_00_00.csv"), stockParser.Parse("filesystem/2022-04-11-00_00_00.csv") ); var expected = new StockDifferences Loading @@ -127,7 +181,7 @@ public class StockWebApiTests }; var parameters = "date1=2022-04-11T13:01:00.000Z&date2=2022-03-31T20:48:00.000Z"; var parameters = "date1=2022-04-11T00:00:00.000Z&date2=2022-03-31T00:00:00.000Z"; var response = await client.GetAsync($"/StockAdvisory?{parameters}"); Assert.True(response.IsSuccessStatusCode); Loading @@ -140,13 +194,21 @@ public class StockWebApiTests } [Test] public async Task Test_WhenTwoDatesArePassed_And_OneDoesNotExist_Then_NotFoundIsReturned() public async Task Test_WhenOneOfDatesAreMissing_Then_NotFoundIsReturned() { var client = _factory.CreateClient(); var parameters = "date1=2022-04-11T13:01:00.000Z&date2=2010-03-03T00:00:00.000Z"; var stockParser = new StockParser(); var parameters = "date1=2022-04-11T00:00:00.000Z&date2=2022-03-31T00:00:00.000Z"; var response = await client.GetAsync($"/StockAdvisory?{parameters}"); Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode); Assert.True(response.IsSuccessStatusCode); var returned = await response.Content.ReadFromJsonAsync<StockDifferences>(); Assert.NotNull(returned); } }
StockAdvisoryWebApi/Controllers/StockAdvisoryController.cs +16 −21 Original line number Diff line number Diff line Loading @@ -34,9 +34,7 @@ public class StockAdvisoryController : ControllerBase [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task<IActionResult> GetDifferences([FromQuery] DateTime? date1, [FromQuery] DateTime? date2) { var diff = date1 is null || date2 is null ? await GetDifferencesFromLastTwoDays() : GetStockDifferencesFromDates(date1.Value, date2.Value); var diff = await GetStockDifferencesFromDates(date1, date2); if (diff is not null) return Ok(diff); Loading @@ -44,30 +42,27 @@ public class StockAdvisoryController : ControllerBase return NotFound(); } private async Task<StockDifferences?> GetDifferencesFromLastTwoDays() private async Task<StockDifferences> GetStockDifferencesFromDates(DateTime? date1, DateTime? date2) { try if (date1 is null && date2 is null) { var (_, latest) = await _fileManager.DownloadLatest(); var records = _fileManager.ListAvailableRecords(); var yesterdayDate = _clock.GetCurrentInstant().ToDateTimeUtc().Date.Subtract(TimeSpan.FromDays(1)); var yesterdaysLatest = records .OrderByDescending(d => d) .First(d => d.Date.CompareTo(yesterdayDate) == 0); return GetStockDifferencesFromDates(latest, yesterdaysLatest); date1 = _clock.GetCurrentInstant().ToDateTimeUtc().Date; //today date2 = _clock.GetCurrentInstant().ToDateTimeUtc().Date.Subtract(TimeSpan.FromDays(1)); //yesterday } catch (Exception) else if (date1 is null || date2 is null) { return null; } } private StockDifferences? GetStockDifferencesFromDates(DateTime date1, DateTime date2) var path1 = _fileManager.GetRecordFilePath((DateTime) date1); var path2 = _fileManager.GetRecordFilePath((DateTime) date2); if (path1 is null && date1.Equals(_clock.GetCurrentInstant().ToDateTimeUtc().Date)) { var path1 = _fileManager.GetRecordFilePath(date1); var path2 = _fileManager.GetRecordFilePath(date2); (path1, _) = await _fileManager.DownloadLatest(); } if (path1 is null || path2 is null) if (path1 == null || path2 == null) { return null; } Loading