Skip to content

Commit

Permalink
test: android test for MultimediaFragment intents
Browse files Browse the repository at this point in the history
  • Loading branch information
criticalAY committed Oct 20, 2024
1 parent 80487ca commit bb31a0d
Show file tree
Hide file tree
Showing 4 changed files with 125 additions and 0 deletions.
1 change: 1 addition & 0 deletions AnkiDroid/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,7 @@ dependencies {
}
api project(":api")
implementation libs.androidx.work.runtime
implementation libs.androidx.espresso.intents
lintChecks project(":lint-rules")
coreLibraryDesugaring libs.desugar.jdk.libs.nio

Expand Down
2 changes: 2 additions & 0 deletions AnkiDroid/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
-keep class * extends com.google.protobuf.GeneratedMessageLite { *; }
-keep class androidx.core.app.ActivityCompat$* { *; }
-keep class androidx.concurrent.futures.** { *; }
-keep class * extends androidx.work.InputMerger


# Ignore unused packages
-dontwarn javax.naming.**
Expand Down
120 changes: 120 additions & 0 deletions AnkiDroid/src/androidTest/java/com/ichi2/anki/MultimediaTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
/*
* Copyright (c) 2024 Ashish Yadav <[email protected]>
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation; either version 3 of the License, or (at your option) any later
* version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/

package com.ichi2.anki

import android.content.Context
import android.content.Intent
import android.provider.MediaStore
import androidx.test.core.app.ActivityScenario
import androidx.test.espresso.intent.Intents
import androidx.test.espresso.intent.Intents.intended
import androidx.test.espresso.intent.matcher.IntentMatchers.hasAction
import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent
import com.ichi2.anki.multimedia.MultimediaActivity
import com.ichi2.anki.multimedia.MultimediaActivityExtra
import com.ichi2.anki.multimedia.MultimediaImageFragment
import com.ichi2.anki.multimediacard.fields.ImageField
import com.ichi2.anki.multimediacard.fields.TextField
import com.ichi2.anki.multimediacard.impl.MultimediaEditableNote
import com.ichi2.anki.tests.InstrumentedTest
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized

@RunWith(Parameterized::class)
class MultimediaTest : InstrumentedTest() {

@JvmField
@Parameterized.Parameter(0)
var intentBuilder: (Context) -> Intent? = { null }

@JvmField
@Parameterized.Parameter(1)
var expectedAction: String? = null

@JvmField
@Parameterized.Parameter(2)
var isComponentCheck: Boolean = false

@Test
fun testIntentFired() {
Intents.init()

try {
ActivityScenario.launch<MultimediaActivity>(intentBuilder(testContext)).use { scenario ->
scenario.onActivity { activity ->
activity.supportFragmentManager.findFragmentById(R.id.fragment_container) as MultimediaImageFragment
}

if (isComponentCheck) {
intended(hasComponent(expectedAction!!))
} else {
intended(hasAction(expectedAction))
}
}
} finally {
Intents.release()
}
}

companion object {
@Parameterized.Parameters(name = "{index}: {1}")
@JvmStatic
fun initParameters(): Collection<Array<out Any>> {
return listOf(
arrayOf({ context: Context -> getImageFragment(context) }, MediaStore.ACTION_IMAGE_CAPTURE, false),
arrayOf({ context: Context -> getGalleryFragment(context) }, Intent.ACTION_PICK, false),
arrayOf({ context: Context -> getDrawingFragment(context) }, DrawingActivity::class.java.name, true)
)
}

private val multimediaActivityExtra = MultimediaActivityExtra(0, ImageField(), getTestMultimediaNote())

private fun getImageFragment(context: Context): Intent {
return MultimediaImageFragment.getIntent(
context,
multimediaActivityExtra,
MultimediaImageFragment.ImageOptions.CAMERA
)
}

private fun getGalleryFragment(context: Context): Intent {
return MultimediaImageFragment.getIntent(
context,
multimediaActivityExtra,
MultimediaImageFragment.ImageOptions.GALLERY
)
}

private fun getDrawingFragment(context: Context): Intent {
return MultimediaImageFragment.getIntent(
context,
multimediaActivityExtra,
MultimediaImageFragment.ImageOptions.DRAWING
)
}

private fun getTestMultimediaNote(): MultimediaEditableNote {
val note = MultimediaEditableNote()
note.setNumFields(1)
note.setField(0, TextField())
note.freezeInitialFieldValues()
return note
}
}
}
2 changes: 2 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ timber = "5.0.1"
# In the past, releases have been published before the changelog
triplet = "3.11.0"
turbine = "1.1.0"
espressoIntents = "3.6.1"

[libraries]
acra-limiter = { module = "ch.acra:acra-limiter", version.ref = "acra" }
Expand Down Expand Up @@ -165,6 +166,7 @@ androidx-work-runtime = { group = "androidx.work", name = "work-runtime-ktx", ve

#testing libs
androidx-espresso-contrib = { module = "androidx.test.espresso:espresso-contrib", version.ref = "espresso" }
androidx-espresso-intents = { module = "androidx.test.espresso:espresso-intents", version.ref = "espressoIntents" }
androidx-espresso-core = { module = "androidx.test.espresso:espresso-core", version.ref = "espresso" }
androidx-fragment-testing = { module = "androidx.fragment:fragment-testing", version.ref = "androidxFragmentKtx" }
androidx-fragment-testing-manifest = { module = "androidx.fragment:fragment-testing-manifest", version.ref = "androidxFragmentKtx" }
Expand Down

0 comments on commit bb31a0d

Please sign in to comment.