@mattermost/playwright-lib 10.6.1 → 10.7.0-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser_context.js +14 -21
- package/dist/constant.js +3 -6
- package/dist/file.js +20 -20
- package/dist/flag.d.ts +2 -0
- package/dist/flag.js +49 -38
- package/dist/flag.js.map +1 -1
- package/dist/global_setup.d.ts +0 -2
- package/dist/global_setup.js +14 -71
- package/dist/global_setup.js.map +1 -1
- package/dist/index.js +9 -42
- package/dist/mock_browser_api.js +2 -8
- package/dist/server/channel.js +3 -9
- package/dist/server/client.js +10 -16
- package/dist/server/default_config.js +18 -17
- package/dist/server/default_config.js.map +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.js +10 -0
- package/dist/server/init.js +29 -36
- package/dist/server/plugins.d.ts +2 -0
- package/dist/server/plugins.js +30 -0
- package/dist/server/plugins.js.map +1 -0
- package/dist/server/post.js +3 -9
- package/dist/server/team.js +3 -9
- package/dist/server/user.js +8 -15
- package/dist/test_action.js +3 -14
- package/dist/test_config.js +4 -30
- package/dist/test_fixture.d.ts +4 -2
- package/dist/test_fixture.js +51 -66
- package/dist/test_fixture.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types.js +3 -0
- package/dist/ui/components/channels/app_bar.js +3 -9
- package/dist/ui/components/channels/center_view.js +22 -28
- package/dist/ui/components/channels/delete_post_confirmation_dialog.js +8 -14
- package/dist/ui/components/channels/delete_post_modal.js +4 -10
- package/dist/ui/components/channels/emoji_gif_picker.js +9 -15
- package/dist/ui/components/channels/find_channels_modal.js +3 -9
- package/dist/ui/components/channels/generic_confirm_modal.js +5 -11
- package/dist/ui/components/channels/header.js +3 -9
- package/dist/ui/components/channels/message_priority.js +14 -20
- package/dist/ui/components/channels/post.js +10 -16
- package/dist/ui/components/channels/post_create.js +23 -29
- package/dist/ui/components/channels/post_dot_menu.js +3 -9
- package/dist/ui/components/channels/post_edit.js +16 -22
- package/dist/ui/components/channels/post_menu.js +3 -9
- package/dist/ui/components/channels/post_reminder_menu.js +3 -9
- package/dist/ui/components/channels/restore_post_confirmation_dialog.js +6 -12
- package/dist/ui/components/channels/scheduled_draft_menu.js +3 -9
- package/dist/ui/components/channels/scheduled_draft_modal.js +4 -10
- package/dist/ui/components/channels/search_popover.js +3 -9
- package/dist/ui/components/channels/settings/notification_settings.js +8 -14
- package/dist/ui/components/channels/settings/settings_modal.js +7 -13
- package/dist/ui/components/channels/sidebar_left.js +8 -14
- package/dist/ui/components/channels/sidebar_right.js +20 -26
- package/dist/ui/components/channels/thread_footer.js +3 -9
- package/dist/ui/components/channels/user_profile_popover.js +3 -9
- package/dist/ui/components/footer.js +3 -9
- package/dist/ui/components/global_header.d.ts +1 -0
- package/dist/ui/components/global_header.js +9 -13
- package/dist/ui/components/global_header.js.map +1 -1
- package/dist/ui/components/index.js +72 -74
- package/dist/ui/components/main_header.js +3 -9
- package/dist/ui/components/system_console/navbar.js +3 -9
- package/dist/ui/components/system_console/sections/system_users/column_toggle_menu.js +4 -10
- package/dist/ui/components/system_console/sections/system_users/feature_discovery.js +4 -10
- package/dist/ui/components/system_console/sections/system_users/filter_menu.js +3 -9
- package/dist/ui/components/system_console/sections/system_users/filter_popover.js +8 -14
- package/dist/ui/components/system_console/sections/system_users/mobile_security.js +3 -9
- package/dist/ui/components/system_console/sections/system_users/system_users.js +10 -16
- package/dist/ui/components/system_console/sidebar.js +4 -10
- package/dist/ui/pages/channels.js +18 -24
- package/dist/ui/pages/drafts.js +17 -23
- package/dist/ui/pages/index.js +17 -30
- package/dist/ui/pages/landing_login.js +5 -11
- package/dist/ui/pages/login.js +8 -14
- package/dist/ui/pages/reset_password.js +9 -15
- package/dist/ui/pages/scheduled_draft.js +19 -25
- package/dist/ui/pages/signup.js +11 -17
- package/dist/ui/pages/system_console.js +16 -22
- package/dist/util.js +8 -19
- package/dist/visual/index.js +14 -20
- package/dist/visual/percy.js +4 -10
- package/package.json +1 -1
package/dist/server/user.js
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var util = require('../util.js');
|
|
4
|
-
var test_config = require('../test_config.js');
|
|
5
|
-
|
|
6
1
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
7
2
|
// See LICENSE.txt for license information.
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
import { getRandomId } from '@/util';
|
|
4
|
+
import { testConfig } from '@/test_config';
|
|
5
|
+
export function createRandomUser(prefix = 'user') {
|
|
6
|
+
const randomId = getRandomId();
|
|
10
7
|
const user = {
|
|
11
8
|
email: `${prefix}${randomId}@sample.mattermost.com`,
|
|
12
9
|
username: `${prefix}${randomId}`,
|
|
@@ -17,17 +14,13 @@ function createRandomUser(prefix = 'user') {
|
|
|
17
14
|
};
|
|
18
15
|
return user;
|
|
19
16
|
}
|
|
20
|
-
function getDefaultAdminUser() {
|
|
17
|
+
export function getDefaultAdminUser() {
|
|
21
18
|
const admin = {
|
|
22
|
-
username:
|
|
23
|
-
password:
|
|
19
|
+
username: testConfig.adminUsername,
|
|
20
|
+
password: testConfig.adminPassword,
|
|
24
21
|
first_name: 'Kenneth',
|
|
25
22
|
last_name: 'Moreno',
|
|
26
|
-
email:
|
|
23
|
+
email: testConfig.adminEmail,
|
|
27
24
|
};
|
|
28
25
|
return admin;
|
|
29
26
|
}
|
|
30
|
-
|
|
31
|
-
exports.createRandomUser = createRandomUser;
|
|
32
|
-
exports.getDefaultAdminUser = getDefaultAdminUser;
|
|
33
|
-
//# sourceMappingURL=user.js.map
|
package/dist/test_action.js
CHANGED
|
@@ -1,24 +1,13 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var asyncWaitUntil = require('async-wait-until');
|
|
4
|
-
|
|
5
1
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
6
2
|
// See LICENSE.txt for license information.
|
|
3
|
+
export { waitUntil } from 'async-wait-until';
|
|
7
4
|
const visibilityHidden = 'visibility: hidden !important;';
|
|
8
5
|
const hideTeamHeader = `.test-team-header {${visibilityHidden}} `;
|
|
9
6
|
const hidePostHeaderTime = `.post__time {${visibilityHidden}} `;
|
|
10
7
|
const hidePostProfileIcon = `.profile-icon {${visibilityHidden}} `;
|
|
11
|
-
async function hideDynamicChannelsContent(page) {
|
|
8
|
+
export async function hideDynamicChannelsContent(page) {
|
|
12
9
|
await page.addStyleTag({ content: hideTeamHeader + hidePostHeaderTime + hidePostProfileIcon });
|
|
13
10
|
}
|
|
14
|
-
async function waitForAnimationEnd(locator) {
|
|
11
|
+
export async function waitForAnimationEnd(locator) {
|
|
15
12
|
return locator.evaluate((element) => Promise.all(element.getAnimations({ subtree: true }).map((animation) => animation.finished)));
|
|
16
13
|
}
|
|
17
|
-
|
|
18
|
-
Object.defineProperty(exports, "waitUntil", {
|
|
19
|
-
enumerable: true,
|
|
20
|
-
get: function () { return asyncWaitUntil.waitUntil; }
|
|
21
|
-
});
|
|
22
|
-
exports.hideDynamicChannelsContent = hideDynamicChannelsContent;
|
|
23
|
-
exports.waitForAnimationEnd = waitForAnimationEnd;
|
|
24
|
-
//# sourceMappingURL=test_action.js.map
|
package/dist/test_config.js
CHANGED
|
@@ -1,31 +1,9 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var dotenv = require('dotenv');
|
|
4
|
-
|
|
5
|
-
function _interopNamespaceDefault(e) {
|
|
6
|
-
var n = Object.create(null);
|
|
7
|
-
if (e) {
|
|
8
|
-
Object.keys(e).forEach(function (k) {
|
|
9
|
-
if (k !== 'default') {
|
|
10
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
11
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
12
|
-
enumerable: true,
|
|
13
|
-
get: function () { return e[k]; }
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
n.default = e;
|
|
19
|
-
return Object.freeze(n);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
var dotenv__namespace = /*#__PURE__*/_interopNamespaceDefault(dotenv);
|
|
23
|
-
|
|
24
1
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
25
2
|
// See LICENSE.txt for license information.
|
|
26
|
-
|
|
3
|
+
import * as dotenv from 'dotenv';
|
|
4
|
+
dotenv.config();
|
|
27
5
|
// All process.env should be defined here
|
|
28
|
-
class TestConfig {
|
|
6
|
+
export class TestConfig {
|
|
29
7
|
baseURL;
|
|
30
8
|
adminUsername;
|
|
31
9
|
adminPassword;
|
|
@@ -69,14 +47,10 @@ class TestConfig {
|
|
|
69
47
|
}
|
|
70
48
|
}
|
|
71
49
|
// Create a singleton instance
|
|
72
|
-
const testConfig = new TestConfig();
|
|
50
|
+
export const testConfig = new TestConfig();
|
|
73
51
|
function parseBool(actualValue, defaultValue) {
|
|
74
52
|
return actualValue ? actualValue === 'true' : defaultValue;
|
|
75
53
|
}
|
|
76
54
|
function parseNumber(actualValue, defaultValue) {
|
|
77
55
|
return actualValue ? parseInt(actualValue, 10) : defaultValue;
|
|
78
56
|
}
|
|
79
|
-
|
|
80
|
-
exports.TestConfig = TestConfig;
|
|
81
|
-
exports.testConfig = testConfig;
|
|
82
|
-
//# sourceMappingURL=test_config.js.map
|
package/dist/test_fixture.d.ts
CHANGED
|
@@ -2,9 +2,9 @@ import { Browser, Page } from '@playwright/test';
|
|
|
2
2
|
import { AxeResults } from 'axe-core';
|
|
3
3
|
import { AxeBuilder } from '@axe-core/playwright';
|
|
4
4
|
import { TestBrowser } from './browser_context';
|
|
5
|
-
import { ensureLicense, shouldHaveCallsEnabled, shouldHaveFeatureFlag, shouldRunInLinux, skipIfFeatureFlagNotSet, skipIfNoLicense } from './flag';
|
|
5
|
+
import { ensureLicense, ensureServerDeployment, shouldHaveCallsEnabled, shouldHaveFeatureFlag, shouldRunInLinux, skipIfFeatureFlagNotSet, skipIfNoLicense } from './flag';
|
|
6
6
|
import { getBlobFromAsset, getFileFromAsset } from './file';
|
|
7
|
-
import { createRandomChannel, createRandomPost, createRandomTeam, createRandomUser, getAdminClient, initSetup } from './server';
|
|
7
|
+
import { createRandomChannel, createRandomPost, createRandomTeam, createRandomUser, ensurePluginsLoaded, getAdminClient, initSetup } from './server';
|
|
8
8
|
import { hideDynamicChannelsContent, waitForAnimationEnd } from './test_action';
|
|
9
9
|
import { matchSnapshot } from './visual';
|
|
10
10
|
import { stubNotification, waitForNotification } from './mock_browser_api';
|
|
@@ -25,10 +25,12 @@ export declare class PlaywrightExtended {
|
|
|
25
25
|
readonly shouldHaveFeatureFlag: typeof shouldHaveFeatureFlag;
|
|
26
26
|
readonly shouldRunInLinux: typeof shouldRunInLinux;
|
|
27
27
|
readonly ensureLicense: typeof ensureLicense;
|
|
28
|
+
readonly ensureServerDeployment: typeof ensureServerDeployment;
|
|
28
29
|
readonly skipIfNoLicense: typeof skipIfNoLicense;
|
|
29
30
|
readonly skipIfFeatureFlagNotSet: typeof skipIfFeatureFlagNotSet;
|
|
30
31
|
readonly getBlobFromAsset: typeof getBlobFromAsset;
|
|
31
32
|
readonly getFileFromAsset: typeof getFileFromAsset;
|
|
33
|
+
readonly ensurePluginsLoaded: typeof ensurePluginsLoaded;
|
|
32
34
|
readonly getAdminClient: typeof getAdminClient;
|
|
33
35
|
readonly initSetup: typeof initSetup;
|
|
34
36
|
readonly hideDynamicChannelsContent: typeof hideDynamicChannelsContent;
|
package/dist/test_fixture.js
CHANGED
|
@@ -1,28 +1,18 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var test$1 = require('@playwright/test');
|
|
4
|
-
var playwright = require('@axe-core/playwright');
|
|
5
|
-
var browser_context = require('./browser_context.js');
|
|
6
|
-
var flag = require('./flag.js');
|
|
7
|
-
var file = require('./file.js');
|
|
8
|
-
require('@mattermost/client');
|
|
9
|
-
require('./test_config.js');
|
|
10
|
-
var channel = require('./server/channel.js');
|
|
11
|
-
require('./server/default_config.js');
|
|
12
|
-
var init = require('./server/init.js');
|
|
13
|
-
var post = require('./server/post.js');
|
|
14
|
-
var team = require('./server/team.js');
|
|
15
|
-
var user = require('./server/user.js');
|
|
16
|
-
var test_action = require('./test_action.js');
|
|
17
|
-
var index = require('./ui/pages/index.js');
|
|
18
|
-
var index$1 = require('./visual/index.js');
|
|
19
|
-
var mock_browser_api = require('./mock_browser_api.js');
|
|
20
|
-
var util = require('./util.js');
|
|
21
|
-
var asyncWaitUntil = require('async-wait-until');
|
|
22
|
-
|
|
23
1
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
24
2
|
// See LICENSE.txt for license information.
|
|
25
|
-
|
|
3
|
+
import { test as base } from '@playwright/test';
|
|
4
|
+
import { AxeBuilder } from '@axe-core/playwright';
|
|
5
|
+
import { TestBrowser } from './browser_context';
|
|
6
|
+
import { ensureLicense, ensureServerDeployment, shouldHaveCallsEnabled, shouldHaveFeatureFlag, shouldRunInLinux, skipIfFeatureFlagNotSet, skipIfNoLicense, } from './flag';
|
|
7
|
+
import { getBlobFromAsset, getFileFromAsset } from './file';
|
|
8
|
+
import { createRandomChannel, createRandomPost, createRandomTeam, createRandomUser, ensurePluginsLoaded, getAdminClient, initSetup, } from './server';
|
|
9
|
+
import { hideDynamicChannelsContent, waitForAnimationEnd, waitUntil } from './test_action';
|
|
10
|
+
import { pages } from './ui/pages';
|
|
11
|
+
import { matchSnapshot } from './visual';
|
|
12
|
+
import { stubNotification, waitForNotification } from './mock_browser_api';
|
|
13
|
+
import { duration, getRandomId, simpleEmailRe, wait } from './util';
|
|
14
|
+
export { expect } from '@playwright/test';
|
|
15
|
+
export const test = base.extend({
|
|
26
16
|
// eslint-disable-next-line no-empty-pattern
|
|
27
17
|
axe: async ({}, use) => {
|
|
28
18
|
const ab = new AxeBuilderExtended();
|
|
@@ -34,7 +24,7 @@ const test = test$1.test.extend({
|
|
|
34
24
|
await pw.testBrowser.close();
|
|
35
25
|
},
|
|
36
26
|
});
|
|
37
|
-
class PlaywrightExtended {
|
|
27
|
+
export class PlaywrightExtended {
|
|
38
28
|
// ./browser_context
|
|
39
29
|
testBrowser;
|
|
40
30
|
// ./flag
|
|
@@ -42,12 +32,14 @@ class PlaywrightExtended {
|
|
|
42
32
|
shouldHaveFeatureFlag;
|
|
43
33
|
shouldRunInLinux;
|
|
44
34
|
ensureLicense;
|
|
35
|
+
ensureServerDeployment;
|
|
45
36
|
skipIfNoLicense;
|
|
46
37
|
skipIfFeatureFlagNotSet;
|
|
47
38
|
// ./file
|
|
48
39
|
getBlobFromAsset;
|
|
49
40
|
getFileFromAsset;
|
|
50
41
|
// ./server
|
|
42
|
+
ensurePluginsLoaded;
|
|
51
43
|
getAdminClient;
|
|
52
44
|
initSetup;
|
|
53
45
|
// ./test_action
|
|
@@ -73,44 +65,46 @@ class PlaywrightExtended {
|
|
|
73
65
|
hasSeenLandingPage;
|
|
74
66
|
constructor(browser, page, isMobile) {
|
|
75
67
|
// ./browser_context
|
|
76
|
-
this.testBrowser = new
|
|
68
|
+
this.testBrowser = new TestBrowser(browser);
|
|
77
69
|
// ./flag
|
|
78
|
-
this.shouldHaveCallsEnabled =
|
|
79
|
-
this.shouldHaveFeatureFlag =
|
|
80
|
-
this.shouldRunInLinux =
|
|
81
|
-
this.ensureLicense =
|
|
82
|
-
this.
|
|
83
|
-
this.
|
|
70
|
+
this.shouldHaveCallsEnabled = shouldHaveCallsEnabled;
|
|
71
|
+
this.shouldHaveFeatureFlag = shouldHaveFeatureFlag;
|
|
72
|
+
this.shouldRunInLinux = shouldRunInLinux;
|
|
73
|
+
this.ensureLicense = ensureLicense;
|
|
74
|
+
this.ensureServerDeployment = ensureServerDeployment;
|
|
75
|
+
this.skipIfNoLicense = skipIfNoLicense;
|
|
76
|
+
this.skipIfFeatureFlagNotSet = skipIfFeatureFlagNotSet;
|
|
84
77
|
// ./file
|
|
85
|
-
this.getBlobFromAsset =
|
|
86
|
-
this.getFileFromAsset =
|
|
78
|
+
this.getBlobFromAsset = getBlobFromAsset;
|
|
79
|
+
this.getFileFromAsset = getFileFromAsset;
|
|
87
80
|
// ./server
|
|
88
|
-
this.
|
|
89
|
-
this.
|
|
81
|
+
this.ensurePluginsLoaded = ensurePluginsLoaded;
|
|
82
|
+
this.initSetup = initSetup;
|
|
83
|
+
this.getAdminClient = getAdminClient;
|
|
90
84
|
// ./test_action
|
|
91
|
-
this.hideDynamicChannelsContent =
|
|
92
|
-
this.waitForAnimationEnd =
|
|
93
|
-
this.waitUntil =
|
|
85
|
+
this.hideDynamicChannelsContent = hideDynamicChannelsContent;
|
|
86
|
+
this.waitForAnimationEnd = waitForAnimationEnd;
|
|
87
|
+
this.waitUntil = waitUntil;
|
|
94
88
|
// unauthenticated page
|
|
95
|
-
this.loginPage = new
|
|
96
|
-
this.landingLoginPage = new
|
|
97
|
-
this.signupPage = new
|
|
98
|
-
this.resetPasswordPage = new
|
|
89
|
+
this.loginPage = new pages.LoginPage(page);
|
|
90
|
+
this.landingLoginPage = new pages.LandingLoginPage(page, isMobile);
|
|
91
|
+
this.signupPage = new pages.SignupPage(page);
|
|
92
|
+
this.resetPasswordPage = new pages.ResetPasswordPage(page);
|
|
99
93
|
// ./mock_browser_api
|
|
100
|
-
this.stubNotification =
|
|
101
|
-
this.waitForNotification =
|
|
94
|
+
this.stubNotification = stubNotification;
|
|
95
|
+
this.waitForNotification = waitForNotification;
|
|
102
96
|
// ./visual
|
|
103
|
-
this.matchSnapshot =
|
|
97
|
+
this.matchSnapshot = matchSnapshot;
|
|
104
98
|
// ./util
|
|
105
|
-
this.duration =
|
|
106
|
-
this.wait =
|
|
107
|
-
this.simpleEmailRe =
|
|
99
|
+
this.duration = duration;
|
|
100
|
+
this.wait = wait;
|
|
101
|
+
this.simpleEmailRe = simpleEmailRe;
|
|
108
102
|
this.random = {
|
|
109
|
-
id:
|
|
110
|
-
channel:
|
|
111
|
-
post:
|
|
112
|
-
team:
|
|
113
|
-
user:
|
|
103
|
+
id: getRandomId,
|
|
104
|
+
channel: createRandomChannel,
|
|
105
|
+
post: createRandomPost,
|
|
106
|
+
team: createRandomTeam,
|
|
107
|
+
user: createRandomUser,
|
|
114
108
|
};
|
|
115
109
|
this.hasSeenLandingPage = async () => {
|
|
116
110
|
// Visit the base URL to be able to set the localStorage
|
|
@@ -119,7 +113,7 @@ class PlaywrightExtended {
|
|
|
119
113
|
};
|
|
120
114
|
}
|
|
121
115
|
}
|
|
122
|
-
class AxeBuilderExtended {
|
|
116
|
+
export class AxeBuilderExtended {
|
|
123
117
|
builder;
|
|
124
118
|
// See https://github.com/dequelabs/axe-core/blob/master/doc/API.md#axe-core-tags
|
|
125
119
|
tags = ['wcag2a', 'wcag2aa'];
|
|
@@ -137,7 +131,7 @@ class AxeBuilderExtended {
|
|
|
137
131
|
// Option: make use of custom theme to improve color contrast.
|
|
138
132
|
disabledRules.push('link-in-text-block');
|
|
139
133
|
}
|
|
140
|
-
return new
|
|
134
|
+
return new AxeBuilder({ page }).withTags(this.tags).disableRules(disabledRules);
|
|
141
135
|
};
|
|
142
136
|
}
|
|
143
137
|
violationFingerprints(accessibilityScanResults) {
|
|
@@ -152,8 +146,8 @@ class AxeBuilderExtended {
|
|
|
152
146
|
return JSON.stringify(fingerprints, null, 2);
|
|
153
147
|
}
|
|
154
148
|
}
|
|
155
|
-
async function waitUntilLocalStorageIsSet(page, key, value, timeout =
|
|
156
|
-
await
|
|
149
|
+
async function waitUntilLocalStorageIsSet(page, key, value, timeout = duration.ten_sec) {
|
|
150
|
+
await waitUntil(() => page.evaluate(({ key, value }) => {
|
|
157
151
|
if (localStorage.getItem(key) === value) {
|
|
158
152
|
return true;
|
|
159
153
|
}
|
|
@@ -161,12 +155,3 @@ async function waitUntilLocalStorageIsSet(page, key, value, timeout = util.durat
|
|
|
161
155
|
return false;
|
|
162
156
|
}, { key, value }), { timeout });
|
|
163
157
|
}
|
|
164
|
-
|
|
165
|
-
Object.defineProperty(exports, "expect", {
|
|
166
|
-
enumerable: true,
|
|
167
|
-
get: function () { return test$1.expect; }
|
|
168
|
-
});
|
|
169
|
-
exports.AxeBuilderExtended = AxeBuilderExtended;
|
|
170
|
-
exports.PlaywrightExtended = PlaywrightExtended;
|
|
171
|
-
exports.test = test;
|
|
172
|
-
//# sourceMappingURL=test_fixture.js.map
|
package/dist/test_fixture.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test_fixture.js","sources":["../src/test_fixture.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Browser, Page, test as base} from '@playwright/test';\nimport {AxeResults} from 'axe-core';\nimport {AxeBuilder} from '@axe-core/playwright';\n\nimport {TestBrowser} from './browser_context';\nimport {\n ensureLicense,\n shouldHaveCallsEnabled,\n shouldHaveFeatureFlag,\n shouldRunInLinux,\n skipIfFeatureFlagNotSet,\n skipIfNoLicense,\n} from './flag';\nimport {getBlobFromAsset, getFileFromAsset} from './file';\nimport {\n createRandomChannel,\n createRandomPost,\n createRandomTeam,\n createRandomUser,\n getAdminClient,\n initSetup,\n} from './server';\nimport {hideDynamicChannelsContent, waitForAnimationEnd, waitUntil} from './test_action';\nimport {pages} from './ui/pages';\nimport {matchSnapshot} from './visual';\nimport {stubNotification, waitForNotification} from './mock_browser_api';\nimport {duration, getRandomId, simpleEmailRe, wait} from './util';\n\nexport {expect} from '@playwright/test';\n\nexport type ExtendedFixtures = {\n axe: AxeBuilderExtended;\n pw: PlaywrightExtended;\n};\n\ntype AxeBuilderOptions = {\n disableColorContrast?: boolean;\n disableLinkInTextBlock?: boolean;\n};\n\nexport const test = base.extend<ExtendedFixtures>({\n // eslint-disable-next-line no-empty-pattern\n axe: async ({}, use) => {\n const ab = new AxeBuilderExtended();\n await use(ab);\n },\n pw: async ({browser, page, isMobile}, use) => {\n const pw = new PlaywrightExtended(browser, page, isMobile);\n await use(pw);\n await pw.testBrowser.close();\n },\n});\n\nexport class PlaywrightExtended {\n // ./browser_context\n readonly testBrowser;\n\n // ./flag\n readonly shouldHaveCallsEnabled;\n readonly shouldHaveFeatureFlag;\n readonly shouldRunInLinux;\n readonly ensureLicense;\n readonly skipIfNoLicense;\n readonly skipIfFeatureFlagNotSet;\n\n // ./file\n readonly getBlobFromAsset;\n readonly getFileFromAsset;\n\n // ./server\n readonly getAdminClient;\n readonly initSetup;\n\n // ./test_action\n readonly hideDynamicChannelsContent;\n readonly waitForAnimationEnd;\n readonly waitUntil;\n\n // ./mock_browser_api\n readonly stubNotification;\n readonly waitForNotification;\n\n // ./visual\n readonly matchSnapshot;\n\n // ./util\n readonly duration;\n readonly simpleEmailRe;\n readonly wait;\n\n // random\n readonly random;\n\n // unauthenticated page\n readonly loginPage;\n readonly landingLoginPage;\n readonly signupPage;\n readonly resetPasswordPage;\n\n readonly hasSeenLandingPage;\n\n constructor(browser: Browser, page: Page, isMobile: boolean) {\n // ./browser_context\n this.testBrowser = new TestBrowser(browser);\n\n // ./flag\n this.shouldHaveCallsEnabled = shouldHaveCallsEnabled;\n this.shouldHaveFeatureFlag = shouldHaveFeatureFlag;\n this.shouldRunInLinux = shouldRunInLinux;\n this.ensureLicense = ensureLicense;\n this.skipIfNoLicense = skipIfNoLicense;\n this.skipIfFeatureFlagNotSet = skipIfFeatureFlagNotSet;\n\n // ./file\n this.getBlobFromAsset = getBlobFromAsset;\n this.getFileFromAsset = getFileFromAsset;\n\n // ./server\n this.initSetup = initSetup;\n this.getAdminClient = getAdminClient;\n\n // ./test_action\n this.hideDynamicChannelsContent = hideDynamicChannelsContent;\n this.waitForAnimationEnd = waitForAnimationEnd;\n this.waitUntil = waitUntil;\n\n // unauthenticated page\n this.loginPage = new pages.LoginPage(page);\n this.landingLoginPage = new pages.LandingLoginPage(page, isMobile);\n this.signupPage = new pages.SignupPage(page);\n this.resetPasswordPage = new pages.ResetPasswordPage(page);\n\n // ./mock_browser_api\n this.stubNotification = stubNotification;\n this.waitForNotification = waitForNotification;\n\n // ./visual\n this.matchSnapshot = matchSnapshot;\n\n // ./util\n this.duration = duration;\n this.wait = wait;\n this.simpleEmailRe = simpleEmailRe;\n\n this.random = {\n id: getRandomId,\n channel: createRandomChannel,\n post: createRandomPost,\n team: createRandomTeam,\n user: createRandomUser,\n };\n\n this.hasSeenLandingPage = async () => {\n // Visit the base URL to be able to set the localStorage\n await page.goto('/');\n return await waitUntilLocalStorageIsSet(page, '__landingPageSeen__', 'true');\n };\n }\n}\n\nexport class AxeBuilderExtended {\n readonly builder: (page: Page, options?: AxeBuilderOptions) => AxeBuilder;\n\n // See https://github.com/dequelabs/axe-core/blob/master/doc/API.md#axe-core-tags\n readonly tags: string[] = ['wcag2a', 'wcag2aa'];\n\n constructor() {\n this.builder = (page: Page, options: AxeBuilderOptions = {}) => {\n // See https://github.com/dequelabs/axe-core/blob/master/doc/rule-descriptions.md#wcag-20-level-a--aa-rules\n const disabledRules: string[] = [];\n\n if (options.disableColorContrast) {\n // Disabled in pages due to impact to overall theme of Mattermost.\n // Option: make use of custom theme to improve color contrast.\n disabledRules.push('color-contrast');\n }\n\n if (options.disableLinkInTextBlock) {\n // Disabled in pages due to impact to overall theme of Mattermost.\n // Option: make use of custom theme to improve color contrast.\n disabledRules.push('link-in-text-block');\n }\n\n return new AxeBuilder({page}).withTags(this.tags).disableRules(disabledRules);\n };\n }\n\n violationFingerprints(accessibilityScanResults: AxeResults) {\n const fingerprints = accessibilityScanResults.violations.map((violation) => ({\n rule: violation.id,\n description: violation.description,\n helpUrl: violation.helpUrl,\n targets: violation.nodes.map((node) => {\n return {target: node.target, impact: node.impact, html: node.html};\n }),\n }));\n\n return JSON.stringify(fingerprints, null, 2);\n }\n}\n\nasync function waitUntilLocalStorageIsSet(page: Page, key: string, value: string, timeout = duration.ten_sec) {\n await waitUntil(\n () =>\n page.evaluate(\n ({key, value}) => {\n if (localStorage.getItem(key) === value) {\n return true;\n }\n localStorage.setItem(key, value);\n return false;\n },\n {key, value},\n ),\n {timeout},\n );\n}\n"],"names":["base","TestBrowser","shouldHaveCallsEnabled","shouldHaveFeatureFlag","shouldRunInLinux","ensureLicense","skipIfNoLicense","skipIfFeatureFlagNotSet","getBlobFromAsset","getFileFromAsset","initSetup","getAdminClient","hideDynamicChannelsContent","waitForAnimationEnd","waitUntil","pages","stubNotification","waitForNotification","matchSnapshot","duration","wait","simpleEmailRe","getRandomId","createRandomChannel","createRandomPost","createRandomTeam","createRandomUser","AxeBuilder"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AA0Ca,MAAA,IAAI,GAAGA,WAAI,CAAC,MAAM,CAAmB;;AAE9C,IAAA,GAAG,EAAE,OAAO,EAAE,EAAE,GAAG,KAAI;AACnB,QAAA,MAAM,EAAE,GAAG,IAAI,kBAAkB,EAAE;AACnC,QAAA,MAAM,GAAG,CAAC,EAAE,CAAC;KAChB;AACD,IAAA,EAAE,EAAE,OAAO,EAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAC,EAAE,GAAG,KAAI;QACzC,MAAM,EAAE,GAAG,IAAI,kBAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC;AAC1D,QAAA,MAAM,GAAG,CAAC,EAAE,CAAC;AACb,QAAA,MAAM,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE;KAC/B;AACJ,CAAA;MAEY,kBAAkB,CAAA;;AAElB,IAAA,WAAW;;AAGX,IAAA,sBAAsB;AACtB,IAAA,qBAAqB;AACrB,IAAA,gBAAgB;AAChB,IAAA,aAAa;AACb,IAAA,eAAe;AACf,IAAA,uBAAuB;;AAGvB,IAAA,gBAAgB;AAChB,IAAA,gBAAgB;;AAGhB,IAAA,cAAc;AACd,IAAA,SAAS;;AAGT,IAAA,0BAA0B;AAC1B,IAAA,mBAAmB;AACnB,IAAA,SAAS;;AAGT,IAAA,gBAAgB;AAChB,IAAA,mBAAmB;;AAGnB,IAAA,aAAa;;AAGb,IAAA,QAAQ;AACR,IAAA,aAAa;AACb,IAAA,IAAI;;AAGJ,IAAA,MAAM;;AAGN,IAAA,SAAS;AACT,IAAA,gBAAgB;AAChB,IAAA,UAAU;AACV,IAAA,iBAAiB;AAEjB,IAAA,kBAAkB;AAE3B,IAAA,WAAA,CAAY,OAAgB,EAAE,IAAU,EAAE,QAAiB,EAAA;;QAEvD,IAAI,CAAC,WAAW,GAAG,IAAIC,2BAAW,CAAC,OAAO,CAAC;;AAG3C,QAAA,IAAI,CAAC,sBAAsB,GAAGC,2BAAsB;AACpD,QAAA,IAAI,CAAC,qBAAqB,GAAGC,0BAAqB;AAClD,QAAA,IAAI,CAAC,gBAAgB,GAAGC,qBAAgB;AACxC,QAAA,IAAI,CAAC,aAAa,GAAGC,kBAAa;AAClC,QAAA,IAAI,CAAC,eAAe,GAAGC,oBAAe;AACtC,QAAA,IAAI,CAAC,uBAAuB,GAAGC,4BAAuB;;AAGtD,QAAA,IAAI,CAAC,gBAAgB,GAAGC,qBAAgB;AACxC,QAAA,IAAI,CAAC,gBAAgB,GAAGC,qBAAgB;;AAGxC,QAAA,IAAI,CAAC,SAAS,GAAGC,cAAS;AAC1B,QAAA,IAAI,CAAC,cAAc,GAAGC,mBAAc;;AAGpC,QAAA,IAAI,CAAC,0BAA0B,GAAGC,sCAA0B;AAC5D,QAAA,IAAI,CAAC,mBAAmB,GAAGC,+BAAmB;AAC9C,QAAA,IAAI,CAAC,SAAS,GAAGC,wBAAS;;QAG1B,IAAI,CAAC,SAAS,GAAG,IAAIC,WAAK,CAAC,SAAS,CAAC,IAAI,CAAC;AAC1C,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAIA,WAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC;QAClE,IAAI,CAAC,UAAU,GAAG,IAAIA,WAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QAC5C,IAAI,CAAC,iBAAiB,GAAG,IAAIA,WAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC;;AAG1D,QAAA,IAAI,CAAC,gBAAgB,GAAGC,iCAAgB;AACxC,QAAA,IAAI,CAAC,mBAAmB,GAAGC,oCAAmB;;AAG9C,QAAA,IAAI,CAAC,aAAa,GAAGC,qBAAa;;AAGlC,QAAA,IAAI,CAAC,QAAQ,GAAGC,aAAQ;AACxB,QAAA,IAAI,CAAC,IAAI,GAAGC,SAAI;AAChB,QAAA,IAAI,CAAC,aAAa,GAAGC,kBAAa;QAElC,IAAI,CAAC,MAAM,GAAG;AACV,YAAA,EAAE,EAAEC,gBAAW;AACf,YAAA,OAAO,EAAEC,2BAAmB;AAC5B,YAAA,IAAI,EAAEC,qBAAgB;AACtB,YAAA,IAAI,EAAEC,qBAAgB;AACtB,YAAA,IAAI,EAAEC,qBAAgB;SACzB;AAED,QAAA,IAAI,CAAC,kBAAkB,GAAG,YAAW;;AAEjC,YAAA,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YACpB,OAAO,MAAM,0BAA0B,CAAC,IAAI,EAAE,qBAAqB,EAAE,MAAM,CAAC;AAChF,SAAC;;AAER;MAEY,kBAAkB,CAAA;AAClB,IAAA,OAAO;;AAGP,IAAA,IAAI,GAAa,CAAC,QAAQ,EAAE,SAAS,CAAC;AAE/C,IAAA,WAAA,GAAA;QACI,IAAI,CAAC,OAAO,GAAG,CAAC,IAAU,EAAE,OAAA,GAA6B,EAAE,KAAI;;YAE3D,MAAM,aAAa,GAAa,EAAE;AAElC,YAAA,IAAI,OAAO,CAAC,oBAAoB,EAAE;;;AAG9B,gBAAA,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC;;AAGxC,YAAA,IAAI,OAAO,CAAC,sBAAsB,EAAE;;;AAGhC,gBAAA,aAAa,CAAC,IAAI,CAAC,oBAAoB,CAAC;;AAG5C,YAAA,OAAO,IAAIC,qBAAU,CAAC,EAAC,IAAI,EAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC;AACjF,SAAC;;AAGL,IAAA,qBAAqB,CAAC,wBAAoC,EAAA;AACtD,QAAA,MAAM,YAAY,GAAG,wBAAwB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,MAAM;YACzE,IAAI,EAAE,SAAS,CAAC,EAAE;YAClB,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;AAClC,gBAAA,OAAO,EAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAC;AACtE,aAAC,CAAC;AACL,SAAA,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;;AAEnD;AAED,eAAe,0BAA0B,CAAC,IAAU,EAAE,GAAW,EAAE,KAAa,EAAE,OAAO,GAAGR,aAAQ,CAAC,OAAO,EAAA;AACxG,IAAA,MAAML,wBAAS,CACX,MACI,IAAI,CAAC,QAAQ,CACT,CAAC,EAAC,GAAG,EAAE,KAAK,EAAC,KAAI;QACb,IAAI,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE;AACrC,YAAA,OAAO,IAAI;;AAEf,QAAA,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;AAChC,QAAA,OAAO,KAAK;AAChB,KAAC,EACD,EAAC,GAAG,EAAE,KAAK,EAAC,CACf,EACL,EAAC,OAAO,EAAC,CACZ;AACL;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"test_fixture.js","sources":["../src/test_fixture.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Browser, Page, test as base} from '@playwright/test';\nimport {AxeResults} from 'axe-core';\nimport {AxeBuilder} from '@axe-core/playwright';\n\nimport {TestBrowser} from './browser_context';\nimport {\n ensureLicense,\n ensureServerDeployment,\n shouldHaveCallsEnabled,\n shouldHaveFeatureFlag,\n shouldRunInLinux,\n skipIfFeatureFlagNotSet,\n skipIfNoLicense,\n} from './flag';\nimport {getBlobFromAsset, getFileFromAsset} from './file';\nimport {\n createRandomChannel,\n createRandomPost,\n createRandomTeam,\n createRandomUser,\n ensurePluginsLoaded,\n getAdminClient,\n initSetup,\n} from './server';\nimport {hideDynamicChannelsContent, waitForAnimationEnd, waitUntil} from './test_action';\nimport {pages} from './ui/pages';\nimport {matchSnapshot} from './visual';\nimport {stubNotification, waitForNotification} from './mock_browser_api';\nimport {duration, getRandomId, simpleEmailRe, wait} from './util';\n\nexport {expect} from '@playwright/test';\n\nexport type ExtendedFixtures = {\n axe: AxeBuilderExtended;\n pw: PlaywrightExtended;\n};\n\ntype AxeBuilderOptions = {\n disableColorContrast?: boolean;\n disableLinkInTextBlock?: boolean;\n};\n\nexport const test = base.extend<ExtendedFixtures>({\n // eslint-disable-next-line no-empty-pattern\n axe: async ({}, use) => {\n const ab = new AxeBuilderExtended();\n await use(ab);\n },\n pw: async ({browser, page, isMobile}, use) => {\n const pw = new PlaywrightExtended(browser, page, isMobile);\n await use(pw);\n await pw.testBrowser.close();\n },\n});\n\nexport class PlaywrightExtended {\n // ./browser_context\n readonly testBrowser;\n\n // ./flag\n readonly shouldHaveCallsEnabled;\n readonly shouldHaveFeatureFlag;\n readonly shouldRunInLinux;\n readonly ensureLicense;\n readonly ensureServerDeployment;\n readonly skipIfNoLicense;\n readonly skipIfFeatureFlagNotSet;\n\n // ./file\n readonly getBlobFromAsset;\n readonly getFileFromAsset;\n\n // ./server\n readonly ensurePluginsLoaded;\n readonly getAdminClient;\n readonly initSetup;\n\n // ./test_action\n readonly hideDynamicChannelsContent;\n readonly waitForAnimationEnd;\n readonly waitUntil;\n\n // ./mock_browser_api\n readonly stubNotification;\n readonly waitForNotification;\n\n // ./visual\n readonly matchSnapshot;\n\n // ./util\n readonly duration;\n readonly simpleEmailRe;\n readonly wait;\n\n // random\n readonly random;\n\n // unauthenticated page\n readonly loginPage;\n readonly landingLoginPage;\n readonly signupPage;\n readonly resetPasswordPage;\n\n readonly hasSeenLandingPage;\n\n constructor(browser: Browser, page: Page, isMobile: boolean) {\n // ./browser_context\n this.testBrowser = new TestBrowser(browser);\n\n // ./flag\n this.shouldHaveCallsEnabled = shouldHaveCallsEnabled;\n this.shouldHaveFeatureFlag = shouldHaveFeatureFlag;\n this.shouldRunInLinux = shouldRunInLinux;\n this.ensureLicense = ensureLicense;\n this.ensureServerDeployment = ensureServerDeployment;\n this.skipIfNoLicense = skipIfNoLicense;\n this.skipIfFeatureFlagNotSet = skipIfFeatureFlagNotSet;\n\n // ./file\n this.getBlobFromAsset = getBlobFromAsset;\n this.getFileFromAsset = getFileFromAsset;\n\n // ./server\n this.ensurePluginsLoaded = ensurePluginsLoaded;\n this.initSetup = initSetup;\n this.getAdminClient = getAdminClient;\n\n // ./test_action\n this.hideDynamicChannelsContent = hideDynamicChannelsContent;\n this.waitForAnimationEnd = waitForAnimationEnd;\n this.waitUntil = waitUntil;\n\n // unauthenticated page\n this.loginPage = new pages.LoginPage(page);\n this.landingLoginPage = new pages.LandingLoginPage(page, isMobile);\n this.signupPage = new pages.SignupPage(page);\n this.resetPasswordPage = new pages.ResetPasswordPage(page);\n\n // ./mock_browser_api\n this.stubNotification = stubNotification;\n this.waitForNotification = waitForNotification;\n\n // ./visual\n this.matchSnapshot = matchSnapshot;\n\n // ./util\n this.duration = duration;\n this.wait = wait;\n this.simpleEmailRe = simpleEmailRe;\n\n this.random = {\n id: getRandomId,\n channel: createRandomChannel,\n post: createRandomPost,\n team: createRandomTeam,\n user: createRandomUser,\n };\n\n this.hasSeenLandingPage = async () => {\n // Visit the base URL to be able to set the localStorage\n await page.goto('/');\n return await waitUntilLocalStorageIsSet(page, '__landingPageSeen__', 'true');\n };\n }\n}\n\nexport class AxeBuilderExtended {\n readonly builder: (page: Page, options?: AxeBuilderOptions) => AxeBuilder;\n\n // See https://github.com/dequelabs/axe-core/blob/master/doc/API.md#axe-core-tags\n readonly tags: string[] = ['wcag2a', 'wcag2aa'];\n\n constructor() {\n this.builder = (page: Page, options: AxeBuilderOptions = {}) => {\n // See https://github.com/dequelabs/axe-core/blob/master/doc/rule-descriptions.md#wcag-20-level-a--aa-rules\n const disabledRules: string[] = [];\n\n if (options.disableColorContrast) {\n // Disabled in pages due to impact to overall theme of Mattermost.\n // Option: make use of custom theme to improve color contrast.\n disabledRules.push('color-contrast');\n }\n\n if (options.disableLinkInTextBlock) {\n // Disabled in pages due to impact to overall theme of Mattermost.\n // Option: make use of custom theme to improve color contrast.\n disabledRules.push('link-in-text-block');\n }\n\n return new AxeBuilder({page}).withTags(this.tags).disableRules(disabledRules);\n };\n }\n\n violationFingerprints(accessibilityScanResults: AxeResults) {\n const fingerprints = accessibilityScanResults.violations.map((violation) => ({\n rule: violation.id,\n description: violation.description,\n helpUrl: violation.helpUrl,\n targets: violation.nodes.map((node) => {\n return {target: node.target, impact: node.impact, html: node.html};\n }),\n }));\n\n return JSON.stringify(fingerprints, null, 2);\n }\n}\n\nasync function waitUntilLocalStorageIsSet(page: Page, key: string, value: string, timeout = duration.ten_sec) {\n await waitUntil(\n () =>\n page.evaluate(\n ({key, value}) => {\n if (localStorage.getItem(key) === value) {\n return true;\n }\n localStorage.setItem(key, value);\n return false;\n },\n {key, value},\n ),\n {timeout},\n );\n}\n"],"names":["base","TestBrowser","shouldHaveCallsEnabled","shouldHaveFeatureFlag","shouldRunInLinux","ensureLicense","ensureServerDeployment","skipIfNoLicense","skipIfFeatureFlagNotSet","getBlobFromAsset","getFileFromAsset","ensurePluginsLoaded","initSetup","getAdminClient","hideDynamicChannelsContent","waitForAnimationEnd","waitUntil","pages","stubNotification","waitForNotification","matchSnapshot","duration","wait","simpleEmailRe","getRandomId","createRandomChannel","createRandomPost","createRandomTeam","createRandomUser","AxeBuilder"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"root":["../src/browser_context.ts","../src/constant.ts","../src/file.ts","../src/flag.ts","../src/global_setup.ts","../src/index.ts","../src/mock_browser_api.ts","../src/test_action.ts","../src/test_config.ts","../src/test_fixture.ts","../src/types.ts","../src/util.ts","../src/server/channel.ts","../src/server/client.ts","../src/server/default_config.ts","../src/server/index.ts","../src/server/init.ts","../src/server/plugins.ts","../src/server/post.ts","../src/server/team.ts","../src/server/user.ts","../src/ui/components/footer.ts","../src/ui/components/global_header.ts","../src/ui/components/index.ts","../src/ui/components/main_header.ts","../src/ui/components/channels/app_bar.ts","../src/ui/components/channels/center_view.ts","../src/ui/components/channels/delete_post_confirmation_dialog.ts","../src/ui/components/channels/delete_post_modal.ts","../src/ui/components/channels/emoji_gif_picker.ts","../src/ui/components/channels/find_channels_modal.ts","../src/ui/components/channels/generic_confirm_modal.ts","../src/ui/components/channels/header.ts","../src/ui/components/channels/message_priority.ts","../src/ui/components/channels/post.ts","../src/ui/components/channels/post_create.ts","../src/ui/components/channels/post_dot_menu.ts","../src/ui/components/channels/post_edit.ts","../src/ui/components/channels/post_menu.ts","../src/ui/components/channels/post_reminder_menu.ts","../src/ui/components/channels/restore_post_confirmation_dialog.ts","../src/ui/components/channels/scheduled_draft_menu.ts","../src/ui/components/channels/scheduled_draft_modal.ts","../src/ui/components/channels/search_popover.ts","../src/ui/components/channels/sidebar_left.ts","../src/ui/components/channels/sidebar_right.ts","../src/ui/components/channels/thread_footer.ts","../src/ui/components/channels/user_profile_popover.ts","../src/ui/components/channels/settings/notification_settings.ts","../src/ui/components/channels/settings/settings_modal.ts","../src/ui/components/system_console/navbar.ts","../src/ui/components/system_console/sidebar.ts","../src/ui/components/system_console/sections/system_users/column_toggle_menu.ts","../src/ui/components/system_console/sections/system_users/feature_discovery.ts","../src/ui/components/system_console/sections/system_users/filter_menu.ts","../src/ui/components/system_console/sections/system_users/filter_popover.ts","../src/ui/components/system_console/sections/system_users/mobile_security.ts","../src/ui/components/system_console/sections/system_users/system_users.ts","../src/ui/pages/channels.ts","../src/ui/pages/drafts.ts","../src/ui/pages/index.ts","../src/ui/pages/landing_login.ts","../src/ui/pages/login.ts","../src/ui/pages/reset_password.ts","../src/ui/pages/scheduled_draft.ts","../src/ui/pages/signup.ts","../src/ui/pages/system_console.ts","../src/visual/index.ts","../src/visual/percy.ts"],"version":"5.8.2"}
|
package/dist/types.js
ADDED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var test = require('@playwright/test');
|
|
4
|
-
|
|
5
1
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
6
2
|
// See LICENSE.txt for license information.
|
|
7
|
-
|
|
3
|
+
import { expect } from '@playwright/test';
|
|
4
|
+
export default class ChannelsAppBar {
|
|
8
5
|
container;
|
|
9
6
|
playbooksIcon;
|
|
10
7
|
constructor(container) {
|
|
@@ -12,9 +9,6 @@ class ChannelsAppBar {
|
|
|
12
9
|
this.playbooksIcon = container.locator('#app-bar-icon-playbooks').getByRole('img');
|
|
13
10
|
}
|
|
14
11
|
async toBeVisible() {
|
|
15
|
-
await
|
|
12
|
+
await expect(this.container).toBeVisible();
|
|
16
13
|
}
|
|
17
14
|
}
|
|
18
|
-
|
|
19
|
-
module.exports = ChannelsAppBar;
|
|
20
|
-
//# sourceMappingURL=app_bar.js.map
|
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var test = require('@playwright/test');
|
|
4
|
-
var header = require('./header.js');
|
|
5
|
-
var post_create = require('./post_create.js');
|
|
6
|
-
var post_edit = require('./post_edit.js');
|
|
7
|
-
var post = require('./post.js');
|
|
8
|
-
var util = require('../../../util.js');
|
|
9
|
-
var asyncWaitUntil = require('async-wait-until');
|
|
10
|
-
|
|
11
1
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
12
2
|
// See LICENSE.txt for license information.
|
|
13
|
-
|
|
3
|
+
import { expect } from '@playwright/test';
|
|
4
|
+
import ChannelsHeader from './header';
|
|
5
|
+
import ChannelsPostCreate from './post_create';
|
|
6
|
+
import ChannelsPostEdit from './post_edit';
|
|
7
|
+
import ChannelsPost from './post';
|
|
8
|
+
import { duration } from '@/util';
|
|
9
|
+
import { waitUntil } from '@/test_action';
|
|
10
|
+
export default class ChannelsCenterView {
|
|
14
11
|
container;
|
|
15
12
|
header;
|
|
16
13
|
postCreate;
|
|
@@ -26,10 +23,10 @@ class ChannelsCenterView {
|
|
|
26
23
|
constructor(container) {
|
|
27
24
|
this.container = container;
|
|
28
25
|
this.scheduledDraftChannelInfoMessageLocator = 'span:has-text("Message scheduled for")';
|
|
29
|
-
this.header = new
|
|
30
|
-
this.postCreate = new
|
|
31
|
-
this.scheduledDraftOptions = new
|
|
32
|
-
this.postEdit = new
|
|
26
|
+
this.header = new ChannelsHeader(this.container.locator('.channel-header'));
|
|
27
|
+
this.postCreate = new ChannelsPostCreate(container.getByTestId('post-create'));
|
|
28
|
+
this.scheduledDraftOptions = new ChannelsPostCreate(container.locator('#dropdown_send_post_options'));
|
|
29
|
+
this.postEdit = new ChannelsPostEdit(container.locator('.post-edit__container'));
|
|
33
30
|
this.postBoxIndicator = container.locator('div.postBoxIndicator');
|
|
34
31
|
this.scheduledDraftChannelIcon = container.locator('#create_post i.icon-draft-indicator');
|
|
35
32
|
this.scheduledDraftChannelInfoMessage = container.locator('div.ScheduledPostIndicator span');
|
|
@@ -38,7 +35,7 @@ class ChannelsCenterView {
|
|
|
38
35
|
this.editedPostIcon = (postID) => container.locator(`#postEdited_${postID}`);
|
|
39
36
|
}
|
|
40
37
|
async toBeVisible() {
|
|
41
|
-
await
|
|
38
|
+
await expect(this.container).toBeVisible();
|
|
42
39
|
await this.postCreate.toBeVisible();
|
|
43
40
|
}
|
|
44
41
|
/**
|
|
@@ -54,7 +51,7 @@ class ChannelsCenterView {
|
|
|
54
51
|
async getFirstPost() {
|
|
55
52
|
const firstPost = this.container.getByTestId('postView').first();
|
|
56
53
|
await firstPost.waitFor();
|
|
57
|
-
return new
|
|
54
|
+
return new ChannelsPost(firstPost);
|
|
58
55
|
}
|
|
59
56
|
/**
|
|
60
57
|
* Return the last post in the Center
|
|
@@ -62,7 +59,7 @@ class ChannelsCenterView {
|
|
|
62
59
|
async getLastPost() {
|
|
63
60
|
const lastPost = this.container.getByTestId('postView').last();
|
|
64
61
|
await lastPost.waitFor();
|
|
65
|
-
return new
|
|
62
|
+
return new ChannelsPost(lastPost);
|
|
66
63
|
}
|
|
67
64
|
/**
|
|
68
65
|
* Return the ID of the last post in the Center
|
|
@@ -82,7 +79,7 @@ class ChannelsCenterView {
|
|
|
82
79
|
async getNthPost(index) {
|
|
83
80
|
const nthPost = this.container.getByTestId('postView').nth(index);
|
|
84
81
|
await nthPost.waitFor();
|
|
85
|
-
return new
|
|
82
|
+
return new ChannelsPost(nthPost);
|
|
86
83
|
}
|
|
87
84
|
/**
|
|
88
85
|
* Returns the Center post by post's id
|
|
@@ -91,17 +88,17 @@ class ChannelsCenterView {
|
|
|
91
88
|
async getPostById(id) {
|
|
92
89
|
const postById = this.container.locator(`[id="post_${id}"]`);
|
|
93
90
|
await postById.waitFor();
|
|
94
|
-
return new
|
|
91
|
+
return new ChannelsPost(postById);
|
|
95
92
|
}
|
|
96
|
-
async waitUntilLastPostContains(text, timeout =
|
|
97
|
-
await
|
|
93
|
+
async waitUntilLastPostContains(text, timeout = duration.ten_sec) {
|
|
94
|
+
await waitUntil(async () => {
|
|
98
95
|
const post = await this.getLastPost();
|
|
99
96
|
const content = await post.container.textContent();
|
|
100
97
|
return content?.includes(text);
|
|
101
98
|
}, { timeout });
|
|
102
99
|
}
|
|
103
|
-
async waitUntilPostWithIdContains(id, text, timeout =
|
|
104
|
-
await
|
|
100
|
+
async waitUntilPostWithIdContains(id, text, timeout = duration.ten_sec) {
|
|
101
|
+
await waitUntil(async () => {
|
|
105
102
|
const post = await this.getPostById(id);
|
|
106
103
|
const content = await post.container.textContent();
|
|
107
104
|
return content?.includes(text);
|
|
@@ -111,7 +108,7 @@ class ChannelsCenterView {
|
|
|
111
108
|
await this.postBoxIndicator.isVisible();
|
|
112
109
|
await this.scheduledDraftChannelIcon.isVisible();
|
|
113
110
|
const messageLocator = this.scheduledDraftChannelInfoMessage.first();
|
|
114
|
-
await
|
|
111
|
+
await expect(messageLocator).toContainText('Message scheduled for');
|
|
115
112
|
}
|
|
116
113
|
async clickOnLastEditedPost(postID) {
|
|
117
114
|
if (postID) {
|
|
@@ -119,6 +116,3 @@ class ChannelsCenterView {
|
|
|
119
116
|
}
|
|
120
117
|
}
|
|
121
118
|
}
|
|
122
|
-
|
|
123
|
-
module.exports = ChannelsCenterView;
|
|
124
|
-
//# sourceMappingURL=center_view.js.map
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var test = require('@playwright/test');
|
|
4
|
-
|
|
5
1
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
6
2
|
// See LICENSE.txt for license information.
|
|
7
|
-
|
|
3
|
+
import { expect } from '@playwright/test';
|
|
4
|
+
export default class DeletePostConfirmationDialog {
|
|
8
5
|
container;
|
|
9
6
|
cancelButton;
|
|
10
7
|
confirmButton;
|
|
@@ -14,14 +11,14 @@ class DeletePostConfirmationDialog {
|
|
|
14
11
|
this.confirmButton = container.locator('button#deletePostModalButton');
|
|
15
12
|
}
|
|
16
13
|
async toBeVisible() {
|
|
17
|
-
await
|
|
18
|
-
await
|
|
19
|
-
await
|
|
14
|
+
await expect(this.container).toBeVisible();
|
|
15
|
+
await expect(this.cancelButton).toBeVisible();
|
|
16
|
+
await expect(this.confirmButton).toBeVisible();
|
|
20
17
|
}
|
|
21
18
|
async notToBeVisible() {
|
|
22
|
-
await
|
|
23
|
-
await
|
|
24
|
-
await
|
|
19
|
+
await expect(this.container).not.toBeVisible();
|
|
20
|
+
await expect(this.cancelButton).not.toBeVisible();
|
|
21
|
+
await expect(this.confirmButton).not.toBeVisible();
|
|
25
22
|
}
|
|
26
23
|
async cancelDeletion() {
|
|
27
24
|
await this.cancelButton.click();
|
|
@@ -30,6 +27,3 @@ class DeletePostConfirmationDialog {
|
|
|
30
27
|
await this.confirmButton.click();
|
|
31
28
|
}
|
|
32
29
|
}
|
|
33
|
-
|
|
34
|
-
module.exports = DeletePostConfirmationDialog;
|
|
35
|
-
//# sourceMappingURL=delete_post_confirmation_dialog.js.map
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var test = require('@playwright/test');
|
|
4
|
-
|
|
5
1
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
6
2
|
// See LICENSE.txt for license information.
|
|
7
|
-
|
|
3
|
+
import { expect } from '@playwright/test';
|
|
4
|
+
export default class DeletePostModal {
|
|
8
5
|
container;
|
|
9
6
|
confirmButton;
|
|
10
7
|
constructor(container) {
|
|
@@ -12,15 +9,12 @@ class DeletePostModal {
|
|
|
12
9
|
this.confirmButton = container.locator('#deletePostModalButton');
|
|
13
10
|
}
|
|
14
11
|
async toBeVisible() {
|
|
15
|
-
await
|
|
12
|
+
await expect(this.container).toBeVisible();
|
|
16
13
|
}
|
|
17
14
|
async confirm() {
|
|
18
15
|
await this.confirmButton.waitFor();
|
|
19
16
|
await this.confirmButton.click();
|
|
20
17
|
// Wait for the modal to disappear
|
|
21
|
-
await
|
|
18
|
+
await expect(this.container).not.toBeVisible();
|
|
22
19
|
}
|
|
23
20
|
}
|
|
24
|
-
|
|
25
|
-
module.exports = DeletePostModal;
|
|
26
|
-
//# sourceMappingURL=delete_post_modal.js.map
|