From 814e9e07ba65446af8446dbbd2f0d70c85fd1b33 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 28 Oct 2022 11:19:54 +0200 Subject: Improve E2E tests Add tests for private video static endpoints Fix tests for local firefox --- client/e2e/browserstack.err | 1 + client/e2e/fixtures/video2.mp4 | Bin 0 -> 335691 bytes client/e2e/fixtures/video3.mp4 | Bin 0 -> 157633 bytes client/e2e/src/po/admin-config.po.ts | 14 ++++- client/e2e/src/po/login.po.ts | 50 +++++++++++++---- client/e2e/src/po/my-account.po.ts | 4 ++ client/e2e/src/po/signup.po.ts | 3 +- client/e2e/src/po/video-upload.po.ts | 10 ++-- client/e2e/src/po/video-watch.po.ts | 6 ++- .../e2e/src/suites-all/private-videos.e2e-spec.ts | 60 +++++++++++++++++++++ client/e2e/src/suites-all/videos.e2e-spec.ts | 6 +-- .../custom-server-defaults.e2e-spec.ts | 6 +-- client/e2e/src/suites-local/plugins.e2e-spec.ts | 10 ++-- client/e2e/src/suites-local/signup.e2e-spec.ts | 4 +- .../e2e/src/suites-local/user-settings.e2e-spec.ts | 4 +- .../e2e/src/suites-local/videos-list.e2e-spec.ts | 8 +-- client/e2e/src/utils/elements.ts | 5 +- client/e2e/src/utils/hooks.ts | 8 +++ client/e2e/src/utils/urls.ts | 5 ++ client/e2e/wdio.local-test.conf.ts | 11 +++- client/e2e/wdio.main.conf.ts | 3 +- 21 files changed, 181 insertions(+), 37 deletions(-) create mode 100644 client/e2e/browserstack.err create mode 100644 client/e2e/fixtures/video2.mp4 create mode 100644 client/e2e/fixtures/video3.mp4 create mode 100644 client/e2e/src/suites-all/private-videos.e2e-spec.ts (limited to 'client/e2e') diff --git a/client/e2e/browserstack.err b/client/e2e/browserstack.err new file mode 100644 index 000000000..a6e141486 --- /dev/null +++ b/client/e2e/browserstack.err @@ -0,0 +1 @@ +[object Object] \ No newline at end of file diff --git a/client/e2e/fixtures/video2.mp4 b/client/e2e/fixtures/video2.mp4 new file mode 100644 index 000000000..e4e6773ef Binary files /dev/null and b/client/e2e/fixtures/video2.mp4 differ diff --git a/client/e2e/fixtures/video3.mp4 b/client/e2e/fixtures/video3.mp4 new file mode 100644 index 000000000..e7a1c12e4 Binary files /dev/null and b/client/e2e/fixtures/video3.mp4 differ diff --git a/client/e2e/src/po/admin-config.po.ts b/client/e2e/src/po/admin-config.po.ts index 6d48a0fd7..27957a71f 100644 --- a/client/e2e/src/po/admin-config.po.ts +++ b/client/e2e/src/po/admin-config.po.ts @@ -14,8 +14,14 @@ export class AdminConfigPage { await $('.inner-form-title=' + waitTitles[tab]).waitForDisplayed() } - updateNSFWSetting (newValue: 'do_not_list' | 'blur' | 'display') { - return $('#instanceDefaultNSFWPolicy').selectByAttribute('value', newValue) + async updateNSFWSetting (newValue: 'do_not_list' | 'blur' | 'display') { + const elem = $('#instanceDefaultNSFWPolicy') + + await elem.waitForDisplayed() + await elem.scrollIntoView(false) // Avoid issues with fixed header on firefox + await elem.waitForClickable() + + return elem.selectByAttribute('value', newValue) } updateHomepage (newValue: string) { @@ -24,11 +30,15 @@ export class AdminConfigPage { async toggleSignup () { const checkbox = await getCheckbox('signupEnabled') + + await checkbox.waitForClickable() await checkbox.click() } async save () { const button = $('input[type=submit]') + + await button.waitForClickable() await button.click() } } diff --git a/client/e2e/src/po/login.po.ts b/client/e2e/src/po/login.po.ts index 2c4561b7d..91bf46e30 100644 --- a/client/e2e/src/po/login.po.ts +++ b/client/e2e/src/po/login.po.ts @@ -2,31 +2,61 @@ import { go } from '../utils' export class LoginPage { - async loginAsRootUser () { - await go('/login') + constructor (private isMobileDevice: boolean) { + + } + + async login (username: string, password: string, url = '/login') { + await go(url) + await browser.execute(`window.localStorage.setItem('no_account_setup_warning_modal', 'true')`) await browser.execute(`window.localStorage.setItem('no_instance_config_warning_modal', 'true')`) await browser.execute(`window.localStorage.setItem('no_welcome_modal', 'true')`) - await $('input#username').setValue('root') - await $('input#password').setValue('test' + this.getSuffix()) + await $('input#username').setValue(username) + await $('input#password').setValue(password) await browser.pause(1000) await $('form input[type=submit]').click() - await this.ensureIsLoggedInAs('root') + const menuToggle = $('.top-left-block span[role=button]') + + if (this.isMobileDevice) { + await browser.pause(1000) + + await menuToggle.click() + } + + await this.ensureIsLoggedInAs(username) + + if (this.isMobileDevice) { + await menuToggle.click() + } + } + + async loginAsRootUser () { + return this.login('root', 'test' + this.getSuffix()) + } + + loginOnPeerTube2 () { + return this.login('e2e', process.env.PEERTUBE2_E2E_PASSWORD, 'https://peertube2.cpy.re/login') } async logout () { - await $('.logged-in-more').click() + const loggedInMore = $('.logged-in-more') + + await loggedInMore.waitForClickable() + await loggedInMore.click() - const logout = () => $('.dropdown-item*=Log out') + const logout = $('.dropdown-item*=Log out') - await logout().waitForDisplayed() - await logout().click() + await logout.waitForClickable() + await logout.click() - await $('.login-buttons-block').waitForDisplayed() + await browser.waitUntil(() => { + return $('.login-buttons-block, my-error-page a[href="/login"]').isDisplayed() + }) } async ensureIsLoggedInAs (displayName: string) { diff --git a/client/e2e/src/po/my-account.po.ts b/client/e2e/src/po/my-account.po.ts index 8d5d878ce..222dbb569 100644 --- a/client/e2e/src/po/my-account.po.ts +++ b/client/e2e/src/po/my-account.po.ts @@ -25,6 +25,8 @@ export class MyAccountPage { await nsfw.waitForDisplayed() await nsfw.scrollIntoView(false) // Avoid issues with fixed header on firefox + await nsfw.waitForClickable() + await nsfw.selectByAttribute('value', newValue) await this.submitVideoSettings() @@ -43,6 +45,8 @@ export class MyAccountPage { private async submitVideoSettings () { const submit = $('my-user-video-settings input[type=submit]') + + await submit.waitForClickable() await submit.scrollIntoView(false) await submit.click() } diff --git a/client/e2e/src/po/signup.po.ts b/client/e2e/src/po/signup.po.ts index ef36dbcc4..7a17198cc 100644 --- a/client/e2e/src/po/signup.po.ts +++ b/client/e2e/src/po/signup.po.ts @@ -9,7 +9,7 @@ export class SignupPage { async clickOnRegisterInMenu () { const button = this.getRegisterMenuButton() - await button.waitForDisplayed() + await button.waitForClickable() await button.click() } @@ -22,6 +22,7 @@ export class SignupPage { async checkTerms () { const terms = await getCheckbox('terms') + await terms.waitForClickable() return terms.click() } diff --git a/client/e2e/src/po/video-upload.po.ts b/client/e2e/src/po/video-upload.po.ts index 8605139c9..7e7989763 100644 --- a/client/e2e/src/po/video-upload.po.ts +++ b/client/e2e/src/po/video-upload.po.ts @@ -11,8 +11,8 @@ export class VideoUploadPage { await $('.upload-video-container').waitForDisplayed() } - async uploadVideo () { - const fileToUpload = join(__dirname, '../../fixtures/video.mp4') + async uploadVideo (fixtureName: 'video.mp4' | 'video2.mp4' | 'video3.mp4') { + const fileToUpload = join(__dirname, '../../fixtures/' + fixtureName) const fileInputSelector = '.upload-video-container input[type=file]' const parentFileInput = '.upload-video-container .button-file' @@ -36,6 +36,7 @@ export class VideoUploadPage { async setAsNSFW () { const checkbox = await getCheckbox('nsfw') + await checkbox.waitForClickable() return checkbox.click() } @@ -45,7 +46,10 @@ export class VideoUploadPage { await nameInput.clearValue() await nameInput.setValue(videoName) - await this.getSecondStepSubmitButton().click() + const button = this.getSecondStepSubmitButton() + await button.waitForClickable() + + await button.click() return browser.waitUntil(async () => { return (await browser.getUrl()).includes('/w/') diff --git a/client/e2e/src/po/video-watch.po.ts b/client/e2e/src/po/video-watch.po.ts index 65bf21837..982c90908 100644 --- a/client/e2e/src/po/video-watch.po.ts +++ b/client/e2e/src/po/video-watch.po.ts @@ -49,7 +49,11 @@ export class VideoWatchPage { url = url.replace(':3333', ':9001') await go(url) - await $('.vjs-big-play-button').waitForDisplayed() + await this.waitEmbedForDisplayed() + } + + waitEmbedForDisplayed () { + return $('.vjs-big-play-button').waitForDisplayed() } isEmbedWarningDisplayed () { diff --git a/client/e2e/src/suites-all/private-videos.e2e-spec.ts b/client/e2e/src/suites-all/private-videos.e2e-spec.ts new file mode 100644 index 000000000..db3554659 --- /dev/null +++ b/client/e2e/src/suites-all/private-videos.e2e-spec.ts @@ -0,0 +1,60 @@ +import { LoginPage } from '../po/login.po' +import { PlayerPage } from '../po/player.po' +import { VideoWatchPage } from '../po/video-watch.po' +import { FIXTURE_URLS, go, isMobileDevice, isSafari } from '../utils' + +async function checkCorrectlyPlay (playerPage: PlayerPage) { + await playerPage.playAndPauseVideo(false, 2) + + expect(await playerPage.getWatchVideoPlayerCurrentTime()).toBeGreaterThanOrEqual(2) +} + +describe('Private videos all workflow', () => { + let videoWatchPage: VideoWatchPage + let loginPage: LoginPage + let playerPage: PlayerPage + + const internalVideoName = 'Internal E2E test' + + beforeEach(async () => { + videoWatchPage = new VideoWatchPage(isMobileDevice(), isSafari()) + loginPage = new LoginPage(isMobileDevice()) + playerPage = new PlayerPage() + + if (!isMobileDevice()) { + await browser.maximizeWindow() + } + }) + + it('Should log in', async () => { + return loginPage.loginOnPeerTube2() + }) + + it('Should play an internal webtorrent video', async () => { + await go(FIXTURE_URLS.INTERNAL_WEBTORRENT_VIDEO) + + await videoWatchPage.waitWatchVideoName(internalVideoName) + await checkCorrectlyPlay(playerPage) + }) + + it('Should play an internal HLS video', async () => { + await go(FIXTURE_URLS.INTERNAL_HLS_VIDEO) + + await videoWatchPage.waitWatchVideoName(internalVideoName) + await checkCorrectlyPlay(playerPage) + }) + + it('Should play an internal WebTorrent video in embed', async () => { + await go(FIXTURE_URLS.INTERNAL_EMBED_WEBTORRENT_VIDEO) + + await videoWatchPage.waitEmbedForDisplayed() + await checkCorrectlyPlay(playerPage) + }) + + it('Should play an internal HLS video in embed', async () => { + await go(FIXTURE_URLS.INTERNAL_EMBED_HLS_VIDEO) + + await videoWatchPage.waitEmbedForDisplayed() + await checkCorrectlyPlay(playerPage) + }) +}) diff --git a/client/e2e/src/suites-all/videos.e2e-spec.ts b/client/e2e/src/suites-all/videos.e2e-spec.ts index b3a87c8e2..997d58884 100644 --- a/client/e2e/src/suites-all/videos.e2e-spec.ts +++ b/client/e2e/src/suites-all/videos.e2e-spec.ts @@ -49,7 +49,7 @@ describe('Videos all workflow', () => { videoUploadPage = new VideoUploadPage() videoUpdatePage = new VideoUpdatePage() myAccountPage = new MyAccountPage() - loginPage = new LoginPage() + loginPage = new LoginPage(isMobileDevice()) playerPage = new PlayerPage() videoListPage = new VideoListPage(isMobileDevice(), isSafari()) @@ -72,7 +72,7 @@ describe('Videos all workflow', () => { await videoUploadPage.navigateTo() - await videoUploadPage.uploadVideo() + await videoUploadPage.uploadVideo('video.mp4') return videoUploadPage.validSecondUploadStep(videoName) }) @@ -147,7 +147,7 @@ describe('Videos all workflow', () => { await videoUploadPage.navigateTo() - await videoUploadPage.uploadVideo() + await videoUploadPage.uploadVideo('video2.mp4') await videoUploadPage.validSecondUploadStep(video2Name) await videoWatchPage.clickOnSave() diff --git a/client/e2e/src/suites-local/custom-server-defaults.e2e-spec.ts b/client/e2e/src/suites-local/custom-server-defaults.e2e-spec.ts index e060d382f..71840d707 100644 --- a/client/e2e/src/suites-local/custom-server-defaults.e2e-spec.ts +++ b/client/e2e/src/suites-local/custom-server-defaults.e2e-spec.ts @@ -11,7 +11,7 @@ describe('Custom server defaults', () => { before(async () => { await waitServerUp() - loginPage = new LoginPage() + loginPage = new LoginPage(isMobileDevice()) videoUploadPage = new VideoUploadPage() videoWatchPage = new VideoWatchPage(isMobileDevice(), isSafari()) @@ -25,7 +25,7 @@ describe('Custom server defaults', () => { it('Should upload a video with custom default values', async function () { await videoUploadPage.navigateTo() - await videoUploadPage.uploadVideo() + await videoUploadPage.uploadVideo('video.mp4') await videoUploadPage.validSecondUploadStep('video') await videoWatchPage.waitWatchVideoName('video') @@ -60,7 +60,7 @@ describe('Custom server defaults', () => { before(async () => { await loginPage.loginAsRootUser() await videoUploadPage.navigateTo() - await videoUploadPage.uploadVideo() + await videoUploadPage.uploadVideo('video2.mp4') await videoUploadPage.setAsPublic() await videoUploadPage.validSecondUploadStep('video') diff --git a/client/e2e/src/suites-local/plugins.e2e-spec.ts b/client/e2e/src/suites-local/plugins.e2e-spec.ts index a32ba1044..363c7f836 100644 --- a/client/e2e/src/suites-local/plugins.e2e-spec.ts +++ b/client/e2e/src/suites-local/plugins.e2e-spec.ts @@ -1,7 +1,7 @@ import { AdminPluginPage } from '../po/admin-plugin.po' import { LoginPage } from '../po/login.po' import { VideoUploadPage } from '../po/video-upload.po' -import { getCheckbox, waitServerUp } from '../utils' +import { getCheckbox, isMobileDevice, waitServerUp } from '../utils' describe('Plugins', () => { let videoUploadPage: VideoUploadPage @@ -24,7 +24,7 @@ describe('Plugins', () => { }) beforeEach(async () => { - loginPage = new LoginPage() + loginPage = new LoginPage(isMobileDevice()) videoUploadPage = new VideoUploadPage() adminPluginPage = new AdminPluginPage() @@ -42,7 +42,7 @@ describe('Plugins', () => { it('Should have checkbox in video edit page', async () => { await videoUploadPage.navigateTo() - await videoUploadPage.uploadVideo() + await videoUploadPage.uploadVideo('video.mp4') await $('span=Super field 4 in main tab').waitForDisplayed() @@ -54,6 +54,8 @@ describe('Plugins', () => { it('Should check the checkbox and be able to submit the video', async function () { const checkbox = await getPluginCheckbox() + + await checkbox.waitForClickable() await checkbox.click() await expectSubmitState({ disabled: false }) @@ -61,6 +63,8 @@ describe('Plugins', () => { it('Should uncheck the checkbox and not be able to submit the video', async function () { const checkbox = await getPluginCheckbox() + + await checkbox.waitForClickable() await checkbox.click() await expectSubmitState({ disabled: true }) diff --git a/client/e2e/src/suites-local/signup.e2e-spec.ts b/client/e2e/src/suites-local/signup.e2e-spec.ts index 0f6d7a0e6..4eed3eefe 100644 --- a/client/e2e/src/suites-local/signup.e2e-spec.ts +++ b/client/e2e/src/suites-local/signup.e2e-spec.ts @@ -1,7 +1,7 @@ import { AdminConfigPage } from '../po/admin-config.po' import { LoginPage } from '../po/login.po' import { SignupPage } from '../po/signup.po' -import { waitServerUp } from '../utils' +import { isMobileDevice, waitServerUp } from '../utils' describe('Signup', () => { let loginPage: LoginPage @@ -13,7 +13,7 @@ describe('Signup', () => { }) beforeEach(async () => { - loginPage = new LoginPage() + loginPage = new LoginPage(isMobileDevice()) adminConfigPage = new AdminConfigPage() signupPage = new SignupPage() diff --git a/client/e2e/src/suites-local/user-settings.e2e-spec.ts b/client/e2e/src/suites-local/user-settings.e2e-spec.ts index b87501cd1..3e982d26f 100644 --- a/client/e2e/src/suites-local/user-settings.e2e-spec.ts +++ b/client/e2e/src/suites-local/user-settings.e2e-spec.ts @@ -15,7 +15,7 @@ describe('User settings', () => { before(async () => { await waitServerUp() - loginPage = new LoginPage() + loginPage = new LoginPage(isMobileDevice()) videoUploadPage = new VideoUploadPage() videoWatchPage = new VideoWatchPage(isMobileDevice(), isSafari()) myAccountPage = new MyAccountPage() @@ -43,7 +43,7 @@ describe('User settings', () => { before(async () => { await loginPage.loginAsRootUser() await videoUploadPage.navigateTo() - await videoUploadPage.uploadVideo() + await videoUploadPage.uploadVideo('video.mp4') await videoUploadPage.validSecondUploadStep('video') await videoWatchPage.waitWatchVideoName('video') diff --git a/client/e2e/src/suites-local/videos-list.e2e-spec.ts b/client/e2e/src/suites-local/videos-list.e2e-spec.ts index ce57261b9..8264308f2 100644 --- a/client/e2e/src/suites-local/videos-list.e2e-spec.ts +++ b/client/e2e/src/suites-local/videos-list.e2e-spec.ts @@ -106,7 +106,7 @@ describe('Videos list', () => { beforeEach(async () => { videoListPage = new VideoListPage(isMobileDevice(), isSafari()) adminConfigPage = new AdminConfigPage() - loginPage = new LoginPage() + loginPage = new LoginPage(isMobileDevice()) videoUploadPage = new VideoUploadPage() myAccountPage = new MyAccountPage() videoSearchPage = new VideoSearchPage() @@ -128,12 +128,12 @@ describe('Videos list', () => { it('Should upload 2 videos (NSFW and classic videos)', async () => { await videoUploadPage.navigateTo() - await videoUploadPage.uploadVideo() + await videoUploadPage.uploadVideo('video.mp4') await videoUploadPage.setAsNSFW() await videoUploadPage.validSecondUploadStep(nsfwVideo) await videoUploadPage.navigateTo() - await videoUploadPage.uploadVideo() + await videoUploadPage.uploadVideo('video2.mp4') await videoUploadPage.validSecondUploadStep(normalVideo) }) @@ -205,7 +205,7 @@ describe('Videos list', () => { it('Should have default video values', async function () { await loginPage.loginAsRootUser() await videoUploadPage.navigateTo() - await videoUploadPage.uploadVideo() + await videoUploadPage.uploadVideo('video3.mp4') await videoUploadPage.validSecondUploadStep('video') await videoWatchPage.waitWatchVideoName('video') diff --git a/client/e2e/src/utils/elements.ts b/client/e2e/src/utils/elements.ts index 9d6cfe673..b0ddd5a65 100644 --- a/client/e2e/src/utils/elements.ts +++ b/client/e2e/src/utils/elements.ts @@ -6,7 +6,10 @@ async function getCheckbox (name: string) { } async function selectCustomSelect (id: string, valueLabel: string) { - await $(`[formcontrolname=${id}] .ng-arrow-wrapper`).click() + const wrapper = $(`[formcontrolname=${id}] .ng-arrow-wrapper`) + + await wrapper.waitForClickable() + await wrapper.click() const option = await $$(`[formcontrolname=${id}] .ng-option`).filter(async o => { const text = await o.getText() diff --git a/client/e2e/src/utils/hooks.ts b/client/e2e/src/utils/hooks.ts index e139d8183..889cf1d86 100644 --- a/client/e2e/src/utils/hooks.ts +++ b/client/e2e/src/utils/hooks.ts @@ -68,5 +68,13 @@ function buildConfig (suiteFile: string = undefined) { } } + if (filename === 'signup.e2e-spec.ts') { + return { + signup: { + enabled: true + } + } + } + return {} } diff --git a/client/e2e/src/utils/urls.ts b/client/e2e/src/utils/urls.ts index e82ff1b2e..a1c8283b5 100644 --- a/client/e2e/src/utils/urls.ts +++ b/client/e2e/src/utils/urls.ts @@ -1,4 +1,9 @@ const FIXTURE_URLS = { + INTERNAL_WEBTORRENT_VIDEO: 'https://peertube2.cpy.re/w/pwfz7NizSdPD4mJcbbmNwa?mode=webtorrent', + INTERNAL_HLS_VIDEO: 'https://peertube2.cpy.re/w/pwfz7NizSdPD4mJcbbmNwa', + INTERNAL_EMBED_WEBTORRENT_VIDEO: 'https://peertube2.cpy.re/videos/embed/pwfz7NizSdPD4mJcbbmNwa?mode=webtorrent', + INTERNAL_EMBED_HLS_VIDEO: 'https://peertube2.cpy.re/videos/embed/pwfz7NizSdPD4mJcbbmNwa', + WEBTORRENT_VIDEO: 'https://peertube2.cpy.re/w/122d093a-1ede-43bd-bd34-59d2931ffc5e', HLS_EMBED: 'https://peertube2.cpy.re/videos/embed/969bf103-7818-43b5-94a0-de159e13de50', diff --git a/client/e2e/wdio.local-test.conf.ts b/client/e2e/wdio.local-test.conf.ts index 5389ebcf0..ca0bb5bfe 100644 --- a/client/e2e/wdio.local-test.conf.ts +++ b/client/e2e/wdio.local-test.conf.ts @@ -26,9 +26,18 @@ module.exports = { prefs } } + // { + // browserName: 'firefox', + // 'moz:firefoxOptions': { + // binary: '/usr/bin/firefox-developer-edition', + // args: [ '--headless', '--window-size=1280,1024' ], + + // prefs + // } + // } ], - services: [ 'chromedriver' ], + services: [ 'chromedriver', 'geckodriver' ], beforeSession: beforeLocalSession, beforeSuite: beforeLocalSuite, diff --git a/client/e2e/wdio.main.conf.ts b/client/e2e/wdio.main.conf.ts index 29afdbdc0..0a10ee9ca 100644 --- a/client/e2e/wdio.main.conf.ts +++ b/client/e2e/wdio.main.conf.ts @@ -98,7 +98,8 @@ export const config = { // See the full list at http://mochajs.org/ mochaOpts: { ui: 'bdd', - timeout: 60000 + timeout: 60000, + bail: true }, autoCompileOpts: { -- cgit v1.2.3