diff --git a/src/AdminAssistant.Blazor/Server/WebAPI/v1/BudgetModule/BudgetController.cs b/src/AdminAssistant.Blazor/Server/WebAPI/v1/BudgetModule/BudgetController.cs new file mode 100644 index 00000000..0b026a7f --- /dev/null +++ b/src/AdminAssistant.Blazor/Server/WebAPI/v1/BudgetModule/BudgetController.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using AdminAssistant.DomainModel.Modules.BudgetModule.CQRS; +using AdminAssistant.Framework.Providers; +using AutoMapper; +using MediatR; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Swashbuckle.AspNetCore.Annotations; + +namespace AdminAssistant.WebAPI.v1 +{ + [ApiController] + [Route("api/v1/core/[controller]")] + [ApiExplorerSettings(GroupName = "Budgets - Budget")] + public class BudgetController : WebAPIControllerBase + { + public BudgetController(IMapper mapper, IMediator mediator, ILoggingProvider loggingProvider) + : base(mapper, mediator, loggingProvider) + { + } + + [HttpGet] + [SwaggerOperation("Lists all budgets.", OperationId = "GetBudget")] + [SwaggerResponse(StatusCodes.Status200OK, "Ok - returns a list of BudgetResponseDto", type: typeof(IEnumerable))] + public async Task>> GetBudgets() + { + Log.Start(); + + var result = await Mediator.Send(new BudgetQuery()).ConfigureAwait(false); + var response = Mapper.Map>(result.Value); + + return Log.Finish(Ok(response)); + } + } +} diff --git a/src/AdminAssistant.Blazor/Server/WebAPI/v1/BudgetModule/BudgetResponseDto.cs b/src/AdminAssistant.Blazor/Server/WebAPI/v1/BudgetModule/BudgetResponseDto.cs new file mode 100644 index 00000000..e21ce4ad --- /dev/null +++ b/src/AdminAssistant.Blazor/Server/WebAPI/v1/BudgetModule/BudgetResponseDto.cs @@ -0,0 +1,11 @@ +using AdminAssistant.DomainModel.Modules.BudgetModule; +using AdminAssistant.Framework.TypeMapping; + +namespace AdminAssistant.WebAPI.v1 +{ + public class BudgetResponseDto : IMapFrom + { + public int BudgetID { get; set; } + public string BudgetName { get; set; } = string.Empty; + } +} diff --git a/src/AdminAssistant.Test/AutoMapper_WebAPIMappingProfile_UnitTest.cs b/src/AdminAssistant.Test/AutoMapper_WebAPIMappingProfile_UnitTest.cs index d439967e..ab529196 100644 --- a/src/AdminAssistant.Test/AutoMapper_WebAPIMappingProfile_UnitTest.cs +++ b/src/AdminAssistant.Test/AutoMapper_WebAPIMappingProfile_UnitTest.cs @@ -2,6 +2,7 @@ using System; using System.Diagnostics.CodeAnalysis; using AdminAssistant.DomainModel.Modules.AccountsModule; +using AdminAssistant.DomainModel.Modules.BudgetModule; using AdminAssistant.DomainModel.Modules.DocumentsModule; using AutoMapper; using FluentAssertions; @@ -41,6 +42,7 @@ public void HaveValidConfiguration() [InlineData(typeof(BankAccountInfo), typeof(BankAccountInfoResponseDto))] [InlineData(typeof(BankAccountType), typeof(BankAccountTypeResponseDto))] [InlineData(typeof(BankAccountTransaction), typeof(BankAccountTransactionResponseDto))] + [InlineData(typeof(Budget), typeof(BudgetResponseDto))] [InlineData(typeof(Document), typeof(DocumentResponseDto))] public void ShouldSupportMappingFromSourceToDestination(Type source, Type destination) { diff --git a/src/AdminAssistant.Test/WebAPI/v1/Budget/BudgetController_UnitTest.cs b/src/AdminAssistant.Test/WebAPI/v1/Budget/BudgetController_UnitTest.cs new file mode 100644 index 00000000..61869b84 --- /dev/null +++ b/src/AdminAssistant.Test/WebAPI/v1/Budget/BudgetController_UnitTest.cs @@ -0,0 +1,67 @@ +#pragma warning disable CA1707 // Identifiers should not contain underscores +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using AdminAssistant.DomainModel; +using AdminAssistant.DomainModel.Modules.BudgetModule; +using AdminAssistant.DomainModel.Modules.BudgetModule.CQRS; +using Ardalis.Result; +using AutoMapper; +using FluentAssertions; +using MediatR; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; +using Moq; +using Xunit; + +namespace AdminAssistant.WebAPI.v1.BudgetModule +{ + public class BudgetController_UnitTest_Should + { + [Fact] + [Trait("Category", "Unit")] + public async Task Return_Status200OK_With_AListOfBudgets_Given_NoArguments() + { + // Arrange + var budgets = new List() + { + Factory.Budget.WithTestData(10).Build(), + Factory.Budget.WithTestData(20).Build() + }; + + var services = new ServiceCollection(); + services.AddMockServerSideLogging(); + services.AddAutoMapper(typeof(MappingProfile)); + + var mockMediator = new Mock(); + mockMediator.Setup(x => x.Send(It.IsAny(), It.IsAny())) + .Returns(Task.FromResult(Result>.Success(budgets))); + + services.AddTransient((sp) => mockMediator.Object); + services.AddTransient(); + + // Act + var response = await services.BuildServiceProvider().GetRequiredService().GetBudgets().ConfigureAwait(false); + + // Assert + response.Result.Should().BeOfType(); + response.Value.Should().BeNull(); + + var result = (OkObjectResult)response.Result; + result.Value.Should().BeAssignableTo>(); + + //var value = ((IEnumerable)result.Value).ToArray(); + //value.Should().HaveCount(currencies.Count); + + //var expected = currencies.ToArray(); + //for (int i = 0; i < expected.Length; i++) + //{ + // value[i].CurrencyID.Should().Be(expected[i].CurrencyID); + // value[i].Symbol.Should().Be(expected[i].Symbol); + // value[i].DecimalFormat.Should().Be(expected[i].DecimalFormat); + //} + } + } +} +#pragma warning restore CA1707 // Identifiers should not contain underscores diff --git a/src/AdminAssistant/DomainModel/Modules/BudgetModule/Budget.cs b/src/AdminAssistant/DomainModel/Modules/BudgetModule/Budget.cs index 60f1bed9..1a7c8bcd 100644 --- a/src/AdminAssistant/DomainModel/Modules/BudgetModule/Budget.cs +++ b/src/AdminAssistant/DomainModel/Modules/BudgetModule/Budget.cs @@ -1,9 +1,14 @@ +using AdminAssistant.Infra.DAL; + namespace AdminAssistant.DomainModel.Modules.BudgetModule { - public class Budget + public class Budget : IDatabasePersistable { public const int BudgetNameMaxLength = Constants.NameMaxLength; + public int BudgetID { get; set; } public string BudgetName { get; set; } = string.Empty; + + public int PrimaryKey => BudgetID; } } diff --git a/src/AdminAssistant/DomainModel/Modules/BudgetModule/CQRS/BudgetQuery.cs b/src/AdminAssistant/DomainModel/Modules/BudgetModule/CQRS/BudgetQuery.cs new file mode 100644 index 00000000..8a6ea14a --- /dev/null +++ b/src/AdminAssistant/DomainModel/Modules/BudgetModule/CQRS/BudgetQuery.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using Ardalis.Result; +using MediatR; + +namespace AdminAssistant.DomainModel.Modules.BudgetModule.CQRS +{ + public class BudgetQuery : IRequest>> + { + } +}