From 366704472fca6718bbbdc6ea2ca4eac3f02d55db Mon Sep 17 00:00:00 2001 From: Yasser Ahmed Date: Sun, 18 May 2025 13:39:58 +0300 Subject: [PATCH 1/7] add unit tests for SubTask conversion and TaskDto to Task mapping --- src/test/kotlin/data/mappers/MapperKtTest.kt | 37 ++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/test/kotlin/data/mappers/MapperKtTest.kt b/src/test/kotlin/data/mappers/MapperKtTest.kt index 043ba67..223bb0a 100644 --- a/src/test/kotlin/data/mappers/MapperKtTest.kt +++ b/src/test/kotlin/data/mappers/MapperKtTest.kt @@ -312,4 +312,41 @@ class MapperKtTest { ) assertEquals(TASK, taskAuditLog.toDto().auditType) } + + @Test + fun `test String to SubTask conversion`() { + val uuidString = "550e8400-e29b-41d4-a716-446655440000" + + val subTask = uuidString.toSubTask() + + assertEquals(UUID.fromString(uuidString), subTask.id) + assertEquals("", subTask.title) + assertEquals("", subTask.description) + assertEquals(false, subTask.isCompleted) + assertEquals(UUID.fromString(uuidString), subTask.parentTaskId) + } + + @Test + fun `test TaskDto to Task conversion with subTasks`() { + val taskDto = TaskDto( + id = "550e8400-e29b-41d4-a716-446655440000", + name = "Test Task", + description = "Task Description", + projectId = "550e8400-e29b-41d4-a716-446655440001", + stateId = "550e8400-e29b-41d4-a716-446655440002", + subTasks = listOf("550e8400-e29b-41d4-a716-446655440003") + ) + + val task = taskDto.toTask() + + assertEquals(UUID.fromString("550e8400-e29b-41d4-a716-446655440000"), task.id) + assertEquals("Test Task", task.title) + assertEquals("Task Description", task.description) + assertEquals(1, task.subTasks.size) + val subTask = task.subTasks[0] + assertEquals(UUID.fromString("550e8400-e29b-41d4-a716-446655440003"), subTask.id) + assertEquals("", subTask.title) + assertEquals(false, subTask.isCompleted) + } + } \ No newline at end of file From d845551779d398bd248f0844bfbfbb6a51b7dc37 Mon Sep 17 00:00:00 2001 From: Yasser Ahmed Date: Sun, 18 May 2025 13:50:51 +0300 Subject: [PATCH 2/7] add unit tests for CreateSubTask use case --- .../sub_task/CreateSubTaskUseCaseTest.kt | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/test/kotlin/domain/usecases/sub_task/CreateSubTaskUseCaseTest.kt diff --git a/src/test/kotlin/domain/usecases/sub_task/CreateSubTaskUseCaseTest.kt b/src/test/kotlin/domain/usecases/sub_task/CreateSubTaskUseCaseTest.kt new file mode 100644 index 0000000..3e0a89a --- /dev/null +++ b/src/test/kotlin/domain/usecases/sub_task/CreateSubTaskUseCaseTest.kt @@ -0,0 +1,91 @@ +package domain.usecases.sub_task + +import domain.models.SubTask +import domain.repositories.SubTaskRepository +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.mockk +import kotlinx.coroutines.test.runTest +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import java.util.* +import kotlin.test.assertFalse +import kotlin.test.assertTrue + +class CreateSubTaskUseCaseTest { + private lateinit var createSubTaskUseCase: CreateSubTaskUseCase + private lateinit var subTaskRepository: SubTaskRepository + + @BeforeEach + fun setup() { + subTaskRepository = mockk() + createSubTaskUseCase = CreateSubTaskUseCase(subTaskRepository) + } + + @Test + fun `should return true when create subtask without any issue`() = runTest { + // Given + val subTask = SubTask( + id = UUID.randomUUID(), + title = "SubTask Title", + description = "SubTask Description", + isCompleted = false, + parentTaskId = UUID.randomUUID() + ) + coEvery { subTaskRepository.createSubTask(subTask) } returns true + + // When + val result = createSubTaskUseCase(subTask) + + // Then + assertTrue(result) + coVerify(exactly = 1) { subTaskRepository.createSubTask(subTask) } + } + + @Test + fun `should return false when repository fails to create subtask`() = runTest { + // Given + val subTask = SubTask( + id = UUID.randomUUID(), + title = "SubTask Title", + description = "SubTask Description", + isCompleted = false, + parentTaskId = UUID.randomUUID() + ) + coEvery { subTaskRepository.createSubTask(subTask) } returns false + + // When + val result = createSubTaskUseCase(subTask) + + // Then + assertFalse(result) + coVerify(exactly = 1) { subTaskRepository.createSubTask(subTask) } + } + + @Test + fun `should pass correct SubTask object to repository`() = runTest { + // Given + val subTaskId = UUID.randomUUID() + val taskId = UUID.randomUUID() + val subTask = SubTask( + id = subTaskId, + title = "Test SubTask", + description = "Test Description", + isCompleted = true, + parentTaskId = taskId + ) + coEvery { subTaskRepository.createSubTask(any()) } returns true + + // When + createSubTaskUseCase(subTask) + + // Then + coVerify { + subTaskRepository.createSubTask(match { + it.id == subTaskId && it.title == "Test SubTask" && + it.parentTaskId == taskId && + it.isCompleted == true + }) + } + } +} \ No newline at end of file From 83870be03cb69a0e577764e80ae3a2490d09aaf4 Mon Sep 17 00:00:00 2001 From: Yasser Ahmed Date: Sun, 18 May 2025 13:55:20 +0300 Subject: [PATCH 3/7] add unit tests for DeleteSubTask use case --- .../sub_task/DeleteSubTaskUseCaseTest.kt | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/test/kotlin/domain/usecases/sub_task/DeleteSubTaskUseCaseTest.kt diff --git a/src/test/kotlin/domain/usecases/sub_task/DeleteSubTaskUseCaseTest.kt b/src/test/kotlin/domain/usecases/sub_task/DeleteSubTaskUseCaseTest.kt new file mode 100644 index 0000000..13ee64f --- /dev/null +++ b/src/test/kotlin/domain/usecases/sub_task/DeleteSubTaskUseCaseTest.kt @@ -0,0 +1,68 @@ +package domain.usecases.sub_task + +import domain.repositories.SubTaskRepository +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.mockk +import kotlinx.coroutines.test.runTest +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import java.util.* +import kotlin.test.assertFalse +import kotlin.test.assertTrue + +class DeleteSubTaskUseCaseTest { + private lateinit var deleteSubTaskUseCase: DeleteSubTaskUseCase + private lateinit var subTaskRepository: SubTaskRepository + + @BeforeEach + fun setup() { + subTaskRepository = mockk() + deleteSubTaskUseCase = DeleteSubTaskUseCase(subTaskRepository) + } + + @Test + fun `should return true when delete subtask without any issue`() = runTest { + // Given + val subTaskId = UUID.randomUUID() + coEvery { subTaskRepository.deleteSubTask(subTaskId) } returns true + + // When + val result = deleteSubTaskUseCase(subTaskId) + + // Then + assertTrue(result) + coVerify(exactly = 1) { subTaskRepository.deleteSubTask(subTaskId) } + } + + @Test + fun `should return false when repository fails to delete subtask`() = runTest { + // Given + val subTaskId = UUID.randomUUID() + coEvery { subTaskRepository.deleteSubTask(subTaskId) } returns false + + // When + val result = deleteSubTaskUseCase(subTaskId) + + // Then + assertFalse(result) + coVerify(exactly = 1) { subTaskRepository.deleteSubTask(subTaskId) } + } + + @Test + fun `should pass correct UUID to repository`() = runTest { + // Given + val subTaskId = UUID.randomUUID() + coEvery { subTaskRepository.deleteSubTask(any()) } returns true + + // When + deleteSubTaskUseCase(subTaskId) + + // Then + coVerify { + subTaskRepository.deleteSubTask(match { + it == subTaskId + }) + } + } +} \ No newline at end of file From 17df0b8750ddf80786842264c0e9a9afd4ca3d93 Mon Sep 17 00:00:00 2001 From: Yasser Ahmed Date: Sun, 18 May 2025 14:10:15 +0300 Subject: [PATCH 4/7] add unit tests for GetSubTasksByTaskId use case --- .../GetSubTasksByTaskIdUseCaseTest.kt | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/test/kotlin/domain/usecases/sub_task/GetSubTasksByTaskIdUseCaseTest.kt diff --git a/src/test/kotlin/domain/usecases/sub_task/GetSubTasksByTaskIdUseCaseTest.kt b/src/test/kotlin/domain/usecases/sub_task/GetSubTasksByTaskIdUseCaseTest.kt new file mode 100644 index 0000000..2880d56 --- /dev/null +++ b/src/test/kotlin/domain/usecases/sub_task/GetSubTasksByTaskIdUseCaseTest.kt @@ -0,0 +1,85 @@ +package domain.usecases.sub_task + +import domain.models.SubTask +import domain.repositories.SubTaskRepository +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.mockk +import kotlinx.coroutines.test.runTest +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import java.util.* +import kotlin.test.assertEquals + +class GetSubTasksByTaskIdUseCaseTest { + private lateinit var getSubTasksByTaskIdUseCase: GetSubTasksByTaskIdUseCase + private lateinit var subTaskRepository: SubTaskRepository + + @BeforeEach + fun setup() { + subTaskRepository = mockk() + getSubTasksByTaskIdUseCase = GetSubTasksByTaskIdUseCase(subTaskRepository) + } + + @Test + fun `should return list of subtasks when repository returns data`() = runTest { + // Given + val taskId = UUID.randomUUID() + val subTasks = listOf( + SubTask( + id = UUID.randomUUID(), + title = "SubTask 1", + description = "Description 1", + isCompleted = false, + parentTaskId = taskId + ), + SubTask( + id = UUID.randomUUID(), + title = "SubTask 2", + description = "Description 2", + isCompleted = true, + parentTaskId = taskId + ) + ) + coEvery { subTaskRepository.getSubTasksByTaskId(taskId) } returns subTasks + + // When + val result = getSubTasksByTaskIdUseCase(taskId) + + // Then + assertEquals(subTasks, result) + coVerify(exactly = 1) { subTaskRepository.getSubTasksByTaskId(taskId) } + } + + @Test + fun `should return empty list when repository returns no data`() = runTest { + // Given + val taskId = UUID.randomUUID() + val emptyList = emptyList() + coEvery { subTaskRepository.getSubTasksByTaskId(taskId) } returns emptyList + + // When + val result = getSubTasksByTaskIdUseCase(taskId) + + // Then + assertEquals(emptyList, result) + coVerify(exactly = 1) { subTaskRepository.getSubTasksByTaskId(taskId) } + } + + @Test + fun `should pass correct taskId to repository`() = runTest { + // Given + val taskId = UUID.randomUUID() + coEvery { subTaskRepository.getSubTasksByTaskId(any()) } returns emptyList() + + // When + getSubTasksByTaskIdUseCase(taskId) + + // Then + coVerify { + subTaskRepository.getSubTasksByTaskId(match { + it == taskId + }) + } + } +} \ No newline at end of file From a1b798843ae513e1230fce2faad86c15b6ac18d8 Mon Sep 17 00:00:00 2001 From: Yasser Ahmed Date: Sun, 18 May 2025 14:19:42 +0300 Subject: [PATCH 5/7] add unit tests for UpdateSubTask use case --- .../sub_task/UpdateSubTaskUseCaseTest.kt | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 src/test/kotlin/domain/usecases/sub_task/UpdateSubTaskUseCaseTest.kt diff --git a/src/test/kotlin/domain/usecases/sub_task/UpdateSubTaskUseCaseTest.kt b/src/test/kotlin/domain/usecases/sub_task/UpdateSubTaskUseCaseTest.kt new file mode 100644 index 0000000..e57c73f --- /dev/null +++ b/src/test/kotlin/domain/usecases/sub_task/UpdateSubTaskUseCaseTest.kt @@ -0,0 +1,93 @@ +package domain.usecases.sub_task + +import domain.models.SubTask +import domain.repositories.SubTaskRepository +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.mockk +import kotlinx.coroutines.test.runTest +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import java.util.* +import kotlin.test.assertFalse +import kotlin.test.assertTrue + +class UpdateSubTaskUseCaseTest { + private lateinit var updateSubTaskUseCase: UpdateSubTaskUseCase + private lateinit var subTaskRepository: SubTaskRepository + + @BeforeEach + fun setup() { + subTaskRepository = mockk() + updateSubTaskUseCase = UpdateSubTaskUseCase(subTaskRepository) + } + + @Test + fun `should return true when update subtask without any issue`() = runTest { + // Given + val subTask = SubTask( + id = UUID.randomUUID(), + title = "Updated SubTask Title", + description = "Updated SubTask Description", + isCompleted = true, + parentTaskId = UUID.randomUUID() + ) + coEvery { subTaskRepository.updateSubTask(subTask) } returns true + + // When + val result = updateSubTaskUseCase(subTask) + + // Then + assertTrue(result) + coVerify(exactly = 1) { subTaskRepository.updateSubTask(subTask) } + } + + @Test + fun `should return false when repository fails to update subtask`() = runTest { + // Given + val subTask = SubTask( + id = UUID.randomUUID(), + title = "Updated SubTask Title", + description = "Updated SubTask Description", + isCompleted = true, + parentTaskId = UUID.randomUUID() + ) + coEvery { subTaskRepository.updateSubTask(subTask) } returns false + + // When + val result = updateSubTaskUseCase(subTask) + + // Then + assertFalse(result) + coVerify(exactly = 1) { subTaskRepository.updateSubTask(subTask) } + } + + @Test + fun `should pass correct SubTask object to repository`() = runTest { + // Given + val subTaskId = UUID.randomUUID() + val taskId = UUID.randomUUID() + val subTask = SubTask( + id = subTaskId, + title = "Test Updated SubTask", + description = "Test Updated Description", + isCompleted = true, + parentTaskId = taskId + ) + coEvery { subTaskRepository.updateSubTask(any()) } returns true + + // When + updateSubTaskUseCase(subTask) + + // Then + coVerify { + subTaskRepository.updateSubTask(match { + it.id == subTaskId && + it.title == "Test Updated SubTask" && + it.description == "Test Updated Description" && + it.parentTaskId == taskId && + it.isCompleted == true + }) + } + } +} \ No newline at end of file From 1128c891892841dfe4c3bdf08f448703a9db4924 Mon Sep 17 00:00:00 2001 From: Yasser Ahmed Date: Sun, 18 May 2025 14:32:56 +0300 Subject: [PATCH 6/7] rename test class from TaskStateDataSourceImplTest to TaskStateRepositoryImplTest --- ...tateDataSourceImplTest.kt => TaskStateRepositoryImplTest.kt} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/test/kotlin/data/repositories/{TaskStateDataSourceImplTest.kt => TaskStateRepositoryImplTest.kt} (99%) diff --git a/src/test/kotlin/data/repositories/TaskStateDataSourceImplTest.kt b/src/test/kotlin/data/repositories/TaskStateRepositoryImplTest.kt similarity index 99% rename from src/test/kotlin/data/repositories/TaskStateDataSourceImplTest.kt rename to src/test/kotlin/data/repositories/TaskStateRepositoryImplTest.kt index ca410b2..3301cd6 100644 --- a/src/test/kotlin/data/repositories/TaskStateDataSourceImplTest.kt +++ b/src/test/kotlin/data/repositories/TaskStateRepositoryImplTest.kt @@ -17,7 +17,7 @@ import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows import java.util.* -class TaskStateDataSourceImplTest { +class TaskStateRepositoryImplTest { private lateinit var dataSource: TaskDataSource private lateinit var repository: TasksRepositoryImpl From 521bc3f88aced6ecdefcb5413bc4f9bd653a8984 Mon Sep 17 00:00:00 2001 From: Yasser Ahmed Date: Sun, 18 May 2025 14:38:36 +0300 Subject: [PATCH 7/7] rename test class from UserDataSourceImplTest to UserRepositoryImplTest --- .../{UserDataSourceImplTest.kt => UserRepositoryImplTest.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/test/kotlin/data/repositories/{UserDataSourceImplTest.kt => UserRepositoryImplTest.kt} (100%) diff --git a/src/test/kotlin/data/repositories/UserDataSourceImplTest.kt b/src/test/kotlin/data/repositories/UserRepositoryImplTest.kt similarity index 100% rename from src/test/kotlin/data/repositories/UserDataSourceImplTest.kt rename to src/test/kotlin/data/repositories/UserRepositoryImplTest.kt