Skip to content

Commit 12b8d73

Browse files
authored
feature: setup unit testing (#1074)
* Add junit dependency * Add more test libraries for androidTest classes. * Add an expected failure util to catch assertion error for known bugs without failing the tests. * Add some tests for known bugs.
1 parent 0b35af4 commit 12b8d73

4 files changed

Lines changed: 118 additions & 0 deletions

File tree

app/build.gradle.kts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,12 @@ dependencies {
147147
implementation(libs.androidx.print)
148148
implementation(libs.bundles.room)
149149
implementation(libs.androidx.work.runtime.ktx)
150+
testImplementation(libs.junit)
151+
androidTestImplementation(libs.androidx.test.core)
152+
androidTestImplementation(libs.androidx.test.runner)
153+
androidTestImplementation(libs.androidx.test.rules)
154+
androidTestImplementation(libs.androidx.test.ext.junit)
155+
androidTestImplementation(libs.androidx.test.ext.truth)
150156
ksp(libs.androidx.room.compiler)
151157
detektPlugins(libs.compose.detekt)
152158
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package org.fossify.calendar.interfaces
2+
3+
import android.content.Context
4+
import androidx.room.Room
5+
import androidx.test.core.app.ApplicationProvider
6+
import androidx.test.ext.junit.runners.AndroidJUnit4
7+
import org.fossify.calendar.databases.EventsDatabase
8+
import org.fossify.calendar.extensions.seconds
9+
import org.fossify.calendar.models.Event
10+
import org.fossify.calendar.testing.expectedFailure
11+
import org.joda.time.DateTime
12+
import org.junit.After
13+
import org.junit.Assert
14+
import org.junit.Before
15+
import org.junit.Test
16+
import org.junit.runner.RunWith
17+
import java.io.IOException
18+
19+
@RunWith(AndroidJUnit4::class)
20+
class EventsDaoGetOneTimeEventsFromToWithCalendarIdsTest {
21+
22+
private lateinit var eventsDao: EventsDao
23+
private lateinit var db: EventsDatabase
24+
25+
private val calendarId = 1L
26+
27+
@Before
28+
fun createDb() {
29+
val context = ApplicationProvider.getApplicationContext<Context>()
30+
db = Room.inMemoryDatabaseBuilder(
31+
context, EventsDatabase::class.java).build()
32+
eventsDao = db.EventsDao()
33+
}
34+
35+
@After
36+
@Throws(IOException::class)
37+
fun closeDb() {
38+
db.close()
39+
}
40+
41+
@Test
42+
@Throws(Exception::class)
43+
fun bug255_EventEndingAtMidnightShouldNotShowOnNextDay() {
44+
expectedFailure("https://github.com/FossifyOrg/Calendar/issues/255") {
45+
val startDay = DateTime(2026, 1, 1, 0, 0)
46+
val startEvent = startDay.plusHours(23)
47+
val event = Event(id = 0, startTS = startEvent.seconds(), endTS = startEvent.plusHours(1).seconds(), calendarId = calendarId)
48+
eventsDao.insertOrUpdate(event)
49+
50+
val eventsDayOne = eventsDao.getOneTimeEventsFromToWithCalendarIds(startDay.plusDays(1).seconds(), startDay.seconds(), listOf(calendarId))
51+
val eventsDayTwo = eventsDao.getOneTimeEventsFromToWithCalendarIds(startDay.plusDays(2).seconds(), startDay.plusDays(1).seconds(), listOf(calendarId))
52+
53+
Assert.assertEquals(1, eventsDayOne.count())
54+
Assert.assertEquals(emptyList<Event>(), eventsDayTwo)
55+
}
56+
}
57+
58+
@Test
59+
@Throws(Exception::class)
60+
fun bug255_EventStartingAtMidnightWithoutDurationShouldOnlyShowOnSingleDay() {
61+
expectedFailure("https://github.com/FossifyOrg/Calendar/issues/255") {
62+
val startDay = DateTime(2026, 1, 10, 0, 0)
63+
val event = Event(id = 0, startTS = startDay.seconds(), endTS = startDay.seconds(), calendarId = calendarId)
64+
eventsDao.insertOrUpdate(event)
65+
66+
val eventsDayOne = eventsDao.getOneTimeEventsFromToWithCalendarIds(startDay.seconds(), startDay.plusDays(-1).seconds(), listOf(calendarId))
67+
val eventsDayTwo = eventsDao.getOneTimeEventsFromToWithCalendarIds(startDay.plusDays(1).seconds(), startDay.seconds(), listOf(calendarId))
68+
69+
Assert.assertEquals(1, eventsDayTwo.count())
70+
Assert.assertEquals(emptyList<Event>(), eventsDayOne)
71+
}
72+
}
73+
74+
@Test
75+
@Throws(Exception::class)
76+
fun bug440_EventAtMidnightOnFirstJan1970() {
77+
expectedFailure("https://github.com/FossifyOrg/Calendar/issues/440") {
78+
eventsDao.insertOrUpdate(Event(id = 0, startTS = 0, endTS = 3600, calendarId = calendarId))
79+
80+
val eventsOnFirstJan1970 = eventsDao.getOneTimeEventsFromToWithCalendarIds(86400, 0, listOf(calendarId))
81+
82+
Assert.assertEquals(1, eventsOnFirstJan1970.count())
83+
}
84+
}
85+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.fossify.calendar.testing
2+
3+
fun expectedFailure(testName: String = "", block: () -> Unit) {
4+
try {
5+
block()
6+
println("WARNING: Expected failure test '$testName' passed unexpectedly.")
7+
} catch (e: Throwable) {
8+
println("Expected failure in test '$testName': ${e.javaClass.simpleName}: ${e.message}")
9+
return
10+
}
11+
12+
throw AssertionError("Expected failure test '$testName' passed unexpectedly. Investigate: bug may be fixed.")
13+
}

gradle/libs.versions.toml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,13 @@ swiperefreshlayout = "1.2.0"
1313
work = "2.11.2"
1414
#Room
1515
room = "2.8.4"
16+
#junit
17+
junit = "4.13.2"
18+
androidx-test-core = "1.7.0"
19+
androidx-test-runner = "1.7.0"
20+
androidx-test-rules = "1.7.0"
21+
androidx-test-ext-junit = "1.3.0"
22+
androidx-test-ext-truth = "1.7.0"
1623
#Fossify
1724
commons = "6.1.6"
1825
#Gradle
@@ -35,6 +42,13 @@ androidx-room-ktx = { module = "androidx.room:room-ktx", version.ref = "room" }
3542
androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" }
3643
#Compose
3744
compose-detekt = { module = "io.nlopez.compose.rules:detekt", version.ref = "detektCompose" }
45+
#junit
46+
junit = { group = "junit", name = "junit", version.ref = "junit" }
47+
androidx-test-core = { group = "androidx.test", name = "core", version.ref = "androidx-test-core" }
48+
androidx-test-runner = { group = "androidx.test", name = "runner", version.ref = "androidx-test-runner" }
49+
androidx-test-rules = { group = "androidx.test", name = "rules", version.ref = "androidx-test-rules" }
50+
androidx-test-ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidx-test-ext-junit" }
51+
androidx-test-ext-truth = { group = "androidx.test.ext", name = "truth", version.ref = "androidx-test-ext-truth" }
3852
#Fossify
3953
fossify-commons = { module = "org.fossify:commons", version.ref = "commons" }
4054
[bundles]

0 commit comments

Comments
 (0)