from email.headerregistry import Address from email.parser import BytesParser import email.policy from mu4web.components import ( dl, flashed_messages, format_email, include_stylesheet, login_page, login_prompt, mailto, search_field, user_info, ) from typing import cast def test_dl() -> None: assert dl([]) == ('dl', []) assert dl([('k', '1'), ('v', '2')]) == ('dl', [('dt', 'k'), ('dd', '1'), ('dt', 'v'), ('dd', '2')]) def test_mailto() -> None: assert mailto('hugo@example.com') \ == ('a', {'href': 'mailto:hugo@example.com'}, 'hugo@example.com') def test_format_email() -> None: assert format_email(Address('Hugo Hörnquist', 'hugo', 'example.com')) == [ 'Hugo Hörnquist', ' <', mailto('hugo@example.com'), '>' ] parser = BytesParser(policy=email.policy.default) msg = parser.parsebytes(b""" Date: Fri, 04 Aug 2023 20:15:30 +0200 From: Hugo To: "Hugo 1" , "Hugo 2" Message-Id: <9a274279-9915-44e7-b4c0-3d29b7929744> In-Reply-To: <1763399c-9483-4c12-a633-5eb0496886b9> This is a short message """.strip()) # TODO The above message claims to contain proper data structures, # however, it only contains string-like objects. # def test_header_format(): # print("to:", len(msg.get('to')), repr(msg['to']), type(msg['to'])) # assert header_format('to', msg['to']) \ # == ('ul', ('li', # format_email(msg['to'][0]), # format_email(msg['to'][1]))) # assert 'from' # assert 'in-reply-to' # assert 'x-fake-header' def test_attachement_tree() -> None: # TODO pass def test_login_page() -> None: assert login_page() == \ ('form', {'action': '/login', 'method': 'POST', 'class': 'loginform'}, ('label', {'for': 'username'}, 'Användarnamn'), ('input', {'id': 'username', 'name': 'username', 'placeholder': 'Användarnamn'}), ('label', {'for': 'password'}, 'Lösenord'), ('input', {'id': 'password', 'name': 'password', 'placeholder': 'Lösenord', 'type': 'password'}), ('div', ('input', {'id': 'remember', 'name': 'remember', 'type': 'checkbox'}), ('label', {'for': 'remember'}, 'Kom ihåg mig')), [], ('input', {'type': 'submit', 'value': 'Logga in'}), ) def test_user_info() -> None: assert user_info('hugo') == [ ('span', 'hugo'), ('form', {'action': '/logout', 'method': 'POST'}, ('input', {'type': 'submit', 'value': 'Logga ut'})) ] def test_login_prompt() -> None: assert login_prompt() == ('a', {'href': '/login'}, 'Logga in') def test_flashed_messages() -> None: assert flashed_messages(cast(list[str], [])) == cast(list[str], []) assert flashed_messages(['msg1']) \ == ('ul', {'class': 'flashes'}, ('li', 'msg1')) assert flashed_messages([('cat1', 'msg1')]) \ == ('ul', {'class': 'flashes'}, ('li', 'msg1')) def test_include_stylesheet() -> None: assert include_stylesheet('style.css') == \ ('link', {'type': 'text/css', 'rel': 'stylesheet', 'href': 'style.css'}) def test_search_field() -> None: assert search_field('test') == \ ('form', {'id': 'searchform', 'action': '/search', 'method': 'GET'}, ('label', {'for': 'search'}, 'Sökförfrågan till Mu'), ('input', {'id': 'search', 'type': 'text', 'placeholder': 'Sök...', 'name': 'q', 'value': 'test'}), ('input', {'type': 'Submit', 'value': 'Sök'}))