From 5825cf553a4e87608e9242fa8f2535997752f00a Mon Sep 17 00:00:00 2001 From: Maurice HUNLEDE Date: Tue, 27 Jun 2023 22:19:50 +0000 Subject: [PATCH 01/10] added : MoviesAppBehaviourTest class to perform the test cases --- .../viewmodel/MoviesAppBehaviourTest.kt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 app/src/test/java/com/skydoves/themovies/viewmodel/MoviesAppBehaviourTest.kt diff --git a/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesAppBehaviourTest.kt b/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesAppBehaviourTest.kt new file mode 100644 index 0000000..aa7eb24 --- /dev/null +++ b/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesAppBehaviourTest.kt @@ -0,0 +1,20 @@ +import androidx.test.espresso.Espresso +import androidx.test.espresso.action.ViewActions +import androidx.test.espresso.assertion.ViewAssertions +import androidx.test.espresso.matcher.ViewMatchers +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.LargeTest +import androidx.test.rule.ActivityTestRule + +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +import com.example.movies.MainActivity +import com.example.movies.R + +@RunWith(AndroidJUnit4::class) +@LargeTest +class MoviesAppBehaviourTest { + +} \ No newline at end of file From 6f67add60c94a5a1591dced020c6ecf3dbf0d027 Mon Sep 17 00:00:00 2001 From: Maurice HUNLEDE Date: Tue, 27 Jun 2023 22:29:42 +0000 Subject: [PATCH 02/10] added : test function navigate to to movie details screen --- .../themovies/viewmodel/MoviesAppBehaviourTest.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesAppBehaviourTest.kt b/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesAppBehaviourTest.kt index aa7eb24..4c804bf 100644 --- a/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesAppBehaviourTest.kt +++ b/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesAppBehaviourTest.kt @@ -17,4 +17,18 @@ import com.example.movies.R @LargeTest class MoviesAppBehaviourTest { + @Rule + @JvmField + var mActivityRule: ActivityTestRule = ActivityTestRule(MainActivity::class.java) + + @Test + fun navigateToMovieDetailsScreen() { + // Perform an action to navigate to the details screen + Espresso.onView(ViewMatchers.withId(R.id.movies_list)) + .perform(ViewActions.click()) + + // Assert that the details screen is displayed + Espresso.onView(ViewMatchers.withId(R.id.movie_details)) + .check(ViewAssertions.matches(ViewMatchers.isDisplayed())) + } } \ No newline at end of file From 81a0416d3530c2eb02ec99dfe68c0b04f021482b Mon Sep 17 00:00:00 2001 From: Maurice HUNLEDE Date: Tue, 27 Jun 2023 22:30:50 +0000 Subject: [PATCH 03/10] added : test function apply year filter --- .../viewmodel/MoviesAppBehaviourTest.kt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesAppBehaviourTest.kt b/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesAppBehaviourTest.kt index 4c804bf..ade814f 100644 --- a/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesAppBehaviourTest.kt +++ b/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesAppBehaviourTest.kt @@ -31,4 +31,24 @@ class MoviesAppBehaviourTest { Espresso.onView(ViewMatchers.withId(R.id.movie_details)) .check(ViewAssertions.matches(ViewMatchers.isDisplayed())) } + + @Test + fun applyYearFilter() { + // Perform an action to apply the year filter + Espresso.onView(ViewMatchers.withId(R.id.year_filter_button)) + .perform(ViewActions.click()) + + // Assume the year filter dialog is displayed, select a specific year + Espresso.onView(ViewMatchers.withId(R.id.year_filter_dialog)) + .perform(ViewActions.click()) + + // Assert that the movie list is updated with the filtered results + Espresso.onView(ViewMatchers.withId(R.id.movies_list)) + .check(ViewAssertions.matches(ViewMatchers.isDisplayed())) + + // Assert that the filtered movies meet the specified criteria + // You can perform further assertions on individual movie items or their properties + } + + } \ No newline at end of file From 5dee5db39534b1d31e31fa2c56f42f46655cd0cd Mon Sep 17 00:00:00 2001 From: Maurice HUNLEDE Date: Tue, 27 Jun 2023 22:35:51 +0000 Subject: [PATCH 04/10] added/modified : test function apply year filter + filter matched --- .../themovies/viewmodel/MoviesAppBehaviourTest.kt | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesAppBehaviourTest.kt b/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesAppBehaviourTest.kt index ade814f..ae8b369 100644 --- a/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesAppBehaviourTest.kt +++ b/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesAppBehaviourTest.kt @@ -47,8 +47,17 @@ class MoviesAppBehaviourTest { .check(ViewAssertions.matches(ViewMatchers.isDisplayed())) // Assert that the filtered movies meet the specified criteria - // You can perform further assertions on individual movie items or their properties + Espresso.onView(ViewMatchers.withId(R.id.movies_list)) + .check { view, _ -> + // Custom assertions on the filtered movies + val movieList = view as RecyclerView + val adapter = movieList.adapter as MovieListAdapter + for (i in 0 until adapter.itemCount) { + val movie = adapter.getItem(i) + Assert.assertTrue(movie.year == selectedYear) + } + } } - + } \ No newline at end of file From e4b0432af4e20a5ae1efc3ecf3b4073a3521733d Mon Sep 17 00:00:00 2001 From: Maurice HUNLEDE Date: Tue, 27 Jun 2023 22:37:48 +0000 Subject: [PATCH 05/10] added : test function apply popularity filter --- .../viewmodel/MoviesAppBehaviourTest.kt | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesAppBehaviourTest.kt b/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesAppBehaviourTest.kt index ae8b369..80f574d 100644 --- a/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesAppBehaviourTest.kt +++ b/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesAppBehaviourTest.kt @@ -59,5 +59,31 @@ class MoviesAppBehaviourTest { } } + @Test + fun applyPopularityFilter() { + // Perform an action to apply the popularity filter + Espresso.onView(ViewMatchers.withId(R.id.popularity_filter_button)) + .perform(ViewActions.click()) + + // Assume the popularity filter dialog is displayed, select a specific popularity range + Espresso.onView(ViewMatchers.withId(R.id.popularity_filter_dialog)) + .perform(ViewActions.click()) + + // Assert that the movie list is updated with the filtered results + Espresso.onView(ViewMatchers.withId(R.id.movies_list)) + .check(ViewAssertions.matches(ViewMatchers.isDisplayed())) + + // Assert that the filtered movies meet the specified criteria + Espresso.onView(ViewMatchers.withId(R.id.movies_list)) + .check { view, _ -> + // Custom assertions on the filtered movies + val movieList = view as RecyclerView + val adapter = movieList.adapter as MovieListAdapter + for (i in 0 until adapter.itemCount) { + val movie = adapter.getItem(i) + Assert.assertTrue(movie.popularity >= minPopularity && movie.popularity <= maxPopularity) + } + } + } } \ No newline at end of file From 65138d99743d96e79293ff6d5431243edee1078c Mon Sep 17 00:00:00 2001 From: Maurice HUNLEDE Date: Tue, 27 Jun 2023 22:46:09 +0000 Subject: [PATCH 06/10] added/modified : cocumber dependencies --- app/build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 3373ede..7ecbd7d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -119,6 +119,9 @@ dependencies { androidTestImplementation "androidx.test.espresso:espresso-core:$espressoVersion" androidTestImplementation "androidx.test.ext:junit:$androidxTest" androidTestImplementation "androidx.test:rules:$androidxTestRules" + //cocoumber + androidTestImplementation 'io.cucumber:cucumber-android:7.3.1' + androidTestImplementation 'io.cucumber:cucumber-junit:7.3.1' } apply from: '../spotless.gradle' From 6a0cad80f7a9618e99613a6a4f44341417d8e048 Mon Sep 17 00:00:00 2001 From: Maurice HUNLEDE Date: Tue, 27 Jun 2023 22:48:01 +0000 Subject: [PATCH 07/10] added : features file --- app/src/test/resources/movies.features | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 app/src/test/resources/movies.features diff --git a/app/src/test/resources/movies.features b/app/src/test/resources/movies.features new file mode 100644 index 0000000..420a9c7 --- /dev/null +++ b/app/src/test/resources/movies.features @@ -0,0 +1,16 @@ +Feature: Movies App + + Scenario: Navigate to movie details screen + Given I am on the main movies list screen + When I tap on a movie + Then I should see the movie details screen + + Scenario: Apply year filter + Given I am on the main movies list screen + When I apply a year filter + Then I should see only movies from the selected year + + Scenario: Apply popularity filter + Given I am on the main movies list screen + When I apply a popularity filter + Then I should see only movies within the specified popularity range From 1c3ea87648b2d4273ba5bfc52551d54c307cf450 Mon Sep 17 00:00:00 2001 From: Maurice HUNLEDE Date: Tue, 27 Jun 2023 22:51:03 +0000 Subject: [PATCH 08/10] added : Step definitions --- .../themovies/viewmodel/MoviesSteps.kt | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 app/src/test/java/com/skydoves/themovies/viewmodel/MoviesSteps.kt diff --git a/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesSteps.kt b/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesSteps.kt new file mode 100644 index 0000000..e0b969b --- /dev/null +++ b/app/src/test/java/com/skydoves/themovies/viewmodel/MoviesSteps.kt @@ -0,0 +1,66 @@ +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.* +import cucumber.api.java.en.Given +import cucumber.api.java.en.Then +import cucumber.api.java.en.When +import org.junit.Assert + +class MoviesSteps { + + @Given("^I am on the main movies list screen$") + fun iAmOnMainMoviesListScreen() { + // Add any setup code here if needed + } + + @When("^I tap on a movie$") + fun iTapOnAMovie() { + onView(withId(R.id.movies_list)).perform(click()) + } + + @Then("^I should see the movie details screen$") + fun iShouldSeeTheMovieDetailsScreen() { + onView(withId(R.id.movie_details)).check(matches(isDisplayed())) + } + + @When("^I apply a year filter$") + fun iApplyAYearFilter() { + onView(withId(R.id.year_filter_button)).perform(click()) + // Assume the year filter dialog is displayed, select a specific year + onView(withId(R.id.year_filter_dialog)).perform(click()) + } + + @Then("^I should see only movies from the selected year$") + fun iShouldSeeOnlyMoviesFromSelectedYear() { + onView(withId(R.id.movies_list)).check { view, _ -> + // Custom assertions on the filtered movies + val movieList = view as RecyclerView + val adapter = movieList.adapter as MovieListAdapter + for (i in 0 until adapter.itemCount) { + val movie = adapter.getItem(i) + Assert.assertTrue(movie.year == selectedYear) + } + } + } + + @When("^I apply a popularity filter$") + fun iApplyAPopularityFilter() { + onView(withId(R.id.popularity_filter_button)).perform(click()) + // Assume the popularity filter dialog is displayed, select a specific popularity range + onView(withId(R.id.popularity_filter_dialog)).perform(click()) + } + + @Then("^I should see only movies within the specified popularity range$") + fun iShouldSeeOnlyMoviesWithinSpecifiedPopularityRange() { + onView(withId(R.id.movies_list)).check { view, _ -> + // Custom assertions on the filtered movies + val movieList = view as RecyclerView + val adapter = movieList.adapter as MovieListAdapter + for (i in 0 until adapter.itemCount) { + val movie = adapter.getItem(i) + Assert.assertTrue(movie.popularity >= minPopularity && movie.popularity <= maxPopularity) + } + } + } +} \ No newline at end of file From b2ca85188858e02d6d9faa358642b5b0996440b0 Mon Sep 17 00:00:00 2001 From: Maurice HUNLEDE Date: Tue, 27 Jun 2023 22:54:51 +0000 Subject: [PATCH 09/10] added : Cocumber tests runner --- app/src/test-common/CocumberTestRunner.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 app/src/test-common/CocumberTestRunner.kt diff --git a/app/src/test-common/CocumberTestRunner.kt b/app/src/test-common/CocumberTestRunner.kt new file mode 100644 index 0000000..c44d977 --- /dev/null +++ b/app/src/test-common/CocumberTestRunner.kt @@ -0,0 +1,11 @@ +import cucumber.api.CucumberOptions +import cucumber.api.junit.Cucumber +import org.junit.runner.RunWith + +@RunWith(Cucumber::class) +@CucumberOptions( + features = ["features"], + glue = ["your.package.name"], + tags = ["@smoke"] // Optional: Run specific scenarios or tags +) +class CucumberTestRunner From 0b1c1b038c89eaca761abdd3b6d0aa583cdea090 Mon Sep 17 00:00:00 2001 From: Maurice HUNLEDE Date: Tue, 27 Jun 2023 23:02:35 +0000 Subject: [PATCH 10/10] added/modified : Cocumber tests runner scenarios --- app/src/test-common/CocumberTestRunner.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/test-common/CocumberTestRunner.kt b/app/src/test-common/CocumberTestRunner.kt index c44d977..05b0a37 100644 --- a/app/src/test-common/CocumberTestRunner.kt +++ b/app/src/test-common/CocumberTestRunner.kt @@ -5,7 +5,6 @@ import org.junit.runner.RunWith @RunWith(Cucumber::class) @CucumberOptions( features = ["features"], - glue = ["your.package.name"], - tags = ["@smoke"] // Optional: Run specific scenarios or tags + glue = ["com.skydoves.themovies.test"] ) class CucumberTestRunner