forked from pelme/htpy
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_render.py
More file actions
97 lines (74 loc) · 2.69 KB
/
test_render.py
File metadata and controls
97 lines (74 loc) · 2.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
from dataclasses import dataclass
import markupsafe
import pytest
import htpy as h
example_ctx: h.Context[str] = h.Context("example_ctx", default="default!")
@example_ctx.consumer
def example_consumer(value: str) -> str:
return value
@h.with_children
def example_with_children(
content: h.Node,
*,
title: str = "default!",
) -> h.Element:
return h.div[
h.h1[title],
h.p[content],
]
@dataclass(frozen=True)
class RenderableTestCase:
renderable: h.Renderable
expected_chunks: list[str]
def expected_str(self) -> str:
return "".join(self.expected_chunks)
def expected_bytes(self) -> bytes:
return self.expected_str().encode("utf8")
cases = [
RenderableTestCase(h.a, ["<a>", "</a>"]),
RenderableTestCase(h.img, ["<img>"]),
RenderableTestCase(example_ctx.provider("hi!", "stuff!"), ["stuff!"]),
RenderableTestCase(example_consumer(), ["default!"]),
RenderableTestCase(h.fragment["fragment!"], ["fragment!"]),
# comment() is a Fragment but test it anyways for completeness
RenderableTestCase(h.comment("comment!"), ["<!-- comment! -->"]),
RenderableTestCase(
example_with_children,
["<div>", "<h1>", "default!", "</h1>", "<p>", "</p>", "</div>"],
),
RenderableTestCase(
example_with_children["children!"],
["<div>", "<h1>", "default!", "</h1>", "<p>", "children!", "</p>", "</div>"],
),
RenderableTestCase(
example_with_children(title="title!"),
["<div>", "<h1>", "title!", "</h1>", "<p>", "</p>", "</div>"],
),
RenderableTestCase(
example_with_children(title="title!")["children!"],
["<div>", "<h1>", "title!", "</h1>", "<p>", "children!", "</p>", "</div>"],
),
]
@pytest.mark.parametrize("case", cases)
def test_str(case: RenderableTestCase) -> None:
result = str(case.renderable)
assert isinstance(result, str)
assert isinstance(result, markupsafe.Markup)
assert result == case.expected_str()
@pytest.mark.parametrize("case", cases)
def test_html(case: RenderableTestCase) -> None:
result = case.renderable.__html__()
assert isinstance(result, str)
assert isinstance(result, markupsafe.Markup)
assert result == case.expected_str()
@pytest.mark.parametrize("case", cases)
def test_encode(case: RenderableTestCase) -> None:
result = case.renderable.encode()
assert isinstance(result, bytes)
assert result == case.expected_bytes()
@pytest.mark.parametrize("case", cases)
def test_iter_chunks(case: RenderableTestCase) -> None:
result = list(case.renderable.iter_chunks())
# Ensure we get str back, not markup.
assert type(result[0]) is str
assert result == case.expected_chunks