#!/usr/bin/env python3 """Browser integration test for the mentioned-users bar and cyclic jumps.""" from __future__ import annotations import base64 from pathlib import Path from playwright.sync_api import sync_playwright ROOT = Path(__file__).resolve().parents[1] HTML = '''
Editor
Autor
Markdown preview
''' def as_data_url(source): return 'data:text/javascript;base64,' + base64.b64encode(source.encode('utf-8')).decode('ascii') def create_fixture(): autocomplete = (ROOT / 'static/js/mention-autocomplete.js').read_text() autocomplete = autocomplete.replace('import { t } from "@rustpad/i18n";', 'const t = (key, values, fallback) => fallback;') navigation = (ROOT / 'static/js/mention-navigation.js').read_text() navigation = navigation.replace('import { t } from "@rustpad/i18n";', 'const t = (key, values, fallback) => fallback;') navigation = navigation.replace('"@rustpad/mention-autocomplete"', f'"{as_data_url(autocomplete)}"') markdown = (ROOT / 'static/js/markdown.js').read_text() markdown = '\n'.join(line for line in markdown.split('\n') if not line.startswith('import ')) markdown = ('const EMOJI_SHORTCODES = {}; ' 'const t = (key, values, fallback) => fallback; ' 'const parseImageAlias = () => null;\n') + markdown styles = (ROOT / 'static/css/styles.css').read_text() return (HTML.replace('__STYLES__', styles) .replace('__NAVIGATION_URL__', as_data_url(navigation)) .replace('__MARKDOWN_URL__', as_data_url(markdown))) def main(): fixture = create_fixture() with sync_playwright() as playwright: browser = playwright.chromium.launch(executable_path='/usr/bin/chromium', args=['--no-sandbox']) try: page = browser.new_page(viewport={'width': 1020, 'height': 680}) errors = [] page.on('pageerror', lambda error: errors.append(str(error))) page.set_content(fixture) page.wait_for_function('window.ready === true') lines = [ 'Na początku @Dominik i @Dominik, do tego @Dora.', '`@Dominik` [@Dominik](https://example.com/@Dora)', '```sh', '@Dominik', '```', *[f'Wypełnienie linii {i}' for i in range(1, 18)], '
', 'Szczegóły', 'Wewnątrz @Dominik', '
', *[f'Treść linii {i}' for i in range(18, 38)], 'Na końcu @Dominik.', ] content = '\n'.join(lines) users = [{'nickname': 'Dominik', 'color': '#123456'}, {'nickname':'Dora', 'color':'#654321', 'email':'private@example.org'}] page.evaluate('([text,users]) => window.runCase(text,users)', [content, users]) bar = page.locator('#mentioned-users') assert bar.is_visible() badges = page.locator('#mentioned-users-list .mentioned-users__badge') preview_badges = page.locator('#mentioned-users-preview-list .mentioned-users__badge') assert page.locator('#mentioned-users-preview').is_hidden() assert badges.count() == 2 assert preview_badges.count() == 2 assert badges.all_text_contents() == ['@Dominik4', '@Dora1'] assert 'private' not in bar.inner_text() button = badges.first # The two code/link occurrences are intentionally skipped. source_starts = [content.index('@Dominik'),content.index('@Dominik',content.index('@Dominik')+1),content.index('@Dominik',content.index('Wewnątrz')), content.rindex('@Dominik')] for step, start in enumerate(source_starts, 1): button.click() assert page.evaluate('document.querySelector("#editor").selectionStart') == start, step assert page.evaluate('document.querySelector("#editor").selectionEnd') == start + len('@Dominik') assert page.locator('.markdown-mention.is-mention-target').count() == 1 assert button.locator('.mentioned-users__count').inner_text() == f'{step}/4' assert page.locator('details.markdown-details').evaluate('element => element.open') is True button.click() assert page.evaluate('document.querySelector("#editor").selectionStart') == source_starts[0] assert button.locator('.mentioned-users__count').inner_text() == '1/4' dora = badges.nth(1) dora.click() assert page.evaluate('document.querySelector("#editor").selectionStart') == content.index('@Dora') assert dora.locator('.mentioned-users__count').inner_text() == '1/1' page.evaluate('window.setView("preview")') assert bar.is_hidden() assert page.locator('#mentioned-users-preview').is_visible() assert page.locator('#preview').is_visible() original_selection = page.evaluate('document.querySelector("#editor").selectionStart') preview_badges.first.click() assert page.evaluate('document.querySelector("#editor").selectionStart') == original_selection assert page.locator('.markdown-mention.is-mention-target').count() == 1 page.evaluate('window.setView("edit")') assert bar.is_visible() assert page.locator('#mentioned-users-preview').is_hidden() button.click() assert page.evaluate('document.querySelector("#editor").selectionStart') == source_starts[2] page.evaluate('window.setUsers([])') assert bar.is_hidden() assert page.locator('#mentioned-users-preview').is_hidden() assert badges.count() == 0 assert preview_badges.count() == 0 assert not errors, errors print('PASS: Chromium mentions list, access, cyclic navigation, source selection, details, view switching') finally: browser.close() if __name__ == '__main__': main()