@mattermost/playwright-lib 10.6.0 → 10.7.0-0
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 +21 -14
- package/dist/constant.js +6 -3
- package/dist/file.js +20 -20
- package/dist/flag.js +38 -26
- package/dist/global_setup.d.ts +0 -2
- package/dist/global_setup.js +32 -43
- package/dist/global_setup.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +42 -10
- package/dist/index.js.map +1 -1
- package/dist/mock_browser_api.js +8 -2
- package/dist/server/channel.js +9 -3
- package/dist/server/client.js +16 -10
- package/dist/server/default_config.js +24 -11
- package/dist/server/default_config.js.map +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.js +1 -0
- package/dist/server/init.js +36 -29
- package/dist/server/plugins.d.ts +2 -0
- package/dist/server/plugins.js +31 -0
- package/dist/server/plugins.js.map +1 -0
- package/dist/server/post.js +9 -3
- package/dist/server/team.js +9 -3
- package/dist/server/user.js +15 -8
- package/dist/test_action.js +14 -3
- package/dist/test_config.js +30 -4
- package/dist/test_fixture.d.ts +2 -1
- package/dist/test_fixture.js +69 -47
- package/dist/test_fixture.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/ui/components/channels/app_bar.js +9 -3
- package/dist/ui/components/channels/center_view.js +28 -22
- package/dist/ui/components/channels/delete_post_confirmation_dialog.js +14 -8
- package/dist/ui/components/channels/delete_post_modal.js +10 -4
- package/dist/ui/components/channels/emoji_gif_picker.js +15 -9
- package/dist/ui/components/channels/find_channels_modal.js +9 -3
- package/dist/ui/components/channels/generic_confirm_modal.js +11 -5
- package/dist/ui/components/channels/header.js +9 -3
- package/dist/ui/components/channels/message_priority.js +20 -14
- package/dist/ui/components/channels/post.js +16 -10
- package/dist/ui/components/channels/post_create.js +29 -23
- package/dist/ui/components/channels/post_dot_menu.js +9 -3
- package/dist/ui/components/channels/post_edit.js +22 -16
- package/dist/ui/components/channels/post_menu.js +9 -3
- package/dist/ui/components/channels/post_reminder_menu.js +9 -3
- package/dist/ui/components/channels/restore_post_confirmation_dialog.js +12 -6
- package/dist/ui/components/channels/scheduled_draft_menu.js +9 -3
- package/dist/ui/components/channels/scheduled_draft_modal.js +10 -4
- package/dist/ui/components/channels/search_popover.js +9 -3
- package/dist/ui/components/channels/settings/notification_settings.js +14 -8
- package/dist/ui/components/channels/settings/settings_modal.js +13 -7
- package/dist/ui/components/channels/sidebar_left.js +14 -8
- package/dist/ui/components/channels/sidebar_right.js +26 -20
- package/dist/ui/components/channels/thread_footer.js +9 -3
- package/dist/ui/components/channels/user_profile_popover.js +9 -3
- package/dist/ui/components/footer.js +9 -3
- package/dist/ui/components/global_header.d.ts +1 -0
- package/dist/ui/components/global_header.js +15 -7
- package/dist/ui/components/global_header.js.map +1 -1
- package/dist/ui/components/index.js +74 -72
- package/dist/ui/components/main_header.js +9 -3
- package/dist/ui/components/system_console/navbar.js +9 -3
- package/dist/ui/components/system_console/sections/system_users/column_toggle_menu.js +10 -4
- package/dist/ui/components/system_console/sections/system_users/feature_discovery.js +10 -4
- package/dist/ui/components/system_console/sections/system_users/filter_menu.js +9 -3
- package/dist/ui/components/system_console/sections/system_users/filter_popover.js +14 -8
- package/dist/ui/components/system_console/sections/system_users/mobile_security.js +9 -3
- package/dist/ui/components/system_console/sections/system_users/system_users.js +16 -10
- package/dist/ui/components/system_console/sidebar.js +10 -4
- package/dist/ui/pages/channels.js +24 -18
- package/dist/ui/pages/drafts.js +23 -17
- package/dist/ui/pages/index.js +30 -17
- package/dist/ui/pages/landing_login.js +11 -5
- package/dist/ui/pages/login.js +14 -8
- package/dist/ui/pages/reset_password.js +15 -9
- package/dist/ui/pages/scheduled_draft.js +25 -19
- package/dist/ui/pages/signup.js +17 -11
- package/dist/ui/pages/system_console.js +22 -16
- package/dist/util.js +19 -8
- package/dist/visual/index.js +20 -14
- package/dist/visual/percy.js +10 -4
- package/package.json +1 -1
package/dist/test_config.js
CHANGED
|
@@ -1,9 +1,31 @@
|
|
|
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
|
+
|
|
1
24
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
25
|
// See LICENSE.txt for license information.
|
|
3
|
-
|
|
4
|
-
dotenv.config();
|
|
26
|
+
dotenv__namespace.config();
|
|
5
27
|
// All process.env should be defined here
|
|
6
|
-
|
|
28
|
+
class TestConfig {
|
|
7
29
|
baseURL;
|
|
8
30
|
adminUsername;
|
|
9
31
|
adminPassword;
|
|
@@ -47,10 +69,14 @@ export class TestConfig {
|
|
|
47
69
|
}
|
|
48
70
|
}
|
|
49
71
|
// Create a singleton instance
|
|
50
|
-
|
|
72
|
+
const testConfig = new TestConfig();
|
|
51
73
|
function parseBool(actualValue, defaultValue) {
|
|
52
74
|
return actualValue ? actualValue === 'true' : defaultValue;
|
|
53
75
|
}
|
|
54
76
|
function parseNumber(actualValue, defaultValue) {
|
|
55
77
|
return actualValue ? parseInt(actualValue, 10) : defaultValue;
|
|
56
78
|
}
|
|
79
|
+
|
|
80
|
+
exports.TestConfig = TestConfig;
|
|
81
|
+
exports.testConfig = testConfig;
|
|
82
|
+
//# sourceMappingURL=test_config.js.map
|
package/dist/test_fixture.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { AxeBuilder } from '@axe-core/playwright';
|
|
|
4
4
|
import { TestBrowser } from './browser_context';
|
|
5
5
|
import { ensureLicense, 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';
|
|
@@ -29,6 +29,7 @@ export declare class PlaywrightExtended {
|
|
|
29
29
|
readonly skipIfFeatureFlagNotSet: typeof skipIfFeatureFlagNotSet;
|
|
30
30
|
readonly getBlobFromAsset: typeof getBlobFromAsset;
|
|
31
31
|
readonly getFileFromAsset: typeof getFileFromAsset;
|
|
32
|
+
readonly ensurePluginsLoaded: typeof ensurePluginsLoaded;
|
|
32
33
|
readonly getAdminClient: typeof getAdminClient;
|
|
33
34
|
readonly initSetup: typeof initSetup;
|
|
34
35
|
readonly hideDynamicChannelsContent: typeof hideDynamicChannelsContent;
|
package/dist/test_fixture.js
CHANGED
|
@@ -1,18 +1,29 @@
|
|
|
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 plugins = require('./server/plugins.js');
|
|
14
|
+
var post = require('./server/post.js');
|
|
15
|
+
var team = require('./server/team.js');
|
|
16
|
+
var user = require('./server/user.js');
|
|
17
|
+
var test_action = require('./test_action.js');
|
|
18
|
+
var index = require('./ui/pages/index.js');
|
|
19
|
+
var index$1 = require('./visual/index.js');
|
|
20
|
+
var mock_browser_api = require('./mock_browser_api.js');
|
|
21
|
+
var util = require('./util.js');
|
|
22
|
+
var asyncWaitUntil = require('async-wait-until');
|
|
23
|
+
|
|
1
24
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
25
|
// See LICENSE.txt for license information.
|
|
3
|
-
|
|
4
|
-
import { AxeBuilder } from '@axe-core/playwright';
|
|
5
|
-
import { TestBrowser } from './browser_context';
|
|
6
|
-
import { ensureLicense, shouldHaveCallsEnabled, shouldHaveFeatureFlag, shouldRunInLinux, skipIfFeatureFlagNotSet, skipIfNoLicense, } from './flag';
|
|
7
|
-
import { getBlobFromAsset, getFileFromAsset } from './file';
|
|
8
|
-
import { createRandomChannel, createRandomPost, createRandomTeam, createRandomUser, 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
|
+
const test = test$1.test.extend({
|
|
16
27
|
// eslint-disable-next-line no-empty-pattern
|
|
17
28
|
axe: async ({}, use) => {
|
|
18
29
|
const ab = new AxeBuilderExtended();
|
|
@@ -24,7 +35,7 @@ export const test = base.extend({
|
|
|
24
35
|
await pw.testBrowser.close();
|
|
25
36
|
},
|
|
26
37
|
});
|
|
27
|
-
|
|
38
|
+
class PlaywrightExtended {
|
|
28
39
|
// ./browser_context
|
|
29
40
|
testBrowser;
|
|
30
41
|
// ./flag
|
|
@@ -38,6 +49,7 @@ export class PlaywrightExtended {
|
|
|
38
49
|
getBlobFromAsset;
|
|
39
50
|
getFileFromAsset;
|
|
40
51
|
// ./server
|
|
52
|
+
ensurePluginsLoaded;
|
|
41
53
|
getAdminClient;
|
|
42
54
|
initSetup;
|
|
43
55
|
// ./test_action
|
|
@@ -63,44 +75,45 @@ export class PlaywrightExtended {
|
|
|
63
75
|
hasSeenLandingPage;
|
|
64
76
|
constructor(browser, page, isMobile) {
|
|
65
77
|
// ./browser_context
|
|
66
|
-
this.testBrowser = new TestBrowser(browser);
|
|
78
|
+
this.testBrowser = new browser_context.TestBrowser(browser);
|
|
67
79
|
// ./flag
|
|
68
|
-
this.shouldHaveCallsEnabled = shouldHaveCallsEnabled;
|
|
69
|
-
this.shouldHaveFeatureFlag = shouldHaveFeatureFlag;
|
|
70
|
-
this.shouldRunInLinux = shouldRunInLinux;
|
|
71
|
-
this.ensureLicense = ensureLicense;
|
|
72
|
-
this.skipIfNoLicense = skipIfNoLicense;
|
|
73
|
-
this.skipIfFeatureFlagNotSet = skipIfFeatureFlagNotSet;
|
|
80
|
+
this.shouldHaveCallsEnabled = flag.shouldHaveCallsEnabled;
|
|
81
|
+
this.shouldHaveFeatureFlag = flag.shouldHaveFeatureFlag;
|
|
82
|
+
this.shouldRunInLinux = flag.shouldRunInLinux;
|
|
83
|
+
this.ensureLicense = flag.ensureLicense;
|
|
84
|
+
this.skipIfNoLicense = flag.skipIfNoLicense;
|
|
85
|
+
this.skipIfFeatureFlagNotSet = flag.skipIfFeatureFlagNotSet;
|
|
74
86
|
// ./file
|
|
75
|
-
this.getBlobFromAsset = getBlobFromAsset;
|
|
76
|
-
this.getFileFromAsset = getFileFromAsset;
|
|
87
|
+
this.getBlobFromAsset = file.getBlobFromAsset;
|
|
88
|
+
this.getFileFromAsset = file.getFileFromAsset;
|
|
77
89
|
// ./server
|
|
78
|
-
this.
|
|
79
|
-
this.
|
|
90
|
+
this.ensurePluginsLoaded = plugins.ensurePluginsLoaded;
|
|
91
|
+
this.initSetup = init.initSetup;
|
|
92
|
+
this.getAdminClient = init.getAdminClient;
|
|
80
93
|
// ./test_action
|
|
81
|
-
this.hideDynamicChannelsContent = hideDynamicChannelsContent;
|
|
82
|
-
this.waitForAnimationEnd = waitForAnimationEnd;
|
|
83
|
-
this.waitUntil = waitUntil;
|
|
94
|
+
this.hideDynamicChannelsContent = test_action.hideDynamicChannelsContent;
|
|
95
|
+
this.waitForAnimationEnd = test_action.waitForAnimationEnd;
|
|
96
|
+
this.waitUntil = asyncWaitUntil.waitUntil;
|
|
84
97
|
// unauthenticated page
|
|
85
|
-
this.loginPage = new pages.LoginPage(page);
|
|
86
|
-
this.landingLoginPage = new pages.LandingLoginPage(page, isMobile);
|
|
87
|
-
this.signupPage = new pages.SignupPage(page);
|
|
88
|
-
this.resetPasswordPage = new pages.ResetPasswordPage(page);
|
|
98
|
+
this.loginPage = new index.pages.LoginPage(page);
|
|
99
|
+
this.landingLoginPage = new index.pages.LandingLoginPage(page, isMobile);
|
|
100
|
+
this.signupPage = new index.pages.SignupPage(page);
|
|
101
|
+
this.resetPasswordPage = new index.pages.ResetPasswordPage(page);
|
|
89
102
|
// ./mock_browser_api
|
|
90
|
-
this.stubNotification = stubNotification;
|
|
91
|
-
this.waitForNotification = waitForNotification;
|
|
103
|
+
this.stubNotification = mock_browser_api.stubNotification;
|
|
104
|
+
this.waitForNotification = mock_browser_api.waitForNotification;
|
|
92
105
|
// ./visual
|
|
93
|
-
this.matchSnapshot = matchSnapshot;
|
|
106
|
+
this.matchSnapshot = index$1.matchSnapshot;
|
|
94
107
|
// ./util
|
|
95
|
-
this.duration = duration;
|
|
96
|
-
this.wait = wait;
|
|
97
|
-
this.simpleEmailRe = simpleEmailRe;
|
|
108
|
+
this.duration = util.duration;
|
|
109
|
+
this.wait = util.wait;
|
|
110
|
+
this.simpleEmailRe = util.simpleEmailRe;
|
|
98
111
|
this.random = {
|
|
99
|
-
id: getRandomId,
|
|
100
|
-
channel: createRandomChannel,
|
|
101
|
-
post: createRandomPost,
|
|
102
|
-
team: createRandomTeam,
|
|
103
|
-
user: createRandomUser,
|
|
112
|
+
id: util.getRandomId,
|
|
113
|
+
channel: channel.createRandomChannel,
|
|
114
|
+
post: post.createRandomPost,
|
|
115
|
+
team: team.createRandomTeam,
|
|
116
|
+
user: user.createRandomUser,
|
|
104
117
|
};
|
|
105
118
|
this.hasSeenLandingPage = async () => {
|
|
106
119
|
// Visit the base URL to be able to set the localStorage
|
|
@@ -109,7 +122,7 @@ export class PlaywrightExtended {
|
|
|
109
122
|
};
|
|
110
123
|
}
|
|
111
124
|
}
|
|
112
|
-
|
|
125
|
+
class AxeBuilderExtended {
|
|
113
126
|
builder;
|
|
114
127
|
// See https://github.com/dequelabs/axe-core/blob/master/doc/API.md#axe-core-tags
|
|
115
128
|
tags = ['wcag2a', 'wcag2aa'];
|
|
@@ -127,7 +140,7 @@ export class AxeBuilderExtended {
|
|
|
127
140
|
// Option: make use of custom theme to improve color contrast.
|
|
128
141
|
disabledRules.push('link-in-text-block');
|
|
129
142
|
}
|
|
130
|
-
return new AxeBuilder({ page }).withTags(this.tags).disableRules(disabledRules);
|
|
143
|
+
return new playwright.AxeBuilder({ page }).withTags(this.tags).disableRules(disabledRules);
|
|
131
144
|
};
|
|
132
145
|
}
|
|
133
146
|
violationFingerprints(accessibilityScanResults) {
|
|
@@ -142,8 +155,8 @@ export class AxeBuilderExtended {
|
|
|
142
155
|
return JSON.stringify(fingerprints, null, 2);
|
|
143
156
|
}
|
|
144
157
|
}
|
|
145
|
-
async function waitUntilLocalStorageIsSet(page, key, value, timeout = duration.ten_sec) {
|
|
146
|
-
await waitUntil(() => page.evaluate(({ key, value }) => {
|
|
158
|
+
async function waitUntilLocalStorageIsSet(page, key, value, timeout = util.duration.ten_sec) {
|
|
159
|
+
await asyncWaitUntil.waitUntil(() => page.evaluate(({ key, value }) => {
|
|
147
160
|
if (localStorage.getItem(key) === value) {
|
|
148
161
|
return true;
|
|
149
162
|
}
|
|
@@ -151,3 +164,12 @@ async function waitUntilLocalStorageIsSet(page, key, value, timeout = duration.t
|
|
|
151
164
|
return false;
|
|
152
165
|
}, { key, value }), { timeout });
|
|
153
166
|
}
|
|
167
|
+
|
|
168
|
+
Object.defineProperty(exports, "expect", {
|
|
169
|
+
enumerable: true,
|
|
170
|
+
get: function () { return test$1.expect; }
|
|
171
|
+
});
|
|
172
|
+
exports.AxeBuilderExtended = AxeBuilderExtended;
|
|
173
|
+
exports.PlaywrightExtended = PlaywrightExtended;
|
|
174
|
+
exports.test = test;
|
|
175
|
+
//# 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":"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"}
|
|
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 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 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.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","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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"}
|
|
@@ -1 +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/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.
|
|
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"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var test = require('@playwright/test');
|
|
4
|
+
|
|
1
5
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
6
|
// See LICENSE.txt for license information.
|
|
3
|
-
|
|
4
|
-
export default class ChannelsAppBar {
|
|
7
|
+
class ChannelsAppBar {
|
|
5
8
|
container;
|
|
6
9
|
playbooksIcon;
|
|
7
10
|
constructor(container) {
|
|
@@ -9,6 +12,9 @@ export default class ChannelsAppBar {
|
|
|
9
12
|
this.playbooksIcon = container.locator('#app-bar-icon-playbooks').getByRole('img');
|
|
10
13
|
}
|
|
11
14
|
async toBeVisible() {
|
|
12
|
-
await expect(this.container).toBeVisible();
|
|
15
|
+
await test.expect(this.container).toBeVisible();
|
|
13
16
|
}
|
|
14
17
|
}
|
|
18
|
+
|
|
19
|
+
module.exports = ChannelsAppBar;
|
|
20
|
+
//# sourceMappingURL=app_bar.js.map
|
|
@@ -1,13 +1,16 @@
|
|
|
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
|
+
|
|
1
11
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
12
|
// See LICENSE.txt for license information.
|
|
3
|
-
|
|
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 {
|
|
13
|
+
class ChannelsCenterView {
|
|
11
14
|
container;
|
|
12
15
|
header;
|
|
13
16
|
postCreate;
|
|
@@ -23,10 +26,10 @@ export default class ChannelsCenterView {
|
|
|
23
26
|
constructor(container) {
|
|
24
27
|
this.container = container;
|
|
25
28
|
this.scheduledDraftChannelInfoMessageLocator = 'span:has-text("Message scheduled for")';
|
|
26
|
-
this.header = new
|
|
27
|
-
this.postCreate = new
|
|
28
|
-
this.scheduledDraftOptions = new
|
|
29
|
-
this.postEdit = new
|
|
29
|
+
this.header = new header(this.container.locator('.channel-header'));
|
|
30
|
+
this.postCreate = new post_create(container.getByTestId('post-create'));
|
|
31
|
+
this.scheduledDraftOptions = new post_create(container.locator('#dropdown_send_post_options'));
|
|
32
|
+
this.postEdit = new post_edit(container.locator('.post-edit__container'));
|
|
30
33
|
this.postBoxIndicator = container.locator('div.postBoxIndicator');
|
|
31
34
|
this.scheduledDraftChannelIcon = container.locator('#create_post i.icon-draft-indicator');
|
|
32
35
|
this.scheduledDraftChannelInfoMessage = container.locator('div.ScheduledPostIndicator span');
|
|
@@ -35,7 +38,7 @@ export default class ChannelsCenterView {
|
|
|
35
38
|
this.editedPostIcon = (postID) => container.locator(`#postEdited_${postID}`);
|
|
36
39
|
}
|
|
37
40
|
async toBeVisible() {
|
|
38
|
-
await expect(this.container).toBeVisible();
|
|
41
|
+
await test.expect(this.container).toBeVisible();
|
|
39
42
|
await this.postCreate.toBeVisible();
|
|
40
43
|
}
|
|
41
44
|
/**
|
|
@@ -51,7 +54,7 @@ export default class ChannelsCenterView {
|
|
|
51
54
|
async getFirstPost() {
|
|
52
55
|
const firstPost = this.container.getByTestId('postView').first();
|
|
53
56
|
await firstPost.waitFor();
|
|
54
|
-
return new
|
|
57
|
+
return new post(firstPost);
|
|
55
58
|
}
|
|
56
59
|
/**
|
|
57
60
|
* Return the last post in the Center
|
|
@@ -59,7 +62,7 @@ export default class ChannelsCenterView {
|
|
|
59
62
|
async getLastPost() {
|
|
60
63
|
const lastPost = this.container.getByTestId('postView').last();
|
|
61
64
|
await lastPost.waitFor();
|
|
62
|
-
return new
|
|
65
|
+
return new post(lastPost);
|
|
63
66
|
}
|
|
64
67
|
/**
|
|
65
68
|
* Return the ID of the last post in the Center
|
|
@@ -79,7 +82,7 @@ export default class ChannelsCenterView {
|
|
|
79
82
|
async getNthPost(index) {
|
|
80
83
|
const nthPost = this.container.getByTestId('postView').nth(index);
|
|
81
84
|
await nthPost.waitFor();
|
|
82
|
-
return new
|
|
85
|
+
return new post(nthPost);
|
|
83
86
|
}
|
|
84
87
|
/**
|
|
85
88
|
* Returns the Center post by post's id
|
|
@@ -88,17 +91,17 @@ export default class ChannelsCenterView {
|
|
|
88
91
|
async getPostById(id) {
|
|
89
92
|
const postById = this.container.locator(`[id="post_${id}"]`);
|
|
90
93
|
await postById.waitFor();
|
|
91
|
-
return new
|
|
94
|
+
return new post(postById);
|
|
92
95
|
}
|
|
93
|
-
async waitUntilLastPostContains(text, timeout = duration.ten_sec) {
|
|
94
|
-
await waitUntil(async () => {
|
|
96
|
+
async waitUntilLastPostContains(text, timeout = util.duration.ten_sec) {
|
|
97
|
+
await asyncWaitUntil.waitUntil(async () => {
|
|
95
98
|
const post = await this.getLastPost();
|
|
96
99
|
const content = await post.container.textContent();
|
|
97
100
|
return content?.includes(text);
|
|
98
101
|
}, { timeout });
|
|
99
102
|
}
|
|
100
|
-
async waitUntilPostWithIdContains(id, text, timeout = duration.ten_sec) {
|
|
101
|
-
await waitUntil(async () => {
|
|
103
|
+
async waitUntilPostWithIdContains(id, text, timeout = util.duration.ten_sec) {
|
|
104
|
+
await asyncWaitUntil.waitUntil(async () => {
|
|
102
105
|
const post = await this.getPostById(id);
|
|
103
106
|
const content = await post.container.textContent();
|
|
104
107
|
return content?.includes(text);
|
|
@@ -108,7 +111,7 @@ export default class ChannelsCenterView {
|
|
|
108
111
|
await this.postBoxIndicator.isVisible();
|
|
109
112
|
await this.scheduledDraftChannelIcon.isVisible();
|
|
110
113
|
const messageLocator = this.scheduledDraftChannelInfoMessage.first();
|
|
111
|
-
await expect(messageLocator).toContainText('Message scheduled for');
|
|
114
|
+
await test.expect(messageLocator).toContainText('Message scheduled for');
|
|
112
115
|
}
|
|
113
116
|
async clickOnLastEditedPost(postID) {
|
|
114
117
|
if (postID) {
|
|
@@ -116,3 +119,6 @@ export default class ChannelsCenterView {
|
|
|
116
119
|
}
|
|
117
120
|
}
|
|
118
121
|
}
|
|
122
|
+
|
|
123
|
+
module.exports = ChannelsCenterView;
|
|
124
|
+
//# sourceMappingURL=center_view.js.map
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var test = require('@playwright/test');
|
|
4
|
+
|
|
1
5
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
6
|
// See LICENSE.txt for license information.
|
|
3
|
-
|
|
4
|
-
export default class DeletePostConfirmationDialog {
|
|
7
|
+
class DeletePostConfirmationDialog {
|
|
5
8
|
container;
|
|
6
9
|
cancelButton;
|
|
7
10
|
confirmButton;
|
|
@@ -11,14 +14,14 @@ export default class DeletePostConfirmationDialog {
|
|
|
11
14
|
this.confirmButton = container.locator('button#deletePostModalButton');
|
|
12
15
|
}
|
|
13
16
|
async toBeVisible() {
|
|
14
|
-
await expect(this.container).toBeVisible();
|
|
15
|
-
await expect(this.cancelButton).toBeVisible();
|
|
16
|
-
await expect(this.confirmButton).toBeVisible();
|
|
17
|
+
await test.expect(this.container).toBeVisible();
|
|
18
|
+
await test.expect(this.cancelButton).toBeVisible();
|
|
19
|
+
await test.expect(this.confirmButton).toBeVisible();
|
|
17
20
|
}
|
|
18
21
|
async notToBeVisible() {
|
|
19
|
-
await expect(this.container).not.toBeVisible();
|
|
20
|
-
await expect(this.cancelButton).not.toBeVisible();
|
|
21
|
-
await expect(this.confirmButton).not.toBeVisible();
|
|
22
|
+
await test.expect(this.container).not.toBeVisible();
|
|
23
|
+
await test.expect(this.cancelButton).not.toBeVisible();
|
|
24
|
+
await test.expect(this.confirmButton).not.toBeVisible();
|
|
22
25
|
}
|
|
23
26
|
async cancelDeletion() {
|
|
24
27
|
await this.cancelButton.click();
|
|
@@ -27,3 +30,6 @@ export default class DeletePostConfirmationDialog {
|
|
|
27
30
|
await this.confirmButton.click();
|
|
28
31
|
}
|
|
29
32
|
}
|
|
33
|
+
|
|
34
|
+
module.exports = DeletePostConfirmationDialog;
|
|
35
|
+
//# sourceMappingURL=delete_post_confirmation_dialog.js.map
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var test = require('@playwright/test');
|
|
4
|
+
|
|
1
5
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
6
|
// See LICENSE.txt for license information.
|
|
3
|
-
|
|
4
|
-
export default class DeletePostModal {
|
|
7
|
+
class DeletePostModal {
|
|
5
8
|
container;
|
|
6
9
|
confirmButton;
|
|
7
10
|
constructor(container) {
|
|
@@ -9,12 +12,15 @@ export default class DeletePostModal {
|
|
|
9
12
|
this.confirmButton = container.locator('#deletePostModalButton');
|
|
10
13
|
}
|
|
11
14
|
async toBeVisible() {
|
|
12
|
-
await expect(this.container).toBeVisible();
|
|
15
|
+
await test.expect(this.container).toBeVisible();
|
|
13
16
|
}
|
|
14
17
|
async confirm() {
|
|
15
18
|
await this.confirmButton.waitFor();
|
|
16
19
|
await this.confirmButton.click();
|
|
17
20
|
// Wait for the modal to disappear
|
|
18
|
-
await expect(this.container).not.toBeVisible();
|
|
21
|
+
await test.expect(this.container).not.toBeVisible();
|
|
19
22
|
}
|
|
20
23
|
}
|
|
24
|
+
|
|
25
|
+
module.exports = DeletePostModal;
|
|
26
|
+
//# sourceMappingURL=delete_post_modal.js.map
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var test = require('@playwright/test');
|
|
4
|
+
|
|
1
5
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
6
|
// See LICENSE.txt for license information.
|
|
3
|
-
|
|
4
|
-
export default class EmojiGifPicker {
|
|
7
|
+
class EmojiGifPicker {
|
|
5
8
|
container;
|
|
6
9
|
gifTab;
|
|
7
10
|
gifSearchInput;
|
|
@@ -13,23 +16,23 @@ export default class EmojiGifPicker {
|
|
|
13
16
|
this.gifPickerItems = container.locator('.gif-picker__items');
|
|
14
17
|
}
|
|
15
18
|
async toBeVisible() {
|
|
16
|
-
await expect(this.container).toBeVisible();
|
|
19
|
+
await test.expect(this.container).toBeVisible();
|
|
17
20
|
}
|
|
18
21
|
async openGifTab() {
|
|
19
|
-
await expect(this.gifTab).toBeVisible();
|
|
22
|
+
await test.expect(this.gifTab).toBeVisible();
|
|
20
23
|
await this.gifTab.click({ force: true });
|
|
21
|
-
await expect(this.gifSearchInput).toBeVisible();
|
|
22
|
-
await expect(this.gifPickerItems).toBeVisible();
|
|
24
|
+
await test.expect(this.gifSearchInput).toBeVisible();
|
|
25
|
+
await test.expect(this.gifPickerItems).toBeVisible();
|
|
23
26
|
}
|
|
24
27
|
async searchGif(name) {
|
|
25
28
|
await this.gifSearchInput.fill(name);
|
|
26
|
-
await expect(this.gifSearchInput).toHaveValue(name);
|
|
29
|
+
await test.expect(this.gifSearchInput).toHaveValue(name);
|
|
27
30
|
}
|
|
28
31
|
async getNthGif(n) {
|
|
29
|
-
await expect(this.gifPickerItems).toBeVisible();
|
|
32
|
+
await test.expect(this.gifPickerItems).toBeVisible();
|
|
30
33
|
await this.gifPickerItems.locator('img').nth(n).waitFor();
|
|
31
34
|
const nthGif = this.gifPickerItems.locator('img').nth(n);
|
|
32
|
-
await expect(nthGif).toBeVisible();
|
|
35
|
+
await test.expect(nthGif).toBeVisible();
|
|
33
36
|
const nthGifSrc = await nthGif.getAttribute('src');
|
|
34
37
|
const nthGifAlt = await nthGif.getAttribute('alt');
|
|
35
38
|
if (!nthGifSrc || !nthGifAlt) {
|
|
@@ -42,3 +45,6 @@ export default class EmojiGifPicker {
|
|
|
42
45
|
};
|
|
43
46
|
}
|
|
44
47
|
}
|
|
48
|
+
|
|
49
|
+
module.exports = EmojiGifPicker;
|
|
50
|
+
//# sourceMappingURL=emoji_gif_picker.js.map
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var test = require('@playwright/test');
|
|
4
|
+
|
|
1
5
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
6
|
// See LICENSE.txt for license information.
|
|
3
|
-
|
|
4
|
-
export default class FindChannelsModal {
|
|
7
|
+
class FindChannelsModal {
|
|
5
8
|
container;
|
|
6
9
|
input;
|
|
7
10
|
searchList;
|
|
@@ -11,6 +14,9 @@ export default class FindChannelsModal {
|
|
|
11
14
|
this.searchList = container.locator('.suggestion-list__item');
|
|
12
15
|
}
|
|
13
16
|
async toBeVisible() {
|
|
14
|
-
await expect(this.container).toBeVisible();
|
|
17
|
+
await test.expect(this.container).toBeVisible();
|
|
15
18
|
}
|
|
16
19
|
}
|
|
20
|
+
|
|
21
|
+
module.exports = FindChannelsModal;
|
|
22
|
+
//# sourceMappingURL=find_channels_modal.js.map
|