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/).** devDependency Status + + Browser Stack

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 zcmagEb984<@F@66GO=xIV%xTzOl;e>ZQHhOOw5UG+new2?R&fb?Adef?Jjp!b)S3d zbTp<=yN}kyTT`f43D$_OuH6_}nF(kJ3~e2Z2^g5!2^<(%*fPI0;)nkl19dcKMWyTJ9jH%6DI;jdU_@rMtTO8AEKF)lN~1=ovW)Wt&6#l zv8|Q94Xv$%Dcygg(3&|}Tm8t`+Buoq+Bk9&80s778}cv^I2fDoFcBCT8(7&ITJkV( z(sR-i=-cR9xjP#3(7Q2l(z`J*FcDZA^OzaC5jZ*<{6K63c8=~psz0r+gAoq{E&Y$u zPeWjB?q+PH`=3RI9}QgxeH&9_9tKtdLo)|kYkl1xRR#hl2V*NMbH^Wu-HqMI(CG&- zw72G=|8YUz$ivpgn1_*pnt_49MBmX#*Ur(>-0nY#|7F15PS@7N#L?J^hlY{B$;{zL zj&XsWTK@fu>UU@9(r2VAJFbU!~fIkyYaAc{16n?D#uIQI=jH1a{=jac#*2%w$+4R#SCkkB1_3kSzVt<<=Q)7wj5}g9 zZKjq~51R4yz&ckL7UUEKY#v}(rW-}+>qJMEvi@Ffwxyn zb?3~KD`Z%J{GEytK?+XQ9E5T~WSy#xYPUh=eOAF-!6F=hvTleafREqqYe8~b&hP>N zfK%w@>(JK(z5VfM?ZWv@&!4<DNFDe*18Ni zEi|)k&ue{8=WyH!2m*Ci%J@|$Yu@WJaR&6)a+yqIL2=!`+DyW= zw2zvKpbrbfK)(Uc0=-*9r#)tNAIkeUjZFTwF#_oC>ZaWf_*C5sK*_Kx$|2sN27*Oo26At z8_ZWANIEV?RW)>Wa?so02X5oT{eR4ecm;^>nb~tE<(WWE8hjmzGfW097RDt>CLA0S zSi~_^D(Yp0Z+HCeSRHFx*onK#Tg>Q?8-$F^Sx%ds+Dc`#)Uhd|-_89CnJ$Ole9yf3 zj>X6Or~aUovHBm#MDC^MWhkR)@wchr;qJ!7; z95sYb)yk#nH;E|xv*o><9sKOL7%yPjzCO8m7xsH)gRrcVqVDq9{}qRy>Fp0vzwuAppKL0eaQ{xpOUj9`Bg@AG7FeQE%yM&ld@ zc2)Ej{pHrri-pt1C_!bKJ+Oo8Etw(-1EZjR7^yXt=5Blx9500l$56nPy!0{M-0?UJ_*De#+8=$7I28sAoh_+9{vlS?Q!3d_3FA zvkgxT_SfFOI!NOS)ujrl{4TpfK3(g1{kC!M zq|LWyq-3nO%@h_a52)Vt6zlVPqq;H6sqNHSdlreP(z_8T;jaE7wStpd-3l zS}g>YHgR0Kt@4N2_**Q293keWS;YX6Gv%!HeIqVT|q2sZS^m z^8UbKVj-Q5b3L%+tkvQsjr+9`Vw6wNTiulwBb9qtyMcbp;ku~%N}#8JCv}#9*Tu{s zCBn~rJli96=-lf3Rf9|Y(L|aX$-uyz(WT5r66)5g1xv$d^FU>!xiB7czvAO5bp(;) z@{TTf8i@OSh_(69HDHZWVaAJ)LlGi878=V`C;hh-vw42BCN@z7I27^UQ(pc#Qu<2% zDiV+oRFB^(sjD(Z$?uoe()kB}>A;7&*9!^gW`ePTCA`%&pbHjHa0N7>xSLn^`1MXM zmOB3W0Lt4Cp```!YGwax-XTY0ruDZ3P#|~gw3URA{a3{qEoo(i*l9($c#6gz>4E3@T_q?=ctnIc$sOnGNjxhVU zq3A@SsFVXa-Qjni_Z>2N^2=x3*XTrn5d1U_vy+ElU@zV6{UvuQEedjH7$Sf&&Y6;K z(V;c2Sn`=vCF@qoDw_G^3sw^{BE8atxQoAi`1}m-Z=F8!=dZg>!

#+%NbRpdPDY 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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 @@

- - - {{ video.name }} - - + + {{ video.name }} + {{ video.publishedAt | myFromNow }} - {{ video.views | myNumberFormatter }} views diff --git a/scripts/e2e.sh b/scripts/e2e.sh index b1e9245c1..bdd051486 100755 --- a/scripts/e2e.sh +++ b/scripts/e2e.sh @@ -2,10 +2,14 @@ set -eu -#npm run build:server npm run clean:server:test +( + cd client + npm run webdriver-manager update +) + concurrently -k -s first \ "cd client && npm run ng -- e2e" \ - "NODE_ENV=test NODE_APP_INSTANCE=1 npm start" + "NODE_ENV=test NODE_APP_INSTANCE=1 NODE_CONFIG='{ \"log\": { \"level\": \"warning\" } }' npm start" -- 2.25.1