diff options
-rw-r--r-- | client/e2e/fixtures/video.mp4 | bin | 619477 -> 1170399 bytes | |||
-rw-r--r-- | client/e2e/protractor.conf.js | 79 | ||||
-rw-r--r-- | client/e2e/src/po/app.po.ts | 7 | ||||
-rw-r--r-- | client/e2e/src/po/video-watch.po.ts | 21 | ||||
-rw-r--r-- | client/e2e/src/utils.ts | 30 | ||||
-rw-r--r-- | client/e2e/src/videos.e2e-spec.ts | 33 | ||||
-rwxr-xr-x | scripts/e2e/index.sh | 2 | ||||
-rwxr-xr-x | scripts/e2e/local.sh | 2 |
8 files changed, 99 insertions, 75 deletions
diff --git a/client/e2e/fixtures/video.mp4 b/client/e2e/fixtures/video.mp4 index 23000cfc1..8a634db8e 100644 --- a/client/e2e/fixtures/video.mp4 +++ b/client/e2e/fixtures/video.mp4 | |||
Binary files differ | |||
diff --git a/client/e2e/protractor.conf.js b/client/e2e/protractor.conf.js index 5531707e6..b087f70dc 100644 --- a/client/e2e/protractor.conf.js +++ b/client/e2e/protractor.conf.js | |||
@@ -12,52 +12,55 @@ exports.config = { | |||
12 | 'browserstack.user': process.env.BROWSERSTACK_USER, | 12 | 'browserstack.user': process.env.BROWSERSTACK_USER, |
13 | 'browserstack.key': process.env.BROWSERSTACK_KEY, | 13 | 'browserstack.key': process.env.BROWSERSTACK_KEY, |
14 | 'browserstack.local': true, | 14 | 'browserstack.local': true, |
15 | 'browserstack.console': 'info', | 15 | 'browserstack.console': 'verbose', |
16 | 'browserstack.networkLogs': true, | ||
17 | 'browserstack.debug': true, | ||
16 | project: 'PeerTube', | 18 | project: 'PeerTube', |
19 | build: 'Main', | ||
17 | name: 'Bstack-[Protractor] Parallel Test' | 20 | name: 'Bstack-[Protractor] Parallel Test' |
18 | }, | 21 | }, |
19 | 22 | ||
20 | multiCapabilities: [ | 23 | multiCapabilities: [ |
24 | // { | ||
25 | // browserName: 'Safari', | ||
26 | // version: '11.1', | ||
27 | // name: 'Safari Desktop', | ||
28 | // resolution: '1280x1024' | ||
29 | // }, | ||
30 | // { | ||
31 | // browserName: 'Chrome', | ||
32 | // name: 'Latest Chrome Desktop', | ||
33 | // resolution: '1280x1024' | ||
34 | // }, | ||
35 | // { | ||
36 | // browserName: 'Firefox', | ||
37 | // version: '60', // ESR, | ||
38 | // name: 'Firefox ESR Desktop', | ||
39 | // resolution: '1280x1024' | ||
40 | // }, | ||
41 | // { | ||
42 | // browserName: 'Firefox', | ||
43 | // name: 'Latest Firefox Desktop', | ||
44 | // resolution: '1280x1024' | ||
45 | // }, | ||
46 | // { | ||
47 | // browserName: 'Edge', | ||
48 | // name: 'Latest Edge Desktop', | ||
49 | // resolution: '1280x1024' | ||
50 | // }, | ||
51 | // { | ||
52 | // browserName: 'Chrome', | ||
53 | // device: 'Google Nexus 6', | ||
54 | // realMobile: 'true', | ||
55 | // os_version: '5.0', | ||
56 | // name: 'Latest Chrome Android' | ||
57 | // }, | ||
21 | { | 58 | { |
22 | browserName: 'Safari', | 59 | browserName: 'Safari', |
23 | version: '11.1', | 60 | device: 'iPhone 8', |
24 | name: 'Safari Desktop', | ||
25 | resolution: '1280x1024' | ||
26 | }, | ||
27 | { | ||
28 | browserName: 'Chrome', | ||
29 | name: 'Latest Chrome Desktop', | ||
30 | resolution: '1280x1024' | ||
31 | }, | ||
32 | { | ||
33 | browserName: 'Firefox', | ||
34 | version: '60', // ESR, | ||
35 | name: 'Firefox ESR Desktop', | ||
36 | resolution: '1280x1024' | ||
37 | }, | ||
38 | { | ||
39 | browserName: 'Firefox', | ||
40 | name: 'Latest Firefox Desktop', | ||
41 | resolution: '1280x1024' | ||
42 | }, | ||
43 | { | ||
44 | browserName: 'Edge', | ||
45 | name: 'Latest Edge Desktop', | ||
46 | resolution: '1280x1024' | ||
47 | }, | ||
48 | { | ||
49 | browserName: 'Chrome', | ||
50 | device: 'Google Nexus 6', | ||
51 | realMobile: 'true', | ||
52 | os_version: '5.0', | ||
53 | name: 'Latest Chrome Android' | ||
54 | }, | ||
55 | { | ||
56 | browserName: 'Safari', | ||
57 | device: 'iPhone SE', | ||
58 | realMobile: 'true', | 61 | realMobile: 'true', |
59 | os_version: '11.2', | 62 | os_version: '12', |
60 | name: 'Latest Safari iPhone' | 63 | name: 'Safari iPhone' |
61 | } | 64 | } |
62 | ], | 65 | ], |
63 | 66 | ||
diff --git a/client/e2e/src/po/app.po.ts b/client/e2e/src/po/app.po.ts index a636e825f..4954880ef 100644 --- a/client/e2e/src/po/app.po.ts +++ b/client/e2e/src/po/app.po.ts | |||
@@ -10,12 +10,5 @@ export class AppPage { | |||
10 | await element(by.css('.configure-instance-button')).click() | 10 | await element(by.css('.configure-instance-button')).click() |
11 | 11 | ||
12 | await browser.switchTo().window(firstHandle) | 12 | await browser.switchTo().window(firstHandle) |
13 | |||
14 | await browser.refresh() | ||
15 | |||
16 | await element(by.css('.form-group-checkbox')).click() | ||
17 | await element(by.css('.action-button-cancel')).click() | ||
18 | |||
19 | await browser.switchTo().window(firstHandle) | ||
20 | } | 13 | } |
21 | } | 14 | } |
diff --git a/client/e2e/src/po/video-watch.po.ts b/client/e2e/src/po/video-watch.po.ts index c5e37e6de..bcfceefbc 100644 --- a/client/e2e/src/po/video-watch.po.ts +++ b/client/e2e/src/po/video-watch.po.ts | |||
@@ -1,4 +1,5 @@ | |||
1 | import { browser, by, element, ElementFinder, ExpectedConditions } from 'protractor' | 1 | import { browser, by, element, ElementFinder, ExpectedConditions } from 'protractor' |
2 | import { browserSleep } from '../utils' | ||
2 | 3 | ||
3 | export class VideoWatchPage { | 4 | export class VideoWatchPage { |
4 | async goOnVideosList (isMobileDevice: boolean, isSafari: boolean) { | 5 | async goOnVideosList (isMobileDevice: boolean, isSafari: boolean) { |
@@ -11,10 +12,10 @@ export class VideoWatchPage { | |||
11 | url = '/videos/recently-added' | 12 | url = '/videos/recently-added' |
12 | } | 13 | } |
13 | 14 | ||
14 | await browser.get(url) | 15 | await browser.get(url, 20000) |
15 | 16 | ||
16 | // Waiting the following element does not work on Safari... | 17 | // Waiting the following element does not work on Safari... |
17 | if (isSafari) return browser.sleep(3000) | 18 | if (isSafari) return browserSleep(3000) |
18 | 19 | ||
19 | const elem = element.all(by.css('.videos .video-miniature .video-miniature-name')).first() | 20 | const elem = element.all(by.css('.videos .video-miniature .video-miniature-name')).first() |
20 | return browser.wait(browser.ExpectedConditions.visibilityOf(elem)) | 21 | return browser.wait(browser.ExpectedConditions.visibilityOf(elem)) |
@@ -27,13 +28,12 @@ export class VideoWatchPage { | |||
27 | } | 28 | } |
28 | 29 | ||
29 | waitWatchVideoName (videoName: string, isMobileDevice: boolean, isSafari: boolean) { | 30 | waitWatchVideoName (videoName: string, isMobileDevice: boolean, isSafari: boolean) { |
31 | if (isSafari) return browserSleep(5000) | ||
32 | |||
30 | // On mobile we display the first node, on desktop the second | 33 | // On mobile we display the first node, on desktop the second |
31 | const index = isMobileDevice ? 0 : 1 | 34 | const index = isMobileDevice ? 0 : 1 |
32 | 35 | ||
33 | const elem = element.all(by.css('.video-info .video-info-name')).get(index) | 36 | const elem = element.all(by.css('.video-info .video-info-name')).get(index) |
34 | |||
35 | if (isSafari) return browser.sleep(5000) | ||
36 | |||
37 | return browser.wait(browser.ExpectedConditions.textToBePresentInElement(elem, videoName)) | 37 | return browser.wait(browser.ExpectedConditions.textToBePresentInElement(elem, videoName)) |
38 | } | 38 | } |
39 | 39 | ||
@@ -55,7 +55,7 @@ export class VideoWatchPage { | |||
55 | await playButton.click() | 55 | await playButton.click() |
56 | } | 56 | } |
57 | 57 | ||
58 | await browser.sleep(1000) | 58 | await browserSleep(1000) |
59 | await browser.wait(browser.ExpectedConditions.invisibilityOf(element(by.css('.vjs-loading-spinner')))) | 59 | await browser.wait(browser.ExpectedConditions.invisibilityOf(element(by.css('.vjs-loading-spinner')))) |
60 | 60 | ||
61 | const videojsEl = element(by.css('div.video-js')) | 61 | const videojsEl = element(by.css('div.video-js')) |
@@ -63,13 +63,16 @@ export class VideoWatchPage { | |||
63 | 63 | ||
64 | // On Android, we need to click twice on "play" (BrowserStack particularity) | 64 | // On Android, we need to click twice on "play" (BrowserStack particularity) |
65 | if (isMobileDevice) { | 65 | if (isMobileDevice) { |
66 | await browser.sleep(3000) | 66 | await browserSleep(3000) |
67 | |||
67 | await videojsEl.click() | 68 | await videojsEl.click() |
68 | } | 69 | } |
69 | 70 | ||
70 | await browser.sleep(7000) | 71 | browser.ignoreSynchronization = false |
72 | await browserSleep(7000) | ||
73 | browser.ignoreSynchronization = true | ||
71 | 74 | ||
72 | return videojsEl.click() | 75 | await videojsEl.click() |
73 | } | 76 | } |
74 | 77 | ||
75 | async clickOnVideo (videoName: string) { | 78 | async clickOnVideo (videoName: string) { |
diff --git a/client/e2e/src/utils.ts b/client/e2e/src/utils.ts new file mode 100644 index 000000000..e19da6402 --- /dev/null +++ b/client/e2e/src/utils.ts | |||
@@ -0,0 +1,30 @@ | |||
1 | import { browser } from 'protractor' | ||
2 | |||
3 | async function browserSleep (amount: number) { | ||
4 | if (await isIOS()) browser.ignoreSynchronization = false | ||
5 | |||
6 | await browser.sleep(amount) | ||
7 | |||
8 | if (await isIOS()) browser.ignoreSynchronization = true | ||
9 | } | ||
10 | |||
11 | async function isMobileDevice () { | ||
12 | const caps = await browser.getCapabilities() | ||
13 | return caps.get('realMobile') === 'true' || caps.get('realMobile') === true | ||
14 | } | ||
15 | |||
16 | async function isSafari () { | ||
17 | const caps = await browser.getCapabilities() | ||
18 | return caps.get('browserName') && caps.get('browserName').toLowerCase() === 'safari' | ||
19 | } | ||
20 | |||
21 | async function isIOS () { | ||
22 | return await isMobileDevice() && await isSafari() | ||
23 | } | ||
24 | |||
25 | export { | ||
26 | isMobileDevice, | ||
27 | isSafari, | ||
28 | isIOS, | ||
29 | browserSleep | ||
30 | } | ||
diff --git a/client/e2e/src/videos.e2e-spec.ts b/client/e2e/src/videos.e2e-spec.ts index b2c5ab4c6..0cba8331f 100644 --- a/client/e2e/src/videos.e2e-spec.ts +++ b/client/e2e/src/videos.e2e-spec.ts | |||
@@ -1,10 +1,11 @@ | |||
1 | import { VideoWatchPage } from './po/video-watch.po' | ||
2 | import { VideoUploadPage } from './po/video-upload.po' | ||
3 | import { LoginPage } from './po/login.po' | ||
4 | import { browser } from 'protractor' | 1 | import { browser } from 'protractor' |
5 | import { VideoUpdatePage } from './po/video-update.po' | ||
6 | import { MyAccountPage } from './po/my-account' | ||
7 | import { AppPage } from './po/app.po' | 2 | import { AppPage } from './po/app.po' |
3 | import { LoginPage } from './po/login.po' | ||
4 | import { MyAccountPage } from './po/my-account' | ||
5 | import { VideoUpdatePage } from './po/video-update.po' | ||
6 | import { VideoUploadPage } from './po/video-upload.po' | ||
7 | import { VideoWatchPage } from './po/video-watch.po' | ||
8 | import { isIOS, isMobileDevice, isSafari } from './utils' | ||
8 | 9 | ||
9 | async function skipIfUploadNotSupported () { | 10 | async function skipIfUploadNotSupported () { |
10 | if (await isMobileDevice() || await isSafari()) { | 11 | if (await isMobileDevice() || await isSafari()) { |
@@ -15,16 +16,6 @@ async function skipIfUploadNotSupported () { | |||
15 | return false | 16 | return false |
16 | } | 17 | } |
17 | 18 | ||
18 | async function isMobileDevice () { | ||
19 | const caps = await browser.getCapabilities() | ||
20 | return caps.get('realMobile') === 'true' || caps.get('realMobile') === true | ||
21 | } | ||
22 | |||
23 | async function isSafari () { | ||
24 | const caps = await browser.getCapabilities() | ||
25 | return caps.get('browserName') && caps.get('browserName').toLowerCase() === 'safari' | ||
26 | } | ||
27 | |||
28 | describe('Videos workflow', () => { | 19 | describe('Videos workflow', () => { |
29 | let videoWatchPage: VideoWatchPage | 20 | let videoWatchPage: VideoWatchPage |
30 | let videoUploadPage: VideoUploadPage | 21 | let videoUploadPage: VideoUploadPage |
@@ -46,11 +37,15 @@ describe('Videos workflow', () => { | |||
46 | loginPage = new LoginPage() | 37 | loginPage = new LoginPage() |
47 | appPage = new AppPage() | 38 | appPage = new AppPage() |
48 | 39 | ||
49 | if (await isMobileDevice()) { | 40 | if (await isIOS()) { |
50 | console.log('Mobile device detected.') | 41 | // iOS does not seem to work with protractor |
51 | } | 42 | // https://github.com/angular/protractor/issues/2840 |
43 | browser.ignoreSynchronization = true | ||
52 | 44 | ||
53 | if (await isSafari()) { | 45 | console.log('iOS detected') |
46 | } else if (await isMobileDevice()) { | ||
47 | console.log('Android detected.') | ||
48 | } else if (await isSafari()) { | ||
54 | console.log('Safari detected.') | 49 | console.log('Safari detected.') |
55 | } | 50 | } |
56 | 51 | ||
diff --git a/scripts/e2e/index.sh b/scripts/e2e/index.sh index 3856af06e..08f09c9ed 100755 --- a/scripts/e2e/index.sh +++ b/scripts/e2e/index.sh | |||
@@ -11,4 +11,4 @@ npm run clean:server:test | |||
11 | 11 | ||
12 | npm run concurrently -- -k -s first \ | 12 | npm run concurrently -- -k -s first \ |
13 | "cd client && npm run ng -- e2e --port 3333" \ | 13 | "cd client && npm run ng -- e2e --port 3333" \ |
14 | "NODE_ENV=test NODE_APP_INSTANCE=1 NODE_CONFIG='{ \"log\": { \"level\": \"warning\" } }' npm start" | 14 | "NODE_ENV=test NODE_APP_INSTANCE=1 NODE_CONFIG='{ \"log\": { \"level\": \"warning\" }, \"signup\": { \"enabled\": false } }' node dist/server" |
diff --git a/scripts/e2e/local.sh b/scripts/e2e/local.sh index e8db2e808..40efa3525 100755 --- a/scripts/e2e/local.sh +++ b/scripts/e2e/local.sh | |||
@@ -11,4 +11,4 @@ npm run clean:server:test | |||
11 | 11 | ||
12 | npm run concurrently -- -k -s first \ | 12 | npm run concurrently -- -k -s first \ |
13 | "cd client && npm run ng -- e2e --port 3333 -c local" \ | 13 | "cd client && npm run ng -- e2e --port 3333 -c local" \ |
14 | "NODE_ENV=test NODE_APP_INSTANCE=1 NODE_CONFIG='{ \"log\": { \"level\": \"warning\" } }' node dist/server" | 14 | "NODE_ENV=test NODE_APP_INSTANCE=1 NODE_CONFIG='{ \"log\": { \"level\": \"warning\" }, \"signup\": { \"enabled\": false } }' node dist/server" |