Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
71bef76
First commit for Espresso test
SyedaGini Jun 17, 2024
1f64a50
ci(ui-automation): Add Espresso for GiniBankSDKExample
SyedaGini Jul 2, 2024
df1c9ed
ci(ui-automation): Fix requested suggestions
SyedaGini Jul 4, 2024
2d7df38
ci(bank-sdk): Create dedicated workflow for running UI tests
a-szotyori Jul 8, 2024
72a9477
ci(bank-sdk): Fix UI tests workflow
a-szotyori Jul 9, 2024
6b8fcc6
ci(bank-sdk): Run the UI tests from the release workflow
a-szotyori Jul 9, 2024
d2ffcb8
ci(bank-sdk): Introduce new test and resource classes.
SyedaGini Jul 11, 2024
e66b5c5
Merge branch 'main' into test-automation
a-szotyori Jul 16, 2024
f9a0381
refactor(ui-automation): Use string resource ids for the Help Screen
a-szotyori Jul 16, 2024
2aea8c9
ci(bank-sdk): Try running the emulator for UI tests without `-no-window`
a-szotyori Jul 16, 2024
96fd6fc
refactor(ui-automation): Use resource ids for the Onboarding Screen T…
SyedaGini Jul 16, 2024
88dd996
ci(ui-automation): Introduce new screen and test classes
SyedaGini Jul 16, 2024
1de6c50
ci(bank-sdk): Revert running the emulator for UI tests without `-no-w…
a-szotyori Jul 16, 2024
e097417
ci: Update emulator Android API level for UI tests to 34
a-szotyori Aug 21, 2024
3b858f1
Merge branch 'main' into test-automation
a-szotyori Aug 21, 2024
e33a4b6
ci (ui-automation): Resolved CaptureScreen ui-tests and added Extract…
SyedaGini Aug 21, 2024
06d1db4
ci (ui-automation): Implemented test-cases for Extraction Screen
SyedaGini Aug 22, 2024
61e5d08
refactor(ui-automation): Added assertion for test-cases and updated e…
SyedaGini Aug 28, 2024
ac9ea32
ci (ui-automation): added function to ExtractionScreen
SyedaGinii Aug 29, 2024
6a17f53
ci (ui-automation): added ReviewScreenTests
SyedaGinii Aug 29, 2024
03e7594
ci (ui-automation): added test-cases for ImportPdfImageTest.kt
SyedaGinii Aug 30, 2024
050ddbe
refactor(ui-automation): Update PdfUploader.Kt and mutliple test-classes
SyedaGinii Sep 3, 2024
0673760
Added automation for Digital Invoice Screen
SyedaGinii Sep 9, 2024
0438289
ci(ui-automation): Push test documents to emulator before running UI …
a-szotyori Sep 9, 2024
beb4231
Address comments on PR
SyedaGinii Sep 11, 2024
ae34c24
Added automation for No Result Screen
SyedaGinii Sep 13, 2024
4d2b4ef
Fixed comments on PR
SyedaGinii Sep 13, 2024
d081257
Addressed comments on PR
SyedaGinii Sep 17, 2024
052c50f
Addressed comments on PR
SyedaGinii Sep 17, 2024
55088e6
Merge pull request #574 from gini/automation(no-result-screen)
SyedaGinii Sep 18, 2024
233ab1b
Added assertion for checks
SyedaGinii Sep 18, 2024
9e2869d
Merge branch 'test-automation' into automation(digital-invoice-screen)
SyedaGinii Sep 18, 2024
4d30565
Merge pull request #565 from gini/automation(digital-invoice-screen)
SyedaGinii Sep 18, 2024
b8c126f
Added automation for File Import Error Screen
SyedaGinii Sep 18, 2024
50fedb8
Remove toast assertion from test-cases
SyedaGinii Sep 20, 2024
2825b0b
Merge pull request #580 from gini/automation(file-import-error-dialog)
SyedaGinii Sep 23, 2024
0546575
Added automation for Edit Button on Digital Invoice Screen
SyedaGinii Sep 24, 2024
ff585d7
Addressed comment on PR
SyedaGinii Sep 24, 2024
623d37c
Merge pull request #587 from gini/automation(edit-button-digital-invo…
SyedaGinii Sep 25, 2024
6d90b76
Added automation for Error Screens
SyedaGinii Sep 30, 2024
1cc32a5
Added test-case number 2 with validations
SyedaGinii Oct 1, 2024
5b7c09e
Merge pull request #589 from gini/automation(errors-screen)
SyedaGinii Oct 1, 2024
501766c
ci: Add adb push command to CI
Oct 16, 2024
e2e03d8
ci: Add sample documents for UI tests
Oct 4, 2024
b51e147
fix:(bank-sdk) Add delay for tests. Add scroll search of file
Oct 17, 2024
ad442be
ci: Fix api-level of emulator
Oct 17, 2024
ade70e3
Merge pull request #600 from gini/PP-860_automation_test_files
GeraltRiv Oct 22, 2024
c566d77
ci: Fix failing tests for assertions
SyedaGinii Oct 22, 2024
16fb023
ci: Add scrollTo option
Oct 22, 2024
8f6dc36
Merge pull request #607 from gini/PM-122_test-automation_scroll_to
GeraltRiv Oct 23, 2024
46f2cec
Merge pull request #605 from gini/PM-122-fix-failing-test-cases
SyedaGinii Oct 23, 2024
6b3eae0
ci: Fix failing test of CaptureScreenTests > test2_flashEnabledWhenIm…
SyedaGinii Oct 23, 2024
ebffcfa
Merge pull request #608 from gini/PM-122-fix-failing-test-cases
SyedaGinii Oct 23, 2024
1d1263c
test: (bank-sdk) Add possibility to skip tests
Oct 28, 2024
be13e08
ci: Add possibility to skip tests
Oct 28, 2024
44fca15
Merge pull request #613 from gini/PM-122_test-automation_skip_photo_p…
GeraltRiv Dec 13, 2024
d4e4f65
bank-sdk test
Dec 16, 2024
26df142
bank-sdk test
Dec 16, 2024
8ade701
test
Dec 20, 2024
39aa1a0
test
Dec 20, 2024
8de117e
test
Dec 20, 2024
71e2e45
test
Dec 20, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions bank-sdk/example-app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -189,25 +189,28 @@ dependencies {
implementation(libs.hilt.library)
implementation(libs.navigation.fragment.ktx)
implementation(libs.navigation.ui.ktx)
implementation(libs.androidx.test.junit.ktx)
kapt(libs.hilt.compiler)

implementation(libs.androidx.lifecycle.runtime.ktx)
implementation(libs.androidx.test.espresso.idlingresource)

testImplementation(libs.junit)

androidTestImplementation(libs.androidx.test.runner)
androidTestImplementation(libs.truth)
androidTestImplementation(libs.androidx.test.rules)
androidTestImplementation(libs.androidx.test.espresso.core)
androidTestImplementation(libs.androidx.test.espresso.intents)
androidTestImplementation(libs.androidx.test.runner)
androidTestImplementation(libs.androidx.test.core)
androidTestImplementation(libs.androidx.test.junit)
androidTestImplementation(libs.androidx.test.rules)
androidTestImplementation(libs.androidx.test.uiautomator)
androidTestImplementation(libs.mockito.core)
androidTestImplementation(libs.mockito.android)
androidTestImplementation(libs.androidx.multidex)
androidTestImplementation(libs.androidx.test.junit)

androidTestUtil(libs.androidx.test.orchestrator)

}

// this is needed because of Dagger-Hilt
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package net.gini.android.bank.sdk.exampleapp.ui.screens

import android.app.Activity
import android.app.Instrumentation
import android.content.Intent
import android.net.Uri
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.intent.Intents.intending
import androidx.test.espresso.intent.matcher.IntentMatchers.hasAction
import androidx.test.espresso.intent.matcher.IntentMatchers.hasType
import androidx.test.espresso.matcher.ViewMatchers.withText
import org.hamcrest.Matchers.allOf

class CaptureScreen {
fun assertCameraTitle(): CaptureScreen {
onView(withId(net.gini.android.capture.R.id.gc_camera_title)).check(matches(withText("Scan an invoice")))
return this
}

fun clickHelpButton(): CaptureScreen {
onView(withId(net.gini.android.capture.R.id.gc_action_show_onboarding)).perform(click())
return this
}

fun clickCancelButton(): CaptureScreen {
onView(withId(net.gini.android.capture.R.id.gc_navigation_bar)).perform(click())
return this
}

fun clickFlashButton(): CaptureScreen {
onView(withId(net.gini.android.capture.R.id.gc_button_camera_flash)).perform(click())
return this
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package net.gini.android.bank.sdk.exampleapp.ui.screens

import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA
import androidx.test.espresso.matcher.ViewMatchers.withContentDescription
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import org.hamcrest.CoreMatchers.allOf

class HelpScreen {
fun clickTipsForBestResults(): HelpScreen {
onView(
allOf(
withId(net.gini.android.capture.R.id.gc_help_item_title),
withText("Tips for best results from photos"),
isDescendantOfA(withId(net.gini.android.capture.R.id.gc_help_items))
)
)
.check(matches(withText("Tips for best results from photos")))
.perform(click());
return this
}

fun clickSupportedFormats(): HelpScreen {
onView(
allOf(
withId(net.gini.android.capture.R.id.gc_help_item_title),
withText("Supported formats"),
isDescendantOfA(withId(net.gini.android.capture.R.id.gc_help_items))
)
)
.check(matches(withText("Supported formats")))
.perform(click());
return this
}

fun clickImportDocs(): HelpScreen {
onView(
allOf(
withId(net.gini.android.capture.R.id.gc_help_item_title),
withText("Import documents from other apps"),
isDescendantOfA(withId(net.gini.android.capture.R.id.gc_help_items))
)
)
.check(matches(withText("Import documents from other apps")))
.perform(click());
return this
}

fun clickBackButton(): HelpScreen {
onView(withContentDescription(net.gini.android.capture.R.string.gc_back_button_description)).perform(click())
return this
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package net.gini.android.bank.sdk.exampleapp.ui.screens

import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import net.gini.android.bank.sdk.exampleapp.R

class MainScreen {

fun checkWelcomeTitleIsDisplayed(): MainScreen {
onView(withId(R.id.tv_welcomeToGini)).check(matches(isDisplayed()))
return this
}

fun assertDescriptionTitle(): MainScreen {
onView(withId(R.id.tv_exampleOfPhotoPayment)).check(matches(isDisplayed()))
return this
}

fun checkCheckIconDisplayed(): MainScreen {
onView(withId(R.id.til_fieldEntryPoint)).check(matches(isDisplayed()))
return this
}

fun clickCameraIcon(): MainScreen {
onView(withId(R.id.til_fieldEntryPoint)).perform(click())
return this
}

fun checkScannerButtonDisplayed(): MainScreen {
onView(withId(R.id.button_startScanner)).check(matches(isDisplayed()))
return this
}

fun clickPhotoPaymentButton(): MainScreen {
onView(withId(R.id.button_startScanner)).perform(click())
return this
}

fun clickSettingButton(): MainScreen {
onView(withId(R.id.text_giniBankVersion)).perform(click())
return this
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package net.gini.android.bank.sdk.exampleapp.ui.screens

import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.espresso.assertion.ViewAssertions.matches

class OnboardingScreen {

fun assertSkipButtonText(): OnboardingScreen {
onView(withId(net.gini.android.capture.R.id.gc_skip)).check(matches(withText("Skip")))
return this
}

fun clickSkipButton(): OnboardingScreen {
onView(withId(net.gini.android.capture.R.id.gc_skip)).perform(click())
return this
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
package net.gini.android.bank.sdk.exampleapp.ui.testcases

import android.Manifest
import android.app.Activity
import android.app.Instrumentation
import android.content.Intent
import android.net.Uri
import androidx.test.espresso.intent.Intents
import androidx.test.espresso.intent.Intents.intending
import androidx.test.espresso.intent.matcher.IntentMatchers.hasAction
import androidx.test.espresso.intent.matcher.IntentMatchers.hasType
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.rule.GrantPermissionRule
import net.gini.android.bank.sdk.exampleapp.ui.MainActivity
import net.gini.android.bank.sdk.exampleapp.ui.screens.CaptureScreen
import net.gini.android.bank.sdk.exampleapp.ui.screens.HelpScreen
import net.gini.android.bank.sdk.exampleapp.ui.screens.MainScreen
import net.gini.android.bank.sdk.exampleapp.ui.screens.OnboardingScreen
import org.hamcrest.Matchers.allOf
import org.junit.After
import org.junit.Before
import org.junit.FixMethodOrder
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.MethodSorters


@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@RunWith(AndroidJUnit4::class)
@LargeTest
class MainActivityTest {

@get: Rule
val activityRule = ActivityScenarioRule(MainActivity::class.java)

@get: Rule
val grantPermissionRule: GrantPermissionRule =
GrantPermissionRule.grant(Manifest.permission.CAMERA)

private val mainScreen = MainScreen()
private val onboardingScreen = OnboardingScreen()
private val captureScreen = CaptureScreen()
private val helpScreen = HelpScreen()

@Before
fun setUp() {
Intents.init()
}
@Test
fun test1_assertTitlesOnMainScreen() {
mainScreen.checkWelcomeTitleIsDisplayed()
mainScreen.assertDescriptionTitle()
}
@Test
fun test2_clickPhotoPaymentButton() {
mainScreen.checkScannerButtonDisplayed()
mainScreen.clickPhotoPaymentButton()
onboardingScreen.assertSkipButtonText()
onboardingScreen.clickSkipButton()
captureScreen.assertCameraTitle()
captureScreen.clickCancelButton()
}

@Test
fun test3_clickHelpButton() {
mainScreen.clickPhotoPaymentButton()
captureScreen.clickHelpButton()
}

@Test
fun test4_verifyHelpItemTipsForBestResult() {
mainScreen.clickPhotoPaymentButton()
captureScreen.clickHelpButton()
helpScreen.clickTipsForBestResults()
helpScreen.clickBackButton()
}

@Test
fun test5_verifyHelpItemSupportedFormats() {
mainScreen.clickPhotoPaymentButton()
captureScreen.clickHelpButton()
helpScreen.clickSupportedFormats()
helpScreen.clickBackButton()
}

@Test
fun test6_verifyHelpItemImportDocuments() {
mainScreen.clickPhotoPaymentButton()
captureScreen.clickHelpButton()
helpScreen.clickImportDocs()
helpScreen.clickBackButton()
}


@Test
fun test7_pdfImportFromFiles() {
mainScreen.clickPhotoPaymentButton()
val resultData = Intent()
val fileUri =
Uri.parse("/Users/syedaquratulainasad/Documents/Gini/GitHub/gini-mobile-android/bank-sdk/example-app/src/androidTest/assets/test_pdf.pdf")
resultData.setData(fileUri)
val result = Instrumentation.ActivityResult(Activity.RESULT_OK, resultData)
intending(
allOf(
hasAction(Intent.ACTION_OPEN_DOCUMENT),
hasType("image/*")
)
).respondWith(result)
}

@After
fun tearDown() {
}
}
2 changes: 2 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ jacoco = "0.8.10"
hilt = "2.46.1"
navigation_component = "2.7.6"


[libraries]
android-gradle = { module = "com.android.tools.build:gradle", version.ref = "android-gradle-plugin" }
kotlin-gradle = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
Expand All @@ -47,6 +48,7 @@ androidx-camera-lifecycle = { module = "androidx.camera:camera-lifecycle", versi
androidx-camera-view = { module = "androidx.camera:camera-view", version.ref = "androidx-camera" }
androidx-annotation = "androidx.annotation:annotation:1.7.1"
androidx-test-core-ktx = { module = "androidx.test:core-ktx", version.ref = "androidx-test" }
androidx-test-core = { module = "androidx.test:core", version.ref = "androidx-test" }
androidx-test-runner = { module = "androidx.test:runner", version.ref = "androidx-test" }
androidx-test-rules = { module = "androidx.test:rules", version.ref = "androidx-test" }
androidx-test-orchestrator = "androidx.test:orchestrator:1.4.2"
Expand Down