@digigov/cli-app 1.0.0-rc.2 → 1.0.0-rc.4

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.
package/index.js CHANGED
@@ -56,19 +56,26 @@ module.exports = class App extends DigigovCommand {
56
56
  .option('pagesPath', {
57
57
  alias: 'p',
58
58
  describe: 'The directory where the pages are located relative to the project folder',
59
+ default: 'pages'
60
+ })
61
+ .option('screenSizes', {
62
+ alias: 's',
63
+ choices: ['xs', 'lg'],
64
+ describe: 'The screen sizes for viewport',
59
65
  })
60
66
  .help()
61
67
  .argv;
62
68
 
63
69
  if (test_args.init) {
64
- const { baseUrl, pagesPath } = test_args;
65
- console.log(`Generating test files for pagesPath "${pagesPath}" with baseUrl "${baseUrl}"`);
70
+ const { baseUrl, pagesPath, screenSizes } = test_args;
71
+ console.log(`Generating test files for pagesPath "${pagesPath}" with baseUrl "${baseUrl}" for screen sizes "${screenSizes}"`);
66
72
  const projectFolder = process.cwd();
67
- generatePagesTestFile(projectFolder, pagesPath, baseUrl);
73
+ generatePagesTestFile(projectFolder, pagesPath, baseUrl, screenSizes);
68
74
  } else {
69
- console.log('Usage: digigov app test --init --baseUrl [baseUrl] --pagesPath [pagesPath]');
75
+ console.log('Usage: digigov app test --init --baseUrl [baseUrl] --pagesPath [pagesPath] --screenSizes [screenSizes]');
70
76
  console.log('baseUrl: the base url of the running project (default: http://localhost:3000)');
71
77
  console.log('pagesPath: the directory where the pages are located (default: pages, src/pages)');
78
+ console.log('screenSizes: the screen sizes for viewport (default: lg)');
72
79
  }
73
80
  break;
74
81
  default:
package/lib/test/init.js CHANGED
@@ -4,53 +4,93 @@ const glob = require('glob');
4
4
 
5
5
  const FILE_EXTENSIONS = ['js', 'jsx', 'ts', 'tsx'];
6
6
 
7
- const appendTestFile = (fileRelativePath, baseUrl, testFile) => {
8
- testFile += `\n\ttest('${fileRelativePath.replace('index', '')} page should match the screenshot', async () => {
9
- await page.goto(\`\${baseUrl}${fileRelativePath.replace('index', '')}\`);
10
- const screenshot = await page.screenshot();
11
- expect(screenshot).toMatchSnapshot();
12
- });\n`;
7
+ const SCREEN_SIZES = {
8
+ 'xs': { width: 375, height: 667, deviceScaleFactor: 1 },
9
+ 'lg': { width: 1280, height: 720, deviceScaleFactor: 2 }
10
+ }
11
+
12
+ const appendTestFile = (fileRelativePath, testFile, screenSizes) => {
13
+ screenSizes.forEach((screenSize) => {
14
+ testFile += `\ntest('${fileRelativePath.replace('index', '')} screen-${screenSize}', async () => {
15
+ await page${screenSize.toUpperCase()}.goto(\`\${baseUrl}${fileRelativePath.replace('index', '')}\`);
16
+ await delay(SCREENSHOT_DELAY);
17
+ await page${screenSize.toUpperCase()}.waitForLoadState('domcontentloaded');
18
+ const screenshot = await page${screenSize.toUpperCase()}.screenshot({ fullPage: true });
19
+ expect(screenshot).toMatchSnapshot();
20
+ });\n`;
21
+ });
13
22
  return testFile;
14
23
  }
15
24
 
16
- const generatePagesTestFile = (projectFolder, pagesPath, baseUrl = 'http://localhost:3000', testFileName = 'index.spec.ts') => {
25
+ const generateBrowserContexts = (screenSizes) => {
26
+ let viewportSizes = '';
27
+ screenSizes.forEach((screenSize) => {
28
+ viewportSizes += `\n// Create a context with "${screenSize}" screen size
29
+ const context${screenSize.toUpperCase()} = await browser.newContext({
30
+ viewport: { width: ${SCREEN_SIZES[screenSize].width}, height: ${SCREEN_SIZES[screenSize].height} },
31
+ deviceScaleFactor: ${SCREEN_SIZES[screenSize].deviceScaleFactor},
32
+ });\n`;
33
+ });
34
+ return viewportSizes;
35
+ }
36
+
37
+ const initializePages = (screenSizes) => {
38
+ let initializePages = '';
39
+ screenSizes.forEach((screenSize) => {
40
+ initializePages += `let page${screenSize.toUpperCase()};\n`;
41
+ });
42
+ return initializePages;
43
+ }
44
+
45
+ const generateNewPages = (screenSizes) => {
46
+ let newPages = '';
47
+ screenSizes.forEach((screenSize) => {
48
+ newPages += `page${screenSize.toUpperCase()} = await context${screenSize.toUpperCase()}.newPage();\n`;
49
+ });
50
+ return newPages;
51
+ }
52
+
53
+ const generatePagesTestFile = (projectFolder, pagesPath = 'pages', baseUrl = 'http://localhost:3000', testFileName = 'index.spec.ts', screenSizes=['xs', 'lg']) => {
17
54
  let pagesFullPath = '';
18
- if (pagesPath) {
55
+ if (fs.existsSync(path.join(projectFolder, pagesPath))) {
19
56
  pagesFullPath = path.join(projectFolder, pagesPath);
20
57
  }
21
- else {
22
- if (fs.existsSync(path.join(projectFolder, 'pages'))) {
23
- pagesFullPath = path.join(projectFolder, 'pages');
24
- }
25
- else if (fs.existsSync(path.join(projectFolder, 'src', 'pages'))) {
26
- pagesFullPath = path.join(projectFolder, 'src/pages');
27
- }
58
+ else if (fs.existsSync(path.join(projectFolder, 'src', pagesPath))) {
59
+ pagesFullPath = path.join(projectFolder, `src/${pagesPath}`);
28
60
  }
29
61
  let testFile = `import { test, expect } from '@playwright/test';
30
62
  import { chromium } from 'playwright';
31
63
 
32
64
  const baseUrl = '${baseUrl}';
65
+ const SCREENSHOT_DELAY = 2000;
33
66
 
34
- test.describe('${projectFolder} /pages tests', () => {
67
+ test.describe('/pages', () => {
35
68
  let browser;
36
- let page;
69
+ ${initializePages(screenSizes)}
70
+
71
+ const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
37
72
 
38
73
  test.beforeAll(async () => {
74
+ // Wait until yarn start is loaded
75
+ test.setTimeout(60000);
76
+ await delay(30000);
39
77
  browser = await chromium.launch();
40
- page = await browser.newPage();
78
+ ${generateBrowserContexts(screenSizes)}
79
+ ${generateNewPages(screenSizes)}
41
80
  });
42
81
 
43
82
  test.afterAll(async () => {
44
83
  await browser.close();
45
84
  });
46
85
  `;
86
+
47
87
  const pagesPathRegex = new RegExp(`.*${pagesFullPath.replace('/', '\\/')}(.*)`);
48
88
  glob.sync(`${pagesFullPath}/**/*.@(${FILE_EXTENSIONS.join('|')})`).forEach((fileFullPath) => {
49
89
  const fileRelativePath = fileFullPath.replace(pagesPathRegex, '$1');
50
90
  const pageFileName = fileRelativePath.substring(fileRelativePath.lastIndexOf('/') + 1);
51
91
  // Check of the file starts with letter or digit
52
92
  if(/^[a-zA-Z0-9]/.test(pageFileName)) {
53
- testFile = appendTestFile(fileRelativePath.replace(/\.[^/.]+$/, ''), baseUrl, testFile);
93
+ testFile = appendTestFile(fileRelativePath.replace(/\.[^/.]+$/, ''), testFile, screenSizes);
54
94
  }
55
95
  });
56
96
  testFile += '\n});';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digigov/cli-app",
3
- "version": "1.0.0-rc.2",
3
+ "version": "1.0.0-rc.4",
4
4
  "description": "@digigov developer cli tool",
5
5
  "main": "index.js",
6
6
  "author": "GRNET Developers <devs@lists.grnet.gr>",
@@ -10,7 +10,7 @@
10
10
  "express": "4.17.1",
11
11
  "http-proxy-middleware": "1.0.3",
12
12
  "next-images": "1.3.0",
13
- "@digigov/cli-build": "1.0.0-rc.2",
13
+ "@digigov/cli-build": "1.0.0-rc.4",
14
14
  "url-loader": "4.1.1",
15
15
  "next": "10.0.9",
16
16
  "publint": "0.1.8",
@@ -21,13 +21,13 @@
21
21
  "peerDependencies": {
22
22
  "rimraf": "3.0.2",
23
23
  "execa": "5.0.0",
24
- "@digigov/cli": "1.0.0-rc.2",
24
+ "@digigov/cli": "1.0.0-rc.4",
25
25
  "typescript": "4.2.3",
26
26
  "@types/node": "16.6.2",
27
27
  "@types/react": "16.9.56",
28
28
  "autoprefixer": "10.4.16",
29
29
  "postcss": "8.4.4",
30
- "@digigov/css": "1.0.0-rc.2",
30
+ "@digigov/css": "1.0.0-rc.4",
31
31
  "tailwindcss": "3.3.5"
32
32
  },
33
33
  "scripts": {