wow-backup/composeApp/src/jvmTest/kotlin/com/rukira/wowbackup/update/UpdateCheckerTest.kt
2026-08-25 10:30:52 +01:00

172 lines
5.5 KiB
Kotlin

package com.rukira.wowbackup.update
import com.sun.net.httpserver.HttpServer
import kotlinx.coroutines.runBlocking
import java.net.InetSocketAddress
import kotlin.test.AfterTest
import kotlin.test.BeforeTest
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
import kotlin.test.assertNull
class UpdateCheckerTest {
private lateinit var server: HttpServer
private var serverPort: Int = 0
@BeforeTest
fun setUp() {
server = HttpServer.create(InetSocketAddress("127.0.0.1", 0), 0)
serverPort = server.address.port
server.start()
}
@AfterTest
fun tearDown() {
server.stop(0)
}
@Test
fun testUpdateAvailableWhenRemoteIsNewer() = runBlocking {
val jsonResponse = """
{
"id": 5,
"tag_name": "v1.0.2",
"name": "WoW Backup v1.0.2",
"html_url": "https://git.asarius.site/rukira/wow-backup/releases/tag/v1.0.2"
}
""".trimIndent()
server.createContext("/releases/latest") { exchange ->
exchange.responseHeaders.add("Content-Type", "application/json")
val bytes = jsonResponse.toByteArray()
exchange.sendResponseHeaders(200, bytes.size.toLong())
exchange.responseBody.write(bytes)
exchange.close()
}
val checker = UpdateChecker(
apiUrl = "http://127.0.0.1:$serverPort/releases/latest",
fallbackUrl = "https://git.asarius.site/rukira/wow-backup/releases",
)
val result = checker.checkForUpdate(currentVersion = "1.0.1")
assertNotNull(result)
assertEquals("1.0.2", result.latestVersion)
assertEquals("https://git.asarius.site/rukira/wow-backup/releases/tag/v1.0.2", result.releaseUrl)
}
@Test
fun testNoUpdateWhenUpToDate() = runBlocking {
val jsonResponse = """
{
"id": 5,
"tag_name": "v1.0.2",
"name": "WoW Backup v1.0.2",
"html_url": "https://git.asarius.site/rukira/wow-backup/releases/tag/v1.0.2"
}
""".trimIndent()
server.createContext("/releases/latest") { exchange ->
exchange.responseHeaders.add("Content-Type", "application/json")
val bytes = jsonResponse.toByteArray()
exchange.sendResponseHeaders(200, bytes.size.toLong())
exchange.responseBody.write(bytes)
exchange.close()
}
val checker = UpdateChecker(
apiUrl = "http://127.0.0.1:$serverPort/releases/latest",
)
val result = checker.checkForUpdate(currentVersion = "1.0.2")
assertNull(result)
}
@Test
fun testNoUpdateWhenRunningNewerVersion() = runBlocking {
val jsonResponse = """
{
"id": 5,
"tag_name": "v1.0.2",
"name": "WoW Backup v1.0.2",
"html_url": "https://git.asarius.site/rukira/wow-backup/releases/tag/v1.0.2"
}
""".trimIndent()
server.createContext("/releases/latest") { exchange ->
exchange.responseHeaders.add("Content-Type", "application/json")
val bytes = jsonResponse.toByteArray()
exchange.sendResponseHeaders(200, bytes.size.toLong())
exchange.responseBody.write(bytes)
exchange.close()
}
val checker = UpdateChecker(
apiUrl = "http://127.0.0.1:$serverPort/releases/latest",
)
val result = checker.checkForUpdate(currentVersion = "2.0.0")
assertNull(result)
}
@Test
fun testHttpErrorGracefullyReturnsNull() = runBlocking {
server.createContext("/releases/latest") { exchange ->
exchange.sendResponseHeaders(404, 0)
exchange.close()
}
val checker = UpdateChecker(
apiUrl = "http://127.0.0.1:$serverPort/releases/latest",
)
val result = checker.checkForUpdate(currentVersion = "1.0.0")
assertNull(result)
}
@Test
fun testMalformedJsonGracefullyReturnsNull() = runBlocking {
server.createContext("/releases/latest") { exchange ->
val bytes = "Not valid JSON".toByteArray()
exchange.sendResponseHeaders(200, bytes.size.toLong())
exchange.responseBody.write(bytes)
exchange.close()
}
val checker = UpdateChecker(
apiUrl = "http://127.0.0.1:$serverPort/releases/latest",
)
val result = checker.checkForUpdate(currentVersion = "1.0.0")
assertNull(result)
}
@Test
fun testFallbackUrlUsedWhenHtmlUrlMissing() = runBlocking {
val jsonResponse = """
{
"id": 5,
"tag_name": "v1.0.2",
"name": "WoW Backup v1.0.2"
}
""".trimIndent()
server.createContext("/releases/latest") { exchange ->
val bytes = jsonResponse.toByteArray()
exchange.sendResponseHeaders(200, bytes.size.toLong())
exchange.responseBody.write(bytes)
exchange.close()
}
val checker = UpdateChecker(
apiUrl = "http://127.0.0.1:$serverPort/releases/latest",
fallbackUrl = "https://git.asarius.site/rukira/wow-backup/releases",
)
val result = checker.checkForUpdate(currentVersion = "1.0.0")
assertNotNull(result)
assertEquals("https://git.asarius.site/rukira/wow-backup/releases", result.releaseUrl)
}
}