Skip to content

Commit feb62d5

Browse files
BrayanDSOmikehardy
authored andcommitted
test: simplify template previewer tests
the collection media dir is necessary for running `prepareCardTextForDisplay` when a card is shown, hence why a different CollectionStorageMode was necessary since `prepareCardTextForDisplay` isn't necessary for any of the current tests and a different CollectionStorageMode requires a heavier test configuration with Robolectric, its usage is being modified.
1 parent bab0fb4 commit feb62d5

File tree

3 files changed

+43
-65
lines changed

3 files changed

+43
-65
lines changed

AnkiDroid/src/main/java/com/ichi2/anki/previewer/CardViewerViewModel.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package com.ichi2.anki.previewer
1818
import android.media.MediaPlayer
1919
import android.net.Uri
2020
import androidx.annotation.CallSuper
21+
import androidx.annotation.VisibleForTesting
2122
import androidx.core.net.toFile
2223
import androidx.lifecycle.ViewModel
2324
import androidx.lifecycle.viewModelScope
@@ -116,7 +117,8 @@ abstract class CardViewerViewModel :
116117
/** From the [desktop code](https://github.com/ankitects/anki/blob/1ff55475b93ac43748d513794bcaabd5d7df6d9d/qt/aqt/reviewer.py#L358) */
117118
private suspend fun mungeQA(text: String) = typeAnsFilter(prepareCardTextForDisplay(text))
118119

119-
private suspend fun prepareCardTextForDisplay(text: String): String =
120+
@VisibleForTesting
121+
suspend fun prepareCardTextForDisplay(text: String): String =
120122
replaceAvRefsWithPlayButtons(
121123
text = withCol { media.escapeMediaFilenames(text) },
122124
renderOutput = currentCard.await().let { card -> withCol { card.renderOutput(this) } },

AnkiDroid/src/test/java/com/ichi2/anki/previewer/TemplatePreviewerViewModelFileSystemTest.kt

Lines changed: 0 additions & 44 deletions
This file was deleted.

AnkiDroid/src/test/java/com/ichi2/anki/previewer/TemplatePreviewerViewModelTest.kt

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,29 @@ package com.ichi2.anki.previewer
1717

1818
import androidx.test.ext.junit.runners.AndroidJUnit4
1919
import com.ichi2.anki.NotetypeFile
20-
import com.ichi2.anki.libanki.testutils.AnkiTest
2120
import com.ichi2.testutils.JvmTest
21+
import io.mockk.coEvery
22+
import io.mockk.spyk
2223
import org.hamcrest.CoreMatchers.equalTo
2324
import org.hamcrest.MatcherAssert.assertThat
2425
import org.junit.Rule
2526
import org.junit.Test
2627
import org.junit.rules.TemporaryFolder
2728
import org.junit.runner.RunWith
29+
import kotlin.test.assertNotEquals
2830

2931
@RunWith(AndroidJUnit4::class)
3032
class TemplatePreviewerViewModelTest : JvmTest() {
3133
@get:Rule
3234
val tempDirectory = TemporaryFolder()
3335

36+
private fun createViewModel(arguments: TemplatePreviewerArguments): TemplatePreviewerViewModel =
37+
spyk(TemplatePreviewerViewModel(arguments)).apply {
38+
// the default implementation requires the Collection media directory,
39+
// which needs a Robolectric setup with CollectionStorageMode.IN_MEMORY_WITH_MEDIA or ON_DISK
40+
coEvery { prepareCardTextForDisplay(any()) } answers { firstArg() }
41+
}
42+
3443
@Test
3544
fun `getCurrentTabIndex returns the correct tab if the first cloze isn't 1 and ord isn't 0`() =
3645
runClozeTest(ord = 6, fields = mutableListOf("{{c7::foo}} {{c4::bar}} {{c9::ha}}")) {
@@ -57,9 +66,20 @@ class TemplatePreviewerViewModelTest : JvmTest() {
5766
) {
5867
onPageFinished(false)
5968
assertThat(this.cardsWithEmptyFronts!!.await()[0], equalTo(false))
60-
assertThat(this.cardsWithEmptyFronts!!.await()[1], equalTo(true))
69+
assertThat(this.cardsWithEmptyFronts.await()[1], equalTo(true))
6170
}
6271

72+
@Test
73+
fun `card ords are changed`() {
74+
runClozeTest(tempDirectory = tempDirectory, fields = mutableListOf("{{c1::one}} {{c2::bar}}")) {
75+
onPageFinished(false)
76+
val ord1 = currentCard.await().ord
77+
onTabSelected(1)
78+
val ord2 = currentCard.await().ord
79+
assertNotEquals(ord1, ord2)
80+
}
81+
}
82+
6383
private fun runClozeTest(
6484
ord: Int = 0,
6585
fields: MutableList<String>? = null,
@@ -79,25 +99,25 @@ class TemplatePreviewerViewModelTest : JvmTest() {
7999
tags = mutableListOf(),
80100
ord = ord,
81101
)
82-
val viewModel = TemplatePreviewerViewModel(arguments)
102+
val viewModel = createViewModel(arguments)
83103
block(viewModel)
84104
}
85-
}
86105

87-
fun AnkiTest.runClozeTest(
88-
ord: Int = 0,
89-
tempDirectory: TemporaryFolder,
90-
fields: MutableList<String>? = null,
91-
block: suspend TemplatePreviewerViewModel.() -> Unit,
92-
) = runTest {
93-
val notetype = col.notetypes.byName("Cloze")!!
94-
val arguments =
95-
TemplatePreviewerArguments(
96-
notetypeFile = NotetypeFile(tempDirectory.root, notetype),
97-
fields = fields ?: mutableListOf("{{c1::foo}} {{c2::bar}}", "anki"),
98-
tags = mutableListOf(),
99-
ord = ord,
100-
)
101-
val viewModel = TemplatePreviewerViewModel(arguments)
102-
block(viewModel)
106+
private fun runClozeTest(
107+
ord: Int = 0,
108+
tempDirectory: TemporaryFolder,
109+
fields: MutableList<String>? = null,
110+
block: suspend TemplatePreviewerViewModel.() -> Unit,
111+
) = runTest {
112+
val notetype = col.notetypes.byName("Cloze")!!
113+
val arguments =
114+
TemplatePreviewerArguments(
115+
notetypeFile = NotetypeFile(tempDirectory.root, notetype),
116+
fields = fields ?: mutableListOf("{{c1::foo}} {{c2::bar}}", "anki"),
117+
tags = mutableListOf(),
118+
ord = ord,
119+
)
120+
val viewModel = createViewModel(arguments)
121+
block(viewModel)
122+
}
103123
}

0 commit comments

Comments
 (0)