Skip to content

Commit db18686

Browse files
committed
Add logged in session test
1 parent 71a53bd commit db18686

File tree

4 files changed

+103
-17
lines changed

4 files changed

+103
-17
lines changed

playwright.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ const config = {
3737

3838
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
3939
use: {
40-
headless: true,
40+
headless: true, // set to false to debug
4141

4242
locale: 'en-US',
4343

tests/e2e/e2e_test.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,15 +96,17 @@ func TestE2e(t *testing.T) {
9696
cmd := exec.Command(runArgs[0], runArgs...)
9797
cmd.Env = os.Environ()
9898
cmd.Env = append(cmd.Env, fmt.Sprintf("GITEA_URL=%s", setting.AppURL))
99-
var out bytes.Buffer
100-
cmd.Stdout = &out
99+
var stdout, stderr bytes.Buffer
100+
cmd.Stdout = &stdout
101+
cmd.Stderr = &stderr
101102
err := cmd.Run()
102103
if err != nil {
103104
// Currently colored output is conflicting. Using Printf until that is resolved.
104-
fmt.Printf("%v", out.String())
105+
fmt.Printf("%v", stdout.String())
106+
fmt.Printf("%v", stderr.String())
105107
log.Fatal("Playwright Failed: %s", err)
106108
} else {
107-
fmt.Printf("%v", out.String())
109+
fmt.Printf("%v", stdout.String())
108110
}
109111
})
110112
})

tests/e2e/example.test.e2e.js

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
// @ts-check
22
import {test, expect} from '@playwright/test';
3+
import {login_user, save_visual, load_logged_in_context} from './utils_e2e.js';
4+
5+
test.beforeAll(async ({browser}, workerInfo) => {
6+
await login_user(browser, workerInfo, 'user2');
7+
});
38

49
test('Load Homepage', async ({page}) => {
510
const response = await page.goto('/');
@@ -20,16 +25,33 @@ test('Test Register Form', async ({page}, workerInfo) => {
2025
await expect(page.url()).toBe(`${workerInfo.project.use.baseURL}/`);
2126
await expect(page.locator('.dashboard-navbar span>img.ui.avatar.image')).toBeVisible();
2227
await expect(page.locator('.ui.positive.message.flash-success')).toHaveText('Account was successfully created.');
23-
// Optionally include visual testing
24-
if (process.env.VISUAL_TEST) {
25-
await page.waitForLoadState('networkidle');
26-
// Mock page/version string
27-
await page.locator('footer div.ui.left').evaluate((node) => node.innerHTML = 'MOCK');
28-
await expect(page).toHaveScreenshot({timeout: 20000,
29-
mask: [
30-
page.locator('.dashboard-navbar span>img.ui.avatar.image'),
31-
page.locator('.ui.dropdown.jump.item.tooltip span>img.ui.avatar.image'),
32-
]
33-
});
34-
}
28+
29+
save_visual(page);
30+
});
31+
32+
test('Test Login Form', async ({page}, workerInfo) => {
33+
const response = await page.goto('/user/login');
34+
await expect(response?.status()).toBe(200); // Status OK
35+
36+
await page.type('input[name=user_name]', `user2`);
37+
await page.type('input[name=password]', `password`);
38+
await page.click('form button.ui.green.button:visible');
39+
40+
await page.waitForLoadState('networkidle');
41+
42+
await expect(page.url()).toBe(`${workerInfo.project.use.baseURL}/`);
43+
44+
save_visual(page);
45+
});
46+
47+
test('Test Logged In User', async ({browser}, workerInfo) => {
48+
const context = await load_logged_in_context(browser, workerInfo, 'user2');
49+
const page = await context.newPage();
50+
51+
await page.goto('/');
52+
53+
// Make sure we routed to the home page. Else login failed.
54+
await expect(page.url()).toBe(`${workerInfo.project.use.baseURL}/`);
55+
56+
save_visual(page);
3557
});

tests/e2e/utils_e2e.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import {expect, request} from '@playwright/test';
2+
3+
const ARTIFACTS_PATH = `tests/e2e/test-artifacts`
4+
const LOGIN_PASSWORD = 'password'
5+
6+
/*
7+
log in user and store session info. This should generally be
8+
run in test.beforeAll(), then the session can be loaded in tests.
9+
*/
10+
export async function login_user(browser, workerInfo, user) {
11+
// Set up a new context
12+
let context = await browser.newContext();
13+
let page = await context.newPage();
14+
15+
// Route to login page
16+
// Note: this could probably be done more quickly with a POST
17+
const response = await page.goto('/user/login');
18+
await expect(response?.status()).toBe(200); // Status OK
19+
20+
// Fill out form
21+
await page.type('input[name=user_name]', user);
22+
await page.type('input[name=password]', LOGIN_PASSWORD);
23+
await page.click('form button.ui.green.button:visible');
24+
25+
await page.waitForLoadState('networkidle');
26+
27+
await expect(page.url(), {message: `Failed to login user ${user}`}).toBe(`${workerInfo.project.use.baseURL}/`);
28+
29+
// Save state
30+
await context.storageState({ path: `${ARTIFACTS_PATH}/state-${user}-${workerInfo.workerIndex}.json` });
31+
32+
return context;
33+
}
34+
35+
export async function load_logged_in_context(browser, workerInfo, user) {
36+
try {
37+
var context = await browser.newContext({ storageState: `${ARTIFACTS_PATH}/state-${user}-${workerInfo.workerIndex}.json` })
38+
} catch(err) {
39+
if (err.code == 'ENOENT') {
40+
console.error(`Could not find state for '${user}'. Did you call login_user(browser, workerInfo, '${user}') in test.beforeAll()?`)
41+
}
42+
throw err;
43+
}
44+
return context;
45+
}
46+
47+
export async function save_visual(page) {
48+
// Optionally include visual testing
49+
if (process.env.VISUAL_TEST) {
50+
await page.waitForLoadState('networkidle');
51+
// Mock page/version string
52+
await page.locator('footer div.ui.left').evaluate((node) => node.innerHTML = 'MOCK');
53+
await expect(page).toHaveScreenshot({
54+
fullPage: true,
55+
timeout: 20000,
56+
mask: [
57+
page.locator('.dashboard-navbar span>img.ui.avatar.image'),
58+
page.locator('.ui.dropdown.jump.item.tooltip span>img.ui.avatar.image'),
59+
],
60+
});
61+
}
62+
}

0 commit comments

Comments
 (0)