regressify 1.2.4 → 1.2.6

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.
@@ -176,11 +176,17 @@ module.exports = async (context) => {
176
176
  if (!!action.persit) {
177
177
  console.log(logPrefix + 'persit:', action.persit);
178
178
  const states = await browserContext.storageState();
179
- fs.writeFileSync(getStatePath(action.persit), JSON.stringify(states, null, 2));
179
+ setStorageState(action.persit, states);
180
180
  }
181
181
  }
182
182
  };
183
183
 
184
- function getStatePath(stateName) {
185
- return path.join(process.cwd(), 'states', `storage-states--${stateName}.json`);
184
+ function setStorageState(stateName, states) {
185
+ const statePath = path.join(process.cwd(), 'states', `storage-states--${stateName}.json`);
186
+ const parentDir = path.dirname(statePath);
187
+ if (!fs.existsSync(parentDir)) {
188
+ fs.mkdirSync(parentDir, { recursive: true });
189
+ }
190
+
191
+ fs.writeFileSync(statePath, JSON.stringify(states, null, 2));
186
192
  }
@@ -1,16 +1,21 @@
1
+ const fs = require('fs');
1
2
  const path = require('path');
2
3
  const autoScroll = require('../auto-scroll');
3
4
  const scrollTop = require('../scroll-top');
4
5
  const chalkImport = import('chalk').then((m) => m.default);
5
6
 
6
- function getStatePath(stateName) {
7
- return path.join(process.cwd(), 'states', `storage-states--${stateName}.json`);
7
+ function getStorageState(stateName) {
8
+ const statePath = path.join(process.cwd(), 'states', `storage-states--${stateName}.json`);
9
+ if (fs.existsSync(statePath)) {
10
+ const json = fs.readFileSync(statePath, 'utf8');
11
+ return JSON.parse(json);
12
+ }
8
13
  }
9
14
 
10
15
  module.exports = async (page, scenario, viewport, isReference, browserContext) => {
11
16
  if (scenario.restore) {
12
- console.log(logPrefix + 'restore:', action.restore);
13
- const states = JSON.parse(getStatePath(), 'utf8');
17
+ console.log(logPrefix + 'restore:', scenario.restore);
18
+ const states = getStorageState(scenario.restore);
14
19
  await browserContext.storageState(states);
15
20
  }
16
21
 
@@ -31,7 +36,7 @@ module.exports = async (page, scenario, viewport, isReference, browserContext) =
31
36
  console.log(logPrefix + 'SCENARIO > ' + scenario.label);
32
37
 
33
38
  if (!!scenario.actions) {
34
- await require('./actions')({ page, scenario, browserContext });
39
+ await require('./actions')({ currentPage: page, scenario, browserContext });
35
40
  } else {
36
41
  await require('./clickAndHoverHelper')(page, scenario);
37
42
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "regressify",
3
- "version": "1.2.4",
3
+ "version": "1.2.6",
4
4
  "description": "Visual regression tests support",
5
5
  "main": "src/index.ts",
6
6
  "type": "module",
@@ -1,143 +0,0 @@
1
- const fs = require('fs');
2
- const YAML = require('js-yaml');
3
- const { clearInterval } = require('timers');
4
- const globalData = {
5
- domain1: {
6
- isSiginingIn: false,
7
- cookies: undefined,
8
- domain: '',
9
- },
10
- };
11
- // loginAndSaveCookies.ts
12
- const getSignInData = async () => {
13
- const signInPath = 'common/_signing-in.yaml';
14
- let signInConfig = [];
15
- // Read Cookies from File, if exists
16
- if (!!signInPath && fs.existsSync(signInPath)) {
17
- let content = fs.readFileSync(signInPath);
18
- if (signInPath.endsWith('.json')) {
19
- signInConfig = JSON.parse(content);
20
- } else if (signInPath.endsWith('.yaml') || signInPath.endsWith('.yml')) {
21
- signInConfig = YAML.load(content);
22
- }
23
- }
24
-
25
- return signInConfig;
26
- };
27
- const sleep = (time) => {
28
- return new Promise((r) => {
29
- setTimeout(() => {
30
- r(true);
31
- }, time);
32
- });
33
- };
34
- const waitForCondition = (condition = () => true, intervalCheckTime = 1000, maxCheckTime = 30000) => {
35
- return new Promise((resolve, reject) => {
36
- if (condition()) {
37
- resolve(true);
38
- return;
39
- }
40
- let totalCheckedTime = 0;
41
- let intervalCheckId = setInterval(() => {
42
- totalCheckedTime += intervalCheckTime;
43
- if (condition()) {
44
- clearInterval(intervalCheckId);
45
- resolve(true);
46
- return;
47
- }
48
- if (totalCheckedTime >= maxCheckTime) {
49
- clearInterval(intervalCheckId);
50
- resolve(false);
51
- return;
52
- }
53
- }, intervalCheckTime);
54
- });
55
- };
56
-
57
- const executeSignIn = async (browserContext, domain) => {
58
- try {
59
- const pageUrl = domain;
60
- const signInConfig = await getSignInData();
61
- const sigInForPage = signInConfig.find((a) => a.domain.includes(pageUrl.host));
62
- if (!sigInForPage) {
63
- console.warn('not found signin config for page url', pageUrl);
64
- return;
65
- }
66
-
67
- console.log('found signin config for page url', pageUrl);
68
- const page = await browserContext.newPage();
69
-
70
- console.log('navigate to sigin url', sigInForPage.loginUrl);
71
- // Navigate to the login page
72
- await page.goto(sigInForPage.loginUrl);
73
-
74
- const inputData = async (selector, value) => {
75
- await page.waitForSelector(selector);
76
- console.log('found selector', selector);
77
- let el = await page.locator(selector);
78
- await el.fill(value);
79
- };
80
- await inputData(sigInForPage.userNameSelector, sigInForPage.userName);
81
- await inputData(sigInForPage.passwordSelector, sigInForPage.password);
82
-
83
- await page.waitForSelector(sigInForPage.loginButtonSelector);
84
- console.log('found selector login button');
85
- await Promise.all([page.click(sigInForPage.loginButtonSelector), page.waitForNavigation()]);
86
-
87
- page.close();
88
-
89
- console.log('sign in successfully', page.url());
90
- // Save cookies after login
91
- cookies = await browserContext.cookies();
92
- const loggingCookies = cookies.map((a) => a.name).sort();
93
- console.log('cookies', loggingCookies);
94
- return cookies;
95
- } catch (error) {
96
- console.error('sign in error', error, domain);
97
- return undefined;
98
- }
99
- };
100
- const waitForOtherSiginingIn = async (signInData) => {
101
- const isSignedIn = await waitForCondition(() => !signInData.isSiginingIn, 1000, 10000);
102
- return isSignedIn;
103
- };
104
- const getOrSetSignInData = async (browserContext, loginScenario) => {
105
- const pageUrl = new URL(loginScenario.url);
106
- const signInDomain = pageUrl.host;
107
- const signInData = (globalData[signInDomain] = globalData[signInDomain] || {
108
- isSiginingIn: false,
109
- cookies: undefined,
110
- signInDomain: new URL(`${pageUrl.protocol}//${pageUrl.host}`),
111
- });
112
-
113
- if (!signInData.isSiginingIn) {
114
- console.log('first signin was called');
115
- // lock current signin for domain
116
- signInData.isSiginingIn = true;
117
- signInData.cookies = await executeSignIn(browserContext, signInData.signInDomain);
118
- // release lock for domain
119
- signInData.isSiginingIn = false;
120
- } else {
121
- const isSignedInSuccessfully = await waitForOtherSiginingIn(signInData);
122
- if (isSignedInSuccessfully) {
123
- console.log('cookies is populated by others, reuse it');
124
- } else {
125
- console.log('cookies is not populated by others, start logging in user');
126
- signInData.cookies = await executeSignIn(browserContext, signInData.signInDomain);
127
- }
128
- }
129
-
130
- return signInData;
131
- };
132
- module.exports = async function (browserContext, loginScenario) {
133
- if (!loginScenario.requiredLogin) {
134
- console.log('testing scenario run as anonymous user ', loginScenario.label);
135
- return;
136
- }
137
- console.log('testing scenario required login cookies ', loginScenario.label);
138
- let signInData = await getOrSetSignInData(browserContext, loginScenario);
139
- if (signInData?.cookies) {
140
- browserContext.addCookies(signInData.cookies);
141
- console.log('------login cookies restored for ', loginScenario.label);
142
- }
143
- };
@@ -1,142 +0,0 @@
1
- const fs = require('fs');
2
- const YAML = require('js-yaml');
3
- const { clearInterval } = require('timers');
4
- const globalData = {
5
- domain1: {
6
- isSiginingIn: false,
7
- cookies: undefined,
8
- domain: '',
9
- },
10
- };
11
- // loginAndSaveCookies.ts
12
- const getSignInData = async () => {
13
- const signInPath = 'common/_signing-in.yaml';
14
- let signInConfig = [];
15
- // Read Cookies from File, if exists
16
- if (!!signInPath && fs.existsSync(signInPath)) {
17
- let content = fs.readFileSync(signInPath);
18
- if (signInPath.endsWith('.json')) {
19
- signInConfig = JSON.parse(content);
20
- } else if (signInPath.endsWith('.yaml') || signInPath.endsWith('.yml')) {
21
- signInConfig = YAML.load(content);
22
- }
23
- }
24
-
25
- return signInConfig;
26
- };
27
- const sleep = (time) => {
28
- return new Promise((r) => {
29
- setTimeout(() => {
30
- r(true);
31
- }, time);
32
- });
33
- };
34
- const waitForCondition = (condition = () => true, intervalCheckTime = 1000, maxCheckTime = 30000) => {
35
- return new Promise((resolve, reject) => {
36
- if (condition()) {
37
- resolve(true);
38
- return;
39
- }
40
- let totalCheckedTime = 0;
41
- let intervalCheckId = setInterval(() => {
42
- totalCheckedTime += intervalCheckTime;
43
- if (condition()) {
44
- clearInterval(intervalCheckId);
45
- resolve(true);
46
- return;
47
- }
48
- if (totalCheckedTime >= maxCheckTime) {
49
- clearInterval(intervalCheckId);
50
- resolve(false);
51
- return;
52
- }
53
- }, intervalCheckTime);
54
- });
55
- };
56
-
57
- const executeSignIn = async (browserContext, domain) => {
58
- try {
59
- const pageUrl = domain;
60
- const signInConfig = await getSignInData();
61
- const sigInForPage = signInConfig.find((a) => a.domain.includes(pageUrl.host));
62
- if (!sigInForPage) {
63
- console.warn('not found signin config for page url', pageUrl);
64
- return;
65
- }
66
-
67
- console.log('found signin config for page url', pageUrl);
68
- const page = await browserContext.newPage();
69
-
70
- console.log('navigate to sigin url', sigInForPage.loginUrl);
71
- // Navigate to the login page
72
- await page.goto(sigInForPage.loginUrl);
73
-
74
- const inputData = async (selector, value) => {
75
- await page.waitForSelector(selector);
76
- console.log('found selector', selector);
77
- let el = await page.locator(selector);
78
- await el.fill(value);
79
- };
80
- await inputData(sigInForPage.userNameSelector, sigInForPage.userName);
81
- await inputData(sigInForPage.passwordSelector, sigInForPage.password);
82
-
83
- await page.waitForSelector(sigInForPage.loginButtonSelector);
84
- console.log('found selector login button');
85
- await page.click(sigInForPage.loginButtonSelector);
86
- await page.waitForNavigation();
87
-
88
- console.log('sign in successfully', page.url());
89
- // Save cookies after login
90
- cookies = await browserContext.cookies();
91
- const loggingCookies = cookies.map((a) => a.name).sort();
92
- console.log('cookies', loggingCookies);
93
- return cookies;
94
- } catch (error) {
95
- console.error('sign in error', error, domain);
96
- return undefined;
97
- }
98
- };
99
- const waitForOtherSiginingIn = async (signInData) => {
100
- const isSignedIn = await waitForCondition(() => !signInData.isSiginingIn, 1000, 10000);
101
- return isSignedIn;
102
- };
103
- const getOrSetSignInData = async (browserContext, loginScenario) => {
104
- const pageUrl = new URL(loginScenario.url);
105
- const signInDomain = pageUrl.host;
106
- const signInData = (globalData[signInDomain] = globalData[signInDomain] || {
107
- isSiginingIn: false,
108
- cookies: undefined,
109
- signInDomain: new URL(`${pageUrl.protocol}//${pageUrl.host}`),
110
- });
111
-
112
- if (!signInData.isSiginingIn) {
113
- console.log('first signin was called');
114
- // lock current signin for domain
115
- signInData.isSiginingIn = true;
116
- signInData.cookies = await executeSignIn(browserContext, signInData.signInDomain);
117
- // release lock for domain
118
- signInData.isSiginingIn = false;
119
- } else {
120
- const isSignedInSuccessfully = await waitForOtherSiginingIn(signInData);
121
- if (isSignedInSuccessfully) {
122
- console.log('cookies is populated by others, reuse it');
123
- } else {
124
- console.log('cookies is not populated by others, start logging in user');
125
- signInData.cookies = await executeSignIn(browserContext, signInData.signInDomain);
126
- }
127
- }
128
-
129
- return signInData;
130
- };
131
- module.exports = async function (browserContext, loginScenario) {
132
- if (!loginScenario.requiredLogin) {
133
- console.log('testing scenario run as anonymous user ', loginScenario.label);
134
- return;
135
- }
136
- console.log('testing scenario required login cookies ', loginScenario.label);
137
- let signInData = await getOrSetSignInData(browserContext, loginScenario);
138
- if (signInData?.cookies) {
139
- browserContext.addCookies(signInData.cookies);
140
- console.log('------login cookies restored for ', loginScenario.label);
141
- }
142
- };