generator-jhipster-playwright 1.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.
Files changed (26) hide show
  1. package/LICENSE +176 -0
  2. package/README.md +137 -0
  3. package/cli/cli.cjs +37 -0
  4. package/generators/cypress/command.js +5 -0
  5. package/generators/cypress/files.js +75 -0
  6. package/generators/cypress/generator.js +111 -0
  7. package/generators/cypress/index.js +2 -0
  8. package/generators/cypress/templates/playwright.config.ts.ejs +30 -0
  9. package/generators/cypress/templates/src/test/javascript/cypress/e2e/account/login-page.spec.ts.ejs +83 -0
  10. package/generators/cypress/templates/src/test/javascript/cypress/e2e/account/logout.spec.ts.ejs +39 -0
  11. package/generators/cypress/templates/src/test/javascript/cypress/e2e/account/password-page.spec.ts.ejs +88 -0
  12. package/generators/cypress/templates/src/test/javascript/cypress/e2e/account/register-page.spec.ts.ejs +124 -0
  13. package/generators/cypress/templates/src/test/javascript/cypress/e2e/account/reset-password-page.spec.ts.ejs +57 -0
  14. package/generators/cypress/templates/src/test/javascript/cypress/e2e/account/settings-page.spec.ts.ejs +85 -0
  15. package/generators/cypress/templates/src/test/javascript/cypress/e2e/administration/administration.spec.ts.ejs +73 -0
  16. package/generators/cypress/templates/src/test/javascript/cypress/e2e/entity/_entity_.spec.ts.ejs +378 -0
  17. package/generators/cypress/templates/src/test/javascript/cypress/fixtures/integration-test.png +0 -0
  18. package/generators/cypress/templates/src/test/javascript/cypress/support/account.ts.ejs +26 -0
  19. package/generators/cypress/templates/src/test/javascript/cypress/support/commands.ts.ejs +200 -0
  20. package/generators/cypress/templates/src/test/javascript/cypress/support/entity.ts.ejs +73 -0
  21. package/generators/cypress/templates/src/test/javascript/cypress/support/index.ts.ejs +3 -0
  22. package/generators/cypress/templates/src/test/javascript/cypress/support/management.ts.ejs +12 -0
  23. package/generators/cypress/templates/src/test/javascript/cypress/support/navbar.ts.ejs +54 -0
  24. package/generators/cypress/templates/src/test/javascript/cypress/support/oauth2.ts.ejs +64 -0
  25. package/generators/cypress/templates/src/test/javascript/cypress/tsconfig.json.ejs +14 -0
  26. package/package.json +45 -0
