# Copyright (c) Microsoft Corporation.
#
# 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 re
import pytest
from playwright.async_api import Locator, Page, expect
def _unshift(snapshot: str) -> str:
lines = snapshot.split("\n")
whitespace_prefix_length = 100
for line in lines:
if not line.strip():
continue
match = re.match(r"^(\s*)", line)
if match and len(match[1]) < whitespace_prefix_length:
whitespace_prefix_length = len(match[1])
return "\n".join(
[line[whitespace_prefix_length:] for line in lines if line.strip()]
)
async def check_and_match_snapshot(locator: Locator, snapshot: str) -> None:
assert await locator.aria_snapshot() == _unshift(snapshot)
await expect(locator).to_match_aria_snapshot(snapshot, timeout=1000)
async def test_should_snapshot(page: Page) -> None:
await page.set_content("
title
")
await check_and_match_snapshot(
page.locator("body"),
"""
- heading "title" [level=1]
""",
)
async def test_should_snapshot_list(page: Page) -> None:
await page.set_content("title
title 2
")
await check_and_match_snapshot(
page.locator("body"),
"""
- heading "title" [level=1]
- heading "title 2" [level=1]
""",
)
async def test_should_snapshot_list_with_list(page: Page) -> None:
await page.set_content("")
await check_and_match_snapshot(
page.locator("body"),
"""
- list:
- listitem: one
- listitem: two
""",
)
async def test_should_snapshot_list_with_accessible_name(page: Page) -> None:
await page.set_content('')
await check_and_match_snapshot(
page.locator("body"),
"""
- list "my list":
- listitem: one
- listitem: two
""",
)
async def test_should_snapshot_complex(page: Page) -> None:
await page.set_content('')
await check_and_match_snapshot(
page.locator("body"),
"""
- list:
- listitem:
- link "link":
- /url: about:blank
""",
)
async def test_should_snapshot_with_unexpected_children_equal(page: Page) -> None:
await page.set_content(
"""
"""
)
await expect(page.locator("body")).to_match_aria_snapshot(
"""
- list:
- listitem: One
- listitem: Three
""",
)
with pytest.raises(AssertionError):
await expect(page.locator("body")).to_match_aria_snapshot(
"""
- list:
- /children: equal
- listitem: One
- listitem: Three
""",
timeout=1000,
)
async def test_should_snapshot_with_unexpected_children_deep_equal(page: Page) -> None:
await page.set_content(
"""
"""
)
await expect(page.locator("body")).to_match_aria_snapshot(
"""
- list:
- listitem:
- list:
- listitem: 1.1
""",
)
await expect(page.locator("body")).to_match_aria_snapshot(
"""
- list:
- /children: equal
- listitem:
- list:
- listitem: 1.1
""",
)
with pytest.raises(AssertionError):
await expect(page.locator("body")).to_match_aria_snapshot(
"""
- list:
- /children: deep-equal
- listitem:
- list:
- listitem: 1.1
""",
timeout=1000,
)
async def test_should_snapshot_with_restored_contain_mode_inside_deep_equal(
page: Page,
) -> None:
await page.set_content(
"""
"""
)
with pytest.raises(AssertionError):
await expect(page.locator("body")).to_match_aria_snapshot(
"""
- list:
- /children: deep-equal
- listitem:
- list:
- listitem: 1.1
""",
timeout=1000,
)
await expect(page.locator("body")).to_match_aria_snapshot(
"""
- list:
- /children: deep-equal
- listitem:
- list:
- /children: contain
- listitem: 1.1
""",
)
async def test_match_values_both_against_regex_and_string(page: Page) -> None:
await page.set_content('Log in')
await expect(page.locator("body")).to_match_aria_snapshot(
"""
- link "Log in":
- /url: /auth?r=/
""",
)
async def test_should_snapshot_with_depth(page: Page) -> None:
await page.set_content("")
snapshot = await page.locator("body").aria_snapshot(depth=1)
assert "listitem" in snapshot
assert "/url" not in snapshot
async def test_page_aria_snapshot_should_work(page: Page) -> None:
await page.set_content("title
")
snapshot = await page.aria_snapshot()
assert _unshift(snapshot) == _unshift(
"""
- heading "title" [level=1]
"""
)
async def test_to_match_aria_snapshot_should_match_page(page: Page) -> None:
# Ported from upstream tests/page/to-match-aria-snapshot.spec.ts.
await page.set_content("title
")
await expect(page).to_match_aria_snapshot(
"""
- heading "title"
"""
)
async def test_to_match_aria_snapshot_should_match_page_complex(page: Page) -> None:
# Ported from upstream tests/page/to-match-aria-snapshot.spec.ts.
await page.set_content(
"""
Microsoft
Open source projects and samples from Microsoft
"""
)
await expect(page).to_match_aria_snapshot(
"""
- heading "Microsoft"
- text: Open source projects and samples from Microsoft
- list:
- listitem:
- link "Playwright"
"""
)
async def test_to_match_aria_snapshot_should_match_page_with_not(page: Page) -> None:
# Ported from upstream tests/page/to-match-aria-snapshot.spec.ts.
await page.set_content("title
")
await expect(page).not_to_match_aria_snapshot(
"""
- heading "wrong"
"""
)