Skip to content

Commit 7acbff5

Browse files
committed
CR
1 parent 34fb975 commit 7acbff5

File tree

5 files changed

+55
-127
lines changed

5 files changed

+55
-127
lines changed

integration/web-e2e_test.go

Lines changed: 10 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -17,67 +17,22 @@ import (
1717

1818
// TestSignup sets up a test instance of Teleport and runs a playwright test against it to test the signup flow.
1919
func TestSignup(t *testing.T) {
20-
rc, ctx := helpers.CreateTeleportTestInstance(t)
21-
22-
as := rc.Process.GetAuthServer()
23-
24-
accessRole := services.NewPresetAccessRole()
25-
26-
// Create a test user.
27-
testUser, err := types.NewUser("testuser")
28-
require.NoError(t, err)
29-
testUser.SetRoles([]string{accessRole.GetName()})
30-
user, err := as.UpsertUser(ctx, testUser)
31-
32-
inviteToken, err := as.CreateResetPasswordToken(ctx, authclient.CreateUserTokenRequest{
33-
Name: user.GetName(),
34-
})
35-
require.NoError(t, err)
36-
37-
// Generate the URL the playwright test will start from.
38-
startUrl := fmt.Sprintf("START_URL=https://%s/web/invite/%s", rc.Web, inviteToken.GetName())
39-
40-
// Start the playwright test
41-
cmd := exec.Command("pnpm", "test-e2e", "signup.spec.ts")
42-
cmd.Env = append(os.Environ(), startUrl)
43-
cmd.Stdout = os.Stdout
44-
cmd.Stderr = os.Stderr
45-
require.NoError(t, cmd.Run())
20+
setupAndRunBasicTest(t, "signup.spec.ts")
4621
}
4722

4823
// TestCreateNewRole sets up a test instance of Teleport and a user to test role management in the UI.
4924
func TestRoleManagement(t *testing.T) {
50-
rc, ctx := helpers.CreateTeleportTestInstance(t)
51-
52-
as := rc.Process.GetAuthServer()
53-
54-
accessRole := services.NewPresetAccessRole()
55-
editorRole := services.NewPresetEditorRole()
56-
57-
// Create a test user.
58-
testUser, err := types.NewUser("testuser")
59-
require.NoError(t, err)
60-
testUser.SetRoles([]string{accessRole.GetName(), editorRole.GetName()})
61-
user, err := as.UpsertUser(ctx, testUser)
62-
63-
inviteToken, err := as.CreateResetPasswordToken(ctx, authclient.CreateUserTokenRequest{
64-
Name: user.GetName(),
65-
})
66-
require.NoError(t, err)
67-
68-
// Generate the URL the playwright test will start from.
69-
startUrl := fmt.Sprintf("START_URL=https://%s/web/invite/%s", rc.Web, inviteToken.GetName())
70-
71-
// Start the playwright test
72-
cmd := exec.Command("pnpm", "test-e2e", "roles.spec.ts")
73-
cmd.Env = append(os.Environ(), startUrl)
74-
cmd.Stdout = os.Stdout
75-
cmd.Stderr = os.Stderr
76-
require.NoError(t, cmd.Run())
25+
setupAndRunBasicTest(t, "roles.spec.ts")
7726
}
7827

7928
// TestAuthConnectorManagement sets up a test instance of Teleport and a user to test auth connector management in the UI.
8029
func TestAuthConnectorManagement(t *testing.T) {
30+
setupAndRunBasicTest(t, "authconnectors.spec.ts")
31+
}
32+
33+
// setupAndRunBasicTest sets up a test instance of Teleport and a user with the access and editor roles and runs a playwright test.
34+
// This is a helper function in cases where there is no additional backend setup required beyond creating an invite link.
35+
func setupAndRunBasicTest(t *testing.T, playwrightTest string) {
8136
rc, ctx := helpers.CreateTeleportTestInstance(t)
8237

8338
as := rc.Process.GetAuthServer()
@@ -90,6 +45,7 @@ func TestAuthConnectorManagement(t *testing.T) {
9045
require.NoError(t, err)
9146
testUser.SetRoles([]string{accessRole.GetName(), editorRole.GetName()})
9247
user, err := as.UpsertUser(ctx, testUser)
48+
require.NoError(t, err)
9349

9450
inviteToken, err := as.CreateResetPasswordToken(ctx, authclient.CreateUserTokenRequest{
9551
Name: user.GetName(),
@@ -100,7 +56,7 @@ func TestAuthConnectorManagement(t *testing.T) {
10056
startUrl := fmt.Sprintf("START_URL=https://%s/web/invite/%s", rc.Web, inviteToken.GetName())
10157

10258
// Start the playwright test
103-
cmd := exec.Command("pnpm", "test-e2e", "authconnectors.spec.ts")
59+
cmd := exec.Command("pnpm", "test-e2e", playwrightTest, "--headed")
10460
cmd.Env = append(os.Environ(), startUrl)
10561
cmd.Stdout = os.Stdout
10662
cmd.Stderr = os.Stderr

web/e2e/tests/authconnectors.spec.ts

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,11 @@
11
import { expect, test } from '@playwright/test';
22

3-
import { mockWebAuthn } from '../utils/mockWebAuthn';
3+
import { signup } from '../utils/signup';
44

55
test('verify that a user can create and delete an auth connector', async ({
66
page,
77
}) => {
8-
const { cleanup } = await mockWebAuthn(page);
9-
10-
await page.goto('');
11-
12-
await page.getByRole('button', { name: 'Get started' }).click();
13-
await page.getByRole('textbox', { name: 'Password', exact: true }).click();
14-
await page
15-
.getByRole('textbox', { name: 'Password', exact: true })
16-
.fill('passwordtest123');
17-
await page
18-
.getByRole('textbox', { name: 'Password', exact: true })
19-
.press('Tab');
20-
await page
21-
.getByRole('textbox', { name: 'Confirm Password' })
22-
.fill('passwordtest123');
23-
await page.getByRole('button', { name: 'Next' }).click();
24-
await page.getByRole('button', { name: 'Create an MFA Method' }).click();
25-
await page.getByRole('button', { name: 'Submit' }).click();
26-
await page.getByRole('button', { name: 'Go to Cluster' }).click();
27-
28-
await page.getByRole('button', { name: "I'll do that later" }).click();
8+
const { cleanup } = await signup(page);
299

3010
await page.getByRole('button', { name: 'Zero Trust Access' }).click();
3111
await page.getByRole('link', { name: 'Auth Connectors' }).click();
@@ -57,5 +37,5 @@ test('verify that a user can create and delete an auth connector', async ({
5737

5838
await expect(page.getByText('testconnector')).not.toBeVisible();
5939

60-
cleanup();
40+
await cleanup();
6141
});

web/e2e/tests/roles.spec.ts

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,22 @@
11
import { expect, test } from '@playwright/test';
22

3-
import { mockWebAuthn } from '../utils/mockWebAuthn';
3+
import { signup } from '../utils/signup';
44

55
test('verify that a user can create and delete a role', async ({ page }) => {
6-
const { cleanup } = await mockWebAuthn(page);
7-
8-
await page.goto('');
9-
10-
await page.getByRole('button', { name: 'Get started' }).click();
11-
await page.getByRole('textbox', { name: 'Password', exact: true }).click();
12-
await page
13-
.getByRole('textbox', { name: 'Password', exact: true })
14-
.fill('passwordtest123');
15-
await page
16-
.getByRole('textbox', { name: 'Password', exact: true })
17-
.press('Tab');
18-
await page
19-
.getByRole('textbox', { name: 'Confirm Password' })
20-
.fill('passwordtest123');
21-
await page.getByRole('button', { name: 'Next' }).click();
22-
await page.getByRole('button', { name: 'Create an MFA Method' }).click();
23-
await page.getByRole('button', { name: 'Submit' }).click();
24-
await page.getByRole('button', { name: 'Go to Cluster' }).click();
25-
26-
await page.getByRole('button', { name: "I'll do that later" }).click();
6+
const { cleanup } = await signup(page);
277

288
await page.getByRole('button', { name: 'Zero Trust Access' }).click();
299
await page.getByRole('link', { name: 'Roles' }).click();
3010
await page.getByTestId('create_new_role_button').click();
3111
await page.getByRole('textbox', { name: 'Role Name(required)' }).click();
32-
await page
33-
.getByRole('textbox', { name: 'Role Name(required)' })
34-
.press('ControlOrMeta+a');
3512
await page
3613
.getByRole('textbox', { name: 'Role Name(required)' })
3714
.fill('testrole');
3815
await page.getByRole('button', { name: 'Next: Resources' }).click();
3916
await page
4017
.getByRole('button', { name: 'Add Teleport Resource Access' })
4118
.click();
42-
await page.getByRole('menuitem', { name: 'SSH Server Access' }).click();
19+
await page.getByRole('menuitem', { name: 'Servers' }).click();
4320
await page.getByRole('button', { name: 'Next: Admin Rules' }).click();
4421
await page.getByRole('button', { name: 'Next: Options' }).click();
4522
await page.getByRole('button', { name: 'Create Role' }).click();
@@ -55,5 +32,5 @@ test('verify that a user can create and delete a role', async ({ page }) => {
5532

5633
await expect(page.getByRole('cell', { name: 'testrole' })).not.toBeVisible();
5734

58-
cleanup();
35+
await cleanup();
5936
});

web/e2e/tests/signup.spec.ts

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,23 @@
1-
import { test } from '@playwright/test';
1+
import { expect, test } from '@playwright/test';
22

3-
import { mockWebAuthn } from '../utils/mockWebAuthn';
3+
import { signup } from '../utils/signup';
44

55
test('verify that a user can sign up with webauthn and login', async ({
66
page,
77
}) => {
8-
const { cleanup } = await mockWebAuthn(page);
8+
const { cleanup } = await signup(page);
99

10-
await page.goto('');
11-
12-
await page.getByRole('button', { name: 'Get started' }).click();
13-
await page.getByRole('textbox', { name: 'Password', exact: true }).click();
14-
await page
15-
.getByRole('textbox', { name: 'Password', exact: true })
16-
.fill('passwordtest123');
17-
await page
18-
.getByRole('textbox', { name: 'Password', exact: true })
19-
.press('Tab');
20-
await page
21-
.getByRole('textbox', { name: 'Confirm Password' })
22-
.fill('passwordtest123');
23-
await page.getByRole('button', { name: 'Next' }).click();
24-
await page.getByRole('button', { name: 'Create an MFA Method' }).click();
25-
await page.getByRole('button', { name: 'Submit' }).click();
26-
await page.getByRole('button', { name: 'Go to Cluster' }).click();
2710
await page.getByRole('button', { name: 'User Menu' }).click();
2811
await page.getByText('Logout').click();
29-
await page.getByRole('textbox', { name: 'Username' }).fill('e2e-user');
12+
await page.getByRole('textbox', { name: 'Username' }).fill('testuser');
3013
await page.getByRole('textbox', { name: 'Username' }).press('Tab');
3114
await page.getByRole('textbox', { name: 'Password' }).fill('passwordtest123');
3215
await page
3316
.getByTestId('userpassword')
3417
.getByRole('button', { name: 'Sign In' })
3518
.click();
3619

37-
await page.getByText('Resources');
20+
await expect(page.getByRole('heading', { name: 'Resources' })).toBeVisible();
3821

39-
cleanup();
22+
await cleanup();
4023
});

web/e2e/utils/signup.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { Page } from '@playwright/test';
2+
3+
import { mockWebAuthn } from './mockWebAuthn';
4+
5+
/**
6+
* signup completes the signup flow for a new user. This is typically run at the beginning of every test.
7+
*/
8+
export async function signup(page: Page) {
9+
const { cleanup } = await mockWebAuthn(page);
10+
11+
await page.goto('');
12+
13+
await page.getByRole('button', { name: 'Get started' }).click();
14+
await page.getByRole('textbox', { name: 'Password', exact: true }).click();
15+
await page
16+
.getByRole('textbox', { name: 'Password', exact: true })
17+
.fill('passwordtest123');
18+
await page
19+
.getByRole('textbox', { name: 'Password', exact: true })
20+
.press('Tab');
21+
await page
22+
.getByRole('textbox', { name: 'Confirm Password' })
23+
.fill('passwordtest123');
24+
await page.getByRole('button', { name: 'Next' }).click();
25+
await page.getByRole('button', { name: 'Create an MFA Method' }).click();
26+
await page.getByRole('button', { name: 'Submit' }).click();
27+
await page.getByRole('button', { name: 'Go to Cluster' }).click();
28+
29+
await page.getByRole('button', { name: "I'll do that later" }).click();
30+
31+
return { cleanup };
32+
}

0 commit comments

Comments
 (0)