![mcarare](/assets/img/avatar_default.png)
Locally, on some devices, these tests pass. Also, with devices on which the test fail, on mirroring the tests in real app usage the notification closes on tab close.
138 lines
4.8 KiB
Kotlin
138 lines
4.8 KiB
Kotlin
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
package org.mozilla.fenix.ui
|
|
|
|
import androidx.test.platform.app.InstrumentationRegistry
|
|
import androidx.test.uiautomator.UiDevice
|
|
import mozilla.components.browser.state.store.BrowserStore
|
|
import mozilla.components.concept.engine.mediasession.MediaSession
|
|
import okhttp3.mockwebserver.MockWebServer
|
|
import org.junit.After
|
|
import org.junit.Before
|
|
import org.junit.Ignore
|
|
import org.junit.Rule
|
|
import org.junit.Test
|
|
import org.mozilla.fenix.ext.components
|
|
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
|
|
import org.mozilla.fenix.helpers.HomeActivityTestRule
|
|
import org.mozilla.fenix.helpers.RetryTestRule
|
|
import org.mozilla.fenix.helpers.TestAssetHelper
|
|
import org.mozilla.fenix.ui.robots.browserScreen
|
|
import org.mozilla.fenix.ui.robots.homeScreen
|
|
import org.mozilla.fenix.ui.robots.navigationToolbar
|
|
import org.mozilla.fenix.ui.robots.notificationShade
|
|
|
|
/**
|
|
* Tests for verifying basic functionality of media notifications:
|
|
* - video and audio playback system notifications appear and can pause/play the media content
|
|
* - a media notification icon is displayed on the homescreen for the tab playing media content
|
|
* Note: this test only verifies media notifications, not media itself
|
|
*/
|
|
class MediaNotificationTest {
|
|
/* ktlint-disable no-blank-line-before-rbrace */ // This imposes unreadable grouping.
|
|
|
|
private lateinit var mockWebServer: MockWebServer
|
|
private lateinit var mDevice: UiDevice
|
|
|
|
@get:Rule
|
|
val activityTestRule = HomeActivityTestRule.withDefaultSettingsOverrides()
|
|
private lateinit var browserStore: BrowserStore
|
|
|
|
@Rule
|
|
@JvmField
|
|
val retryTestRule = RetryTestRule(3)
|
|
|
|
@Before
|
|
fun setUp() {
|
|
// Initializing this as part of class construction, below the rule would throw a NPE
|
|
// So we are initializing this here instead of in all tests.
|
|
browserStore = activityTestRule.activity.components.core.store
|
|
|
|
mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
|
|
mockWebServer = MockWebServer().apply {
|
|
dispatcher = AndroidAssetDispatcher()
|
|
start()
|
|
}
|
|
}
|
|
|
|
@After
|
|
fun tearDown() {
|
|
mockWebServer.shutdown()
|
|
}
|
|
|
|
@Ignore("Failing after SDK 33 migration. See: https://github.com/mozilla-mobile/fenix/pull/25876")
|
|
@Test
|
|
fun videoPlaybackSystemNotificationTest() {
|
|
val videoTestPage = TestAssetHelper.getVideoPageAsset(mockWebServer)
|
|
|
|
navigationToolbar {
|
|
}.enterURLAndEnterToBrowser(videoTestPage.url) {
|
|
mDevice.waitForIdle()
|
|
clickMediaPlayerPlayButton()
|
|
assertPlaybackState(browserStore, MediaSession.PlaybackState.PLAYING)
|
|
}.openNotificationShade {
|
|
verifySystemNotificationExists(videoTestPage.title)
|
|
clickMediaNotificationControlButton("Pause")
|
|
verifyMediaSystemNotificationButtonState("Play")
|
|
}
|
|
|
|
mDevice.pressBack()
|
|
|
|
browserScreen {
|
|
assertPlaybackState(browserStore, MediaSession.PlaybackState.PAUSED)
|
|
}.openTabDrawer {
|
|
closeTab()
|
|
}
|
|
|
|
mDevice.openNotification()
|
|
|
|
notificationShade {
|
|
verifySystemNotificationGone(videoTestPage.title)
|
|
}
|
|
|
|
// close notification shade before the next test
|
|
mDevice.pressBack()
|
|
}
|
|
|
|
@Ignore("Failing after SDK 33 migration. See: https://github.com/mozilla-mobile/fenix/pull/25876")
|
|
@Test
|
|
fun mediaSystemNotificationInPrivateModeTest() {
|
|
val audioTestPage = TestAssetHelper.getAudioPageAsset(mockWebServer)
|
|
|
|
navigationToolbar {
|
|
}.openTabTray {
|
|
}.toggleToPrivateTabs {
|
|
}.openNewTab {
|
|
}.submitQuery(audioTestPage.url.toString()) {
|
|
mDevice.waitForIdle()
|
|
clickMediaPlayerPlayButton()
|
|
assertPlaybackState(browserStore, MediaSession.PlaybackState.PLAYING)
|
|
}.openNotificationShade {
|
|
verifySystemNotificationExists("A site is playing media")
|
|
clickMediaNotificationControlButton("Pause")
|
|
verifyMediaSystemNotificationButtonState("Play")
|
|
}
|
|
|
|
mDevice.pressBack()
|
|
|
|
browserScreen {
|
|
assertPlaybackState(browserStore, MediaSession.PlaybackState.PAUSED)
|
|
}.openTabDrawer {
|
|
closeTab()
|
|
verifySnackBarText("Private tab closed")
|
|
}
|
|
|
|
mDevice.openNotification()
|
|
|
|
notificationShade {
|
|
verifySystemNotificationGone("A site is playing media")
|
|
}
|
|
|
|
// close notification shade before and go back to regular mode before the next test
|
|
mDevice.pressBack()
|
|
homeScreen { }.togglePrivateBrowsingMode()
|
|
}
|
|
}
|