From db66bb1341204dabc48aa1762a966e785ccf62bb Mon Sep 17 00:00:00 2001 From: Gustavo Pagani Date: Fri, 13 May 2022 10:08:33 +0100 Subject: [PATCH] Add tests for MediaControlButtons (#156) --- .../ui/components/MediaControlButtonsTest.kt | 333 +++++++++++++++++ .../MediaControlButtonsWithProgressTest.kt | 344 ++++++++++++++++++ 2 files changed, 677 insertions(+) create mode 100644 media-ui/src/androidTest/java/com/google/android/horologist/media/ui/components/MediaControlButtonsTest.kt create mode 100644 media-ui/src/androidTest/java/com/google/android/horologist/media/ui/components/MediaControlButtonsWithProgressTest.kt diff --git a/media-ui/src/androidTest/java/com/google/android/horologist/media/ui/components/MediaControlButtonsTest.kt b/media-ui/src/androidTest/java/com/google/android/horologist/media/ui/components/MediaControlButtonsTest.kt new file mode 100644 index 0000000000..0522f71f88 --- /dev/null +++ b/media-ui/src/androidTest/java/com/google/android/horologist/media/ui/components/MediaControlButtonsTest.kt @@ -0,0 +1,333 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@file:OptIn(ExperimentalHorologistMediaUiApi::class) + +package com.google.android.horologist.media.ui.components + +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertIsEnabled +import androidx.compose.ui.test.assertIsNotEnabled +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithContentDescription +import androidx.compose.ui.test.performClick +import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi +import com.google.test.toolbox.matchers.hasProgressBar +import org.junit.Rule +import org.junit.Test + +class MediaControlButtonsTest { + + @get:Rule + val composeTestRule = createComposeRule() + + @Test + fun givenIsPlaying_thenPauseButtonIsDisplayed() { + // given + val playing = true + + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = {}, + onPauseButtonClick = {}, + playPauseButtonEnabled = true, + playing = playing, + onSeekToPreviousButtonClick = {}, + seekToPreviousButtonEnabled = true, + onSeekToNextButtonClick = {}, + seekToNextButtonEnabled = true, + ) + } + + // then + composeTestRule.onNodeWithContentDescription("Pause") + .assertIsDisplayed() + + composeTestRule.onNodeWithContentDescription("Play") + .assertDoesNotExist() + } + + @Test + fun givenIsPlaying_whenPauseIsClicked_thenCorrectEventIsTriggered() { + // given + val playing = true + var clicked = false + + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = {}, + onPauseButtonClick = { clicked = true }, + playPauseButtonEnabled = true, + playing = playing, + onSeekToPreviousButtonClick = {}, + seekToPreviousButtonEnabled = true, + onSeekToNextButtonClick = {}, + seekToNextButtonEnabled = true, + ) + } + + // when + composeTestRule.onNodeWithContentDescription("Pause") + .performClick() + + // then + // assert that the click event was assigned to the correct button + composeTestRule.waitUntil(timeoutMillis = 1_000) { clicked } + } + + @Test + fun givenIsNOTPlaying_thenPlayButtonIsDisplayed() { + // given + val playing = false + + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = {}, + onPauseButtonClick = {}, + playPauseButtonEnabled = true, + playing = playing, + onSeekToPreviousButtonClick = {}, + seekToPreviousButtonEnabled = true, + onSeekToNextButtonClick = {}, + seekToNextButtonEnabled = true, + ) + } + + // then + composeTestRule.onNodeWithContentDescription("Play") + .assertIsDisplayed() + + composeTestRule.onNodeWithContentDescription("Pause") + .assertDoesNotExist() + } + + @Test + fun givenIsNOTPlaying_whenPlayIsClicked_thenCorrectEventIsTriggered() { + // given + val playing = false + var clicked = false + + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = { clicked = true }, + onPauseButtonClick = {}, + playPauseButtonEnabled = true, + playing = playing, + onSeekToPreviousButtonClick = {}, + seekToPreviousButtonEnabled = true, + onSeekToNextButtonClick = {}, + seekToNextButtonEnabled = true, + ) + } + + // when + composeTestRule.onNodeWithContentDescription("Play") + .performClick() + + // then + // assert that the click event was assigned to the correct button + composeTestRule.waitUntil(timeoutMillis = 1_000) { clicked } + } + + @Test + fun whenSeekToPreviousIsClicked_thenCorrectEventIsTriggered() { + // given + var clicked = false + + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = {}, + onPauseButtonClick = {}, + playPauseButtonEnabled = true, + playing = false, + onSeekToPreviousButtonClick = { clicked = true }, + seekToPreviousButtonEnabled = true, + onSeekToNextButtonClick = {}, + seekToNextButtonEnabled = true, + ) + } + + // when + composeTestRule.onNodeWithContentDescription("Previous") + .performClick() + + // then + // assert that the click event was assigned to the correct button + composeTestRule.waitUntil(timeoutMillis = 1_000) { clicked } + } + + @Test + fun whenSeekToNextIsClicked_thenCorrectEventIsTriggered() { + // given + var clicked = false + + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = {}, + onPauseButtonClick = {}, + playPauseButtonEnabled = true, + playing = false, + onSeekToPreviousButtonClick = {}, + seekToPreviousButtonEnabled = true, + onSeekToNextButtonClick = { clicked = true }, + seekToNextButtonEnabled = true, + ) + } + + // when + composeTestRule.onNodeWithContentDescription("Next") + .performClick() + + // then + // assert that the click event was assigned to the correct button + composeTestRule.waitUntil(timeoutMillis = 1_000) { clicked } + } + + @Test + fun givenNOPercentParam_thenNOProgressBarIsDisplayed() { + // given + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = {}, + onPauseButtonClick = {}, + playPauseButtonEnabled = true, + playing = false, + onSeekToPreviousButtonClick = {}, + seekToPreviousButtonEnabled = true, + onSeekToNextButtonClick = {}, + seekToNextButtonEnabled = true, + ) + } + + // then + composeTestRule.onNode(hasProgressBar()) + .assertDoesNotExist() + } + + @Test + fun givenIsPlayingAndPlayPauseEnabledIsTrue_thenPauseButtonIsEnabled() { + // given + val playing = true + val playPauseButtonEnabled = true + + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = {}, + onPauseButtonClick = {}, + playPauseButtonEnabled = playPauseButtonEnabled, + playing = playing, + onSeekToPreviousButtonClick = {}, + seekToPreviousButtonEnabled = false, + onSeekToNextButtonClick = {}, + seekToNextButtonEnabled = false, + ) + } + + // then + composeTestRule.onNodeWithContentDescription("Pause") + .assertIsEnabled() + + composeTestRule.onNodeWithContentDescription("Previous") + .assertIsNotEnabled() + composeTestRule.onNodeWithContentDescription("Next") + .assertIsNotEnabled() + } + + @Test + fun givenIsNOTPlayingAndPlayPauseEnabledIsTrue_thenPlayButtonIsEnabled() { + // given + val playing = false + val playPauseButtonEnabled = true + + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = {}, + onPauseButtonClick = {}, + playPauseButtonEnabled = playPauseButtonEnabled, + playing = playing, + onSeekToPreviousButtonClick = {}, + seekToPreviousButtonEnabled = false, + onSeekToNextButtonClick = {}, + seekToNextButtonEnabled = false, + ) + } + + // then + composeTestRule.onNodeWithContentDescription("Play") + .assertIsEnabled() + + composeTestRule.onNodeWithContentDescription("Previous") + .assertIsNotEnabled() + composeTestRule.onNodeWithContentDescription("Next") + .assertIsNotEnabled() + } + + @Test + fun givenSeekToPreviousButtonEnabledIsTrue_thenSeekToPreviousButtonIsEnabled() { + // given + val seekToPreviousButtonEnabled = true + + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = {}, + onPauseButtonClick = {}, + playPauseButtonEnabled = false, + playing = false, + onSeekToPreviousButtonClick = {}, + seekToPreviousButtonEnabled = seekToPreviousButtonEnabled, + onSeekToNextButtonClick = {}, + seekToNextButtonEnabled = false, + ) + } + + // then + composeTestRule.onNodeWithContentDescription("Previous") + .assertIsEnabled() + + composeTestRule.onNodeWithContentDescription("Play") + .assertIsNotEnabled() + composeTestRule.onNodeWithContentDescription("Next") + .assertIsNotEnabled() + } + + @Test + fun givenSeekToNextButtonEnabledIsTrue_thenSeekToNextButtonIsEnabled() { + // given + val seekToNextButtonEnabled = true + + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = {}, + onPauseButtonClick = {}, + playPauseButtonEnabled = false, + playing = false, + onSeekToPreviousButtonClick = {}, + seekToPreviousButtonEnabled = false, + onSeekToNextButtonClick = {}, + seekToNextButtonEnabled = seekToNextButtonEnabled, + ) + } + + // then + composeTestRule.onNodeWithContentDescription("Next") + .assertIsEnabled() + + composeTestRule.onNodeWithContentDescription("Previous") + .assertIsNotEnabled() + composeTestRule.onNodeWithContentDescription("Play") + .assertIsNotEnabled() + } +} diff --git a/media-ui/src/androidTest/java/com/google/android/horologist/media/ui/components/MediaControlButtonsWithProgressTest.kt b/media-ui/src/androidTest/java/com/google/android/horologist/media/ui/components/MediaControlButtonsWithProgressTest.kt new file mode 100644 index 0000000000..5e5e9037ef --- /dev/null +++ b/media-ui/src/androidTest/java/com/google/android/horologist/media/ui/components/MediaControlButtonsWithProgressTest.kt @@ -0,0 +1,344 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@file:OptIn(ExperimentalHorologistMediaUiApi::class) + +package com.google.android.horologist.media.ui.components + +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertIsEnabled +import androidx.compose.ui.test.assertIsNotEnabled +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithContentDescription +import androidx.compose.ui.test.performClick +import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi +import com.google.test.toolbox.matchers.hasProgressBar +import org.junit.Rule +import org.junit.Test + +class MediaControlButtonsWithProgressTest { + + @get:Rule + val composeTestRule = createComposeRule() + + @Test + fun givenIsPlaying_thenPauseButtonIsDisplayed() { + // given + val playing = true + + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = {}, + onPauseButtonClick = {}, + playPauseButtonEnabled = true, + playing = playing, + onSeekToPreviousButtonClick = {}, + seekToPreviousButtonEnabled = true, + onSeekToNextButtonClick = {}, + seekToNextButtonEnabled = true, + percent = 0.25f, + ) + } + + // then + composeTestRule.onNodeWithContentDescription("Pause") + .assertIsDisplayed() + + composeTestRule.onNodeWithContentDescription("Play") + .assertDoesNotExist() + } + + @Test + fun givenIsPlaying_whenPauseIsClicked_thenCorrectEventIsTriggered() { + // given + val playing = true + var clicked = false + + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = {}, + onPauseButtonClick = { clicked = true }, + playPauseButtonEnabled = true, + playing = playing, + onSeekToPreviousButtonClick = {}, + seekToPreviousButtonEnabled = true, + onSeekToNextButtonClick = {}, + seekToNextButtonEnabled = true, + percent = 0.25f, + ) + } + + // when + composeTestRule.onNodeWithContentDescription("Pause") + .performClick() + + // then + // assert that the click event was assigned to the correct button + composeTestRule.waitUntil(timeoutMillis = 1_000) { clicked } + } + + @Test + fun givenIsNOTPlaying_thenPlayButtonIsDisplayed() { + // given + val playing = false + + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = {}, + onPauseButtonClick = {}, + playPauseButtonEnabled = true, + playing = playing, + onSeekToPreviousButtonClick = {}, + seekToPreviousButtonEnabled = true, + onSeekToNextButtonClick = {}, + seekToNextButtonEnabled = true, + percent = 0.25f, + ) + } + + // then + composeTestRule.onNodeWithContentDescription("Play") + .assertIsDisplayed() + + composeTestRule.onNodeWithContentDescription("Pause") + .assertDoesNotExist() + } + + @Test + fun givenIsNOTPlaying_whenPlayIsClicked_thenCorrectEventIsTriggered() { + // given + val playing = false + var clicked = false + + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = { clicked = true }, + onPauseButtonClick = {}, + playPauseButtonEnabled = true, + playing = playing, + onSeekToPreviousButtonClick = {}, + seekToPreviousButtonEnabled = true, + onSeekToNextButtonClick = {}, + seekToNextButtonEnabled = true, + percent = 0.25f, + ) + } + + // when + composeTestRule.onNodeWithContentDescription("Play") + .performClick() + + // then + // assert that the click event was assigned to the correct button + composeTestRule.waitUntil(timeoutMillis = 1_000) { clicked } + } + + @Test + fun whenSeekToPreviousIsClicked_thenCorrectEventIsTriggered() { + // given + var clicked = false + + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = {}, + onPauseButtonClick = {}, + playPauseButtonEnabled = true, + playing = false, + onSeekToPreviousButtonClick = { clicked = true }, + seekToPreviousButtonEnabled = true, + onSeekToNextButtonClick = {}, + seekToNextButtonEnabled = true, + percent = 0.25f, + ) + } + + // when + composeTestRule.onNodeWithContentDescription("Previous") + .performClick() + + // then + // assert that the click event was assigned to the correct button + composeTestRule.waitUntil(timeoutMillis = 1_000) { clicked } + } + + @Test + fun whenSeekToNextIsClicked_thenCorrectEventIsTriggered() { + // given + var clicked = false + + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = {}, + onPauseButtonClick = {}, + playPauseButtonEnabled = true, + playing = false, + onSeekToPreviousButtonClick = {}, + seekToPreviousButtonEnabled = true, + onSeekToNextButtonClick = { clicked = true }, + seekToNextButtonEnabled = true, + percent = 0.25f, + ) + } + + // when + composeTestRule.onNodeWithContentDescription("Next") + .performClick() + + // then + // assert that the click event was assigned to the correct button + composeTestRule.waitUntil(timeoutMillis = 1_000) { clicked } + } + + @Test + fun givenPercentParam_thenProgressBarIsDisplayed() { + // given + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = {}, + onPauseButtonClick = {}, + playPauseButtonEnabled = true, + playing = false, + onSeekToPreviousButtonClick = {}, + seekToPreviousButtonEnabled = true, + onSeekToNextButtonClick = {}, + seekToNextButtonEnabled = true, + percent = 0.25f, + ) + } + + // then + composeTestRule.onNode(hasProgressBar()) + .assertIsDisplayed() + } + + @Test + fun givenIsPlayingAndPlayPauseEnabledIsTrue_thenPauseButtonIsEnabled() { + // given + val playing = true + val playPauseButtonEnabled = true + + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = {}, + onPauseButtonClick = {}, + playPauseButtonEnabled = playPauseButtonEnabled, + playing = playing, + onSeekToPreviousButtonClick = {}, + seekToPreviousButtonEnabled = false, + onSeekToNextButtonClick = {}, + seekToNextButtonEnabled = false, + percent = 0.25f, + ) + } + + // then + composeTestRule.onNodeWithContentDescription("Pause") + .assertIsEnabled() + + composeTestRule.onNodeWithContentDescription("Previous") + .assertIsNotEnabled() + composeTestRule.onNodeWithContentDescription("Next") + .assertIsNotEnabled() + } + + @Test + fun givenIsNOTPlayingAndPlayPauseEnabledIsTrue_thenPlayButtonIsEnabled() { + // given + val playing = false + val playPauseButtonEnabled = true + + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = {}, + onPauseButtonClick = {}, + playPauseButtonEnabled = playPauseButtonEnabled, + playing = playing, + onSeekToPreviousButtonClick = {}, + seekToPreviousButtonEnabled = false, + onSeekToNextButtonClick = {}, + seekToNextButtonEnabled = false, + percent = 0.25f, + ) + } + + // then + composeTestRule.onNodeWithContentDescription("Play") + .assertIsEnabled() + + composeTestRule.onNodeWithContentDescription("Previous") + .assertIsNotEnabled() + composeTestRule.onNodeWithContentDescription("Next") + .assertIsNotEnabled() + } + + @Test + fun givenSeekToPreviousButtonEnabledIsTrue_thenSeekToPreviousButtonIsEnabled() { + // given + val seekToPreviousButtonEnabled = true + + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = {}, + onPauseButtonClick = {}, + playPauseButtonEnabled = false, + playing = false, + onSeekToPreviousButtonClick = {}, + seekToPreviousButtonEnabled = seekToPreviousButtonEnabled, + onSeekToNextButtonClick = {}, + seekToNextButtonEnabled = false, + percent = 0.25f, + ) + } + + // then + composeTestRule.onNodeWithContentDescription("Previous") + .assertIsEnabled() + + composeTestRule.onNodeWithContentDescription("Play") + .assertIsNotEnabled() + composeTestRule.onNodeWithContentDescription("Next") + .assertIsNotEnabled() + } + + @Test + fun givenSeekToNextButtonEnabledIsTrue_thenSeekToNextButtonIsEnabled() { + // given + val seekToNextButtonEnabled = true + + composeTestRule.setContent { + MediaControlButtons( + onPlayButtonClick = {}, + onPauseButtonClick = {}, + playPauseButtonEnabled = false, + playing = false, + onSeekToPreviousButtonClick = {}, + seekToPreviousButtonEnabled = false, + onSeekToNextButtonClick = {}, + seekToNextButtonEnabled = seekToNextButtonEnabled, + percent = 0.25f, + ) + } + + // then + composeTestRule.onNodeWithContentDescription("Next") + .assertIsEnabled() + + composeTestRule.onNodeWithContentDescription("Previous") + .assertIsNotEnabled() + composeTestRule.onNodeWithContentDescription("Play") + .assertIsNotEnabled() + } +}