aboutsummaryrefslogtreecommitdiff
path: root/test/test_components.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_components.py')
-rw-r--r--test/test_components.py126
1 files changed, 126 insertions, 0 deletions
diff --git a/test/test_components.py b/test/test_components.py
new file mode 100644
index 0000000..f19cfb3
--- /dev/null
+++ b/test/test_components.py
@@ -0,0 +1,126 @@
+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 <hugo@example.com>
+To: "Hugo 1" <hugo1@example.com>, "Hugo 2" <hugo2@example.com>
+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'}))