app/src/test/java/dev/equwal/inkupdate/DecideTest.kt (5461 bytes)
1 // SPDX-License-Identifier: GPL-3.0-or-later 2 // Copyright (c) 2026 equwal 3 package dev.equwal.inkupdate 4 5 import org.junit.Assert.assertEquals 6 import org.junit.Assert.assertNull 7 import org.junit.Assert.assertTrue 8 import org.junit.Test 9 10 /** The order F-Droid, Google Play, GitHub. */ 11 class DecideTest { 12 13 private val fdroidPage = "https://f-droid.org/packages/dev.equwal.inkdim/" 14 private val ghPage = "https://github.com/equwal/ink-dim/releases/tag/v0.1.1" 15 private val apk = "https://github.com/equwal/ink-dim/releases/download/v0.1.1/ink-dim-0.1.1.apk" 16 17 private fun fdroidNewer() = FdroidAnswer.Found(2L, "0.1.1", fdroidPage) 18 private fun fdroidSame() = FdroidAnswer.Found(1L, "0.1.0", fdroidPage) 19 private fun githubNewer() = GithubAnswer.Found("v0.1.1", ghPage, apk) 20 private fun githubSame() = GithubAnswer.Found("v0.1.0", ghPage, apk) 21 22 @Test 23 fun fdroidWinsOverGithub() { 24 val r = Decide.source(null, fdroidNewer(), githubNewer(), 1L, "0.1.0") 25 assertTrue(r is Result.Update) 26 r as Result.Update 27 assertEquals(Decide.FDROID, r.source) 28 assertEquals("0.1.1", r.versionName) 29 assertEquals(fdroidPage, r.page) 30 // F-Droid installs the app by itself, so there is no APK link. 31 assertNull(r.apk) 32 } 33 34 @Test 35 fun fdroidNotThereFallsToGithub() { 36 val r = Decide.source(null, FdroidAnswer.NotThere, githubNewer(), 1L, "0.1.0") 37 assertTrue(r is Result.Update) 38 r as Result.Update 39 assertEquals(Decide.GITHUB, r.source) 40 assertEquals("0.1.1", r.versionName) 41 assertEquals(ghPage, r.page) 42 assertEquals(apk, r.apk) 43 } 44 45 @Test 46 fun fdroidNotThereAndPlayInstalledLeavesItToPlay() { 47 val r = Decide.source( 48 Decide.PLAY_PACKAGE, FdroidAnswer.NotThere, githubNewer(), 1L, "0.1.0" 49 ) 50 assertEquals(Result.LeftToPlay, r) 51 } 52 53 /** The Play store does not beat a newer build on F-Droid. */ 54 @Test 55 fun fdroidStillWinsOverPlay() { 56 val r = Decide.source( 57 Decide.PLAY_PACKAGE, fdroidNewer(), GithubAnswer.None, 1L, "0.1.0" 58 ) 59 assertTrue(r is Result.Update) 60 assertEquals(Decide.FDROID, (r as Result.Update).source) 61 } 62 63 @Test 64 fun anotherInstallerDoesNotLeaveItToPlay() { 65 val r = Decide.source( 66 "com.android.packageinstaller", FdroidAnswer.NotThere, githubNewer(), 1L, "0.1.0" 67 ) 68 assertEquals(Decide.GITHUB, (r as Result.Update).source) 69 } 70 71 @Test 72 fun theSameVersionIsUpToDate() { 73 assertEquals( 74 Result.UpToDate, 75 Decide.source(null, FdroidAnswer.NotThere, githubSame(), 1L, "0.1.0") 76 ) 77 assertEquals( 78 Result.UpToDate, 79 Decide.source(null, fdroidSame(), githubSame(), 1L, "0.1.0") 80 ) 81 } 82 83 /** A tag that is older than what is installed is not an update. */ 84 @Test 85 fun anOlderTagIsUpToDate() { 86 val r = Decide.source( 87 null, FdroidAnswer.NotThere, 88 GithubAnswer.Found("v0.0.9-alpha", ghPage, apk), 1L, "0.1.0" 89 ) 90 assertEquals(Result.UpToDate, r) 91 } 92 93 /** Rebind: the tag has no "-full", the installed name has. */ 94 @Test 95 fun rebindTagsAndNamesLineUp() { 96 val page = "https://github.com/equwal/rebind/releases/tag/v0.0.16-alpha" 97 val full = "https://github.com/equwal/rebind/releases/download/" + 98 "v0.0.16-alpha/rebind-0.0.16-alpha-full.apk" 99 val r = Decide.source( 100 null, FdroidAnswer.NotThere, 101 GithubAnswer.Found("v0.0.16-alpha", page, full), 15L, "0.0.15-alpha-full" 102 ) 103 assertTrue(r is Result.Update) 104 r as Result.Update 105 assertEquals("0.0.16-alpha", r.versionName) 106 assertEquals(full, r.apk) 107 108 val same = Decide.source( 109 null, FdroidAnswer.NotThere, 110 GithubAnswer.Found("v0.0.15-alpha", page, full), 15L, "0.0.15-alpha-full" 111 ) 112 assertEquals(Result.UpToDate, same) 113 } 114 115 @Test 116 fun nobodyAnsweredIsUnknown() { 117 val r = Decide.source( 118 null, FdroidAnswer.Failed("No answer"), GithubAnswer.Failed("No answer"), 119 1L, "0.1.0" 120 ) 121 assertTrue(r is Result.Unknown) 122 assertEquals("No answer", (r as Result.Unknown).reason) 123 } 124 125 /** F-Droid answered, so a failed GitHub request does not hide the answer. */ 126 @Test 127 fun fdroidAnsweredAndGithubFailed() { 128 val r = Decide.source( 129 null, fdroidSame(), GithubAnswer.Failed("Too many requests"), 1L, "0.1.0" 130 ) 131 assertEquals(Result.UpToDate, r) 132 } 133 134 /** GitHub answered, so a failed F-Droid request does not hide the answer. */ 135 @Test 136 fun githubAnsweredAndFdroidFailed() { 137 val r = Decide.source( 138 null, FdroidAnswer.Failed("No answer"), githubNewer(), 1L, "0.1.0" 139 ) 140 assertEquals(Decide.GITHUB, (r as Result.Update).source) 141 } 142 143 /** Neither place has the app. There is nothing newer to get. */ 144 @Test 145 fun nothingAnywhereIsUpToDate() { 146 assertEquals( 147 Result.UpToDate, 148 Decide.source(null, FdroidAnswer.NotThere, GithubAnswer.None, 1L, "0.1.0") 149 ) 150 } 151 152 @Test 153 fun aVersionNameThatMakesNoSenseIsUnknown() { 154 val r = Decide.source( 155 null, FdroidAnswer.NotThere, githubNewer(), 1L, "nightly" 156 ) 157 assertTrue(r is Result.Unknown) 158 } 159 }