@@ -0,0 +1,39 @@
1
+ <%#
2
+ Source EJS variables: authenticationUsesCsrf
3
+ -%>
4
+ import { test, expect } from '@playwright/test';
5
+ import {
6
+ accountMenuSelector,
7
+ credentials,
8
+ login,
9
+ loginItemSelector,
10
+ navbarSelector,
11
+ } from '../../support/commands';
12
+ import { clickOnLogoutItem } from '../../support/navbar';
13
+
14
+ test.describe('logout', () => {
15
+ let username: string;
16
+ let password: string;
17
+
18
+ test.beforeAll(() => {
19
+ const creds = credentials();
20
+ username = creds.username;
21
+ password = creds.password;
22
+ });
23
+
24
+ test('go to home page when successfully logs out', async ({ page, request }) => {
25
+ await login(page, request, username, password);
26
+ <%_ if (authenticationUsesCsrf) { _%>
27
+ const logoutPromise = page.waitForResponse('**/api/logout');
28
+ <%_ } _%>
29
+ await clickOnLogoutItem(page);
30
+ <%_ if (authenticationUsesCsrf) { _%>
31
+ await logoutPromise;
32
+ <%_ } _%>
33
+ // Wait for the logout item to disappear (React processed the logout)
34
+ await expect(page.locator('[data-cy="logout"]')).not.toBeVisible({ timeout: 10000 });
35
+ // Open the account menu and verify login item is visible
36
+ await page.locator(navbarSelector).locator(accountMenuSelector).click();
37
+ await expect(page.locator(navbarSelector).locator(accountMenuSelector).locator(loginItemSelector)).toBeVisible({ timeout: 10000 });
38
+ });
39
+ });
@@ -0,0 +1,88 @@
1
+ <%#
2
+ Source EJS variables: clientFrameworkReact
3
+ -%>
4
+ import { test, expect } from '@playwright/test';
5
+ import {
6
+ currentPasswordSelector,
7
+ newPasswordSelector,
8
+ confirmPasswordSelector,
9
+ submitPasswordSelector,
10
+ classInvalid,
11
+ classValid,
12
+ credentials,
13
+ } from '../../support/commands';
14
+ import { login } from '../../support/commands';
15
+ import { clickOnPasswordItem } from '../../support/navbar';
16
+
17
+ test.describe('/account/password', () => {
18
+ let username: string;
19
+ let password: string;
20
+
21
+ test.beforeAll(() => {
22
+ const creds = credentials();
23
+ username = creds.username;
24
+ password = creds.password;
25
+ });
26
+
27
+ test.beforeEach(async ({ page, request }) => {
28
+ await login(page, request, username, password);
29
+ await page.goto('/account/password');
30
+ });
31
+
32
+ test('should be accessible through menu', async ({ page }) => {
33
+ await page.goto('/');
34
+ await clickOnPasswordItem(page);
35
+ await expect(page).toHaveURL(/\/account\/password$/);
36
+ });
37
+
38
+ test('requires current password', async ({ page }) => {
39
+ <%_ if (clientFrameworkReact) { _%>
40
+ await page.locator(submitPasswordSelector).click();
41
+ <%_ } _%>
42
+ await expect(page.locator(currentPasswordSelector)).toHaveClass(new RegExp(classInvalid));
43
+ await page.locator(currentPasswordSelector).fill('wrong-current-password');
44
+ await page.locator(currentPasswordSelector).evaluate(e => e.blur());
45
+ await expect(page.locator(currentPasswordSelector)).toHaveClass(new RegExp(classValid));
46
+ });
47
+
48
+ test('requires new password', async ({ page }) => {
49
+ <%_ if (clientFrameworkReact) { _%>
50
+ await page.locator(submitPasswordSelector).click();
51
+ <%_ } _%>
52
+ await expect(page.locator(newPasswordSelector)).toHaveClass(new RegExp(classInvalid));
53
+ await page.locator(newPasswordSelector).fill('jhipster');
54
+ await page.locator(newPasswordSelector).evaluate(e => e.blur());
55
+ await expect(page.locator(newPasswordSelector)).toHaveClass(new RegExp(classValid));
56
+ });
57
+
58
+ test('requires confirm new password', async ({ page }) => {
59
+ <%_ if (clientFrameworkReact) { _%>
60
+ await page.locator(submitPasswordSelector).click();
61
+ <%_ } _%>
62
+ await page.locator(newPasswordSelector).fill('jhipster');
63
+ await expect(page.locator(confirmPasswordSelector)).toHaveClass(new RegExp(classInvalid));
64
+ await page.locator(confirmPasswordSelector).fill('jhipster');
65
+ await page.locator(confirmPasswordSelector).evaluate(e => e.blur());
66
+ await expect(page.locator(confirmPasswordSelector)).toHaveClass(new RegExp(classValid));
67
+ });
68
+
69
+ test('should fail to update password when using incorrect current password', async ({ page }) => {
70
+ await page.locator(currentPasswordSelector).fill('wrong-current-password');
71
+ await page.locator(newPasswordSelector).fill('jhipster');
72
+ await page.locator(confirmPasswordSelector).fill('jhipster');
73
+ const responsePromise = page.waitForResponse('**/api/account/change-password');
74
+ await page.locator(submitPasswordSelector).click();
75
+ const response = await responsePromise;
76
+ expect(response.status()).toBe(400);
77
+ });
78
+
79
+ test('should be able to update password', async ({ page }) => {
80
+ await page.locator(currentPasswordSelector).fill(password);
81
+ await page.locator(newPasswordSelector).fill(password);
82
+ await page.locator(confirmPasswordSelector).fill(password);
83
+ const responsePromise = page.waitForResponse('**/api/account/change-password');
84
+ await page.locator(submitPasswordSelector).click();
85
+ const response = await responsePromise;
86
+ expect(response.status()).toBe(200);
87
+ });
88
+ });
@@ -0,0 +1,124 @@
1
+ <%#
2
+ Source EJS variables: clientFrameworkReact, clientFrameworkAngular, clientFrameworkVue, faker
3
+ -%>
4
+ <% const registerPage = clientFrameworkVue ? '/register' : '/account/register'; _%>
5
+ import { test, expect } from '@playwright/test';
6
+ import {
7
+ usernameRegisterSelector,
8
+ emailRegisterSelector,
9
+ firstPasswordRegisterSelector,
10
+ secondPasswordRegisterSelector,
11
+ submitRegisterSelector,
12
+ classInvalid,
13
+ classValid,
14
+ } from '../../support/commands';
15
+ import { clickOnRegisterItem } from '../../support/navbar';
16
+
17
+ test.describe('<%= registerPage %>', () => {
18
+ test.beforeEach(async ({ page }) => {
19
+ await page.goto('<%= registerPage %>');
20
+ });
21
+
22
+ test('should be accessible through menu', async ({ page }) => {
23
+ await page.goto('/');
24
+ await clickOnRegisterItem(page);
25
+ await expect(page).toHaveURL(/<%= registerPage.replace(/\//g, '\\/') %>$/);
26
+ });
27
+
28
+ test('should load the register page', async ({ page }) => {
29
+ await expect(page.locator(submitRegisterSelector)).toBeVisible();
30
+ });
31
+
32
+ test('requires username', async ({ page }) => {
33
+ <%_ if (clientFrameworkReact) { _%>
34
+ await page.locator(submitRegisterSelector).click();
35
+ <%_ } _%>
36
+ await expect(page.locator(usernameRegisterSelector)).toHaveClass(new RegExp(classInvalid));
37
+ await page.locator(usernameRegisterSelector).fill('test');
38
+ await page.locator(usernameRegisterSelector).evaluate(e => e.blur());
39
+ await expect(page.locator(usernameRegisterSelector)).toHaveClass(new RegExp(classValid));
40
+ });
41
+
42
+ test('should not accept invalid email', async ({ page }) => {
43
+ <%_ if (clientFrameworkReact) { _%>
44
+ await page.locator(submitRegisterSelector).click();
45
+ <%_ } _%>
46
+ await expect(page.locator(emailRegisterSelector)).toHaveClass(new RegExp(classInvalid));
47
+ await page.locator(emailRegisterSelector).fill('testtest.fr');
48
+ await page.locator(emailRegisterSelector).evaluate(e => e.blur());
49
+ await expect(page.locator(emailRegisterSelector)).toHaveClass(new RegExp(classInvalid));
50
+ });
51
+
52
+ test('requires email in correct format', async ({ page }) => {
53
+ <%_ if (clientFrameworkReact) { _%>
54
+ await page.locator(submitRegisterSelector).click();
55
+ <%_ } _%>
56
+ await expect(page.locator(emailRegisterSelector)).toHaveClass(new RegExp(classInvalid));
57
+ await page.locator(emailRegisterSelector).fill('test@test.fr');
58
+ await page.locator(emailRegisterSelector).evaluate(e => e.blur());
59
+ await expect(page.locator(emailRegisterSelector)).toHaveClass(new RegExp(classValid));
60
+ });
61
+
62
+ test('requires first password', async ({ page }) => {
63
+ <%_ if (clientFrameworkReact) { _%>
64
+ await page.locator(submitRegisterSelector).click();
65
+ <%_ } _%>
66
+ await expect(page.locator(firstPasswordRegisterSelector)).toHaveClass(new RegExp(classInvalid));
67
+ await page.locator(firstPasswordRegisterSelector).fill('test@test.fr');
68
+ await page.locator(firstPasswordRegisterSelector).evaluate(e => e.blur());
69
+ await expect(page.locator(firstPasswordRegisterSelector)).toHaveClass(new RegExp(classValid));
70
+ });
71
+
72
+ test('requires password and confirm password to be same', async ({ page }) => {
73
+ <%_ if (clientFrameworkReact) { _%>
74
+ await page.locator(submitRegisterSelector).click();
75
+ <%_ } _%>
76
+ await expect(page.locator(firstPasswordRegisterSelector)).toHaveClass(new RegExp(classInvalid));
77
+ await page.locator(firstPasswordRegisterSelector).clear();
78
+ await page.locator(firstPasswordRegisterSelector).pressSequentially('passwd');
79
+ await page.locator(firstPasswordRegisterSelector).evaluate(e => e.blur());
80
+ await expect(page.locator(firstPasswordRegisterSelector)).toHaveClass(new RegExp(classValid));
81
+ await expect(page.locator(secondPasswordRegisterSelector)).toHaveClass(new RegExp(classInvalid));
82
+ await page.locator(secondPasswordRegisterSelector).clear();
83
+ await page.locator(secondPasswordRegisterSelector).pressSequentially('passwd');
84
+ await page.locator(secondPasswordRegisterSelector).evaluate(e => e.blur());
85
+ await expect(page.locator(secondPasswordRegisterSelector)).toHaveClass(new RegExp(classValid));
86
+ });
87
+
88
+ test('requires password and confirm password have not the same value', async ({ page }) => {
89
+ <%_ if (clientFrameworkReact) { _%>
90
+ await page.locator(submitRegisterSelector).click();
91
+ <%_ } _%>
92
+ await expect(page.locator(firstPasswordRegisterSelector)).toHaveClass(new RegExp(classInvalid));
93
+ await page.locator(firstPasswordRegisterSelector).clear();
94
+ await page.locator(firstPasswordRegisterSelector).pressSequentially('passwd');
95
+ await page.locator(firstPasswordRegisterSelector).evaluate(e => e.blur());
96
+ <%_ if (!clientFrameworkReact) { _%>
97
+ await expect(page.locator(firstPasswordRegisterSelector)).toHaveClass(new RegExp(classValid));
98
+ <%_ } _%>
99
+ <%_ if (clientFrameworkAngular) { _%>
100
+ await expect(page.locator(secondPasswordRegisterSelector)).toHaveClass(new RegExp(classInvalid));
101
+ await page.locator(secondPasswordRegisterSelector).fill('otherPassword');
102
+ await expect(page.locator(submitRegisterSelector)).toBeDisabled();
103
+ <%_ } else { _%>
104
+ await expect(page.locator(secondPasswordRegisterSelector)).toHaveClass(new RegExp(classInvalid));
105
+ await page.locator(secondPasswordRegisterSelector).clear();
106
+ await page.locator(secondPasswordRegisterSelector).pressSequentially('otherPassword');
107
+ await page.locator(secondPasswordRegisterSelector).evaluate(e => e.blur());
108
+ await expect(page.locator(secondPasswordRegisterSelector)).toHaveClass(new RegExp(classInvalid));
109
+ <%_ } _%>
110
+ });
111
+
112
+ test('register a valid user', async ({ page }) => {
113
+ const randomEmail = '<%= faker.internet.email() %>';
114
+ const randomUsername = '<%= faker.internet.username() %>';
115
+ await page.locator(usernameRegisterSelector).fill(randomUsername);
116
+ await page.locator(emailRegisterSelector).fill(randomEmail);
117
+ await page.locator(firstPasswordRegisterSelector).fill('jondoe');
118
+ await page.locator(secondPasswordRegisterSelector).fill('jondoe');
119
+ const responsePromise = page.waitForResponse('**/api/register');
120
+ await page.locator(submitRegisterSelector).click();
121
+ const response = await responsePromise;
122
+ expect(response.status()).toBe(201);
123
+ });
124
+ });
@@ -0,0 +1,57 @@
1
+ <%#
2
+ Source EJS variables: clientFrameworkReact
3
+ -%>
4
+ import { test, expect } from '@playwright/test';
5
+ import {
6
+ usernameLoginSelector,
7
+ forgetYourPasswordSelector,
8
+ emailResetPasswordSelector,
9
+ submitInitResetPasswordSelector,
10
+ classInvalid,
11
+ classValid,
12
+ credentials,
13
+ } from '../../support/commands';
14
+ import { clickOnLoginItem } from '../../support/navbar';
15
+
16
+ test.describe('forgot your password', () => {
17
+ let username: string;
18
+
19
+ test.beforeAll(() => {
20
+ const creds = credentials();
21
+ username = creds.username;
22
+ });
23
+
24
+ test.beforeEach(async ({ page }) => {
25
+ await page.goto('/');
26
+ await clickOnLoginItem(page);
27
+ await page.locator(usernameLoginSelector).fill(username);
28
+ await page.locator(forgetYourPasswordSelector).click();
29
+ });
30
+
31
+ test('requires email', async ({ page }) => {
32
+ // Focus then blur to trigger the field validation state.
33
+ await page.locator(emailResetPasswordSelector).focus();
34
+ await page.locator(emailResetPasswordSelector).evaluate(e => e.blur());
35
+ <%_ if (clientFrameworkReact) { _%>
36
+ await page.locator(submitInitResetPasswordSelector).click();
37
+ <%_ } _%>
38
+ await expect(page.locator(emailResetPasswordSelector)).toHaveClass(new RegExp(classInvalid), { timeout: 10000 });
39
+ await page.locator(emailResetPasswordSelector).fill('user@gmail.com');
40
+ <%_ if (clientFrameworkReact) { _%>
41
+ await page.locator(submitInitResetPasswordSelector).click();
42
+ <%_ } _%>
43
+ await expect(page.locator(emailResetPasswordSelector)).toHaveClass(new RegExp(classValid), { timeout: 10000 });
44
+ });
45
+
46
+ test('should be able to init reset password', async ({ page }) => {
47
+ await page.locator(emailResetPasswordSelector).fill('user@gmail.com');
48
+ const responsePromise = page.waitForResponse('**/api/account/reset-password/init');
49
+ <%_ if (clientFrameworkReact) { _%>
50
+ await page.locator(submitInitResetPasswordSelector).click();
51
+ <%_ } else { _%>
52
+ await page.locator(submitInitResetPasswordSelector).click({ force: true });
53
+ <%_ } _%>
54
+ const response = await responsePromise;
55
+ expect(response.status()).toBe(200);
56
+ });
57
+ });
@@ -0,0 +1,85 @@
1
+ <%#
2
+ Source EJS variables: ZERO — settings-page.cy.ts.ejs has no EJS variables.
3
+ -%>
4
+ import { test, expect } from '@playwright/test';
5
+ import {
6
+ firstNameSettingsSelector,
7
+ lastNameSettingsSelector,
8
+ submitSettingsSelector,
9
+ emailSettingsSelector,
10
+ credentials,
11
+ login,
12
+ authenticatedRequest,
13
+ } from '../../support/commands';
14
+ import { clickOnSettingsItem } from '../../support/navbar';
15
+ import type { Account } from '../../support/account';
16
+
17
+ test.describe('/account/settings', () => {
18
+ let adminUsername: string;
19
+ let adminPassword: string;
20
+ let username: string;
21
+ let password: string;
22
+
23
+ const testUserEmail = 'user@localhost.fr';
24
+ let originalUserAccount: Account;
25
+ let testUserAccount: Account;
26
+
27
+ test.beforeAll(() => {
28
+ const creds = credentials();
29
+ ({ adminUsername, adminPassword, username, password } = creds);
30
+ });
31
+
32
+ test.beforeEach(async ({ page, request }) => {
33
+ await login(page, request, username, password);
34
+
35
+ const accountResp = await authenticatedRequest(request, { method: 'GET', url: '/api/account' });
36
+ originalUserAccount = await accountResp.json() as Account;
37
+ testUserAccount = { ...originalUserAccount, email: testUserEmail };
38
+ const saveResp = await authenticatedRequest(request, { method: 'POST', url: '/api/account', data: testUserAccount });
39
+ expect(saveResp.status()).toBe(200);
40
+
41
+ await page.goto('/account/settings');
42
+ await expect(page.locator(emailSettingsSelector)).toHaveValue(testUserEmail);
43
+ });
44
+
45
+ test.afterEach(async ({ request }) => {
46
+ if (testUserAccount) {
47
+ await authenticatedRequest(request, { method: 'POST', url: '/api/account', data: testUserAccount });
48
+ }
49
+ });
50
+
51
+ test('should be accessible through menu', async ({ page }) => {
52
+ await page.goto('/');
53
+ await clickOnSettingsItem(page);
54
+ await expect(page).toHaveURL(/\/account\/settings$/);
55
+ });
56
+
57
+ test("should be able to change 'user' firstname settings", async ({ page }) => {
58
+ await page.locator(firstNameSettingsSelector).clear();
59
+ await page.locator(firstNameSettingsSelector).fill('jhipster');
60
+ const responsePromise = page.waitForResponse('**/api/account');
61
+ await page.locator(submitSettingsSelector).click();
62
+ const response = await responsePromise;
63
+ expect(response.status()).toBe(200);
64
+ });
65
+
66
+ test("should be able to change 'user' lastname settings", async ({ page }) => {
67
+ await page.locator(lastNameSettingsSelector).clear();
68
+ await page.locator(firstNameSettingsSelector).fill('jhipster');
69
+ await page.locator(lastNameSettingsSelector).fill('retspihj');
70
+ const responsePromise = page.waitForResponse('**/api/account');
71
+ await page.locator(submitSettingsSelector).click();
72
+ const response = await responsePromise;
73
+ expect(response.status()).toBe(200);
74
+ });
75
+
76
+ test("should be able to change 'user' email settings", async ({ page }) => {
77
+ await page.locator(emailSettingsSelector).clear();
78
+ await page.locator(firstNameSettingsSelector).fill('jhipster');
79
+ await page.locator(emailSettingsSelector).fill('user@localhost.fr');
80
+ const responsePromise = page.waitForResponse('**/api/account');
81
+ await page.locator(submitSettingsSelector).click();
82
+ const response = await responsePromise;
83
+ expect(response.status()).toBe(200);
84
+ });
85
+ });
@@ -0,0 +1,73 @@
1
+ <%#
2
+ Source EJS variables: withAdminUi, communicationSpringWebsocket
3
+ -%>
4
+ import { test, expect } from '@playwright/test';
5
+ import {
6
+ <%_ if (withAdminUi) { _%>
7
+ metricsPageHeadingSelector,
8
+ healthPageHeadingSelector,
9
+ logsPageHeadingSelector,
10
+ configurationPageHeadingSelector,
11
+ <%_ } _%>
12
+ swaggerPageSelector,
13
+ swaggerFrameSelector,
14
+ credentials,
15
+ } from '../../support/commands';
16
+ import { login } from '../../support/commands';
17
+ import { clickOnAdminMenuItem } from '../../support/navbar';
18
+ import { getManagementInfo } from '../../support/management';
19
+
20
+ test.describe('/admin', () => {
21
+ let adminUsername: string;
22
+ let adminPassword: string;
23
+
24
+ test.beforeAll(() => {
25
+ const creds = credentials();
26
+ adminUsername = creds.adminUsername;
27
+ adminPassword = creds.adminPassword;
28
+ });
29
+
30
+ test.beforeEach(async ({ page, request }) => {
31
+ await login(page, request, adminUsername, adminPassword);
32
+ });
33
+
34
+ <%_ if (withAdminUi) { _%>
35
+ test('should load metrics', async ({ page }) => {
36
+ await clickOnAdminMenuItem(page, 'admin/metrics');
37
+ await expect(page.locator(metricsPageHeadingSelector)).toBeVisible();
38
+ });
39
+
40
+ test('should load health', async ({ page }) => {
41
+ await clickOnAdminMenuItem(page, 'admin/health');
42
+ await expect(page.locator(healthPageHeadingSelector)).toBeVisible();
43
+ });
44
+
45
+ test('should load logs', async ({ page }) => {
46
+ await clickOnAdminMenuItem(page, 'admin/logs');
47
+ await expect(page.locator(logsPageHeadingSelector)).toBeVisible();
48
+ });
49
+
50
+ test('should load configuration', async ({ page }) => {
51
+ await clickOnAdminMenuItem(page, 'admin/configuration');
52
+ await expect(page.locator(configurationPageHeadingSelector)).toBeVisible();
53
+ });
54
+
55
+ <%_ } _%>
56
+ test('should load swagger', async ({ page, request }) => {
57
+ const info = await getManagementInfo(request);
58
+ if (info.activeProfiles && info.activeProfiles.includes('api-docs')) {
59
+ await clickOnAdminMenuItem(page, 'admin/docs');
60
+ await expect(page.locator(swaggerFrameSelector)).toBeVisible();
61
+ // Use frameLocator for iframe content
62
+ const frame = page.frameLocator(swaggerFrameSelector);
63
+ await expect(frame.locator(swaggerPageSelector)).toBeVisible({ timeout: 15000 });
64
+ }
65
+ });
66
+ <%_ if (communicationSpringWebsocket) { _%>
67
+
68
+ test('should load tracker', async ({ page }) => {
69
+ await clickOnAdminMenuItem(page, 'admin/tracker');
70
+ await expect(page.locator('[data-cy="trackerPageHeading"]')).toBeVisible();
71
+ });
72
+ <%_ } _%>
73
+ });