|
1 | 1 | import pytest |
| 2 | +from typing import Literal |
| 3 | + |
2 | 4 | from selenium.webdriver import Firefox |
3 | 5 |
|
4 | 6 | from modules.browser_object import ReaderView |
|
8 | 10 |
|
9 | 11 |
|
10 | 12 | @pytest.fixture() |
11 | | -def test_case(): |
| 13 | +def test_case() -> str: |
12 | 14 | return "130919" |
13 | 15 |
|
14 | 16 |
|
15 | | -size_controllers = ["minus", "plus"] |
16 | | -themes = [ |
17 | | - ("light", "rgb(255, 255, 255)"), |
18 | | - ("dark", "rgb(28, 27, 34)"), |
19 | | - ("sepia", "rgb(244, 236, 216)"), |
20 | | - ("contrast", "rgb(0, 0, 0)"), |
21 | | - ("gray", "rgb(215, 215, 219)"), |
22 | | -] |
23 | | -fonts = ["sans-serif", "serif", "monospace"] |
24 | | -alignments = [("left", "start"), ("right", "right"), ("center", "center")] |
25 | | -slider_options = ["decrease", "increase"] |
26 | | - |
27 | | - |
28 | | -READER_VIEW_URL = ( |
| 17 | +# Constants / parametrization |
| 18 | +READER_VIEW_URL: str = ( |
29 | 19 | "https://support.mozilla.org/en-US/kb/firefox-reader-view-clutter-free-web-pages" |
30 | 20 | ) |
31 | 21 |
|
| 22 | +SizeControl = Literal["minus", "plus"] |
| 23 | +AlignKey = Literal["left", "right", "center"] |
| 24 | +AlignCSS = Literal["start", "right", "center"] |
| 25 | +SliderDirection = Literal["decrease", "increase"] |
| 26 | + |
| 27 | +SIZE_CONTROLS: list[SizeControl] = ["minus", "plus"] |
| 28 | +FONTS: list[Literal["sans-serif", "serif", "monospace"]] = ["sans-serif", "serif", "monospace"] |
| 29 | +ALIGNMENTS: list[tuple[AlignKey, AlignCSS]] = [("left", "start"), ("right", "right"), ("center", "center")] |
| 30 | +SLIDER_DIRS: list[SliderDirection] = ["decrease", "increase"] |
| 31 | + |
32 | 32 |
|
33 | | -def prep_test(web_page: GenericPage, reader_view: ReaderView) -> None: |
| 33 | +# Helpers |
| 34 | +def _open_reader_type_panel(web_page: GenericPage, reader_view: ReaderView) -> None: |
| 35 | + """ |
| 36 | + Open the target page, enter Reader View, and open the 'Type' panel. |
| 37 | + """ |
34 | 38 | web_page.open() |
35 | 39 | reader_view.open_reader_view_searchbar() |
36 | 40 | reader_view.click_toolbar_option("toolbar-type") |
37 | 41 |
|
38 | 42 |
|
| 43 | +def _css_int(util: Utilities, element, prop: str) -> int: |
| 44 | + """ |
| 45 | + Read a CSS property and normalize it to an integer by stripping non-numeric chars. |
| 46 | + """ |
| 47 | + return int(util.remove_all_non_numbers(element.value_of_css_property(prop))) |
| 48 | + |
| 49 | + |
39 | 50 | @pytest.mark.ci |
40 | | -@pytest.mark.parametrize("font", fonts) |
41 | | -def test_type_control_panel_font(driver: Firefox, font: str): |
| 51 | +@pytest.mark.parametrize("font", FONTS) |
| 52 | +def test_type_control_panel_font(driver: Firefox, font: Literal["sans-serif", "serif", "monospace"]) -> None: |
42 | 53 | """ |
43 | | - C130919.1: Ensure the functionality of the type control panels works |
| 54 | + C130919.1: Ensure the functionality of the type control panels works (font family). |
44 | 55 | """ |
45 | 56 | web_page = GenericPage(driver, url=READER_VIEW_URL) |
46 | 57 | reader_view = ReaderView(driver) |
47 | 58 |
|
48 | | - prep_test(web_page, reader_view) |
| 59 | + _open_reader_type_panel(web_page, reader_view) |
49 | 60 |
|
50 | 61 | body = web_page.get_element("page-body") |
51 | 62 |
|
52 | | - reader_view.wait.until( |
53 | | - lambda _: "sans-serif" in body.value_of_css_property("font-family") |
54 | | - ) |
| 63 | + # Ensure default is sans-serif first so the next wait has a stable baseline |
| 64 | + reader_view.wait.until(lambda _: "sans-serif" in body.value_of_css_property("font-family")) |
| 65 | + |
55 | 66 | font_dropdown_root = reader_view.get_element("toolbar-font-selector") |
56 | | - font_dropdown = Dropdown( |
57 | | - page=reader_view, require_shadow=False, root=font_dropdown_root |
58 | | - ) |
| 67 | + font_dropdown = Dropdown(page=reader_view, require_shadow=False, root=font_dropdown_root) |
59 | 68 | font_dropdown.select_option( |
60 | | - f"about-reader-font-type-{font}", option_tag="option", label_name="data-l10n-id" |
| 69 | + f"about-reader-font-type-{font}", |
| 70 | + option_tag="option", |
| 71 | + label_name="data-l10n-id", |
61 | 72 | ) |
| 73 | + |
62 | 74 | reader_view.wait.until(lambda _: font in body.value_of_css_property("font-family")) |
63 | 75 |
|
64 | 76 |
|
65 | | -@pytest.mark.parametrize("type", size_controllers) |
66 | | -def test_type_control_panel_size(driver: Firefox, type: str): |
| 77 | +@pytest.mark.parametrize("control", SIZE_CONTROLS) |
| 78 | +def test_type_control_panel_size(driver: Firefox, control: SizeControl) -> None: |
67 | 79 | """ |
68 | | - C130919.2: Ensure the functionality of the type control panels works |
| 80 | + C130919.2: Ensure the functionality of the type control panels works (text size). |
69 | 81 | """ |
70 | 82 | web_page = GenericPage(driver, url=READER_VIEW_URL) |
71 | 83 | reader_view = ReaderView(driver) |
72 | 84 | util = Utilities() |
73 | 85 |
|
74 | | - prep_test(web_page, reader_view) |
| 86 | + _open_reader_type_panel(web_page, reader_view) |
75 | 87 |
|
76 | 88 | body = web_page.get_element("page-body") |
77 | | - font_before = int( |
78 | | - util.remove_all_non_numbers(body.value_of_css_property("--font-size")) |
79 | | - ) |
80 | | - reader_view.get_element(f"toolbar-textsize-{type}").click() |
81 | | - if type == "minus": |
82 | | - reader_view.wait.until( |
83 | | - lambda _: int( |
84 | | - util.remove_all_non_numbers(body.value_of_css_property("--font-size")) |
85 | | - ) |
86 | | - < font_before |
87 | | - ) |
| 89 | + size_before = _css_int(util, body, "--font-size") |
| 90 | + |
| 91 | + reader_view.get_element(f"toolbar-textsize-{control}").click() |
| 92 | + |
| 93 | + if control == "minus": |
| 94 | + reader_view.wait.until(lambda _: _css_int(util, body, "--font-size") < size_before) |
88 | 95 | else: |
89 | | - reader_view.wait.until( |
90 | | - lambda _: int( |
91 | | - util.remove_all_non_numbers(body.value_of_css_property("--font-size")) |
92 | | - ) |
93 | | - > font_before |
94 | | - ) |
| 96 | + reader_view.wait.until(lambda _: _css_int(util, body, "--font-size") > size_before) |
95 | 97 |
|
96 | 98 |
|
97 | | -@pytest.mark.parametrize("alignment, intended_alignment", alignments) |
| 99 | +@pytest.mark.parametrize("alignment,intended_alignment", ALIGNMENTS) |
98 | 100 | def test_type_control_panel_text_alignment( |
99 | | - driver: Firefox, alignment: str, intended_alignment: str |
100 | | -): |
| 101 | + driver: Firefox, |
| 102 | + alignment: AlignKey, |
| 103 | + intended_alignment: AlignCSS, |
| 104 | +) -> None: |
101 | 105 | """ |
102 | | - C130919.3: Ensure the functionality of the type control panels works |
| 106 | + C130919.3: Ensure the functionality of the type control panels works (text alignment). |
103 | 107 | """ |
104 | 108 | web_page = GenericPage(driver, url=READER_VIEW_URL) |
105 | 109 | reader_view = ReaderView(driver) |
106 | 110 |
|
107 | | - prep_test(web_page, reader_view) |
| 111 | + _open_reader_type_panel(web_page, reader_view) |
108 | 112 |
|
109 | 113 | container = web_page.get_element("container-div") |
110 | 114 | reader_view.open_advanced_options() |
111 | 115 |
|
112 | 116 | reader_view.get_element(f"toolbar-text-align-{alignment}").click() |
113 | | - reader_view.wait.until( |
114 | | - lambda _: container.value_of_css_property("--text-alignment") |
115 | | - == intended_alignment |
116 | | - ) |
| 117 | + reader_view.wait.until(lambda _: container.value_of_css_property("--text-alignment") == intended_alignment) |
117 | 118 |
|
118 | 119 |
|
119 | | -@pytest.mark.parametrize("width", slider_options) |
120 | | -def test_type_control_panel_content_width(driver: Firefox, width: str): |
| 120 | +@pytest.mark.parametrize("direction", SLIDER_DIRS) |
| 121 | +def test_type_control_panel_content_width(driver: Firefox, direction: SliderDirection) -> None: |
121 | 122 | """ |
122 | | - C130919.4: Ensure the functionality of the type control panels works |
| 123 | + C130919.4: Ensure the functionality of the type control panels works (content width slider). |
123 | 124 | """ |
124 | 125 | web_page = GenericPage(driver, url=READER_VIEW_URL) |
125 | 126 | reader_view = ReaderView(driver) |
126 | 127 | util = Utilities() |
127 | 128 |
|
128 | | - prep_test(web_page, reader_view) |
| 129 | + _open_reader_type_panel(web_page, reader_view) |
129 | 130 |
|
130 | 131 | reader_view.change_slider_element_shadow_parent("toolbar-content-width") |
131 | 132 |
|
132 | 133 | body = web_page.get_element("page-body") |
133 | | - before_content_width = int( |
134 | | - util.remove_all_non_numbers(body.value_of_css_property("--content-width")) |
135 | | - ) |
136 | | - content_width_slider = reader_view.get_element("slider") |
137 | | - |
138 | | - if width == "decrease": |
139 | | - reader_view.change_slider_value(content_width_slider, increase=False) |
140 | | - reader_view.wait.until( |
141 | | - lambda _: int( |
142 | | - util.remove_all_non_numbers( |
143 | | - body.value_of_css_property("--content-width") |
144 | | - ) |
145 | | - ) |
146 | | - < before_content_width |
147 | | - ) |
| 134 | + width_before = _css_int(util, body, "--content-width") |
| 135 | + slider = reader_view.get_element("slider") |
| 136 | + |
| 137 | + reader_view.change_slider_value(slider, increase=(direction == "increase")) |
| 138 | + |
| 139 | + if direction == "decrease": |
| 140 | + reader_view.wait.until(lambda _: _css_int(util, body, "--content-width") < width_before) |
148 | 141 | else: |
149 | | - reader_view.change_slider_value(content_width_slider) |
150 | | - reader_view.wait.until( |
151 | | - lambda _: int( |
152 | | - util.remove_all_non_numbers( |
153 | | - body.value_of_css_property("--content-width") |
154 | | - ) |
155 | | - ) |
156 | | - > before_content_width |
157 | | - ) |
| 142 | + reader_view.wait.until(lambda _: _css_int(util, body, "--content-width") > width_before) |
158 | 143 |
|
159 | 144 |
|
160 | | -@pytest.mark.parametrize("line_height", slider_options) |
161 | | -def test_type_control_panel_line_spacing(driver: Firefox, line_height: str): |
| 145 | +@pytest.mark.parametrize("direction", SLIDER_DIRS) |
| 146 | +def test_type_control_panel_line_spacing(driver: Firefox, direction: SliderDirection) -> None: |
162 | 147 | """ |
163 | | - C130919.5: Ensure the functionality of the type control panels works |
| 148 | + C130919.5: Ensure the functionality of the type control panels works (line spacing slider). |
164 | 149 | """ |
165 | 150 | web_page = GenericPage(driver, url=READER_VIEW_URL) |
166 | 151 | reader_view = ReaderView(driver) |
167 | 152 | util = Utilities() |
168 | 153 |
|
169 | | - prep_test(web_page, reader_view) |
| 154 | + _open_reader_type_panel(web_page, reader_view) |
170 | 155 |
|
171 | 156 | reader_view.change_slider_element_shadow_parent("toolbar-line-spacing") |
172 | 157 |
|
173 | 158 | body = web_page.get_element("page-body") |
174 | | - before_block_size = int( |
175 | | - util.remove_all_non_numbers(body.value_of_css_property("block-size")) |
176 | | - ) |
177 | | - content_line_spacer_slider = reader_view.get_element("slider") |
178 | | - |
179 | | - if line_height == "decrease": |
180 | | - reader_view.change_slider_value(content_line_spacer_slider, increase=False) |
181 | | - reader_view.wait.until( |
182 | | - lambda _: int( |
183 | | - util.remove_all_non_numbers(body.value_of_css_property("block-size")) |
184 | | - ) |
185 | | - < before_block_size |
186 | | - ) |
| 159 | + block_before = _css_int(util, body, "block-size") |
| 160 | + slider = reader_view.get_element("slider") |
| 161 | + |
| 162 | + reader_view.change_slider_value(slider, increase=(direction == "increase")) |
| 163 | + |
| 164 | + if direction == "decrease": |
| 165 | + reader_view.wait.until(lambda _: _css_int(util, body, "block-size") < block_before) |
187 | 166 | else: |
188 | | - reader_view.change_slider_value(content_line_spacer_slider) |
189 | | - reader_view.wait.until( |
190 | | - lambda _: int( |
191 | | - util.remove_all_non_numbers(body.value_of_css_property("block-size")) |
192 | | - ) |
193 | | - > before_block_size |
194 | | - ) |
| 167 | + reader_view.wait.until(lambda _: _css_int(util, body, "block-size") > block_before) |
195 | 168 |
|
196 | 169 |
|
197 | | -def test_type_control_panel_character_spacing(driver: Firefox): |
| 170 | +def test_type_control_panel_character_spacing(driver: Firefox) -> None: |
198 | 171 | """ |
199 | | - C130919.6: Ensure the functionality of the type control panels works |
| 172 | + C130919.6: Ensure the functionality of the type control panels works (character spacing slider). |
200 | 173 | """ |
201 | 174 | web_page = GenericPage(driver, url=READER_VIEW_URL) |
202 | 175 | reader_view = ReaderView(driver) |
203 | 176 | util = Utilities() |
204 | 177 |
|
205 | | - prep_test(web_page, reader_view) |
| 178 | + _open_reader_type_panel(web_page, reader_view) |
206 | 179 | reader_view.open_advanced_options() |
207 | 180 |
|
208 | 181 | reader_view.change_slider_element_shadow_parent("toolbar-character-spacing") |
209 | 182 |
|
210 | 183 | container = web_page.get_element("container-div") |
211 | | - before_character_spacing = int( |
212 | | - util.remove_all_non_numbers(container.value_of_css_property("--letter-spacing")) |
213 | | - ) |
214 | | - content_character_spacing_slider = reader_view.get_element("slider") |
215 | | - reader_view.change_slider_value(content_character_spacing_slider) |
216 | | - |
217 | | - reader_view.wait.until( |
218 | | - lambda _: int( |
219 | | - util.remove_all_non_numbers( |
220 | | - container.value_of_css_property("--letter-spacing") |
221 | | - ) |
222 | | - ) |
223 | | - > before_character_spacing |
224 | | - ) |
| 184 | + letter_before = _css_int(util, container, "--letter-spacing") |
| 185 | + slider = reader_view.get_element("slider") |
| 186 | + |
| 187 | + reader_view.change_slider_value(slider, increase=True) |
| 188 | + |
| 189 | + reader_view.wait.until(lambda _: _css_int(util, container, "--letter-spacing") > letter_before) |
225 | 190 |
|
226 | 191 |
|
227 | | -def test_type_control_panel_word_spacing(driver: Firefox): |
| 192 | +def test_type_control_panel_word_spacing(driver: Firefox) -> None: |
228 | 193 | """ |
229 | | - C130919.7: Ensure the functionality of the type control panels works |
| 194 | + C130919.7: Ensure the functionality of the type control panels works (word spacing slider). |
230 | 195 | """ |
231 | 196 | web_page = GenericPage(driver, url=READER_VIEW_URL) |
232 | 197 | reader_view = ReaderView(driver) |
233 | 198 | util = Utilities() |
234 | 199 |
|
235 | | - prep_test(web_page, reader_view) |
| 200 | + _open_reader_type_panel(web_page, reader_view) |
236 | 201 | reader_view.open_advanced_options() |
237 | 202 |
|
238 | 203 | reader_view.change_slider_element_shadow_parent("toolbar-word-spacing") |
239 | 204 |
|
240 | 205 | container = web_page.get_element("container-div") |
241 | | - before_word_spacing = int( |
242 | | - util.remove_all_non_numbers(container.value_of_css_property("--word-spacing")) |
243 | | - ) |
244 | | - content_word_spacing_slider = reader_view.get_element("slider") |
245 | | - reader_view.change_slider_value(content_word_spacing_slider) |
246 | | - |
247 | | - reader_view.wait.until( |
248 | | - lambda _: int( |
249 | | - util.remove_all_non_numbers( |
250 | | - container.value_of_css_property("--word-spacing") |
251 | | - ) |
252 | | - ) |
253 | | - > before_word_spacing |
254 | | - ) |
| 206 | + word_before = _css_int(util, container, "--word-spacing") |
| 207 | + slider = reader_view.get_element("slider") |
| 208 | + |
| 209 | + reader_view.change_slider_value(slider, increase=True) |
| 210 | + |
| 211 | + reader_view.wait.until(lambda _: _css_int(util, container, "--word-spacing") > word_before) |
0 commit comments