| # Copyright © 2019 Intel Corporation |
| |
| # Permission is hereby granted, free of charge, to any person obtaining a copy |
| # of this software and associated documentation files (the "Software"), to deal |
| # in the Software without restriction, including without limitation the rights |
| # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| # copies of the Software, and to permit persons to whom the Software is |
| # furnished to do so, subject to the following conditions: |
| |
| # The above copyright notice and this permission notice shall be included in |
| # all copies or substantial portions of the Software. |
| |
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| # SOFTWARE. |
| |
| from unittest import mock |
| import textwrap |
| |
| from lxml import html |
| import pytest |
| |
| from . import post_version |
| |
| |
| # Mock out subprocess.run to avoid having git commits |
| @mock.patch('bin.post_version.subprocess.run', mock.Mock()) |
| class TestUpdateCalendar: |
| |
| HEAD = textwrap.dedent("""\ |
| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| <html lang="en"> |
| <head> |
| <meta http-equiv="content-type" content="text/html; charset=utf-8"> |
| <title>Release Calendar</title> |
| <link rel="stylesheet" type="text/css" href="mesa.css"> |
| </head> |
| <body> |
| """) |
| |
| TABLE = textwrap.dedent("""\ |
| <table> |
| <tr> |
| <th>Branch</th> |
| <th>Expected date</th> |
| <th>Release</th> |
| <th>Release manager</th> |
| <th>Notes</th> |
| </tr> |
| """) |
| |
| FOOT = "</body></html>" |
| |
| TABLE_FOOT = "</table>" |
| |
| def wrap_table(self, table: str) -> str: |
| return self.HEAD + self.TABLE + table + self.TABLE_FOOT + self.FOOT |
| |
| def test_basic(self): |
| data = self.wrap_table(textwrap.dedent("""\ |
| <tr> |
| <td rowspan="3">19.2</td> |
| <td>2019-11-06</td> |
| <td>19.2.3</td> |
| <td>Dylan Baker</td> |
| </tr> |
| <tr> |
| <td>2019-11-20</td> |
| <td>19.2.4</td> |
| <td>Dylan Baker</td> |
| </tr> |
| <tr> |
| <td>2019-12-04</td> |
| <td>19.2.5</td> |
| <td>Dylan Baker</td> |
| <td>Last planned 19.2.x release</td> |
| </tr> |
| """)) |
| |
| parsed = html.fromstring(data) |
| parsed.write = mock.Mock() |
| |
| with mock.patch('bin.post_version.html.parse', |
| mock.Mock(return_value=parsed)): |
| post_version.update_calendar('19.2.3') |
| |
| assert len(parsed.findall('.//tr')) == 3 |
| # we need the second element becouse the first is the header |
| |
| tr = parsed.findall('.//tr')[1] |
| tds = tr.findall('.//td') |
| assert tds[0].get("rowspan") == "2" |
| assert tds[0].text == "19.2" |
| assert tds[1].text == "2019-11-20" |
| |
| @pytest.fixture |
| def two_releases(self) -> html.etree.ElementTree: |
| data = self.wrap_table(textwrap.dedent("""\ |
| <tr> |
| <td rowspan="1">19.1</td> |
| <td>2019-11-06</td> |
| <td>19.1.8</td> |
| <td>Not Dylan Baker</td> |
| </tr> |
| <tr> |
| <td rowspan="3">19.2</td> |
| <td>2019-11-06</td> |
| <td>19.2.3</td> |
| <td>Dylan Baker</td> |
| </tr> |
| <tr> |
| <td>2019-11-20</td> |
| <td>19.2.4</td> |
| <td>Dylan Baker</td> |
| </tr> |
| <tr> |
| <td>2019-12-04</td> |
| <td>19.2.5</td> |
| <td>Dylan Baker</td> |
| <td>Last planned 19.2.x release</td> |
| </tr> |
| """)) |
| |
| p = html.fromstring(data) |
| p.write = mock.Mock() |
| return p |
| |
| def test_two_releases(self, two_releases: html.etree.ElementTree): |
| with mock.patch('bin.post_version.html.parse', |
| mock.Mock(return_value=two_releases)): |
| post_version.update_calendar('19.2.3') |
| |
| assert len(two_releases.findall('.//tr')) == 4 |
| # we need the second element becouse the first is the header |
| |
| tr = two_releases.findall('.//tr')[2] |
| tds = tr.findall('.//td') |
| assert tds[0].get("rowspan") == "2" |
| assert tds[0].text == "19.2" |
| assert tds[1].text == "2019-11-20" |
| |
| def test_last_Release(self, two_releases: html.etree.ElementTree): |
| with mock.patch('bin.post_version.html.parse', |
| mock.Mock(return_value=two_releases)): |
| post_version.update_calendar('19.1.8') |
| |
| assert len(two_releases.findall('.//tr')) == 4 |
| # we need the second element becouse the first is the header |
| |
| tr = two_releases.findall('.//tr')[1] |
| tds = tr.findall('.//td') |
| assert tds[0].get("rowspan") == "3" |
| assert tds[0].text == "19.2" |
| assert tds[1].text == "2019-11-06" |