package com.suno.android.common_data.repos import arrow.core.Either import arrow.retrofit.adapter.either.networkhandling.CallError import com.suno.android.common_core_utils.Id import com.suno.android.common_core_utils.SunoLogger import com.suno.android.common_data.mappers.projects.ProjectData import com.suno.android.common_networking.remote.entities.ProjectTrashSpec import com.suno.android.common_networking.remote.projects.ProjectsService import io.mockk.coEvery import io.mockk.coVerify import io.mockk.mockk import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test class ProjectsRepositoryTest { private val loggerFactory = mockk(relaxed = true) private val projectsService = mockk() private lateinit var subject: ProjectsRepository @Before fun setUp() { subject = ProjectsRepositoryImpl( loggerFactory = loggerFactory, projectsService = projectsService, ) } @Test fun `given successful service response when deleteProject called then returns Right`() = runTest { val projectId = Id("test-project-123") mockSuccessfulDeleteResponse() val result = subject.deleteProject(projectId) assertTrue(result.isRight()) assertEquals(Unit, result.getOrNull()) verifyTrashProjectCall(projectId = projectId.value, undo = false) } @Test fun `given service error when deleteProject called then returns Left with Unit`() = runTest { val projectId = Id("test-project-456") val error = mockk() mockFailedDeleteResponse(error) val result = subject.deleteProject(projectId) assertTrue(result.isLeft()) assertEquals(Unit, result.leftOrNull()) verifyTrashProjectCall(projectId = projectId.value, undo = false) } private fun mockSuccessfulDeleteResponse() { coEvery { projectsService.trashProject(any()) } returns Either.Right(Unit) } private fun mockFailedDeleteResponse( error: CallError, ) { coEvery { projectsService.trashProject(any()) } returns Either.Left(error) } private fun verifyTrashProjectCall( projectId: String, undo: Boolean, ) { coVerify { projectsService.trashProject( ProjectTrashSpec( projectId = projectId, undo = undo, ), ) } } }