app/src/test/java/dev/equwal/inkupdate/DecideTest.kt (6039 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 @Test 54 fun fdroidClientInstallNeverOffersGithub() { 55 val r = Decide.source( 56 "org.fdroid.fdroid", FdroidAnswer.NotThere, githubNewer(), 1L, "0.1.0" 57 ) 58 assertEquals(Result.UpToDate, r) 59 } 60 61 /** A client that is not in the list, found by its fdroidrepos:// links. */ 62 @Test 63 fun otherFdroidClientInstallNeverOffersGithub() { 64 val r = Decide.source( 65 "com.looker.droidify", FdroidAnswer.NotThere, githubNewer(), 1L, "0.1.0", 66 byFdroid = true 67 ) 68 assertEquals(Result.UpToDate, r) 69 } 70 71 /** The Play store does not beat a newer build on F-Droid. */ 72 @Test 73 fun fdroidStillWinsOverPlay() { 74 val r = Decide.source( 75 Decide.PLAY_PACKAGE, fdroidNewer(), GithubAnswer.None, 1L, "0.1.0" 76 ) 77 assertTrue(r is Result.Update) 78 assertEquals(Decide.FDROID, (r as Result.Update).source) 79 } 80 81 @Test 82 fun anotherInstallerDoesNotLeaveItToPlay() { 83 val r = Decide.source( 84 "com.android.packageinstaller", FdroidAnswer.NotThere, githubNewer(), 1L, "0.1.0" 85 ) 86 assertEquals(Decide.GITHUB, (r as Result.Update).source) 87 } 88 89 @Test 90 fun theSameVersionIsUpToDate() { 91 assertEquals( 92 Result.UpToDate, 93 Decide.source(null, FdroidAnswer.NotThere, githubSame(), 1L, "0.1.0") 94 ) 95 assertEquals( 96 Result.UpToDate, 97 Decide.source(null, fdroidSame(), githubSame(), 1L, "0.1.0") 98 ) 99 } 100 101 /** A tag that is older than what is installed is not an update. */ 102 @Test 103 fun anOlderTagIsUpToDate() { 104 val r = Decide.source( 105 null, FdroidAnswer.NotThere, 106 GithubAnswer.Found("v0.0.9-alpha", ghPage, apk), 1L, "0.1.0" 107 ) 108 assertEquals(Result.UpToDate, r) 109 } 110 111 /** Rebind: the tag has no "-full", the installed name has. */ 112 @Test 113 fun rebindTagsAndNamesLineUp() { 114 val page = "https://github.com/equwal/rebind/releases/tag/v0.0.16-alpha" 115 val full = "https://github.com/equwal/rebind/releases/download/" + 116 "v0.0.16-alpha/rebind-0.0.16-alpha-full.apk" 117 val r = Decide.source( 118 null, FdroidAnswer.NotThere, 119 GithubAnswer.Found("v0.0.16-alpha", page, full), 15L, "0.0.15-alpha-full" 120 ) 121 assertTrue(r is Result.Update) 122 r as Result.Update 123 assertEquals("0.0.16-alpha", r.versionName) 124 assertEquals(full, r.apk) 125 126 val same = Decide.source( 127 null, FdroidAnswer.NotThere, 128 GithubAnswer.Found("v0.0.15-alpha", page, full), 15L, "0.0.15-alpha-full" 129 ) 130 assertEquals(Result.UpToDate, same) 131 } 132 133 @Test 134 fun nobodyAnsweredIsUnknown() { 135 val r = Decide.source( 136 null, FdroidAnswer.Failed("No answer"), GithubAnswer.Failed("No answer"), 137 1L, "0.1.0" 138 ) 139 assertTrue(r is Result.Unknown) 140 assertEquals("No answer", (r as Result.Unknown).reason) 141 } 142 143 /** F-Droid answered, so a failed GitHub request does not hide the answer. */ 144 @Test 145 fun fdroidAnsweredAndGithubFailed() { 146 val r = Decide.source( 147 null, fdroidSame(), GithubAnswer.Failed("Too many requests"), 1L, "0.1.0" 148 ) 149 assertEquals(Result.UpToDate, r) 150 } 151 152 /** GitHub answered, so a failed F-Droid request does not hide the answer. */ 153 @Test 154 fun githubAnsweredAndFdroidFailed() { 155 val r = Decide.source( 156 null, FdroidAnswer.Failed("No answer"), githubNewer(), 1L, "0.1.0" 157 ) 158 assertEquals(Decide.GITHUB, (r as Result.Update).source) 159 } 160 161 /** Neither place has the app. There is nothing newer to get. */ 162 @Test 163 fun nothingAnywhereIsUpToDate() { 164 assertEquals( 165 Result.UpToDate, 166 Decide.source(null, FdroidAnswer.NotThere, GithubAnswer.None, 1L, "0.1.0") 167 ) 168 } 169 170 @Test 171 fun aVersionNameThatMakesNoSenseIsUnknown() { 172 val r = Decide.source( 173 null, FdroidAnswer.NotThere, githubNewer(), 1L, "nightly" 174 ) 175 assertTrue(r is Result.Unknown) 176 } 177 }