Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 0 additions & 116 deletions Controllers/TodoItemsController.cs

This file was deleted.

22 changes: 21 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,21 @@
# TodoService
# TodoService

TASK DESCRIPTION:
1) Add swagger
2) Store list of tasks in SQL Server (initially InMemoryDB is used)
3) Do refactoring: extract Data Access Layer, Business Layer
4) Write unit tests for business operations

Why I added CreateUpdateItemTodoDTO?
- To avoid the scenario when user types different ids in body and route parameter, simply avoiding that

Why didn't I test all the methods in the service?
- methods I didn't test are too simple, thay only use mapper (which is tested) and call repo which calls EF, so it's like testing EF

Possible scaling changes:
1) in case if TodoService will need to talk to more than one repo, it is good to add database service to store all of them
2) if project grows up it's good to separate DAL and BLL to separate projects, like I did with Tests

P.S.
I've passed a real mapper instead of mocked one to service tests, because mapper is already tested and
mocking Automapper makes to sence since its aim is to reduce dumb mapping code
25 changes: 25 additions & 0 deletions Tests/Tests.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
<PackageReference Include="Moq" Version="4.18.4" />
<PackageReference Include="NUnit" Version="3.13.3" />
<PackageReference Include="NUnit3TestAdapter" Version="4.4.2" />
<PackageReference Include="NUnit.Analyzers" Version="3.6.1" />
<PackageReference Include="coverlet.collector" Version="3.2.0" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\TodoApiDTO\TodoApiDTO.csproj" />
</ItemGroup>

</Project>
62 changes: 62 additions & 0 deletions Tests/TodoMapperTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
using AutoMapper;
using GeekStore.API.Core.Configurations;
using TodoApi.Models;
using TodoApiDTO.DTOs;

namespace Tests
{
[TestFixture]
public class TodoMapperTests
{
private readonly IMapper _mapper;

public TodoMapperTests()
{
var mapperConfig = new MapperConfiguration(mc =>
{
mc.AddProfile(new TodoProfile());
});

_mapper = mapperConfig.CreateMapper();
}

[Test]
public void ModelToDtoTest()
{
var todo = new TodoItem { Id = 1, IsComplete = true, Name = "model", Secret = "secret" };
var dto = _mapper.Map<TodoItemDTO>(todo);

Assert.NotNull(dto);
Assert.IsTrue(dto.IsComplete);
Assert.AreEqual(todo.Id, dto.Id);
Assert.AreEqual(todo.Name, dto.Name);
}

[Test]
public void DtoToModelTest()
{
var dto = new TodoItemDTO { Id = 1, IsComplete = true, Name = "model" };
var todo = _mapper.Map<TodoItem>(dto);

Assert.NotNull(todo);
Assert.IsTrue(todo.IsComplete);
Assert.AreEqual(dto.Id, todo.Id);
Assert.AreEqual(todo.Name, dto.Name);
Assert.Null(todo.Secret);
}

[Test]
public void CreateUpdateDtoToModelTest()
{
var dto = new CreateUpdateItemTodoDTO { Name = "postput", IsComplete = false };
var todo = new TodoItem { Id = 1 };

_mapper.Map(dto, todo);

Assert.IsFalse(todo.IsComplete);
Assert.AreEqual(dto.Name, todo.Name);
Assert.AreEqual(1, todo.Id);

}
}
}
79 changes: 79 additions & 0 deletions Tests/TodoServiceTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
using AutoMapper;
using GeekStore.API.Core.Configurations;
using Moq;
using TodoApi.Models;
using TodoApiDTO.ApiConstans;
using TodoApiDTO.DTOs;
using TodoApiDTO.Repositories.Interfaces;
using TodoApiDTO.Services;

namespace Tests
{
[TestFixture]
public class TodoServiceTests
{
private readonly IMapper _mapper;
private readonly TodoService _service;
private readonly Mock<ITodoRepository> _repository;

public TodoServiceTests()
{
_repository = new Mock<ITodoRepository>();

var todoProfile = new TodoProfile();
var configuration = new MapperConfiguration(cfg => cfg.AddProfile(todoProfile));
_mapper = new Mapper(configuration);

_service = new TodoService(_repository.Object, _mapper);
}

[Test]
public void UpdateSuccessTest()
{
// Arrange
var dto = new CreateUpdateItemTodoDTO { Name = "update", IsComplete = false };
_repository.Setup(r => r.Update(It.IsAny<long>(), It.IsAny<TodoItem>()))
.ReturnsAsync(ApiResponseStatus.Success);

// Act
var result = _service.Update(123, dto);

// Assert
Assert.AreEqual(ApiResponseStatus.Success, result.Result);
}

[Test]
public void UpdateIncorrectIdTest()
{
// Arrange
var dto = new CreateUpdateItemTodoDTO { Name = "update", IsComplete = false };
_repository.Setup(r => r.Update(It.IsAny<long>(), It.IsAny<TodoItem>()))
.ReturnsAsync(ApiResponseStatus.ItemDoesntExist);

// Act
var result = _service.Update(123, null);

// Assert
Assert.AreEqual(ApiResponseStatus.ItemDoesntExist, result.Result);
}

[Test]
public void CreateSuccessTest()
{
// Arrange
var dto = new CreateUpdateItemTodoDTO { Name = "create", IsComplete = false };
var expectedTodo = new TodoItem { Name = dto.Name, IsComplete = dto.IsComplete };
_repository.Setup(r => r.Create(It.IsAny<TodoItem>()))
.ReturnsAsync(expectedTodo);

// Act
var result = _service.Create(dto);

// Assert
var modelAfterUpdate = result.Result;
Assert.NotNull(modelAfterUpdate);
Assert.AreEqual(dto.IsComplete, modelAfterUpdate.IsComplete);
Assert.AreEqual(dto.Name, modelAfterUpdate.Name);
}
}
}
1 change: 1 addition & 0 deletions Tests/Usings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
global using NUnit.Framework;
18 changes: 0 additions & 18 deletions TodoApiDTO.csproj

This file was deleted.

12 changes: 12 additions & 0 deletions TodoApiDTO/ApiConstans/ApiResponseStatus.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.ComponentModel;

namespace TodoApiDTO.ApiConstans
{
public enum ApiResponseStatus
{
[Description("Success")]
Success,
[Description("Item does not exist")]
ItemDoesntExist,
}
}
Loading