Commit c008e8b0 authored by kamil's avatar kamil
Browse files

StockAdvisory controller generalization

New test to cover all code in controller
parent 60b68fc3
Loading
Loading
Loading
Loading
+71 −9
Original line number Diff line number Diff line
@@ -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}";
@@ -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()
    {
@@ -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
@@ -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);
@@ -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);

            }
    
}
+16 −21
Original line number Diff line number Diff line
@@ -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);
@@ -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;
        }