Skip to content

Commit 26c5e13

Browse files
committed
Created ReviewRemindersDatabaseTest
GSoC 2025: Review Reminders - Created Robolectric unit tests for `ReviewRemindersDatabase`
1 parent 049673a commit 26c5e13

File tree

1 file changed

+195
-0
lines changed

1 file changed

+195
-0
lines changed
Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
/*
2+
* Copyright (c) 2025 Eric Li <[email protected]>
3+
*
4+
* This program is free software; you can redistribute it and/or modify it under
5+
* the terms of the GNU General Public License as published by the Free Software
6+
* Foundation; either version 3 of the License, or (at your option) any later
7+
* version.
8+
*
9+
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
10+
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
11+
* PARTICULAR PURPOSE. See the GNU General Public License for more details.
12+
*
13+
* You should have received a copy of the GNU General Public License along with
14+
* this program. If not, see <http://www.gnu.org/licenses/>.
15+
*/
16+
17+
package com.ichi2.anki.reviewreminders
18+
19+
import android.app.Activity
20+
import androidx.datastore.preferences.core.edit
21+
import androidx.test.ext.junit.runners.AndroidJUnit4
22+
import com.ichi2.anki.DeckPicker
23+
import com.ichi2.anki.RobolectricTest
24+
import kotlinx.coroutines.runBlocking
25+
import org.junit.After
26+
import org.junit.Before
27+
import org.junit.Test
28+
import org.junit.jupiter.api.assertThrows
29+
import org.junit.runner.RunWith
30+
31+
@RunWith(AndroidJUnit4::class)
32+
class ReviewRemindersDatabaseTest : RobolectricTest() {
33+
private lateinit var activity: Activity
34+
private lateinit var reviewRemindersDatabase: ReviewRemindersDatabase
35+
36+
@Before
37+
override fun setUp() {
38+
super.setUp()
39+
// We need a valid context for the database, any valid context will do
40+
activity = startRegularActivity<DeckPicker>()
41+
reviewRemindersDatabase = ReviewRemindersDatabase(activity)
42+
}
43+
44+
@After
45+
override fun tearDown() {
46+
super.tearDown()
47+
// Clean up the database after each test
48+
runBlocking {
49+
activity.dataStore.edit { preferences ->
50+
preferences.clear()
51+
}
52+
}
53+
}
54+
55+
@Test
56+
fun `getRemindersForDeck should return empty list when no reminders exist`() =
57+
runTest {
58+
val did = 12345L
59+
val reminders = reviewRemindersDatabase.getRemindersForDeck(did)
60+
assert(reminders.isEmpty())
61+
}
62+
63+
@Test
64+
fun `setRemindersForDeck and getRemindersForDeck should read and write reminders correctly`() =
65+
runTest {
66+
val did = 12345L
67+
val reminders =
68+
listOf(
69+
ReviewReminder.createReviewReminder(activity, ReviewReminderTypes.SINGLE, 9, 0, 5),
70+
ReviewReminder.createReviewReminder(activity, ReviewReminderTypes.PERSISTENT, 10, 30, 10),
71+
)
72+
reviewRemindersDatabase.setRemindersForDeck(did, reminders)
73+
74+
val storedReminders = reviewRemindersDatabase.getRemindersForDeck(did)
75+
assert(storedReminders == reminders)
76+
}
77+
78+
@Test
79+
fun `getAppWideReminders should return empty list when no reminders exist`() =
80+
runTest {
81+
val reminders = reviewRemindersDatabase.getAppWideReminders()
82+
assert(reminders.isEmpty())
83+
}
84+
85+
@Test
86+
fun `setAppWideReminders and getAppWideReminders should read and write reminders correctly`() =
87+
runTest {
88+
val reminders =
89+
listOf(
90+
ReviewReminder.createReviewReminder(activity, ReviewReminderTypes.SINGLE, 9, 0, 5),
91+
ReviewReminder.createReviewReminder(activity, ReviewReminderTypes.PERSISTENT, 10, 30, 10),
92+
)
93+
reviewRemindersDatabase.setAppWideReminders(reminders)
94+
95+
val storedReminders = reviewRemindersDatabase.getAppWideReminders()
96+
assert(storedReminders == reminders)
97+
}
98+
99+
@Test
100+
fun `allocateReminderId should return successive IDs`() =
101+
runTest {
102+
for (i in 0..4) {
103+
assert(i == reviewRemindersDatabase.allocateReminderId())
104+
}
105+
}
106+
107+
@Test
108+
fun `deallocateReminderId should allow allocateReminderId to reuse IDs`() =
109+
runTest {
110+
val id = reviewRemindersDatabase.allocateReminderId()
111+
reviewRemindersDatabase.deallocateReminderId(id)
112+
assert(id == reviewRemindersDatabase.allocateReminderId())
113+
}
114+
115+
@Test
116+
fun `addReviewReminderForDeck should add a reminder to the deck`() =
117+
runTest {
118+
val did = 12345L
119+
val reminder = ReviewReminder.createReviewReminder(activity, ReviewReminderTypes.SINGLE, 9, 0, 5)
120+
reviewRemindersDatabase.addReviewReminderForDeck(did, reminder)
121+
122+
val reminders = reviewRemindersDatabase.getRemindersForDeck(did)
123+
assert(reminders.size == 1)
124+
assert(reminders.contains(reminder))
125+
}
126+
127+
@Test
128+
fun `editReviewReminderForDeck should edit an existing reminder`() =
129+
runTest {
130+
val did = 12345L
131+
reviewRemindersDatabase.addReviewReminderForDeck(
132+
did,
133+
ReviewReminder.createReviewReminder(
134+
activity,
135+
ReviewReminderTypes.SINGLE,
136+
0,
137+
9,
138+
0,
139+
),
140+
)
141+
val updatedReminder =
142+
ReviewReminder.createReviewReminder(
143+
activity,
144+
ReviewReminderTypes.PERSISTENT,
145+
10,
146+
30,
147+
5,
148+
)
149+
reviewRemindersDatabase.editReviewReminderForDeck(
150+
did,
151+
0,
152+
updatedReminder,
153+
)
154+
155+
val reminders = reviewRemindersDatabase.getRemindersForDeck(did)
156+
assert(reminders.size == 1)
157+
assert(reminders.contains(updatedReminder))
158+
}
159+
160+
@Test
161+
fun `editReviewReminderForDeck with a nonexistent id should throw an IllegalArgumentException`() =
162+
runTest {
163+
val did = 12345L
164+
assertThrows<IllegalArgumentException> {
165+
reviewRemindersDatabase.editReviewReminderForDeck(
166+
did,
167+
0,
168+
ReviewReminder.createReviewReminder(activity, ReviewReminderTypes.SINGLE, 9, 0, 5),
169+
)
170+
}
171+
}
172+
173+
@Test
174+
fun `deleteReviewReminderForDeck should delete an existing reminder`() =
175+
runTest {
176+
val did = 12345L
177+
reviewRemindersDatabase.addReviewReminderForDeck(
178+
did,
179+
ReviewReminder.createReviewReminder(activity, ReviewReminderTypes.SINGLE, 9, 0, 5),
180+
)
181+
reviewRemindersDatabase.deleteReviewReminderForDeck(did, 0)
182+
183+
val reminders = reviewRemindersDatabase.getRemindersForDeck(did)
184+
assert(reminders.isEmpty())
185+
}
186+
187+
@Test
188+
fun `deleteReviewReminderForDeck with a nonexistent id should throw an IllegalArgumentException`() =
189+
runTest {
190+
val did = 12345L
191+
assertThrows<IllegalArgumentException> {
192+
reviewRemindersDatabase.deleteReviewReminderForDeck(did, 0)
193+
}
194+
}
195+
}

0 commit comments

Comments
 (0)