chore(aria): generate single patch for all baselines (#33384)
This commit is contained in:
		
							parent
							
								
									69404561f9
								
							
						
					
					
						commit
						c462e29e73
					
				| 
						 | 
				
			
			@ -20,6 +20,7 @@ import type { T } from '../transform/babelBundle';
 | 
			
		|||
import { types, traverse, babelParse } from '../transform/babelBundle';
 | 
			
		||||
import { MultiMap } from 'playwright-core/lib/utils';
 | 
			
		||||
import { generateUnifiedDiff } from 'playwright-core/lib/utils';
 | 
			
		||||
import { colors } from 'playwright-core/lib/utilsBundle';
 | 
			
		||||
import type { FullConfigInternal } from '../common/config';
 | 
			
		||||
import { filterProjects } from './projectUtils';
 | 
			
		||||
const t: typeof T = types;
 | 
			
		||||
| 
						 | 
				
			
			@ -45,11 +46,16 @@ export function addSuggestedRebaseline(location: Location, suggestedRebaseline:
 | 
			
		|||
export async function applySuggestedRebaselines(config: FullConfigInternal) {
 | 
			
		||||
  if (config.config.updateSnapshots !== 'all' && config.config.updateSnapshots !== 'missing')
 | 
			
		||||
    return;
 | 
			
		||||
  if (!suggestedRebaselines.size)
 | 
			
		||||
    return;
 | 
			
		||||
  const [project] = filterProjects(config.projects, config.cliProjectFilter);
 | 
			
		||||
  if (!project)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  for (const fileName of suggestedRebaselines.keys()) {
 | 
			
		||||
  const patches: string[] = [];
 | 
			
		||||
  const files: string[] = [];
 | 
			
		||||
 | 
			
		||||
  for (const fileName of [...suggestedRebaselines.keys()].sort()) {
 | 
			
		||||
    const source = await fs.promises.readFile(fileName, 'utf8');
 | 
			
		||||
    const lines = source.split('\n');
 | 
			
		||||
    const replacements = suggestedRebaselines.get(fileName);
 | 
			
		||||
| 
						 | 
				
			
			@ -86,10 +92,16 @@ export async function applySuggestedRebaselines(config: FullConfigInternal) {
 | 
			
		|||
    for (const range of ranges)
 | 
			
		||||
      result = result.substring(0, range.start) + range.newText + result.substring(range.end);
 | 
			
		||||
 | 
			
		||||
    const relativeName = path.relative(process.cwd(), fileName).replace(/\\/g, '/');
 | 
			
		||||
 | 
			
		||||
    const patchFile = path.join(project.project.outputDir, 'rebaselines.patch');
 | 
			
		||||
    await fs.promises.mkdir(path.dirname(patchFile), { recursive: true });
 | 
			
		||||
    await fs.promises.writeFile(patchFile, generateUnifiedDiff(source, result, relativeName));
 | 
			
		||||
    const relativeName = path.relative(process.cwd(), fileName);
 | 
			
		||||
    files.push(relativeName);
 | 
			
		||||
    patches.push(generateUnifiedDiff(source, result, relativeName.replace(/\\/g, '/')));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const patchFile = path.join(project.project.outputDir, 'rebaselines.patch');
 | 
			
		||||
  await fs.promises.mkdir(path.dirname(patchFile), { recursive: true });
 | 
			
		||||
  await fs.promises.writeFile(patchFile, patches.join('\n'));
 | 
			
		||||
 | 
			
		||||
  const fileList = files.map(file => '  ' + colors.dim(file)).join('\n');
 | 
			
		||||
  // eslint-disable-next-line no-console
 | 
			
		||||
  console.log(`New baselines created for:\n\n${fileList}\n\n  ` + colors.cyan('git apply ' + path.relative(process.cwd(), patchFile)) + '\n');
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,15 +5,15 @@
 | 
			
		|||
  "packages": {
 | 
			
		||||
    "": {
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@playwright/test": "1.49.0-alpha-2024-10-29"
 | 
			
		||||
        "@playwright/test": "1.49.0-alpha-2024-10-30"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@playwright/test": {
 | 
			
		||||
      "version": "1.49.0-alpha-2024-10-29",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.0-alpha-2024-10-29.tgz",
 | 
			
		||||
      "integrity": "sha512-JyT6BHjuJl5Iv91PvaYa1RXRQfSwHk1Abq/hzYFpebQQuKKNr3pck55qmih39+S/bGsuYW6XdzqAX+CfknR3sA==",
 | 
			
		||||
      "version": "1.49.0-alpha-2024-10-30",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.0-alpha-2024-10-30.tgz",
 | 
			
		||||
      "integrity": "sha512-7pq4a+eDCkp6VmGGpr6KanL0gQ2SunC9dAjtP+VZLobdaY0ZL7XkmD2rL8UNANF2AkmKdOf+GmTS+wZ42qhvLg==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "playwright": "1.49.0-alpha-2024-10-29"
 | 
			
		||||
        "playwright": "1.49.0-alpha-2024-10-30"
 | 
			
		||||
      },
 | 
			
		||||
      "bin": {
 | 
			
		||||
        "playwright": "cli.js"
 | 
			
		||||
| 
						 | 
				
			
			@ -36,11 +36,11 @@
 | 
			
		|||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/playwright": {
 | 
			
		||||
      "version": "1.49.0-alpha-2024-10-29",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.0-alpha-2024-10-29.tgz",
 | 
			
		||||
      "integrity": "sha512-ypwaWQwpxAiB5JEz4ACrztZsII4BdD5zOuAnjPtiXZtemSZNwxxY7phKlX8nLUlGwWDpb8aGe9tBcxoyrcFIww==",
 | 
			
		||||
      "version": "1.49.0-alpha-2024-10-30",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.0-alpha-2024-10-30.tgz",
 | 
			
		||||
      "integrity": "sha512-OJ++0IaaTyBHZuPMi7kNZ/ssyRvN4Fkh7NCpYBRyfPL8H90bEVwDe7j4Ab79HMBLxUZMg7D7aRIlimmYmVdbpQ==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "playwright-core": "1.49.0-alpha-2024-10-29"
 | 
			
		||||
        "playwright-core": "1.49.0-alpha-2024-10-30"
 | 
			
		||||
      },
 | 
			
		||||
      "bin": {
 | 
			
		||||
        "playwright": "cli.js"
 | 
			
		||||
| 
						 | 
				
			
			@ -53,9 +53,9 @@
 | 
			
		|||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/playwright-core": {
 | 
			
		||||
      "version": "1.49.0-alpha-2024-10-29",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.0-alpha-2024-10-29.tgz",
 | 
			
		||||
      "integrity": "sha512-pJmBdOnVFzBzA6Jo1q7FtJferyLK0a2cNZGbuOMO0LOPWY7FOT91225TYZ9a1qgaYMav+uudmYw6im/qjEwmIQ==",
 | 
			
		||||
      "version": "1.49.0-alpha-2024-10-30",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.0-alpha-2024-10-30.tgz",
 | 
			
		||||
      "integrity": "sha512-T1KDI5SQPqzVIahMOpCX7GE2Slv/5KEM+gSnj5mQZDi57Z8Ij5xnGz6ZX4KBdDrmkBRHLrRM4ijXfH1Q7zNkEg==",
 | 
			
		||||
      "bin": {
 | 
			
		||||
        "playwright-core": "cli.js"
 | 
			
		||||
      },
 | 
			
		||||
| 
						 | 
				
			
			@ -66,11 +66,11 @@
 | 
			
		|||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@playwright/test": {
 | 
			
		||||
      "version": "1.49.0-alpha-2024-10-29",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.0-alpha-2024-10-29.tgz",
 | 
			
		||||
      "integrity": "sha512-JyT6BHjuJl5Iv91PvaYa1RXRQfSwHk1Abq/hzYFpebQQuKKNr3pck55qmih39+S/bGsuYW6XdzqAX+CfknR3sA==",
 | 
			
		||||
      "version": "1.49.0-alpha-2024-10-30",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.0-alpha-2024-10-30.tgz",
 | 
			
		||||
      "integrity": "sha512-7pq4a+eDCkp6VmGGpr6KanL0gQ2SunC9dAjtP+VZLobdaY0ZL7XkmD2rL8UNANF2AkmKdOf+GmTS+wZ42qhvLg==",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "playwright": "1.49.0-alpha-2024-10-29"
 | 
			
		||||
        "playwright": "1.49.0-alpha-2024-10-30"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "fsevents": {
 | 
			
		||||
| 
						 | 
				
			
			@ -80,18 +80,18 @@
 | 
			
		|||
      "optional": true
 | 
			
		||||
    },
 | 
			
		||||
    "playwright": {
 | 
			
		||||
      "version": "1.49.0-alpha-2024-10-29",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.0-alpha-2024-10-29.tgz",
 | 
			
		||||
      "integrity": "sha512-ypwaWQwpxAiB5JEz4ACrztZsII4BdD5zOuAnjPtiXZtemSZNwxxY7phKlX8nLUlGwWDpb8aGe9tBcxoyrcFIww==",
 | 
			
		||||
      "version": "1.49.0-alpha-2024-10-30",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.0-alpha-2024-10-30.tgz",
 | 
			
		||||
      "integrity": "sha512-OJ++0IaaTyBHZuPMi7kNZ/ssyRvN4Fkh7NCpYBRyfPL8H90bEVwDe7j4Ab79HMBLxUZMg7D7aRIlimmYmVdbpQ==",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "fsevents": "2.3.2",
 | 
			
		||||
        "playwright-core": "1.49.0-alpha-2024-10-29"
 | 
			
		||||
        "playwright-core": "1.49.0-alpha-2024-10-30"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "playwright-core": {
 | 
			
		||||
      "version": "1.49.0-alpha-2024-10-29",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.0-alpha-2024-10-29.tgz",
 | 
			
		||||
      "integrity": "sha512-pJmBdOnVFzBzA6Jo1q7FtJferyLK0a2cNZGbuOMO0LOPWY7FOT91225TYZ9a1qgaYMav+uudmYw6im/qjEwmIQ=="
 | 
			
		||||
      "version": "1.49.0-alpha-2024-10-30",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.0-alpha-2024-10-30.tgz",
 | 
			
		||||
      "integrity": "sha512-T1KDI5SQPqzVIahMOpCX7GE2Slv/5KEM+gSnj5mQZDi57Z8Ij5xnGz6ZX4KBdDrmkBRHLrRM4ijXfH1Q7zNkEg=="
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
{
 | 
			
		||||
  "private": true,
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@playwright/test": "1.49.0-alpha-2024-10-29"
 | 
			
		||||
    "@playwright/test": "1.49.0-alpha-2024-10-30"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -204,3 +204,65 @@ test('should update missing snapshots in tsx', async ({ runInlineTest }, testInf
 | 
			
		|||
     
 | 
			
		||||
`);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test('should update multiple files', async ({ runInlineTest }, testInfo) => {
 | 
			
		||||
  const result = await runInlineTest({
 | 
			
		||||
    'playwright.config.ts': playwrightCtConfigText,
 | 
			
		||||
    'playwright/index.html': `<script type="module" src="./index.ts"></script>`,
 | 
			
		||||
    'playwright/index.ts': ``,
 | 
			
		||||
 | 
			
		||||
    'src/button.tsx': `
 | 
			
		||||
      export const Button = () => <button>Button</button>;
 | 
			
		||||
    `,
 | 
			
		||||
 | 
			
		||||
    'src/button-1.test.tsx': `
 | 
			
		||||
      import { test, expect } from '@playwright/experimental-ct-react';
 | 
			
		||||
      import { Button } from './button.tsx';
 | 
			
		||||
 | 
			
		||||
      test('pass 1', async ({ mount }) => {
 | 
			
		||||
        const component = await mount(<Button></Button>);
 | 
			
		||||
        await expect(component).toMatchAriaSnapshot(\`\`);
 | 
			
		||||
      });
 | 
			
		||||
    `,
 | 
			
		||||
 | 
			
		||||
    'src/button-2.test.tsx': `
 | 
			
		||||
      import { test, expect } from '@playwright/experimental-ct-react';
 | 
			
		||||
      import { Button } from './button.tsx';
 | 
			
		||||
 | 
			
		||||
      test('pass 2', async ({ mount }) => {
 | 
			
		||||
        const component = await mount(<Button></Button>);
 | 
			
		||||
        await expect(component).toMatchAriaSnapshot(\`\`);
 | 
			
		||||
      });
 | 
			
		||||
    `,
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  expect(result.exitCode).toBe(0);
 | 
			
		||||
  const patchPath = testInfo.outputPath('test-results/rebaselines.patch');
 | 
			
		||||
  const data = fs.readFileSync(patchPath, 'utf-8');
 | 
			
		||||
  expect(data).toBe(`--- a/src/button-1.test.tsx
 | 
			
		||||
+++ b/src/button-1.test.tsx
 | 
			
		||||
@@ -4,6 +4,8 @@
 | 
			
		||||
 
 | 
			
		||||
       test('pass 1', async ({ mount }) => {
 | 
			
		||||
         const component = await mount(<Button></Button>);
 | 
			
		||||
-        await expect(component).toMatchAriaSnapshot(\`\`);
 | 
			
		||||
+        await expect(component).toMatchAriaSnapshot(\`
 | 
			
		||||
+          - button \"Button\"
 | 
			
		||||
+        \`);
 | 
			
		||||
       });
 | 
			
		||||
     
 | 
			
		||||
 | 
			
		||||
--- a/src/button-2.test.tsx
 | 
			
		||||
+++ b/src/button-2.test.tsx
 | 
			
		||||
@@ -4,6 +4,8 @@
 | 
			
		||||
 
 | 
			
		||||
       test('pass 2', async ({ mount }) => {
 | 
			
		||||
         const component = await mount(<Button></Button>);
 | 
			
		||||
-        await expect(component).toMatchAriaSnapshot(\`\`);
 | 
			
		||||
+        await expect(component).toMatchAriaSnapshot(\`
 | 
			
		||||
+          - button \"Button\"
 | 
			
		||||
+        \`);
 | 
			
		||||
       });
 | 
			
		||||
     
 | 
			
		||||
`);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue