From 5f92c4dc5f08094548be9d23080dd3ca75741c65 Mon Sep 17 00:00:00 2001
From: Chocobozzz
Date: Thu, 17 May 2018 10:55:01 +0200
Subject: [PATCH] Add videos e2e tests
---
README.md | 2 +
client/e2e/fixtures/video.mp4 | Bin 0 -> 38783 bytes
client/e2e/protractor.conf.js | 12 +++--
client/e2e/src/app.e2e-spec.ts | 4 +-
client/e2e/src/{ => po}/app.po.ts | 0
client/e2e/src/po/login.po.ts | 14 +++++
client/e2e/src/po/video-upload.po.ts | 31 +++++++++++
client/e2e/src/po/video-watch.po.ts | 45 ++++++++++++++++
client/e2e/src/video-upload.e2e-spec.ts | 9 ----
client/e2e/src/video-upload.po.ts | 7 ---
client/e2e/src/video-watch.e2e-spec.ts | 9 ----
client/e2e/src/video-watch.po.ts | 8 ---
client/e2e/src/videos.e2e-spec.ts | 48 ++++++++++++++++++
client/package.json | 3 +-
.../video/video-miniature.component.html | 14 +++--
scripts/e2e.sh | 8 ++-
16 files changed, 165 insertions(+), 49 deletions(-)
create mode 100644 client/e2e/fixtures/video.mp4
rename client/e2e/src/{ => po}/app.po.ts (100%)
create mode 100644 client/e2e/src/po/login.po.ts
create mode 100644 client/e2e/src/po/video-upload.po.ts
create mode 100644 client/e2e/src/po/video-watch.po.ts
delete mode 100644 client/e2e/src/video-upload.e2e-spec.ts
delete mode 100644 client/e2e/src/video-upload.po.ts
delete mode 100644 client/e2e/src/video-watch.e2e-spec.ts
delete mode 100644 client/e2e/src/video-watch.po.ts
create mode 100644 client/e2e/src/videos.e2e-spec.ts
diff --git a/README.md b/README.md
index 8abdaf67d..51c3747e8 100644
--- a/README.md
+++ b/README.md
@@ -24,6 +24,8 @@ donating to them](https://soutenir.framasoft.org/en/).**
+
+
diff --git a/client/e2e/fixtures/video.mp4 b/client/e2e/fixtures/video.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..35678362b5c871f9784019ebebcdaf6e45abb919
GIT binary patch
literal 38783
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 {
let page: AppPage
@@ -7,7 +7,7 @@ describe('PeerTube app', () => {
page = new AppPage()
})
- it('should display the app title', () => {
+ it('Should display the app title', () => {
page.navigateTo()
expect(page.getHeaderTitle()).toEqual('PeerTube')
})
diff --git a/client/e2e/src/app.po.ts b/client/e2e/src/po/app.po.ts
similarity index 100%
rename from client/e2e/src/app.po.ts
rename to client/e2e/src/po/app.po.ts
diff --git a/client/e2e/src/po/login.po.ts b/client/e2e/src/po/login.po.ts
new file mode 100644
index 000000000..ada52cb24
--- /dev/null
+++ b/client/e2e/src/po/login.po.ts
@@ -0,0 +1,14 @@
+import { browser, element, by } from 'protractor'
+
+export class LoginPage {
+ async loginAsRootUser () {
+ await browser.get('/login')
+
+ element(by.css('input#username')).sendKeys('root')
+ element(by.css('input#password')).sendKeys('test1')
+
+ await element(by.css('form input[type=submit]')).click()
+
+ return browser.wait(browser.ExpectedConditions.urlContains('/videos/'))
+ }
+}
diff --git a/client/e2e/src/po/video-upload.po.ts b/client/e2e/src/po/video-upload.po.ts
new file mode 100644
index 000000000..4f09bb2fa
--- /dev/null
+++ b/client/e2e/src/po/video-upload.po.ts
@@ -0,0 +1,31 @@
+import { browser, element, by } from 'protractor'
+import { join } from 'path'
+
+export class VideoUploadPage {
+ navigateTo () {
+ return browser.get('/videos/upload')
+ }
+
+ async uploadVideo () {
+ const fileToUpload = join(__dirname, '../../fixtures/video.mp4')
+
+ await element(by.css('.upload-video-container input[type=file]')).sendKeys(fileToUpload)
+
+ // Wait for the upload to finish
+ await browser.wait(browser.ExpectedConditions.elementToBeClickable(this.getSecondStepSubmitButton()))
+ }
+
+ async validSecondUploadStep (videoName: string) {
+ const nameInput = element(by.css('input#name'))
+ await nameInput.clear()
+ await nameInput.sendKeys(videoName)
+
+ await this.getSecondStepSubmitButton().click()
+
+ return browser.wait(browser.ExpectedConditions.urlContains('/watch/'))
+ }
+
+ private getSecondStepSubmitButton () {
+ return element(by.css('.submit-button:not(.disabled) input'))
+ }
+}
diff --git a/client/e2e/src/po/video-watch.po.ts b/client/e2e/src/po/video-watch.po.ts
new file mode 100644
index 000000000..266c9850c
--- /dev/null
+++ b/client/e2e/src/po/video-watch.po.ts
@@ -0,0 +1,45 @@
+import { by, element, browser } from 'protractor'
+
+export class VideoWatchPage {
+ async goOnRecentlyAdded () {
+ const url = '/videos/recently-added'
+
+ await browser.get(url)
+ return browser.wait(browser.ExpectedConditions.elementToBeClickable(element(this.getFirstVideoListSelector())))
+ }
+
+ getVideosListName () {
+ return element.all(this.getFirstVideoListSelector()).getText()
+ }
+
+ waitWatchVideoName (videoName: string) {
+ const elem = element(by.css('.video-info .video-info-name'))
+ return browser.wait(browser.ExpectedConditions.textToBePresentInElement(elem, videoName))
+ }
+
+ getWatchVideoPlayerCurrentTime () {
+ return element(by.css('.video-js .vjs-current-time-display'))
+ .getText()
+ .then((t: string) => t.split(':')[1])
+ .then(seconds => parseInt(seconds, 10))
+ }
+
+ async pauseVideo () {
+ const el = element(by.css('video'))
+ await browser.wait(browser.ExpectedConditions.elementToBeClickable(el))
+
+ return el.click()
+ }
+
+ async clickOnFirstVideoOfList () {
+ const video = element(by.css('.videos .video-miniature:first-child .video-thumbnail'))
+
+ await video.click()
+
+ await browser.wait(browser.ExpectedConditions.urlContains('/watch/'))
+ }
+
+ private getFirstVideoListSelector () {
+ return by.css('.videos .video-miniature-name')
+ }
+}
diff --git a/client/e2e/src/video-upload.e2e-spec.ts b/client/e2e/src/video-upload.e2e-spec.ts
deleted file mode 100644
index 45d8ae2c9..000000000
--- a/client/e2e/src/video-upload.e2e-spec.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { VideoUploadPage } from './video-upload.po'
-
-describe('Video upload', () => {
- let page: VideoUploadPage
-
- beforeEach(() => {
- page = new VideoUploadPage()
- })
-})
diff --git a/client/e2e/src/video-upload.po.ts b/client/e2e/src/video-upload.po.ts
deleted file mode 100644
index df358e44b..000000000
--- a/client/e2e/src/video-upload.po.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { browser } from 'protractor'
-
-export class VideoUploadPage {
- navigateTo () {
- return browser.get('/videos/upload')
- }
-}
diff --git a/client/e2e/src/video-watch.e2e-spec.ts b/client/e2e/src/video-watch.e2e-spec.ts
deleted file mode 100644
index be3552d59..000000000
--- a/client/e2e/src/video-watch.e2e-spec.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { VideoWatchPage } from './video-watch.po'
-
-describe('Video watch', () => {
- let page: VideoWatchPage
-
- beforeEach(() => {
- page = new VideoWatchPage()
- })
-})
diff --git a/client/e2e/src/video-watch.po.ts b/client/e2e/src/video-watch.po.ts
deleted file mode 100644
index 3b5454ba1..000000000
--- a/client/e2e/src/video-watch.po.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { browser } from 'protractor'
-
-export class VideoWatchPage {
- navigateTo () {
- browser.waitForAngularEnabled(false)
- return browser.get('/')
- }
-}
diff --git a/client/e2e/src/videos.e2e-spec.ts b/client/e2e/src/videos.e2e-spec.ts
new file mode 100644
index 000000000..4205fd7a4
--- /dev/null
+++ b/client/e2e/src/videos.e2e-spec.ts
@@ -0,0 +1,48 @@
+import { VideoWatchPage } from './po/video-watch.po'
+import { VideoUploadPage } from './po/video-upload.po'
+import { LoginPage } from './po/login.po'
+import { browser } from 'protractor'
+
+describe('Videos workflow', () => {
+ let videoWatchPage: VideoWatchPage
+ let pageUploadPage: VideoUploadPage
+ let loginPage: LoginPage
+ const videoName = new Date().getTime() + ' video'
+
+ beforeEach(() => {
+ videoWatchPage = new VideoWatchPage()
+ pageUploadPage = new VideoUploadPage()
+ loginPage = new LoginPage()
+ })
+
+ it('Should log in', () => {
+ return loginPage.loginAsRootUser()
+ })
+
+ it('Should upload a video', async () => {
+ pageUploadPage.navigateTo()
+
+ await pageUploadPage.uploadVideo()
+ return pageUploadPage.validSecondUploadStep(videoName)
+ })
+
+ it('Should list the video', async () => {
+ await videoWatchPage.goOnRecentlyAdded()
+
+ const videoNames = videoWatchPage.getVideosListName()
+ expect(videoNames).toContain(videoName)
+ })
+
+ it('Should go on video watch page', async () => {
+ await videoWatchPage.clickOnFirstVideoOfList()
+
+ return videoWatchPage.waitWatchVideoName(videoName)
+ })
+
+ it('Should play the video', async () => {
+ await browser.sleep(4000)
+
+ await videoWatchPage.pauseVideo()
+ expect(videoWatchPage.getWatchVideoPlayerCurrentTime()).toBeGreaterThanOrEqual(2)
+ })
+})
diff --git a/client/package.json b/client/package.json
index b108b0d11..393a4b134 100644
--- a/client/package.json
+++ b/client/package.json
@@ -18,7 +18,8 @@
"tslint": "tslint",
"ng": "ng",
"postinstall": "npm rebuild node-sass && node angular-cli-patch.js",
- "webpack-bundle-analyzer": "webpack-bundle-analyzer"
+ "webpack-bundle-analyzer": "webpack-bundle-analyzer",
+ "webdriver-manager": "webdriver-manager"
},
"license": "GPLv3",
"resolutions": {
diff --git a/client/src/app/shared/video/video-miniature.component.html b/client/src/app/shared/video/video-miniature.component.html
index e26cb058a..1725e9f5c 100644
--- a/client/src/app/shared/video/video-miniature.component.html
+++ b/client/src/app/shared/video/video-miniature.component.html
@@ -2,14 +2,12 @@