GivenNullCountAndListReturnedFromTransactionService_ThenCorrectAnalyticsCategoryListReturned() { var expectedType = TransactionType.Expense; var start = DateTime.MinValue; var end = DateTime.MaxValue; var timePeriod = new TimePeriod("MONTH", 5); var dateRange = new DateRange(start, end); const string expectedCategory1 = "category1"; const int numberOfCategory1Transactions = 24; const decimal category1TransactionsAmount = (decimal)34.5; const string expectedCategory2 = "category2"; const int numberOfCategory2Transactions = 20; const decimal category2TransactionsAmount = (decimal)34.5; const string expectedCategory3 = "category3"; const int numberOfCategory3Transactions = 10; const decimal category3TransactionsAmount = (decimal)34.5; var transactionList = new TransactionListBuilder("userId123") .WithNumberOfTransactionsOfCategoryAndAmount(numberOfCategory1Transactions, expectedCategory1, category1TransactionsAmount) .WithNumberOfTransactionsOfCategoryAndAmount(numberOfCategory2Transactions, expectedCategory2, category2TransactionsAmount) .WithNumberOfTransactionsOfCategoryAndAmount(numberOfCategory3Transactions, expectedCategory3, category3TransactionsAmount) .Build(); _mockTimePeriodHelper.Setup(helper => helper.ResolveDateRange(timePeriod)).Returns(dateRange); _mockTransactionService .Setup(helperService => helperService.GetTransactionsAsync(It.IsAny <GetTransactionsQuery>())) .ReturnsAsync(() => transactionList); var service = new AnalyticsService(_mockTransactionService.Object, _mockTimePeriodHelper.Object); var analyticsCategories = await service.GetCategoriesBreakdown(expectedType, null, timePeriod); var expectedAnalyticsCategories = new List <AnalyticsCategory> { new() { CategoryName = expectedCategory1, TotalAmount = numberOfCategory1Transactions * category1TransactionsAmount }, new() { CategoryName = expectedCategory2, TotalAmount = numberOfCategory2Transactions * category2TransactionsAmount }, new() { CategoryName = expectedCategory3, TotalAmount = numberOfCategory3Transactions * category3TransactionsAmount } }; Assert.Equal(expectedAnalyticsCategories, analyticsCategories); }
GivenStartAndEndInputParameters_WhenGetCategoriesBreakdownEndpointInvoked_ThenCorrectCategoriesReturned() { const string expectedCategory1 = "category1"; const int numberOfCategory1Transactions = 10; const decimal category1TransactionsAmount = (decimal)34.5; const string expectedCategory2 = "category2"; const int numberOfCategory2Transactions = 5; const decimal category2TransactionsAmount = (decimal)34.5; const string expectedCategory3 = "category3"; const int numberOfCategory3Transactions = 2; const decimal category3TransactionsAmount = (decimal)34.5; var transactionList = new TransactionListBuilder(UserId) .WithNumberOfTransactionsOfCategoryAndAmount(numberOfCategory1Transactions, expectedCategory1, category1TransactionsAmount) .WithNumberOfTransactionsOfCategoryAndAmount(numberOfCategory2Transactions, expectedCategory2, category2TransactionsAmount) .WithNumberOfTransactionsOfCategoryAndAmount(numberOfCategory3Transactions, expectedCategory3, category3TransactionsAmount) .Build(); await DynamoDbHelper.WriteTransactionsIntoTable(transactionList); var query = HttpUtility.ParseQueryString(string.Empty); query["type"] = "expense"; query["start"] = new DateTime(2021, 4, 1).ToString("yyyy-MM-dd"); query["end"] = new DateTime(2099, 4, 1).ToString("yyyy-MM-dd"); var queryString = query.ToString(); var response = await HttpClient.GetAsync($"/api/analytics/categories?{queryString}"); response.EnsureSuccessStatusCode(); var returnedString = await response.Content.ReadAsStringAsync(); var actualAnalyticsCategories = JsonSerializer.Deserialize <List <AnalyticsCategory> >(returnedString, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); var expectedAnalyticsCategories = new List <AnalyticsCategory> { new() { CategoryName = expectedCategory1, TotalAmount = numberOfCategory1Transactions * category1TransactionsAmount }, new() { CategoryName = expectedCategory2, TotalAmount = numberOfCategory2Transactions * category2TransactionsAmount }, new() { CategoryName = expectedCategory3, TotalAmount = numberOfCategory3Transactions * category3TransactionsAmount } }; Assert.Equal(expectedAnalyticsCategories, actualAnalyticsCategories); }
GivenStartAndEndInputParameters_WhenGetPayerPayeeBreakdownEndpointInvoked_ThenCorrectAnalyticsPayerPayeesReturned() { Guid expectedPayerPayeeId1 = Guid.NewGuid(); const string expectedPayerPayeeName1 = "name1"; const int numberOfPayerPayee1Transactions = 6; const decimal payerPayee1TransactionsAmount = (decimal)34.5; Guid expectedPayerPayeeId2 = Guid.NewGuid(); const string expectedPayerPayeeName2 = "name2"; const int numberOfPayerPayee2Transactions = 4; const decimal payerPayee2TransactionsAmount = (decimal)34.5; Guid expectedPayerPayeeId3 = Guid.NewGuid(); const string expectedPayerPayeeName3 = "name3"; const int numberOfPayerPayee3Transactions = 2; const decimal payerPayee3TransactionsAmount = (decimal)34.5; var transactionList = new TransactionListBuilder(UserId) .WithNumberOfTransactionsOfPayerPayeeIdAndPayerPayeeName(numberOfPayerPayee1Transactions, expectedPayerPayeeId1, expectedPayerPayeeName1, payerPayee1TransactionsAmount) .WithNumberOfTransactionsOfPayerPayeeIdAndPayerPayeeName(numberOfPayerPayee2Transactions, expectedPayerPayeeId2, expectedPayerPayeeName2, payerPayee2TransactionsAmount) .WithNumberOfTransactionsOfPayerPayeeIdAndPayerPayeeName(numberOfPayerPayee3Transactions, expectedPayerPayeeId3, expectedPayerPayeeName3, payerPayee3TransactionsAmount) .Build(); await DynamoDbHelper.WriteTransactionsIntoTable(transactionList); var query = HttpUtility.ParseQueryString(string.Empty); query["type"] = "expense"; query["start"] = new DateTime(2021, 4, 1).ToString("yyyy-MM-dd"); query["end"] = new DateTime(2099, 4, 1).ToString("yyyy-MM-dd"); var queryString = query.ToString(); var response = await HttpClient.GetAsync($"/api/analytics/payerpayees?{queryString}"); response.EnsureSuccessStatusCode(); var returnedString = await response.Content.ReadAsStringAsync(); var actualAnalyticsPayerPayees = JsonSerializer.Deserialize <List <AnalyticsPayerPayee> >(returnedString, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); var expectedAnalyticsPayerPayees = new List <AnalyticsPayerPayee> { new() { PayerPayeeId = expectedPayerPayeeId1, PayerPayeeName = expectedPayerPayeeName1, TotalAmount = numberOfPayerPayee1Transactions * payerPayee1TransactionsAmount }, new() { PayerPayeeId = expectedPayerPayeeId2, PayerPayeeName = expectedPayerPayeeName2, TotalAmount = numberOfPayerPayee2Transactions * payerPayee2TransactionsAmount }, new() { PayerPayeeId = expectedPayerPayeeId3, PayerPayeeName = expectedPayerPayeeName3, TotalAmount = numberOfPayerPayee3Transactions * payerPayee3TransactionsAmount }, }; Assert.Equal(expectedAnalyticsPayerPayees, actualAnalyticsPayerPayees); }