Recently Written · git

ink-update

Ink Update: tells you when Rebind, Ink Recents or Ink Dim has a new version. F-Droid, then Google Play, then GitHub.

git clone https://github.com/equwal/ink-update

Log | Files | Refs


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 }