From 633f2a37a0e95b34207494740f63a3321632d4aa Mon Sep 17 00:00:00 2001 From: Hari Srinivasan Date: Sun, 19 Jan 2025 00:30:31 +0530 Subject: [PATCH] Unit Tests for getNoteTags and setNoteTags API calls --- .../java/com/ichi2/anki/AnkiDroidJsAPITest.kt | 79 +++++++++++++++++++ .../java/com/ichi2/testutils/TestClass.kt | 7 ++ 2 files changed, 86 insertions(+) diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/AnkiDroidJsAPITest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/AnkiDroidJsAPITest.kt index 4221277b3046..3831b6c411f1 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/AnkiDroidJsAPITest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/AnkiDroidJsAPITest.kt @@ -27,6 +27,7 @@ import com.ichi2.utils.BASIC_MODEL_NAME import net.ankiweb.rsdroid.withoutUnicodeIsolation import org.hamcrest.CoreMatchers.equalTo import org.hamcrest.MatcherAssert.assertThat +import org.json.JSONArray import org.json.JSONObject import org.junit.Ignore import org.junit.Test @@ -417,6 +418,68 @@ class AnkiDroidJsAPITest : RobolectricTest() { assertEquals(CardType.New, cardAfterReset.type, "Card type after reset") } + @Test + fun ankiGetNoteTagsTest() = + runTest { + val n = + addBasicNote("Front", "Back").update { + tags = mutableListOf("tag1", "tag2", "tag3") + } + + val reviewer: Reviewer = startReviewer() + waitForAsyncTasksToComplete() + + val jsapi = reviewer.jsApi + + // test get tags for note + val expectedTags = n.tags + val response = getDataFromRequest("getNoteTags", jsapi, jsonObjectOf("noteId" to n.id)) + val jsonResponse = JSONObject(response) + val actualTags = JSONArray(jsonResponse.getString("value")) + + assertEquals(expectedTags.size, actualTags.length()) + for (i in 0 until actualTags.length()) { + assertEquals(expectedTags[i], actualTags.getString(i)) + } + } + + @Test + fun ankiSetNoteTagsTest() = + runTest { + val n = + addBasicNote("Front", "Back").update { + tags = mutableListOf("tag1", "tag2", "tag3") + } + + val reviewer: Reviewer = startReviewer() + waitForAsyncTasksToComplete() + + val jsapi = reviewer.jsApi + + // test set tags for note + val newTags = + JSONArray().apply { + put("tag4") + put("tag5") + put("tag6") + } + + assertThat( + getDataFromRequest("setNoteTags", jsapi, jsonObjectOf("noteId" to n.id, "tags" to newTags)), + equalTo(formatApiResult(true)), + ) + waitForAsyncTasksToComplete() + + // Reload the note to ensure the tags are updated + val updatedNote = col.getNote(n.id) + + // Verify the tags are updated + assertEquals(newTags.length(), updatedNote.tags.size) + for (i in 0 until newTags.length()) { + assertEquals(newTags.getString(i), updatedNote.tags[i]) + } + } + companion object { fun jsApiContract(data: String = ""): ByteArray = JSONObject() @@ -450,5 +513,21 @@ class AnkiDroidJsAPITest : RobolectricTest() { jsAPI .handleJsApiRequest(methodName, jsApiContract(apiData), false) .decodeToString() + + suspend fun getDataFromRequest( + methodName: String, + jsAPI: AnkiDroidJsAPI, + apiData: JSONObject, + ): String = + jsAPI + .handleJsApiRequest(methodName, jsApiContract(apiData.toString()), false) + .decodeToString() } } + +private fun jsonObjectOf(vararg pairs: Pair): JSONObject = + JSONObject().apply { + for ((key, value) in pairs) { + put(key, value) + } + } diff --git a/AnkiDroid/src/test/java/com/ichi2/testutils/TestClass.kt b/AnkiDroid/src/test/java/com/ichi2/testutils/TestClass.kt index 0e0e9274401a..300caf86ec57 100644 --- a/AnkiDroid/src/test/java/com/ichi2/testutils/TestClass.kt +++ b/AnkiDroid/src/test/java/com/ichi2/testutils/TestClass.kt @@ -225,6 +225,13 @@ interface TestClass { col.decks.save(deckConfig) } + /** Helper method to update a note */ + fun Note.update(block: Note.() -> Unit): Note { + block(this) + col.updateNote(this) + return this + } + /** Helper method to all cards of a note */ fun Note.updateCards(update: Card.() -> Unit): Note { cards().forEach { it.update(update) }