Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import crypto from 'crypto';
import type { BrowserContextOptions, Page } from '@playwright/test';
export type IUserState = {
data: {
username: string
loginToken: string
loginExpire: Date
hashedToken: string
},
state: Exclude<BrowserContextOptions['storageState'], string | undefined>
}
function generateContext(username: string) : IUserState {
const date = new Date('2023-02-17T20:38:12.306Z');
date.setFullYear(date.getFullYear() + 1);
const token = {
token: crypto.createHash('sha256').update(username).digest('base64'),
when: date
};
const hashedToken = crypto.createHash('sha256').update(token.token).digest('base64');
return {
data: {
username,
loginToken: token.token,
loginExpire: token.when,
hashedToken
},
state: {
"cookies": [
{
"sameSite": "Lax",
"name": "rc_uid",
"value": username,
"domain": "localhost",
"path": "/",
"expires": -1,
"httpOnly": false,
"secure": false
},
{
"sameSite": "Lax",
"name": "rc_token",
"value": token.token,
"domain": "localhost",
"path": "/",
"expires": -1,
"httpOnly": false,
"secure": false
}
],
"origins": [
{
"origin": "http://localhost:3000",
"localStorage": [
{
"name": "userLanguage",
"value": "en-US"
},
{
"name": "Meteor.loginToken",
"value": token.token
},
{
"name": "Meteor.loginTokenExpires",
"value": token.when.toISOString(),
},
{
"name": "Meteor.userId",
"value": username
}
]
}
]
}
}
}
export const Users = {
user1: generateContext('user1'),
user2: generateContext('user2'),
user3: generateContext('user3'),
admin: generateContext('rocketchat.internal.admin.test')
}
export async function storeState(page: Page, user: IUserState) {
user.state.origins = (await page.context().storageState()).origins;
}
export async function restoreState(page: Page, user: IUserState, options: {except?: string[]} = {}) {
let ls = user.state.origins[0].localStorage
if (options.except?.length) {
ls = ls.filter(({name}) => !options.except?.includes(name));
}
return page.evaluate((items) => {
items.forEach(({name, value}) => {
window.localStorage.setItem(name, value);
})
}, ls);
}