1 import { browser } from 'protractor'
2 import { AppPage } from './po/app.po'
3 import { LoginPage } from './po/login.po'
4 import { MyAccountPage } from './po/my-account'
5 import { PlayerPage } from './po/player.po'
6 import { VideoUpdatePage } from './po/video-update.po'
7 import { VideoUploadPage } from './po/video-upload.po'
8 import { VideoWatchPage } from './po/video-watch.po'
9 import { isIOS, isMobileDevice, isSafari } from './utils'
11 async function skipIfUploadNotSupported () {
12 if (await isMobileDevice() || await isSafari()) {
13 console.log('Skipping because we are on a real device or Safari and BrowserStack does not support file upload.')
20 describe('Videos workflow', () => {
21 let videoWatchPage: VideoWatchPage
22 let videoUploadPage: VideoUploadPage
23 let videoUpdatePage: VideoUpdatePage
24 let myAccountPage: MyAccountPage
25 let loginPage: LoginPage
27 let playerPage: PlayerPage
29 let videoName = new Date().getTime() + ' video'
30 const video2Name = new Date().getTime() + ' second video'
31 const playlistName = new Date().getTime() + ' playlist'
32 let videoWatchUrl: string
34 beforeEach(async () => {
35 videoWatchPage = new VideoWatchPage()
36 videoUploadPage = new VideoUploadPage()
37 videoUpdatePage = new VideoUpdatePage()
38 myAccountPage = new MyAccountPage()
39 loginPage = new LoginPage()
40 appPage = new AppPage()
41 playerPage = new PlayerPage()
44 // iOS does not seem to work with protractor
45 // https://github.com/angular/protractor/issues/2840
46 browser.ignoreSynchronization = true
48 console.log('iOS detected')
49 } else if (await isMobileDevice()) {
50 console.log('Android detected.')
51 } else if (await isSafari()) {
52 console.log('Safari detected.')
55 if (!await isMobileDevice()) {
56 await browser.driver.manage().window().maximize()
60 it('Should log in', async () => {
61 if (await isMobileDevice() || await isSafari()) {
62 console.log('Skipping because we are on a real device or Safari and BrowserStack does not support file upload.')
66 return loginPage.loginAsRootUser()
69 it('Should close the welcome modal', async () => {
70 if (await skipIfUploadNotSupported()) return
72 await appPage.closeWelcomeModal()
75 it('Should upload a video', async () => {
76 if (await skipIfUploadNotSupported()) return
78 await videoUploadPage.navigateTo()
80 await videoUploadPage.uploadVideo()
81 return videoUploadPage.validSecondUploadStep(videoName)
84 it('Should list videos', async () => {
85 await videoWatchPage.goOnVideosList(await isMobileDevice(), await isSafari())
87 if (await skipIfUploadNotSupported()) return
89 const videoNames = videoWatchPage.getVideosListName()
90 expect(videoNames).toContain(videoName)
93 it('Should go on video watch page', async () => {
94 let videoNameToExcept = videoName
96 if (await isMobileDevice() || await isSafari()) {
97 await browser.get('https://peertube2.cpy.re/videos/watch/122d093a-1ede-43bd-bd34-59d2931ffc5e')
98 videoNameToExcept = 'E2E tests'
100 await videoWatchPage.clickOnVideo(videoName)
103 return videoWatchPage.waitWatchVideoName(videoNameToExcept, await isMobileDevice(), await isSafari())
106 it('Should play the video', async () => {
107 videoWatchUrl = await browser.getCurrentUrl()
109 await playerPage.playAndPauseVideo(true)
110 expect(playerPage.getWatchVideoPlayerCurrentTime()).toBeGreaterThanOrEqual(2)
113 it('Should watch the associated embed video', async () => {
114 await browser.waitForAngularEnabled(false)
116 await videoWatchPage.goOnAssociatedEmbed()
118 await playerPage.playAndPauseVideo(false)
119 expect(playerPage.getWatchVideoPlayerCurrentTime()).toBeGreaterThanOrEqual(2)
121 await browser.waitForAngularEnabled(true)
124 it('Should watch the p2p media loader embed video', async () => {
125 await browser.waitForAngularEnabled(false)
127 await videoWatchPage.goOnP2PMediaLoaderEmbed()
129 await playerPage.playAndPauseVideo(false)
130 expect(playerPage.getWatchVideoPlayerCurrentTime()).toBeGreaterThanOrEqual(2)
132 await browser.waitForAngularEnabled(true)
135 it('Should update the video', async () => {
136 if (await skipIfUploadNotSupported()) return
138 await browser.get(videoWatchUrl)
140 await videoWatchPage.clickOnUpdate()
142 videoName += ' updated'
143 await videoUpdatePage.updateName(videoName)
145 await videoUpdatePage.validUpdate()
147 const name = await videoWatchPage.getVideoName()
148 expect(name).toEqual(videoName)
151 it('Should add the video in my playlist', async () => {
152 if (await skipIfUploadNotSupported()) return
154 await videoWatchPage.clickOnSave()
156 await videoWatchPage.createPlaylist(playlistName)
158 await videoWatchPage.saveToPlaylist(playlistName)
160 await videoUploadPage.navigateTo()
162 await videoUploadPage.uploadVideo()
163 await videoUploadPage.validSecondUploadStep(video2Name)
165 await videoWatchPage.clickOnSave()
166 await videoWatchPage.saveToPlaylist(playlistName)
169 it('Should have the playlist in my account', async () => {
170 if (await skipIfUploadNotSupported()) return
172 await myAccountPage.navigateToMyPlaylists()
174 const videosNumberText = await myAccountPage.getPlaylistVideosText(playlistName)
175 expect(videosNumberText).toEqual('2 videos')
177 await myAccountPage.clickOnPlaylist(playlistName)
179 const count = await myAccountPage.countTotalPlaylistElements()
180 expect(count).toEqual(2)
183 it('Should watch the playlist', async () => {
184 if (await skipIfUploadNotSupported()) return
186 await myAccountPage.playPlaylist()
188 await browser.waitForAngularEnabled(false)
190 await videoWatchPage.waitUntilVideoName(video2Name, 20000 * 1000)
192 await browser.waitForAngularEnabled(true)
195 it('Should watch the webtorrent playlist in the embed', async () => {
196 if (await skipIfUploadNotSupported()) return
198 const accessToken = await browser.executeScript(`return window.localStorage.getItem('access_token');`)
199 const refreshToken = await browser.executeScript(`return window.localStorage.getItem('refresh_token');`)
201 await browser.waitForAngularEnabled(false)
203 await myAccountPage.goOnAssociatedPlaylistEmbed()
205 await browser.executeScript(`window.localStorage.setItem('access_token', '${accessToken}');`)
206 await browser.executeScript(`window.localStorage.setItem('refresh_token', '${refreshToken}');`)
207 await browser.executeScript(`window.localStorage.setItem('token_type', 'Bearer');`)
209 await browser.refresh()
211 await playerPage.playVideo()
213 await playerPage.waitUntilPlaylistInfo('2/2')
215 await browser.waitForAngularEnabled(true)
218 it('Should watch the HLS playlist in the embed', async () => {
219 await browser.waitForAngularEnabled(false)
221 await videoWatchPage.goOnP2PMediaLoaderPlaylistEmbed()
223 await playerPage.playVideo()
225 await playerPage.waitUntilPlaylistInfo('2/2')
227 await browser.waitForAngularEnabled(true)
230 it('Should delete the video 2', async () => {
231 if (await skipIfUploadNotSupported()) return
233 // Go to the dev website
234 await browser.get(videoWatchUrl)
236 await myAccountPage.navigateToMyVideos()
238 await myAccountPage.removeVideo(video2Name)
239 await myAccountPage.validRemove()
241 const count = await myAccountPage.countVideos([ videoName, video2Name ])
242 expect(count).toEqual(1)
245 it('Should delete the first video', async () => {
246 if (await skipIfUploadNotSupported()) return
248 await myAccountPage.removeVideo(videoName)
249 await myAccountPage.validRemove()