예제 #1
0
            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);
            }
예제 #2
0
    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);
    }
예제 #3
0
    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);
    }