/** * Copyright (c) Microsoft Corporation. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { stripAnsi } from '../config/utils'; import { test, expect } from './pageTest'; test('should match', async ({ page }) => { await page.setContent(`

title

`); await expect(page.locator('body')).toMatchAriaSnapshot(` - heading "title" `); }); test('should match in list', async ({ page }) => { await page.setContent(`

title

title 2

`); await expect(page.locator('body')).toMatchAriaSnapshot(` - heading "title" `); }); test('should match list with accessible name', async ({ page }) => { await page.setContent(` `); await expect(page.locator('body')).toMatchAriaSnapshot(` - list "my list": - listitem: "one" - listitem: "two" `); }); test('should match deep item', async ({ page }) => { await page.setContent(`

title

title 2

`); await expect(page.locator('body')).toMatchAriaSnapshot(` - heading "title" `); }); test('should match complex', async ({ page }) => { await page.setContent(` `); await expect(page.locator('body')).toMatchAriaSnapshot(` - list: - listitem: - link "link" `); }); test('should match regex', async ({ page }) => { { await page.setContent(`

Issues 12

`); await expect(page.locator('body')).toMatchAriaSnapshot(` - heading ${/Issues \d+/} `); } { await page.setContent(`

Issues 1/2

`); await expect(page.locator('body')).toMatchAriaSnapshot(` - heading ${/Issues 1[/]2/} `); } { await page.setContent(`

Issues 1[

`); await expect(page.locator('body')).toMatchAriaSnapshot(` - heading ${/Issues 1\[/} `); } { await page.setContent(`

Issues 1]]2

`); await expect(page.locator('body')).toMatchAriaSnapshot(` - heading ${/Issues 1[\]]]2/} `); } }); test('should allow text nodes', async ({ page }) => { await page.setContent(`

Microsoft

Open source projects and samples from Microsoft
`); await expect(page.locator('body')).toMatchAriaSnapshot(` - heading "Microsoft" - text: "Open source projects and samples from Microsoft" `); }); test('details visibility', async ({ page }) => { await page.setContent(`
Summary
Details
`); await expect(page.locator('body')).toMatchAriaSnapshot(` - group: "Summary" `); }); test('checked attribute', async ({ page }) => { await page.setContent(` `); await expect(page.locator('body')).toMatchAriaSnapshot(` - checkbox `); await expect(page.locator('body')).toMatchAriaSnapshot(` - checkbox [checked] `); await expect(page.locator('body')).toMatchAriaSnapshot(` - checkbox [checked=true] `); { const e = await expect(page.locator('body')).toMatchAriaSnapshot(` - checkbox [checked=false] `, { timeout: 1000 }).catch(e => e); expect(stripAnsi(e.message)).toContain('Timed out 1000ms waiting for expect'); } { const e = await expect(page.locator('body')).toMatchAriaSnapshot(` - checkbox [checked=mixed] `, { timeout: 1000 }).catch(e => e); expect(stripAnsi(e.message)).toContain('Timed out 1000ms waiting for expect'); } { const e = await expect(page.locator('body')).toMatchAriaSnapshot(` - checkbox [checked=5] `, { timeout: 1000 }).catch(e => e); expect(stripAnsi(e.message)).toContain(' attribute must be a boolean or "mixed"'); } }); test('disabled attribute', async ({ page }) => { await page.setContent(` `); await expect(page.locator('body')).toMatchAriaSnapshot(` - button `); await expect(page.locator('body')).toMatchAriaSnapshot(` - button [disabled] `); await expect(page.locator('body')).toMatchAriaSnapshot(` - button [disabled=true] `); { const e = await expect(page.locator('body')).toMatchAriaSnapshot(` - button [disabled=false] `, { timeout: 1000 }).catch(e => e); expect(stripAnsi(e.message)).toContain('Timed out 1000ms waiting for expect'); } { const e = await expect(page.locator('body')).toMatchAriaSnapshot(` - button [disabled=invalid] `, { timeout: 1000 }).catch(e => e); expect(stripAnsi(e.message)).toContain(' attribute must be a boolean'); } }); test('expanded attribute', async ({ page }) => { await page.setContent(` `); await expect(page.locator('body')).toMatchAriaSnapshot(` - button `); await expect(page.locator('body')).toMatchAriaSnapshot(` - button [expanded] `); await expect(page.locator('body')).toMatchAriaSnapshot(` - button [expanded=true] `); { const e = await expect(page.locator('body')).toMatchAriaSnapshot(` - button [expanded=false] `, { timeout: 1000 }).catch(e => e); expect(stripAnsi(e.message)).toContain('Timed out 1000ms waiting for expect'); } { const e = await expect(page.locator('body')).toMatchAriaSnapshot(` - button [expanded=invalid] `, { timeout: 1000 }).catch(e => e); expect(stripAnsi(e.message)).toContain(' attribute must be a boolean'); } }); test('level attribute', async ({ page }) => { await page.setContent(`

Section Title

`); await expect(page.locator('body')).toMatchAriaSnapshot(` - heading `); await expect(page.locator('body')).toMatchAriaSnapshot(` - heading [level=2] `); { const e = await expect(page.locator('body')).toMatchAriaSnapshot(` - heading [level=3] `, { timeout: 1000 }).catch(e => e); expect(stripAnsi(e.message)).toContain('Timed out 1000ms waiting for expect'); } { const e = await expect(page.locator('body')).toMatchAriaSnapshot(` - heading [level=two] `, { timeout: 1000 }).catch(e => e); expect(stripAnsi(e.message)).toContain(' attribute must be a number'); } }); test('pressed attribute', async ({ page }) => { await page.setContent(` `); await expect(page.locator('body')).toMatchAriaSnapshot(` - button `); await expect(page.locator('body')).toMatchAriaSnapshot(` - button [pressed] `); await expect(page.locator('body')).toMatchAriaSnapshot(` - button [pressed=true] `); { const e = await expect(page.locator('body')).toMatchAriaSnapshot(` - button [pressed=false] `, { timeout: 1000 }).catch(e => e); expect(stripAnsi(e.message)).toContain('Timed out 1000ms waiting for expect'); } // Test for 'mixed' state await page.setContent(` `); await expect(page.locator('body')).toMatchAriaSnapshot(` - button [pressed=mixed] `); { const e = await expect(page.locator('body')).toMatchAriaSnapshot(` - button [pressed=true] `, { timeout: 1000 }).catch(e => e); expect(stripAnsi(e.message)).toContain('Timed out 1000ms waiting for expect'); } { const e = await expect(page.locator('body')).toMatchAriaSnapshot(` - button [pressed=5] `, { timeout: 1000 }).catch(e => e); expect(stripAnsi(e.message)).toContain(' attribute must be a boolean or "mixed"'); } }); test('selected attribute', async ({ page }) => { await page.setContent(`
Row
`); await expect(page.locator('body')).toMatchAriaSnapshot(` - row `); await expect(page.locator('body')).toMatchAriaSnapshot(` - row [selected] `); await expect(page.locator('body')).toMatchAriaSnapshot(` - row [selected=true] `); { const e = await expect(page.locator('body')).toMatchAriaSnapshot(` - row [selected=false] `, { timeout: 1000 }).catch(e => e); expect(stripAnsi(e.message)).toContain('Timed out 1000ms waiting for expect'); } { const e = await expect(page.locator('body')).toMatchAriaSnapshot(` - row [selected=invalid] `, { timeout: 1000 }).catch(e => e); expect(stripAnsi(e.message)).toContain(' attribute must be a boolean'); } }); test('integration test', async ({ page }) => { await page.setContent(`

Microsoft

Open source projects and samples from Microsoft
`); await expect(page.locator('body')).toMatchAriaSnapshot(` - heading "Microsoft" - text: Open source projects and samples from Microsoft - list: - listitem: - group: Verified - listitem: - link "Sponsor" `); }); test('integration test 2', async ({ page }) => { await page.setContent(`

todos

`); await expect(page.locator('body')).toMatchAriaSnapshot(` - heading "todos" - textbox "What needs to be done?" `); }); test('expected formatter', async ({ page }) => { await page.setContent(`

todos

`); const error = await expect(page.locator('body')).toMatchAriaSnapshot(` - heading "todos" - textbox "Wrong text" `, { timeout: 1 }).catch(e => e); expect(stripAnsi(error.message)).toContain(` Locator: locator('body') - Expected - 2 + Received + 3 - - heading "todos" - - textbox "Wrong text" + - banner: + - heading "todos" [level=1] + - textbox "What needs to be done?"`); }); test('should unpack escaped names', async ({ page }) => { { await page.setContent(` `); await expect(page.locator('body')).toMatchAriaSnapshot(` - 'button "Click: me"' `); await expect(page.locator('body')).toMatchAriaSnapshot(` - 'button /Click: me/' `); } { await page.setContent(` `); await expect(page.locator('body')).toMatchAriaSnapshot(` - button "Click / me" `); await expect(page.locator('body')).toMatchAriaSnapshot(` - button /Click \\/ me/ `); await expect(page.locator('body')).toMatchAriaSnapshot(` - 'button /Click \\/ me/' `); } { await page.setContent(` `); await expect(page.locator('body')).toMatchAriaSnapshot(` - button "Click \\\" me" `); await expect(page.locator('body')).toMatchAriaSnapshot(` - button /Click \" me/ `); await expect(page.locator('body')).toMatchAriaSnapshot(` - button /Click \\\" me/ `); } { await page.setContent(` `); await expect(page.locator('body')).toMatchAriaSnapshot(` - button "Click \\\\ me" `); await expect(page.locator('body')).toMatchAriaSnapshot(` - button /Click \\\\ me/ `); await expect(page.locator('body')).toMatchAriaSnapshot(` - 'button /Click \\\\ me/' `); } { await page.setContent(` `); await expect(page.locator('body')).toMatchAriaSnapshot(` - 'button "Click '' me"' `); } { await page.setContent(`

heading "name" [level=1]

`); await expect(page.locator('body')).toMatchAriaSnapshot(` - heading "heading \\"name\\" [level=1]" [level=1] `); } { await page.setContent(`

heading \\" [level=2]

`); await expect(page.locator('body')).toMatchAriaSnapshot(` - | heading "heading \\\\\\" [level=2]" [ level = 1 ] `); } }); test('should report error in YAML', async ({ page }) => { await page.setContent(`

title

`); { const error = await expect(page.locator('body')).toMatchAriaSnapshot(` heading "title" `).catch(e => e); expect.soft(error.message).toBe(`expect.toMatchAriaSnapshot: Aria snapshot must be a YAML sequence, elements starting with " -"`); } { const error = await expect(page.locator('body')).toMatchAriaSnapshot(` - heading: a: `).catch(e => e); expect.soft(error.message).toBe(`expect.toMatchAriaSnapshot: Nested mappings are not allowed in compact mappings at line 1, column 12: - heading: a: ^ `); } }); test('should report error in YAML keys', async ({ page }) => { await page.setContent(`

title

`); { const error = await expect(page.locator('body')).toMatchAriaSnapshot(` - heading "title `).catch(e => e); expect.soft(error.message).toBe(`expect.toMatchAriaSnapshot: Unterminated string: heading "title ^ `); } { const error = await expect(page.locator('body')).toMatchAriaSnapshot(` - heading /title `).catch(e => e); expect.soft(error.message).toBe(`expect.toMatchAriaSnapshot: Unterminated regex: heading /title ^ `); } { const error = await expect(page.locator('body')).toMatchAriaSnapshot(` - heading [level=a] `).catch(e => e); expect.soft(error.message).toBe(`expect.toMatchAriaSnapshot: Value of "level" attribute must be a number: heading [level=a] ^ `); } { const error = await expect(page.locator('body')).toMatchAriaSnapshot(` - heading [expanded=FALSE] `).catch(e => e); expect.soft(error.message).toBe(`expect.toMatchAriaSnapshot: Value of "expanded" attribute must be a boolean: heading [expanded=FALSE] ^ `); } { const error = await expect(page.locator('body')).toMatchAriaSnapshot(` - heading [checked=foo] `).catch(e => e); expect.soft(error.message).toBe(`expect.toMatchAriaSnapshot: Value of "checked" attribute must be a boolean or "mixed": heading [checked=foo] ^ `); } { const error = await expect(page.locator('body')).toMatchAriaSnapshot(` - heading [level=] `).catch(e => e); expect.soft(error.message).toBe(`expect.toMatchAriaSnapshot: Value of "level" attribute must be a number: heading [level=] ^ `); } { const error = await expect(page.locator('body')).toMatchAriaSnapshot(` - heading [bogus] `).catch(e => e); expect.soft(error.message).toBe(`expect.toMatchAriaSnapshot: Unsupported attribute [bogus]: heading [bogus] ^ `); } { const error = await expect(page.locator('body')).toMatchAriaSnapshot(` - heading invalid `).catch(e => e); expect.soft(error.message).toBe(`expect.toMatchAriaSnapshot: Unexpected input: heading invalid ^ `); } }); test('call log should contain actual snapshot', async ({ page }) => { await page.setContent(`

todos

`); const error = await expect(page.locator('body')).toMatchAriaSnapshot(` - heading "wrong" `, { timeout: 3000 }).catch(e => e); expect(stripAnsi(error.message)).toContain(`- unexpected value "- heading "todos" [level=1]"`); }); test('should parse attributes', async ({ page }) => { { await page.setContent(` `); await expect(page.locator('body')).toMatchAriaSnapshot(` - button [pressed=mixed ] `); } { await page.setContent(`

hello world

`); await expect(page.locator('body')).not.toMatchAriaSnapshot(` - heading [level = -3 ] `); } }); test('should not unshift actual template text', async ({ page }) => { await page.setContent(`

title

title 2

`); const error = await expect(page.locator('body')).toMatchAriaSnapshot(` - heading "title" [level=1] - heading "title 2" [level=1] `, { timeout: 1000 }).catch(e => e); expect(stripAnsi(error.message)).toContain(` - heading "title" [level=1] - heading "title 2" [level=1]`); }); test('should not match what is not matched', async ({ page }) => { await page.setContent(`

Text

`); const error = await expect(page.locator('body')).toMatchAriaSnapshot(` - paragraph: - button "bogus" `).catch(e => e); expect(stripAnsi(error.message)).toContain(` - - paragraph: - - button "bogus" + - paragraph: Text`); });