package org.terst.doot.widget import io.mockk.* import kotlinx.coroutines.test.runTest import okhttp3.Call import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.Protocol import okhttp3.Request import okhttp3.Response import okhttp3.ResponseBody.Companion.toResponseBody import org.junit.Assert.* import org.junit.Test import org.terst.doot.widget.data.WidgetRepository class WidgetRepositoryTest { private val mockClient = mockk() private val mockCall = mockk() private fun responseOf(code: Int, body: String): Response { return Response.Builder() .request(Request.Builder().url("https://example.com").build()) .protocol(Protocol.HTTP_1_1) .code(code) .message("") .body(body.toResponseBody("application/json".toMediaType())) .build() } @Test fun `fetch returns failure on non-200`() = runTest { every { mockClient.newCall(any()) } returns mockCall every { mockCall.execute() } returns responseOf(401, "unauthorized") val repo = WidgetRepository(mockClient, "https://doot.example.com", "token") val result = repo.fetchRaw() assertTrue(result.isFailure) } @Test fun `fetch returns success with valid JSON`() = runTest { val json = """{"now":"2026-06-28T10:15:00Z","items":[]}""" every { mockClient.newCall(any()) } returns mockCall every { mockCall.execute() } returns responseOf(200, json) val repo = WidgetRepository(mockClient, "https://doot.example.com", "token") val result = repo.fetchRaw() assertTrue(result.isSuccess) assertEquals(0, result.getOrThrow().items.size) } @Test fun `fetch sets Authorization header`() = runTest { val json = """{"now":"2026-06-28T10:15:00Z","items":[]}""" val capturedRequest = slot() every { mockClient.newCall(capture(capturedRequest)) } returns mockCall every { mockCall.execute() } returns responseOf(200, json) val repo = WidgetRepository(mockClient, "https://doot.example.com", "mysecret") repo.fetchRaw() assertEquals("Bearer mysecret", capturedRequest.captured.header("Authorization")) } }