From b043c2f43ff744c2b1bfbec0369cb29c1118d422 Mon Sep 17 00:00:00 2001 From: Jose Rubio Date: Mon, 16 Oct 2023 11:44:13 +0200 Subject: [PATCH] ANDROID-13796 Roborazzi screenshot tests (#296) * POC roborazzi screenshot tests * POC roborazzi set screenshot folder * POC roborazzi using getScreenshotName() to get the screenshot file name * POC roborazzi add compare_screenshots.yml * POC roborazzi updating failure report * POC roborazzi buttons test * POC roborazzi update screenshots baseline * POC roborazzi execute update_screenshot_baseline.yml on push * Updated screenshots baseline * POC roborazzi update record screenshots baseline * POC roborazzi runs on ubuntu-latest * Updated screenshots baseline * POC roborazzi remove on push * POC roborazzi upload to azure * POC roborazzi upload to azure if failure * POC roborazzi updated upload to azure * POC roborazzi updated upload to azure * POC roborazzi force screenshots error * POC roborazzi add pngs of other directories * POC roborazzi add pngs of other directories * POC roborazzi revert brand names * POC roborazzi update baseline * POC roborazzi update baseline * POC roborazzi update baseline * POC roborazzi using Enclosed to run parametrized and not parametrized tests * POC roborazzi update screenshots * POC roborazzi update screenshots * POC roborazzi update globs * POC roborazzi also upload artifact * POC roborazzi update job name * POC roborazzi fix uppercase * POC roborazzi upload names * POC roborazzi use pixel 5 * POC roborazzi update baseline on push * Updated screenshots baseline * POC roborazzi update device * POC roborazzi force error * POC roborazzi update device * POC roborazzi force error * POC roborazzi pixel 5 + 33% image size * POC roborazzi add error on PasswordInput * POC roborazzi change report image dimensions * POC roborazzi add image click * POC roborazzi update compare_screenshots.yml AZURE_ACCOUNT_NAME * POC roborazzi update setting GraphicsMode from build.gradle file * POC roborazzi classic views test * POC roborazzi classic views in xmls * POC roborazzi remove clicked from screenshot tests * POC roborazzi update to 1.5.0 * POC roborazzi add screenshots.md file * POC roborazzi fix url * POC roborazzi update screenshots.md * POC roborazzi update test_dummy_activity.xml to the test package * POC roborazzi remove upload to github * POC roborazzi update screenshots.md * POC roborazzi extract roborazzi_version * POC roborazzi update screenshots.md removing github artifacts from there * POC roborazzi update removing checks that are also done with the screenshots * POC roborazzi split ButtonKtTest * POC roborazzi remove git status * POC roborazzi add darkTheme screenshots * ANDROID-13796 add ScreenshotsTest base class * ANDROID-13796 use ScreenshotsTest in classic view tests * ANDROID-13796 update screenshots * ANDROID-13796 add compareScreenshot methods in ScreenshotsTest * ANDROID-13796 downgrade roborazzi to 1.4.0 * ANDROID-13796 restore checkout * ANDROID-13796 downgrade roborazzi to 1.4.0 * ANDROID-13796 add generate-html-report action * ANDROID-13796 add gradle/gradle-build-action * ANDROID-13796 removing the layout tests from library * ANDROID-13796 add TextInputWithError test * ANDROID-13796 add TextInputDisabled test * ANDROID-13796 remove unneeded code * ANDROID-13796 configure sdk version * ANDROID-13796 extract repeated code to private method * ANDROID-13796 add dark mode tests for classic views --------- Co-authored-by: jeprubio --- .../actions/generate-html-report/action.yml | 7 ++ .../scripts/generate-html-report.sh | 59 +++++++++++++ .github/workflows/compare_screenshots.yml | 49 +++++++++++ .../workflows/update_screenshot_baseline.yml | 24 ++++++ build.gradle | 2 + gradle/wrapper/gradle-wrapper.properties | 2 +- library/build.gradle | 18 ++++ library/screenshots/check_TextInput.png | Bin 0 -> 8193 bytes .../screenshots/check_TextInputDisabled.png | Bin 0 -> 7766 bytes .../check_TextInputDisabled_dark.png | Bin 0 -> 7653 bytes .../screenshots/check_TextInputWithError.png | Bin 0 -> 11520 bytes .../check_TextInputWithError_dark.png | Bin 0 -> 11637 bytes library/screenshots/check_TextInput_dark.png | Bin 0 -> 8089 bytes .../check_the_button_screenshot_BlauBrand.png | Bin 0 -> 4812 bytes ...k_the_button_screenshot_BlauBrand_dark.png | Bin 0 -> 4908 bytes ...ck_the_button_screenshot_MovistarBrand.png | Bin 0 -> 4645 bytes ...e_button_screenshot_MovistarBrand_dark.png | Bin 0 -> 4802 bytes .../check_the_button_screenshot_O2Brand.png | Bin 0 -> 4858 bytes ...eck_the_button_screenshot_O2Brand_dark.png | Bin 0 -> 4900 bytes ..._the_button_screenshot_TelefonicaBrand.png | Bin 0 -> 5960 bytes ...button_screenshot_TelefonicaBrand_dark.png | Bin 0 -> 6330 bytes .../check_the_button_screenshot_VivoBrand.png | Bin 0 -> 4853 bytes ...k_the_button_screenshot_VivoBrand_dark.png | Bin 0 -> 4894 bytes ..._the_password_is_initially_not_visible.png | Bin 0 -> 4986 bytes ...r_toggling_twice_the_visibility_button.png | Bin 0 -> 4986 bytes ...after_the_visibility_button_is_clicked.png | Bin 0 -> 8030 bytes library/src/test/AndroidManifest.xml | 20 +++++ .../com/telefonica/mistica/DummyActivity.kt | 13 +++ .../compose/button/ButtonBehaviourTest.kt | 64 ++++++++++++++ .../mistica/compose/button/ButtonKtTest.kt | 68 +++++++++++++++ .../compose/input/PasswordInputKtTest.kt | 80 ++++++++++++++++++ .../telefonica/mistica/input/TextInputTest.kt | 73 ++++++++++++++++ .../mistica/testutils/ScreenshotUtils.kt | 20 +++++ .../mistica/testutils/ScreenshotsTest.kt | 34 ++++++++ .../telefonica/mistica/testutils/TestUtils.kt | 24 ++++++ .../test/res/layout/test_dummy_activity.xml | 7 ++ screenshots.md | 42 +++++++++ 37 files changed, 605 insertions(+), 1 deletion(-) create mode 100644 .github/actions/generate-html-report/action.yml create mode 100755 .github/actions/generate-html-report/scripts/generate-html-report.sh create mode 100644 .github/workflows/compare_screenshots.yml create mode 100644 .github/workflows/update_screenshot_baseline.yml create mode 100644 library/screenshots/check_TextInput.png create mode 100644 library/screenshots/check_TextInputDisabled.png create mode 100644 library/screenshots/check_TextInputDisabled_dark.png create mode 100644 library/screenshots/check_TextInputWithError.png create mode 100644 library/screenshots/check_TextInputWithError_dark.png create mode 100644 library/screenshots/check_TextInput_dark.png create mode 100644 library/screenshots/check_the_button_screenshot_BlauBrand.png create mode 100644 library/screenshots/check_the_button_screenshot_BlauBrand_dark.png create mode 100644 library/screenshots/check_the_button_screenshot_MovistarBrand.png create mode 100644 library/screenshots/check_the_button_screenshot_MovistarBrand_dark.png create mode 100644 library/screenshots/check_the_button_screenshot_O2Brand.png create mode 100644 library/screenshots/check_the_button_screenshot_O2Brand_dark.png create mode 100644 library/screenshots/check_the_button_screenshot_TelefonicaBrand.png create mode 100644 library/screenshots/check_the_button_screenshot_TelefonicaBrand_dark.png create mode 100644 library/screenshots/check_the_button_screenshot_VivoBrand.png create mode 100644 library/screenshots/check_the_button_screenshot_VivoBrand_dark.png create mode 100644 library/screenshots/check_the_password_is_initially_not_visible.png create mode 100644 library/screenshots/check_the_password_is_not_visible_after_toggling_twice_the_visibility_button.png create mode 100644 library/screenshots/check_the_password_is_visible_after_the_visibility_button_is_clicked.png create mode 100644 library/src/test/AndroidManifest.xml create mode 100644 library/src/test/java/com/telefonica/mistica/DummyActivity.kt create mode 100644 library/src/test/java/com/telefonica/mistica/compose/button/ButtonBehaviourTest.kt create mode 100644 library/src/test/java/com/telefonica/mistica/compose/button/ButtonKtTest.kt create mode 100644 library/src/test/java/com/telefonica/mistica/compose/input/PasswordInputKtTest.kt create mode 100644 library/src/test/java/com/telefonica/mistica/input/TextInputTest.kt create mode 100644 library/src/test/java/com/telefonica/mistica/testutils/ScreenshotUtils.kt create mode 100644 library/src/test/java/com/telefonica/mistica/testutils/ScreenshotsTest.kt create mode 100644 library/src/test/java/com/telefonica/mistica/testutils/TestUtils.kt create mode 100644 library/src/test/res/layout/test_dummy_activity.xml create mode 100644 screenshots.md diff --git a/.github/actions/generate-html-report/action.yml b/.github/actions/generate-html-report/action.yml new file mode 100644 index 000000000..19d7d4b60 --- /dev/null +++ b/.github/actions/generate-html-report/action.yml @@ -0,0 +1,7 @@ +name: 'Generate HTML Report' +description: 'Generates HTML report from screenshots' +runs: + using: "composite" + steps: + - run: ${GITHUB_ACTION_PATH}/scripts/generate-html-report.sh + shell: bash \ No newline at end of file diff --git a/.github/actions/generate-html-report/scripts/generate-html-report.sh b/.github/actions/generate-html-report/scripts/generate-html-report.sh new file mode 100755 index 000000000..8c39a2de9 --- /dev/null +++ b/.github/actions/generate-html-report/scripts/generate-html-report.sh @@ -0,0 +1,59 @@ +#!/bin/bash + +mkdir reports +touch reports/report.html +cp */screenshots/*_compare.png reports/ +files=$(find . -type f -name "*_compare.png" | grep "reports/") +{ + echo '' + echo '' + echo '' + echo 'Screenshots failure report' + echo '' + echo '' + echo '' + echo '' + echo '' + echo '' + echo '' + echo '
' + echo '
' + echo '' + echo '' +} >> reports/report.html + + for file in $files; do + # Get the file name and insert newlines every 100 characters + fileName=$(basename "$file" | sed -r 's/(.{100})/\1
/g') + echo "" >> reports/report.html + echo "" >> reports/report.html + done +{ + echo '
File nameComparison
$(basename "$file")
' + echo '
' + echo '
' + echo '
' + echo '
' + echo '
' + echo '' + echo '' +} >> reports/report.html + +echo "Report: " +cat reports/report.html diff --git a/.github/workflows/compare_screenshots.yml b/.github/workflows/compare_screenshots.yml new file mode 100644 index 000000000..aeb5dba0c --- /dev/null +++ b/.github/workflows/compare_screenshots.yml @@ -0,0 +1,49 @@ +name: Compare Screenshots + +on: + workflow_dispatch: + pull_request: + +jobs: + CompareScreenshots: + + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v3 + + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + + - name: Verify Screenshots (roborazzi) + run: 'bash ./gradlew verifyRoborazziDebug' + + - id: generate-html + name: Generate Html Report + if: failure() + uses: ./.github/actions/generate-html-report + + - name: Generate screenshots tests reports tar.gz + if: failure() + run: | + tar cvzf mistica-screenshots-tests-report.tar.gz reports || echo "No screenshots tests reports found" + shell: bash + + - name: Checkout Telefonica/github-actions repo + if: failure() + uses: actions/checkout@v3 + with: + repository: Telefonica/github-actions + token: "${{ secrets.NOVUM_PRIVATE_REPOS }}" + path: .github/shared-actions + + - name: Upload reports to azure + if: failure() + uses: ./.github/shared-actions/azure/upload-to-storage + with: + azure-account-name: ${{secrets.AZURE_ACCOUNT_NAME}} + azure-account-key: ${{secrets.AZURE_ACCOUNT_KEY}} + globs: | + mistica-screenshots-tests-report.tar.gz + generate-summary: true diff --git a/.github/workflows/update_screenshot_baseline.yml b/.github/workflows/update_screenshot_baseline.yml new file mode 100644 index 000000000..500f96b23 --- /dev/null +++ b/.github/workflows/update_screenshot_baseline.yml @@ -0,0 +1,24 @@ +name: "Update screenshot baseline" +on: + workflow_dispatch: + +jobs: + screenshots_baseline: + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v2 + + - name: Run Roborazzi Record + run: 'bash ./gradlew clean recordRoborazziDebug' + + - name: Check Git status + run: 'git status' + shell: bash + + - name: Commit and push screenshots baseline + id: commitAndPushScreenshotsBaseline + uses: EndBug/add-and-commit@v7 + with: + message: 'Updated screenshots baseline' + add: './**/screenshots/*' diff --git a/build.gradle b/build.gradle index 26d786926..1c2bc6323 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,7 @@ buildscript { accompanist_version = "0.30.1" coil_version = '2.2.2' constraintComposeVersion = '1.0.1' + roborazzi_version = "1.4.0" } repositories { google() @@ -27,6 +28,7 @@ buildscript { plugins { id 'org.jetbrains.kotlin.android' version '1.5.21' apply false id 'io.github.gradle-nexus.publish-plugin' version '1.1.0' apply false + id "io.github.takahirom.roborazzi" version '1.4.0' apply false } allprojects { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f02a74898..b619500b1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri May 19 13:07:06 CEST 2023 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/library/build.gradle b/library/build.gradle index c9e35f5fa..ccf7740d3 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -3,6 +3,7 @@ plugins { id 'org.jetbrains.kotlin.android' id 'kotlin-kapt' id 'maven-publish' + id 'io.github.takahirom.roborazzi' } android { @@ -51,6 +52,15 @@ android { sarifReport true checkDependencies true } + + testOptions { + unitTests { + includeAndroidResources = true + all { + systemProperty 'robolectric.graphicsMode', 'NATIVE' + } + } + } } task sourceJar(type: Jar) { @@ -88,7 +98,15 @@ dependencies { testImplementation 'junit:junit:4.13.2' testImplementation "androidx.compose.ui:ui-test-junit4:$compose_ui_version" + testImplementation 'androidx.compose.ui:ui-test-manifest:1.0.5' + testImplementation 'org.robolectric:robolectric:4.10.3' + testImplementation "io.github.takahirom.roborazzi:roborazzi:$roborazzi_version" + testImplementation "io.github.takahirom.roborazzi:roborazzi-compose:$roborazzi_version" testImplementation "org.mockito.kotlin:mockito-kotlin:4.0.0" + testImplementation "androidx.test:rules:1.5.0" + testImplementation "androidx.test:core-ktx:1.5.0" + testImplementation 'androidx.test.ext:junit-ktx:1.1.5' + testImplementation 'androidx.test.espresso:espresso-core:3.2.0' debugImplementation "androidx.compose.ui:ui-tooling:$compose_ui_version" } diff --git a/library/screenshots/check_TextInput.png b/library/screenshots/check_TextInput.png new file mode 100644 index 0000000000000000000000000000000000000000..443fc8a239bd7623bfb0880b8b8911da08c58a1e GIT binary patch literal 8193 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 literal 0 HcmV?d00001 diff --git a/library/screenshots/check_TextInputDisabled.png b/library/screenshots/check_TextInputDisabled.png new file mode 100644 index 0000000000000000000000000000000000000000..6b342981f2be1fe6c84034d7e93decde66e88f64 GIT binary patch literal 7766 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 literal 0 HcmV?d00001 diff --git a/library/screenshots/check_TextInputDisabled_dark.png b/library/screenshots/check_TextInputDisabled_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..6a0907d091a4858706aaaaa511b4a23c18a3c6cf GIT binary patch literal 7653 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 F{}-7t|D^x` literal 0 HcmV?d00001 diff --git a/library/screenshots/check_TextInputWithError_dark.png b/library/screenshots/check_TextInputWithError_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..648dc145f2d2bb0aa823386d06eccc5875216ecd GIT binary patch literal 11637 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 Qn(^w}+J;(XH|{_E9}r28}bLZAVUHmt6^w+6u!= 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 DWaTH& literal 0 HcmV?d00001 diff --git a/library/screenshots/check_the_button_screenshot_BlauBrand.png b/library/screenshots/check_the_button_screenshot_BlauBrand.png new file mode 100644 index 0000000000000000000000000000000000000000..3886ccc05f1da872d2a3394fc916e2eb1d2846c2 GIT binary patch literal 4812 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 Fe*kG&8=3$B literal 0 HcmV?d00001 diff --git a/library/screenshots/check_the_button_screenshot_BlauBrand_dark.png b/library/screenshots/check_the_button_screenshot_BlauBrand_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..6a5f0e69ccc8fc0246a044b6e210ffec6a3897a4 GIT binary patch literal 4908 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 literal 0 HcmV?d00001 diff --git a/library/screenshots/check_the_button_screenshot_O2Brand.png b/library/screenshots/check_the_button_screenshot_O2Brand.png new file mode 100644 index 0000000000000000000000000000000000000000..6fab6c741eaab10982d2eb888966e5ee890db631 GIT binary patch literal 4858 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 literal 0 HcmV?d00001 diff --git a/library/screenshots/check_the_button_screenshot_O2Brand_dark.png b/library/screenshots/check_the_button_screenshot_O2Brand_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..46769318e150ddbd663551eb409855d462bcd1fc GIT binary patch literal 4900 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 literal 0 HcmV?d00001 diff --git a/library/screenshots/check_the_button_screenshot_TelefonicaBrand.png b/library/screenshots/check_the_button_screenshot_TelefonicaBrand.png new file mode 100644 index 0000000000000000000000000000000000000000..16b0f073bafbf50670b51dfc3061b2abf4bf714e GIT binary patch literal 5960 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 literal 0 HcmV?d00001 diff --git a/library/screenshots/check_the_button_screenshot_VivoBrand.png b/library/screenshots/check_the_button_screenshot_VivoBrand.png new file mode 100644 index 0000000000000000000000000000000000000000..c13a91227491bcdfdb7523a2383d2467a4f26cdf GIT binary patch literal 4853 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 literal 0 HcmV?d00001 diff --git a/library/screenshots/check_the_password_is_initially_not_visible.png b/library/screenshots/check_the_password_is_initially_not_visible.png new file mode 100644 index 0000000000000000000000000000000000000000..caf321eb2ded816894e423eba995f7fbbff0c6af GIT binary patch literal 4986 zcmd5=XIzun(&t{~x)-G_AWDEJxP;CE3K*&j5(J5W2uPRSYovoNUg?BIs)?aV5h+

9nAO->fLb*@E?(gUQ_I`Yy4=HERQe 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 P%+uVu3D>Ls%`x`BvmzV2 literal 0 HcmV?d00001 diff --git a/library/screenshots/check_the_password_is_not_visible_after_toggling_twice_the_visibility_button.png b/library/screenshots/check_the_password_is_not_visible_after_toggling_twice_the_visibility_button.png new file mode 100644 index 0000000000000000000000000000000000000000..caf321eb2ded816894e423eba995f7fbbff0c6af GIT binary patch literal 4986 zcmd5=XIzun(&t{~x)-G_AWDEJxP;CE3K*&j5(J5W2uPRSYovoNUg?BIs)?aV5h+

9nAO->fLb*@E?(gUQ_I`Yy4=HERQe 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 P%+uVu3D>Ls%`x`BvmzV2 literal 0 HcmV?d00001 diff --git a/library/screenshots/check_the_password_is_visible_after_the_visibility_button_is_clicked.png b/library/screenshots/check_the_password_is_visible_after_the_visibility_button_is_clicked.png new file mode 100644 index 0000000000000000000000000000000000000000..7511f95c08c6daeb64dc94ec3ae52b0dfa10a01b GIT binary patch literal 8030 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 z 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 literal 0 HcmV?d00001 diff --git a/library/src/test/AndroidManifest.xml b/library/src/test/AndroidManifest.xml new file mode 100644 index 000000000..c2944977c --- /dev/null +++ b/library/src/test/AndroidManifest.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/library/src/test/java/com/telefonica/mistica/DummyActivity.kt b/library/src/test/java/com/telefonica/mistica/DummyActivity.kt new file mode 100644 index 000000000..f84cb814d --- /dev/null +++ b/library/src/test/java/com/telefonica/mistica/DummyActivity.kt @@ -0,0 +1,13 @@ +package com.telefonica.mistica + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.telefonica.mistica.R + +class DummyActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.test_dummy_activity) + } +} diff --git a/library/src/test/java/com/telefonica/mistica/compose/button/ButtonBehaviourTest.kt b/library/src/test/java/com/telefonica/mistica/compose/button/ButtonBehaviourTest.kt new file mode 100644 index 000000000..4deb68dae --- /dev/null +++ b/library/src/test/java/com/telefonica/mistica/compose/button/ButtonBehaviourTest.kt @@ -0,0 +1,64 @@ +package com.telefonica.mistica.compose.button + +import androidx.compose.foundation.layout.padding +import androidx.compose.ui.Modifier +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.compose.ui.unit.dp +import com.telefonica.mistica.compose.theme.MisticaTheme +import com.telefonica.mistica.compose.theme.brand.MovistarBrand +import org.junit.Assert.assertTrue +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +internal class ButtonBehaviourTest { + @get:Rule + val composeTestRule = createComposeRule() + + @Test + fun `check the button is clicked`() = test { + `given Button`() + + `when the button is clicked`() + + `then the onClickListener has been invoked`() + } + + private fun TestScope.`given Button`() { + `when Button`() + } + + private fun TestScope.`when Button`() { + composeTestRule.setContent { + MisticaTheme(brand = MovistarBrand) { + Button( + text = textValue, + onClickListener = onClickListener, + modifier = Modifier.padding(16.dp) + ) + } + } + } + + private fun TestScope.`when the button is clicked`() { + composeTestRule.onNodeWithText(textValue).performClick() + } + + private fun TestScope.`then the onClickListener has been invoked`() { + assertTrue(clicked) + } + + private fun test(block: TestScope.() -> Unit) { + TestScope().block() + } + + private class TestScope { + val textValue = "textValue" + var clicked = false + val onClickListener: () -> Unit = { clicked = true } + } +} \ No newline at end of file diff --git a/library/src/test/java/com/telefonica/mistica/compose/button/ButtonKtTest.kt b/library/src/test/java/com/telefonica/mistica/compose/button/ButtonKtTest.kt new file mode 100644 index 000000000..6f55080c4 --- /dev/null +++ b/library/src/test/java/com/telefonica/mistica/compose/button/ButtonKtTest.kt @@ -0,0 +1,68 @@ +package com.telefonica.mistica.compose.button + +import androidx.compose.foundation.layout.padding +import androidx.compose.material.Surface +import androidx.compose.ui.Modifier +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onRoot +import androidx.compose.ui.unit.dp +import com.telefonica.mistica.compose.theme.MisticaTheme +import com.telefonica.mistica.compose.theme.brand.BlauBrand +import com.telefonica.mistica.compose.theme.brand.Brand +import com.telefonica.mistica.compose.theme.brand.MovistarBrand +import com.telefonica.mistica.compose.theme.brand.O2Brand +import com.telefonica.mistica.compose.theme.brand.TelefonicaBrand +import com.telefonica.mistica.compose.theme.brand.VivoBrand +import com.telefonica.mistica.testutils.ScreenshotsTest +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.ParameterizedRobolectricTestRunner + +@RunWith(ParameterizedRobolectricTestRunner::class) +internal class ButtonKtTest(private val brand: Brand, private val darkTheme: Boolean): ScreenshotsTest() { + @get:Rule + val composeTestRule = createComposeRule() + + @Test + fun `check the button screenshot`() { + `when Button`(brand, darkTheme) + + `then screenshot is OK`(brand, darkTheme) + } + + private fun `when Button`(brand: Brand = MovistarBrand, darkTheme: Boolean) { + composeTestRule.setContent { + MisticaTheme(brand = brand, darkTheme = darkTheme) { + Surface { + Button( + text = "textValue", + onClickListener = { }, + modifier = Modifier.padding(16.dp) + ) + } + } + } + } + + private fun `then screenshot is OK`(brand: Brand, darkTheme: Boolean) { + compareScreenshot(composeTestRule.onRoot(), brand, darkTheme) + } + + companion object { + @JvmStatic + @ParameterizedRobolectricTestRunner.Parameters(name = "Input: {0}") + fun brands() = listOf( + arrayOf(MovistarBrand, false), + arrayOf(VivoBrand, false), + arrayOf(O2Brand, false), + arrayOf(BlauBrand, false), + arrayOf(TelefonicaBrand, false), + arrayOf(MovistarBrand, true), + arrayOf(VivoBrand, true), + arrayOf(O2Brand, true), + arrayOf(BlauBrand, true), + arrayOf(TelefonicaBrand, true), + ) + } +} diff --git a/library/src/test/java/com/telefonica/mistica/compose/input/PasswordInputKtTest.kt b/library/src/test/java/com/telefonica/mistica/compose/input/PasswordInputKtTest.kt new file mode 100644 index 000000000..579ad96e5 --- /dev/null +++ b/library/src/test/java/com/telefonica/mistica/compose/input/PasswordInputKtTest.kt @@ -0,0 +1,80 @@ +package com.telefonica.mistica.compose.input + +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onRoot +import androidx.compose.ui.test.performClick +import com.telefonica.mistica.compose.theme.MisticaTheme +import com.telefonica.mistica.compose.theme.brand.MovistarBrand +import com.telefonica.mistica.testutils.ScreenshotsTest +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +internal class PasswordInputKtTest: ScreenshotsTest() { + @get:Rule + val composeTestRule = createComposeRule() + + @Test + fun `check the password is initially not visible`() = test { + `when PasswordInput`() + + `then screenshot is OK`() + } + + @Test + fun `check the password is visible after the visibility button is clicked`() = test { + `given PasswordInput`() + + `when the visibility button is clicked`() + + `then screenshot is OK`() + } + + @Test + fun `check the password is not visible after toggling twice the visibility button`() = test { + `given PasswordInput`() + + `when the visibility button is clicked`(times = 2) + + `then screenshot is OK`() + } + + private fun TestScope.`given PasswordInput`() { + `when PasswordInput`() + } + + private fun TestScope.`when PasswordInput`() { + composeTestRule.setContent { + MisticaTheme(brand = MovistarBrand) { + PasswordInput( + value = textValue, + onValueChange = onValueChanged, + label = "label", + ) + } + } + } + + private fun `when the visibility button is clicked`(times: Int = 1) { + repeat(times) { + composeTestRule.onNodeWithTag(TextInputTestTags.PASSWORD_VISIBILITY_TOGGLE).performClick() + } + } + + private fun `then screenshot is OK`() { + compareScreenshot(composeTestRule.onRoot()) + } + + private fun test(block: TestScope.() -> Unit) { + TestScope().block() + } + + private class TestScope { + val textValue = "textValue" + var valueChanged = false + val onValueChanged: (String) -> Unit = { valueChanged = true } + } +} diff --git a/library/src/test/java/com/telefonica/mistica/input/TextInputTest.kt b/library/src/test/java/com/telefonica/mistica/input/TextInputTest.kt new file mode 100644 index 000000000..7454dedd2 --- /dev/null +++ b/library/src/test/java/com/telefonica/mistica/input/TextInputTest.kt @@ -0,0 +1,73 @@ +package com.telefonica.mistica.input + +import android.widget.FrameLayout +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.matcher.ViewMatchers +import androidx.test.ext.junit.rules.activityScenarioRule +import com.telefonica.mistica.DummyActivity +import com.telefonica.mistica.R +import com.telefonica.mistica.testutils.ScreenshotsTest +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +@RunWith(RobolectricTestRunner::class) +internal class TextInputTest: ScreenshotsTest() { + @get:Rule + val rule = activityScenarioRule() + + @Test + fun `check TextInput`() { + checkTextInput() + } + + @Config(qualifiers = "+night") + @Test + fun `check TextInput dark`() { + checkTextInput() + } + + @Test + fun `check TextInputWithError`() { + checkTextInput { + error = "Whatever error" + } + } + + @Config(qualifiers = "+night") + @Test + fun `check TextInputWithError dark`() { + checkTextInput { + error = "Whatever error" + } + } + + @Test + fun `check TextInputDisabled`() { + checkTextInput { + isEnabled = false + } + } + + @Config(qualifiers = "+night") + @Test + fun `check TextInputDisabled dark`() { + checkTextInput { + isEnabled = false + } + } + + private fun checkTextInput(onTextInput: TextInput.() -> Unit = {}) { + rule.scenario.onActivity { activity -> + val wrapper: FrameLayout = activity.findViewById(R.id.dummy_activity_wrapper) + val textInput = TextInput(activity) + wrapper.addView(textInput) + textInput.text = "Hello android devs!" + textInput.onTextInput() + + compareScreenshot(onView(ViewMatchers.withId(R.id.dummy_activity_wrapper))) + } + } +} diff --git a/library/src/test/java/com/telefonica/mistica/testutils/ScreenshotUtils.kt b/library/src/test/java/com/telefonica/mistica/testutils/ScreenshotUtils.kt new file mode 100644 index 000000000..29b78f2ba --- /dev/null +++ b/library/src/test/java/com/telefonica/mistica/testutils/ScreenshotUtils.kt @@ -0,0 +1,20 @@ +package com.telefonica.mistica.testutils + +import com.telefonica.mistica.compose.theme.brand.Brand + +object ScreenshotUtils { + fun getScreenshotName(brand: Brand? = null, extra: String = ""): String { + return """screenshots/ + ${TestUtils.findRunningTestMethodName()} + ${brandName(brand, prepend = "_")}${extra}.png""" + .replace("\\s+".toRegex(), "") + } + + private fun brandName(brand: Brand?, prepend: String = "", append: String = ""): String { + return if (brand != null) { + "$prepend${brand::class.java.simpleName}$append" + } else { + "" + } + } +} diff --git a/library/src/test/java/com/telefonica/mistica/testutils/ScreenshotsTest.kt b/library/src/test/java/com/telefonica/mistica/testutils/ScreenshotsTest.kt new file mode 100644 index 000000000..826672af8 --- /dev/null +++ b/library/src/test/java/com/telefonica/mistica/testutils/ScreenshotsTest.kt @@ -0,0 +1,34 @@ +package com.telefonica.mistica.testutils + +import androidx.compose.ui.test.SemanticsNodeInteraction +import androidx.test.espresso.ViewInteraction +import com.github.takahirom.roborazzi.RobolectricDeviceQualifiers +import com.github.takahirom.roborazzi.captureRoboImage +import com.telefonica.mistica.compose.theme.brand.Brand +import org.robolectric.annotation.Config + +@Config(sdk = [33], qualifiers = RobolectricDeviceQualifiers.Pixel5) +open class ScreenshotsTest { + fun compareScreenshot( + node: SemanticsNodeInteraction, + brand: Brand? = null, + darkTheme: Boolean = false, + extra: String = "", + ) { + node.captureRoboImage(screenshotName(brand, darkTheme, extra)) + } + + fun compareScreenshot( + node: ViewInteraction, + brand: Brand? = null, + darkTheme: Boolean = false, + extra: String = "", + ) { + node.captureRoboImage(screenshotName(brand, darkTheme, extra)) + } + + private fun screenshotName(brand: Brand?, darkTheme: Boolean, extra: String) = ScreenshotUtils.getScreenshotName( + brand = brand, + extra = if (darkTheme) "_dark$extra" else extra + ) +} diff --git a/library/src/test/java/com/telefonica/mistica/testutils/TestUtils.kt b/library/src/test/java/com/telefonica/mistica/testutils/TestUtils.kt new file mode 100644 index 000000000..b0a24a910 --- /dev/null +++ b/library/src/test/java/com/telefonica/mistica/testutils/TestUtils.kt @@ -0,0 +1,24 @@ +package com.telefonica.mistica.testutils + +import org.junit.Test + +object TestUtils { + fun findRunningTestMethodName(): String { + val stackTrace = Thread.currentThread().stackTrace + for (element in stackTrace) { + val methodName = element.methodName + val className = element.className + val testClass = Class.forName(className) + val methods = testClass.declaredMethods + for (method in methods) { + if (method.name == methodName && method.isAnnotationPresent(Test::class.java)) { + return methodName.replace( + oldValue = " ", + newValue = "_" + ) + } + } + } + throw IllegalStateException("Could not find running test method name") + } +} \ No newline at end of file diff --git a/library/src/test/res/layout/test_dummy_activity.xml b/library/src/test/res/layout/test_dummy_activity.xml new file mode 100644 index 000000000..d032cf331 --- /dev/null +++ b/library/src/test/res/layout/test_dummy_activity.xml @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/screenshots.md b/screenshots.md new file mode 100644 index 000000000..d3196f1f0 --- /dev/null +++ b/screenshots.md @@ -0,0 +1,42 @@ +## Screenshot testing +Screenshot tests compares current screenshots of the app with a set of desired ones. To achieve that we need to perform 2 tasks: + + 1. Generate and store a set of desired screenshots (also known as baseline). + These screenshots will be generated using a reference device to avoid differences based on Android devices/versions + 2. Take screenshots of the app with this reference device and compare them with the baseline. + Then generate reports with differences detected + +To perform these tasks we use [Roborazzi](https://github.com/takahirom/roborazzi) library which uses gradle tasks to generate baseline and store screenshots + +## Add a new screenshot +To create a new screenshot create a new unitTest with Roboelectric in the test folder of the module to test: + @RunWith(RobolectricTestRunner::class) +or + @RunWith(ParameterizedRobolectricTestRunner::class) +depending if it's a parametrized test or not. Use + @RunWith(Enclosed::class) +in case multiple of them must be on the same file. + +Then use `captureRoboImage()` function to take the screenshot and use `ScreenshotUtils.getScreenshotName()` to set the name of the test.: + + composeTestRule.onRoot() + .captureRoboImage(ScreenshotUtils.getScreenshotName()) + +For traditional views run an activity or check `TextInputTest.kt` example on how to use a dummy activity to load them inside. + +## Check that changes in the screen are detected +`Compare Screenshots` job will run in each pr and will run the `verifyRoborazziDebug` gradle task that checks the screenshots. In case this fails it will +generate a report and upload it to azure. + +## Access to screenshots test report +At the bottom of the summary of the action that has failed you'll see that a report has been uploaded to azure. + +Once that compressed file is downloaded an html report is there with the differences detected between the current screenshot (left side) and the +newly generated one (right side). + +## Update screenshots baseline +Either run the ci job `Update screenshot baseline` that will create the images and perform a commit for you or run the gradle task `recordRoborazziDebug` and +this way it allows you to check everything is ok before uploading the images. + + +