package com.suno.android.common_data.repos import arrow.core.Either import com.suno.android.common_core_utils.Id import com.suno.android.common_core_utils.model.Url import com.suno.android.common_data.mappers.clips.SongListData import com.suno.android.common_data.mappers.hooks.LocalHookData import com.suno.android.common_networking.remote.entities.RemoteShareLinkBody import com.suno.android.common_networking.remote.entities.ShareLinkSchema import com.suno.android.common_networking.remote.share.ShareLinkService 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.Before import org.junit.Test class ShareLinkRepositoryTest { private val shareService = mockk() private lateinit var subject: ShareLinkRepository @Before fun setUp() { subject = ShareLinkRepository(shareService) } @Test fun `given successful response when getSongShareLink called then returns mapped URL`() = runTest { val contentId = Id("song-123") val platform = "instagram" val shareUrl = "https://share.suno.com/song-123" mockSuccessfulResponse(shareUrl = shareUrl) val result = subject.getSongShareLink(contentId, platform) assertEquals(Either.Right(Url(shareUrl)), result) verifyServiceCall(contentType = "song", contentId = contentId.value, platform = platform) } @Test fun `given successful response when getHookShareLink called then returns mapped URL`() = runTest { val contentId = Id("hook-456") val platform = "twitter" val shareUrl = "https://share.suno.com/hook-456" mockSuccessfulResponse(shareUrl = shareUrl) val result = subject.getHookShareLink( contentId = contentId, platform = platform, recommendationMetadata = null, ) assertEquals(Either.Right(Url(shareUrl)), result) verifyServiceCall(contentType = "hook", contentId = contentId.value, platform = platform) } private fun mockSuccessfulResponse( shareUrl: String, ) { val mockResponse = ShareLinkSchema( success = true, message = null, link = shareUrl, ) coEvery { shareService.getShareLink(any()) } returns Either.Right(mockResponse) } private fun verifyServiceCall( contentType: String, contentId: String, platform: String, ) { coVerify { shareService.getShareLink( RemoteShareLinkBody( contentType = contentType, contentId = contentId, source = "android", platform = platform, recommendationMetadata = null, ), ) } } }