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
134 changes: 121 additions & 13 deletions Wybod.TaskTest.UnitTests/TaskServiceTests.cs
Original file line number Diff line number Diff line change
@@ -1,22 +1,130 @@
using Moq;
using Wybod.TaskTest.Data.Models;
using Wybod.TaskTest.Data.Repositories;
using Wybod.TaskTest.DTOs;
using Wybod.TaskTest.Services;

namespace Wybod.TaskTest.UnitTests;

public class TaskServiceTests
{
[Fact]
public void CreateTaskTest()
{
var taskRepository = new Mock<ITaskRepository>();
var taskService = new TaskService(taskRepository.Object);

taskRepository.Setup(tr => tr.Create(It.IsAny<TaskItem>()));

taskService.CreateTask("Test", "Task description");

taskRepository.Verify(tr => tr.Create(It.IsAny<TaskItem>()), Times.Once);
}
{
private readonly Mock<ITaskRepository> _mockRepo;
private readonly TaskService _taskService;
private readonly List<TaskItem> _tasks;

public TaskServiceTests()
{
_tasks = new List<TaskItem>
{
new TaskItem { Id = Guid.NewGuid(), Title = "Task 1", Description = "Description 1", IsActive = true, IsCompleted = false },
new TaskItem { Id = Guid.NewGuid(), Title = "Task 2", Description = "Description 2", IsActive = true, IsCompleted = true },
new TaskItem { Id = Guid.NewGuid(), Title = "Task 3", Description = "Description 3", IsActive = false, IsCompleted = false }
};

_mockRepo = new Mock<ITaskRepository>();
_mockRepo.Setup(r => r.GetAll()).Returns(_tasks);
_mockRepo.Setup(r => r.GetById(It.IsAny<Guid>())).Returns((Guid id) => _tasks.FirstOrDefault(t => t.Id == id));
_mockRepo.Setup(r => r.Create(It.IsAny<TaskItem>())).Returns((TaskItem t) =>
{
_tasks.Add(t);
return t;
});
_mockRepo.Setup(r => r.Update(It.IsAny<Guid>(), It.IsAny<TaskItem>())).Returns((Guid id, TaskItem t) =>
{
var existing = _tasks.FirstOrDefault(x => x.Id == id);
if (existing == null) return false;
existing.Title = t.Title;
existing.Description = t.Description;
existing.IsCompleted = t.IsCompleted;
return true;
});
_mockRepo.Setup(r => r.Delete(It.IsAny<Guid>())).Returns((Guid id) =>
{
var existing = _tasks.FirstOrDefault(x => x.Id == id);
if (existing == null) return false;
existing.IsActive = false;
return true;
});

_taskService = new TaskService(_mockRepo.Object);
}

[Fact]
public void GetAll_ShouldReturnOnlyActiveTasks()
{
var result = _taskService.GetAllTasks();
Assert.Equal(2, result.Count());
Assert.All(result, t => Assert.True(t.IsActive));
}

[Fact]
public void GetById_ShouldReturnCorrectTask()
{
var target = _tasks[0];
var result = _taskService.GetTaskById(target.Id);
Assert.NotNull(result);
Assert.Equal(target.Id, result.Id);
}

[Fact]
public void CreateTask_ShouldAddNewTask()
{
var dto = new TaskCreateDto { Title = "New Task", Description = "New Description test" };
var result = _taskService.CreateTask(dto);
Assert.Contains(result, _tasks);
Assert.Equal("New Task", result.Title);
}

[Fact]
public void UpdateTask_ShouldModifyExistingTask()
{
var target = _tasks[0];
var dto = new TaskUpdateDto
{
Title = "Updated",
Description = "Updated Description test",
IsCompleted = true,
CompletedAt = DateTime.UtcNow
};

var result = _taskService.UpdateTask(target.Id, dto);
Assert.NotNull(result);
Assert.True(target.IsCompleted);
}

[Fact]
public void UpdateTask_NonExistentTask_ShouldReturnNull()
{
var dto = new TaskUpdateDto { Title = "X", Description = "Y", IsCompleted = false };
var result = _taskService.UpdateTask(Guid.NewGuid(), dto);
Assert.Null(result);
}

[Fact]
public void DeleteTask_ShouldMarkTaskInactive()
{
var target = _tasks[0];
var deleted = _taskService.DeleteTask(target.Id);
Assert.True(deleted);
Assert.False(target.IsActive);
}

[Fact]
public void DeleteTask_NonExistentTask_ShouldReturnFalse()
{
var deleted = _taskService.DeleteTask(Guid.NewGuid());
Assert.False(deleted);
}

[Fact]
public void CreateTask_VerifyRepositoryCalledOnce()
{
var mockRepo = new Mock<ITaskRepository>();
var service = new TaskService(mockRepo.Object);

var dto = new TaskCreateDto { Title = "Test", Description = "Task description" };
service.CreateTask(dto);

mockRepo.Verify(r => r.Create(It.IsAny<TaskItem>()), Times.Once);
}
}
79 changes: 77 additions & 2 deletions Wybod.TaskTest/ClientApp/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 4 additions & 1 deletion Wybod.TaskTest/ClientApp/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,11 @@
"license": "ISC",
"description": "",
"dependencies": {
"@headlessui/vue": "^1.7.23",
"@heroicons/vue": "^2.2.0",
"vue": "^3.5.22",
"vue-router": "^4.5.1"
"vue-router": "^4.5.1",
"vue-toastification": "^2.0.0-rc.5"
},
"devDependencies": {
"@tailwindcss/postcss": "^4.1.14",
Expand Down
Loading