diff options
Diffstat (limited to 'client/e2e/src/videos.e2e-spec.ts')
-rw-r--r-- | client/e2e/src/videos.e2e-spec.ts | 140 |
1 files changed, 62 insertions, 78 deletions
diff --git a/client/e2e/src/videos.e2e-spec.ts b/client/e2e/src/videos.e2e-spec.ts index fc816d1bf..7f7c814e1 100644 --- a/client/e2e/src/videos.e2e-spec.ts +++ b/client/e2e/src/videos.e2e-spec.ts | |||
@@ -1,14 +1,13 @@ | |||
1 | import { browser } from 'protractor' | ||
2 | import { LoginPage } from './po/login.po' | 1 | import { LoginPage } from './po/login.po' |
3 | import { MyAccountPage } from './po/my-account' | 2 | import { MyAccountPage } from './po/my-account' |
4 | import { PlayerPage } from './po/player.po' | 3 | import { PlayerPage } from './po/player.po' |
5 | import { VideoUpdatePage } from './po/video-update.po' | 4 | import { VideoUpdatePage } from './po/video-update.po' |
6 | import { VideoUploadPage } from './po/video-upload.po' | 5 | import { VideoUploadPage } from './po/video-upload.po' |
7 | import { VideoWatchPage } from './po/video-watch.po' | 6 | import { VideoWatchPage } from './po/video-watch.po' |
8 | import { isIOS, isMobileDevice, isSafari } from './utils' | 7 | import { browserSleep, go, isIOS, isMobileDevice, isSafari } from './utils' |
9 | 8 | ||
10 | async function skipIfUploadNotSupported () { | 9 | function isUploadUnsupported () { |
11 | if (await isMobileDevice() || await isSafari()) { | 10 | if (isMobileDevice() || isSafari()) { |
12 | console.log('Skipping because we are on a real device or Safari and BrowserStack does not support file upload.') | 11 | console.log('Skipping because we are on a real device or Safari and BrowserStack does not support file upload.') |
13 | return true | 12 | return true |
14 | } | 13 | } |
@@ -24,11 +23,30 @@ describe('Videos workflow', () => { | |||
24 | let loginPage: LoginPage | 23 | let loginPage: LoginPage |
25 | let playerPage: PlayerPage | 24 | let playerPage: PlayerPage |
26 | 25 | ||
27 | let videoName = new Date().getTime() + ' video' | 26 | let videoName = Math.random() + ' video' |
28 | const video2Name = new Date().getTime() + ' second video' | 27 | const video2Name = Math.random() + ' second video' |
29 | const playlistName = new Date().getTime() + ' playlist' | 28 | const playlistName = Math.random() + ' playlist' |
30 | let videoWatchUrl: string | 29 | let videoWatchUrl: string |
31 | 30 | ||
31 | before(async () => { | ||
32 | if (isIOS()) { | ||
33 | console.log('iOS detected') | ||
34 | } else if (isMobileDevice()) { | ||
35 | console.log('Android detected.') | ||
36 | } else if (isSafari()) { | ||
37 | console.log('Safari detected.') | ||
38 | } | ||
39 | |||
40 | if (isUploadUnsupported()) return | ||
41 | |||
42 | await browser.waitUntil(async () => { | ||
43 | await go('/') | ||
44 | await browserSleep(500) | ||
45 | |||
46 | return $('<my-app>').isDisplayed() | ||
47 | }, { timeout: 20 * 1000 }) | ||
48 | }) | ||
49 | |||
32 | beforeEach(async () => { | 50 | beforeEach(async () => { |
33 | videoWatchPage = new VideoWatchPage() | 51 | videoWatchPage = new VideoWatchPage() |
34 | videoUploadPage = new VideoUploadPage() | 52 | videoUploadPage = new VideoUploadPage() |
@@ -37,25 +55,13 @@ describe('Videos workflow', () => { | |||
37 | loginPage = new LoginPage() | 55 | loginPage = new LoginPage() |
38 | playerPage = new PlayerPage() | 56 | playerPage = new PlayerPage() |
39 | 57 | ||
40 | if (await isIOS()) { | 58 | if (!isMobileDevice()) { |
41 | // iOS does not seem to work with protractor | 59 | await browser.maximizeWindow() |
42 | // https://github.com/angular/protractor/issues/2840 | ||
43 | browser.waitForAngularEnabled(false) | ||
44 | |||
45 | console.log('iOS detected') | ||
46 | } else if (await isMobileDevice()) { | ||
47 | console.log('Android detected.') | ||
48 | } else if (await isSafari()) { | ||
49 | console.log('Safari detected.') | ||
50 | } | ||
51 | |||
52 | if (!await isMobileDevice()) { | ||
53 | await browser.driver.manage().window().maximize() | ||
54 | } | 60 | } |
55 | }) | 61 | }) |
56 | 62 | ||
57 | it('Should log in', async () => { | 63 | it('Should log in', async () => { |
58 | if (await isMobileDevice() || await isSafari()) { | 64 | if (isMobileDevice() || isSafari()) { |
59 | console.log('Skipping because we are on a real device or Safari and BrowserStack does not support file upload.') | 65 | console.log('Skipping because we are on a real device or Safari and BrowserStack does not support file upload.') |
60 | return | 66 | return |
61 | } | 67 | } |
@@ -64,7 +70,7 @@ describe('Videos workflow', () => { | |||
64 | }) | 70 | }) |
65 | 71 | ||
66 | it('Should upload a video', async () => { | 72 | it('Should upload a video', async () => { |
67 | if (await skipIfUploadNotSupported()) return | 73 | if (isUploadUnsupported()) return |
68 | 74 | ||
69 | await videoUploadPage.navigateTo() | 75 | await videoUploadPage.navigateTo() |
70 | 76 | ||
@@ -73,62 +79,52 @@ describe('Videos workflow', () => { | |||
73 | }) | 79 | }) |
74 | 80 | ||
75 | it('Should list videos', async () => { | 81 | it('Should list videos', async () => { |
76 | await videoWatchPage.goOnVideosList(await isMobileDevice(), await isSafari()) | 82 | await videoWatchPage.goOnVideosList(isMobileDevice(), isSafari()) |
77 | 83 | ||
78 | if (await skipIfUploadNotSupported()) return | 84 | if (isUploadUnsupported()) return |
79 | 85 | ||
80 | const videoNames = videoWatchPage.getVideosListName() | 86 | const videoNames = await videoWatchPage.getVideosListName() |
81 | expect(videoNames).toContain(videoName) | 87 | expect(videoNames).toContain(videoName) |
82 | }) | 88 | }) |
83 | 89 | ||
84 | it('Should go on video watch page', async () => { | 90 | it('Should go on video watch page', async () => { |
85 | let videoNameToExcept = videoName | 91 | let videoNameToExcept = videoName |
86 | 92 | ||
87 | if (await isMobileDevice() || await isSafari()) { | 93 | if (isMobileDevice() || isSafari()) { |
88 | await browser.get('https://peertube2.cpy.re/w/122d093a-1ede-43bd-bd34-59d2931ffc5e') | 94 | await go('https://peertube2.cpy.re/w/122d093a-1ede-43bd-bd34-59d2931ffc5e') |
89 | videoNameToExcept = 'E2E tests' | 95 | videoNameToExcept = 'E2E tests' |
90 | } else { | 96 | } else { |
91 | await videoWatchPage.clickOnVideo(videoName) | 97 | await videoWatchPage.clickOnVideo(videoName) |
92 | } | 98 | } |
93 | 99 | ||
94 | return videoWatchPage.waitWatchVideoName(videoNameToExcept, await isMobileDevice(), await isSafari()) | 100 | return videoWatchPage.waitWatchVideoName(videoNameToExcept, isMobileDevice(), isSafari()) |
95 | }) | 101 | }) |
96 | 102 | ||
97 | it('Should play the video', async () => { | 103 | it('Should play the video', async () => { |
98 | videoWatchUrl = await browser.getCurrentUrl() | 104 | videoWatchUrl = await browser.getUrl() |
99 | 105 | ||
100 | await playerPage.playAndPauseVideo(true) | 106 | await playerPage.playAndPauseVideo(true) |
101 | expect(playerPage.getWatchVideoPlayerCurrentTime()).toBeGreaterThanOrEqual(2) | 107 | expect(await playerPage.getWatchVideoPlayerCurrentTime()).toBeGreaterThanOrEqual(2) |
102 | }) | 108 | }) |
103 | 109 | ||
104 | it('Should watch the associated embed video', async () => { | 110 | it('Should watch the associated embed video', async () => { |
105 | const oldValue = await browser.waitForAngularEnabled() | ||
106 | await browser.waitForAngularEnabled(false) | ||
107 | |||
108 | await videoWatchPage.goOnAssociatedEmbed() | 111 | await videoWatchPage.goOnAssociatedEmbed() |
109 | 112 | ||
110 | await playerPage.playAndPauseVideo(false) | 113 | await playerPage.playAndPauseVideo(false) |
111 | expect(playerPage.getWatchVideoPlayerCurrentTime()).toBeGreaterThanOrEqual(2) | 114 | expect(await playerPage.getWatchVideoPlayerCurrentTime()).toBeGreaterThanOrEqual(2) |
112 | |||
113 | await browser.waitForAngularEnabled(oldValue) | ||
114 | }) | 115 | }) |
115 | 116 | ||
116 | it('Should watch the p2p media loader embed video', async () => { | 117 | it('Should watch the p2p media loader embed video', async () => { |
117 | const oldValue = await browser.waitForAngularEnabled() | ||
118 | await browser.waitForAngularEnabled(false) | ||
119 | |||
120 | await videoWatchPage.goOnP2PMediaLoaderEmbed() | 118 | await videoWatchPage.goOnP2PMediaLoaderEmbed() |
121 | 119 | ||
122 | await playerPage.playAndPauseVideo(false) | 120 | await playerPage.playAndPauseVideo(false) |
123 | expect(playerPage.getWatchVideoPlayerCurrentTime()).toBeGreaterThanOrEqual(2) | 121 | expect(await playerPage.getWatchVideoPlayerCurrentTime()).toBeGreaterThanOrEqual(2) |
124 | |||
125 | await browser.waitForAngularEnabled(oldValue) | ||
126 | }) | 122 | }) |
127 | 123 | ||
128 | it('Should update the video', async () => { | 124 | it('Should update the video', async () => { |
129 | if (await skipIfUploadNotSupported()) return | 125 | if (isUploadUnsupported()) return |
130 | 126 | ||
131 | await browser.get(videoWatchUrl) | 127 | await go(videoWatchUrl) |
132 | 128 | ||
133 | await videoWatchPage.clickOnUpdate() | 129 | await videoWatchPage.clickOnUpdate() |
134 | 130 | ||
@@ -142,14 +138,14 @@ describe('Videos workflow', () => { | |||
142 | }) | 138 | }) |
143 | 139 | ||
144 | it('Should add the video in my playlist', async () => { | 140 | it('Should add the video in my playlist', async () => { |
145 | if (await skipIfUploadNotSupported()) return | 141 | if (isUploadUnsupported()) return |
146 | 142 | ||
147 | await videoWatchPage.clickOnSave() | 143 | await videoWatchPage.clickOnSave() |
148 | 144 | ||
149 | await videoWatchPage.createPlaylist(playlistName) | 145 | await videoWatchPage.createPlaylist(playlistName) |
150 | 146 | ||
151 | await videoWatchPage.saveToPlaylist(playlistName) | 147 | await videoWatchPage.saveToPlaylist(playlistName) |
152 | await browser.sleep(5000) | 148 | await browser.pause(5000) |
153 | 149 | ||
154 | await videoUploadPage.navigateTo() | 150 | await videoUploadPage.navigateTo() |
155 | 151 | ||
@@ -161,7 +157,7 @@ describe('Videos workflow', () => { | |||
161 | }) | 157 | }) |
162 | 158 | ||
163 | it('Should have the playlist in my account', async () => { | 159 | it('Should have the playlist in my account', async () => { |
164 | if (await skipIfUploadNotSupported()) return | 160 | if (isUploadUnsupported()) return |
165 | 161 | ||
166 | await myAccountPage.navigateToMyPlaylists() | 162 | await myAccountPage.navigateToMyPlaylists() |
167 | 163 | ||
@@ -175,26 +171,18 @@ describe('Videos workflow', () => { | |||
175 | }) | 171 | }) |
176 | 172 | ||
177 | it('Should watch the playlist', async () => { | 173 | it('Should watch the playlist', async () => { |
178 | if (await skipIfUploadNotSupported()) return | 174 | if (isUploadUnsupported()) return |
179 | 175 | ||
180 | await myAccountPage.playPlaylist() | 176 | await myAccountPage.playPlaylist() |
181 | 177 | ||
182 | const oldValue = await browser.waitForAngularEnabled() | 178 | await videoWatchPage.waitUntilVideoName(video2Name, 30 * 1000) |
183 | await browser.waitForAngularEnabled(false) | ||
184 | |||
185 | await videoWatchPage.waitUntilVideoName(video2Name, 20000 * 1000) | ||
186 | |||
187 | await browser.waitForAngularEnabled(oldValue) | ||
188 | }) | 179 | }) |
189 | 180 | ||
190 | it('Should watch the webtorrent playlist in the embed', async () => { | 181 | it('Should watch the webtorrent playlist in the embed', async () => { |
191 | if (await skipIfUploadNotSupported()) return | 182 | if (isUploadUnsupported()) return |
192 | |||
193 | const accessToken = await browser.executeScript(`return window.localStorage.getItem('access_token');`) | ||
194 | const refreshToken = await browser.executeScript(`return window.localStorage.getItem('refresh_token');`) | ||
195 | 183 | ||
196 | const oldValue = await browser.waitForAngularEnabled() | 184 | const accessToken = await browser.execute(`return window.localStorage.getItem('access_token');`) |
197 | await browser.waitForAngularEnabled(false) | 185 | const refreshToken = await browser.execute(`return window.localStorage.getItem('refresh_token');`) |
198 | 186 | ||
199 | await myAccountPage.goOnAssociatedPlaylistEmbed() | 187 | await myAccountPage.goOnAssociatedPlaylistEmbed() |
200 | 188 | ||
@@ -202,49 +190,45 @@ describe('Videos workflow', () => { | |||
202 | 190 | ||
203 | console.log('Will set %s and %s tokens in local storage.', accessToken, refreshToken) | 191 | console.log('Will set %s and %s tokens in local storage.', accessToken, refreshToken) |
204 | 192 | ||
205 | await browser.executeScript(`window.localStorage.setItem('access_token', '${accessToken}');`) | 193 | await browser.execute(`window.localStorage.setItem('access_token', '${accessToken}');`) |
206 | await browser.executeScript(`window.localStorage.setItem('refresh_token', '${refreshToken}');`) | 194 | await browser.execute(`window.localStorage.setItem('refresh_token', '${refreshToken}');`) |
207 | await browser.executeScript(`window.localStorage.setItem('token_type', 'Bearer');`) | 195 | await browser.execute(`window.localStorage.setItem('token_type', 'Bearer');`) |
208 | 196 | ||
209 | await browser.refresh() | 197 | await browser.refresh() |
210 | 198 | ||
211 | await playerPage.playVideo() | 199 | await playerPage.playVideo() |
212 | 200 | ||
213 | await playerPage.waitUntilPlaylistInfo('2/2') | 201 | await playerPage.waitUntilPlaylistInfo('2/2', 30 * 1000) |
214 | |||
215 | await browser.waitForAngularEnabled(oldValue) | ||
216 | }) | 202 | }) |
217 | 203 | ||
218 | it('Should watch the HLS playlist in the embed', async () => { | 204 | it('Should watch the HLS playlist in the embed', async () => { |
219 | const oldValue = await browser.waitForAngularEnabled() | ||
220 | await browser.waitForAngularEnabled(false) | ||
221 | |||
222 | await videoWatchPage.goOnP2PMediaLoaderPlaylistEmbed() | 205 | await videoWatchPage.goOnP2PMediaLoaderPlaylistEmbed() |
223 | 206 | ||
224 | await playerPage.playVideo() | 207 | await playerPage.playVideo() |
225 | 208 | ||
226 | await playerPage.waitUntilPlaylistInfo('2/2') | 209 | await playerPage.waitUntilPlaylistInfo('2/2', 30 * 1000) |
227 | |||
228 | await browser.waitForAngularEnabled(oldValue) | ||
229 | }) | 210 | }) |
230 | 211 | ||
231 | it('Should delete the video 2', async () => { | 212 | it('Should delete the video 2', async () => { |
232 | if (await skipIfUploadNotSupported()) return | 213 | if (isUploadUnsupported()) return |
233 | 214 | ||
234 | // Go to the dev website | 215 | // Go to the dev website |
235 | await browser.get(videoWatchUrl) | 216 | await go(videoWatchUrl) |
236 | 217 | ||
237 | await myAccountPage.navigateToMyVideos() | 218 | await myAccountPage.navigateToMyVideos() |
238 | 219 | ||
239 | await myAccountPage.removeVideo(video2Name) | 220 | await myAccountPage.removeVideo(video2Name) |
240 | await myAccountPage.validRemove() | 221 | await myAccountPage.validRemove() |
241 | 222 | ||
242 | const count = await myAccountPage.countVideos([ videoName, video2Name ]) | 223 | await browser.waitUntil(async () => { |
243 | expect(count).toEqual(1) | 224 | const count = await myAccountPage.countVideos([ videoName, video2Name ]) |
225 | |||
226 | return count === 1 | ||
227 | }) | ||
244 | }) | 228 | }) |
245 | 229 | ||
246 | it('Should delete the first video', async () => { | 230 | it('Should delete the first video', async () => { |
247 | if (await skipIfUploadNotSupported()) return | 231 | if (isUploadUnsupported()) return |
248 | 232 | ||
249 | await myAccountPage.removeVideo(videoName) | 233 | await myAccountPage.removeVideo(videoName) |
250 | await myAccountPage.validRemove() | 234 | await myAccountPage.validRemove() |