diff options
Diffstat (limited to 'tests/units/reporter')
-rw-r--r-- | tests/units/reporter/__init__.py | 3 | ||||
-rw-r--r-- | tests/units/reporter/test__init__.py | 193 |
2 files changed, 196 insertions, 0 deletions
diff --git a/tests/units/reporter/__init__.py b/tests/units/reporter/__init__.py new file mode 100644 index 0000000..e772bee --- /dev/null +++ b/tests/units/reporter/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. diff --git a/tests/units/reporter/test__init__.py b/tests/units/reporter/test__init__.py new file mode 100644 index 0000000..259942f --- /dev/null +++ b/tests/units/reporter/test__init__.py @@ -0,0 +1,193 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +""" +Test anta.report.__init__.py +""" +from __future__ import annotations + +from typing import Callable + +import pytest +from rich.table import Table + +from anta import RICH_COLOR_PALETTE +from anta.custom_types import TestStatus +from anta.reporter import ReportTable +from anta.result_manager import ResultManager + + +class Test_ReportTable: + """ + Test ReportTable class + """ + + # not testing __init__ as nothing is going on there + + @pytest.mark.parametrize( + "usr_list, delimiter, expected_output", + [ + pytest.param([], None, "", id="empty list no delimiter"), + pytest.param([], "*", "", id="empty list with delimiter"), + pytest.param(["elem1"], None, "elem1", id="one elem list no delimiter"), + pytest.param(["elem1"], "*", "* elem1", id="one elem list with delimiter"), + pytest.param(["elem1", "elem2"], None, "elem1\nelem2", id="two elems list no delimiter"), + pytest.param(["elem1", "elem2"], "&", "& elem1\n& elem2", id="two elems list with delimiter"), + ], + ) + def test__split_list_to_txt_list(self, usr_list: list[str], delimiter: str | None, expected_output: str) -> None: + """ + test _split_list_to_txt_list + """ + # pylint: disable=protected-access + report = ReportTable() + assert report._split_list_to_txt_list(usr_list, delimiter) == expected_output + + @pytest.mark.parametrize( + "headers", + [ + pytest.param([], id="empty list"), + pytest.param(["elem1"], id="one elem list"), + pytest.param(["elem1", "elem2"], id="two elemst"), + ], + ) + def test__build_headers(self, headers: list[str]) -> None: + """ + test _build_headers + """ + # pylint: disable=protected-access + report = ReportTable() + table = Table() + table_column_before = len(table.columns) + report._build_headers(headers, table) + assert len(table.columns) == table_column_before + len(headers) + if len(table.columns) > 0: + assert table.columns[table_column_before].style == RICH_COLOR_PALETTE.HEADER + + @pytest.mark.parametrize( + "status, expected_status", + [ + pytest.param("unknown", "unknown", id="unknown status"), + pytest.param("unset", "[grey74]unset", id="unset status"), + pytest.param("skipped", "[bold orange4]skipped", id="skipped status"), + pytest.param("failure", "[bold red]failure", id="failure status"), + pytest.param("error", "[indian_red]error", id="error status"), + pytest.param("success", "[green4]success", id="success status"), + ], + ) + def test__color_result(self, status: TestStatus, expected_status: str) -> None: + """ + test _build_headers + """ + # pylint: disable=protected-access + report = ReportTable() + assert report._color_result(status) == expected_status + + @pytest.mark.parametrize( + "host, testcase, title, number_of_tests, expected_length", + [ + pytest.param(None, None, None, 5, 5, id="all results"), + pytest.param("host1", None, None, 5, 0, id="result for host1 when no host1 test"), + pytest.param(None, "VerifyTest3", None, 5, 1, id="result for test VerifyTest3"), + pytest.param(None, None, "Custom title", 5, 5, id="Change table title"), + ], + ) + def test_report_all( + self, + result_manager_factory: Callable[[int], ResultManager], + host: str | None, + testcase: str | None, + title: str | None, + number_of_tests: int, + expected_length: int, + ) -> None: + """ + test report_all + """ + # pylint: disable=too-many-arguments + rm = result_manager_factory(number_of_tests) + + report = ReportTable() + kwargs = {"host": host, "testcase": testcase, "title": title} + kwargs = {k: v for k, v in kwargs.items() if v is not None} + res = report.report_all(rm, **kwargs) # type: ignore[arg-type] + + assert isinstance(res, Table) + assert res.title == (title or "All tests results") + assert res.row_count == expected_length + + @pytest.mark.parametrize( + "testcase, title, number_of_tests, expected_length", + [ + pytest.param(None, None, 5, 5, id="all results"), + pytest.param("VerifyTest3", None, 5, 1, id="result for test VerifyTest3"), + pytest.param(None, "Custom title", 5, 5, id="Change table title"), + ], + ) + def test_report_summary_tests( + self, + result_manager_factory: Callable[[int], ResultManager], + testcase: str | None, + title: str | None, + number_of_tests: int, + expected_length: int, + ) -> None: + """ + test report_summary_tests + """ + # pylint: disable=too-many-arguments + # TODO refactor this later... this is injecting double test results by modyfing the device name + # should be a fixture + rm = result_manager_factory(number_of_tests) + new_results = [result.model_copy() for result in rm.get_results()] + for result in new_results: + result.name = "test_device" + result.result = "failure" + rm.add_test_results(new_results) + + report = ReportTable() + kwargs = {"testcase": testcase, "title": title} + kwargs = {k: v for k, v in kwargs.items() if v is not None} + res = report.report_summary_tests(rm, **kwargs) # type: ignore[arg-type] + + assert isinstance(res, Table) + assert res.title == (title or "Summary per test case") + assert res.row_count == expected_length + + @pytest.mark.parametrize( + "host, title, number_of_tests, expected_length", + [ + pytest.param(None, None, 5, 2, id="all results"), + pytest.param("host1", None, 5, 1, id="result for host host1"), + pytest.param(None, "Custom title", 5, 2, id="Change table title"), + ], + ) + def test_report_summary_hosts( + self, + result_manager_factory: Callable[[int], ResultManager], + host: str | None, + title: str | None, + number_of_tests: int, + expected_length: int, + ) -> None: + """ + test report_summary_hosts + """ + # pylint: disable=too-many-arguments + # TODO refactor this later... this is injecting double test results by modyfing the device name + # should be a fixture + rm = result_manager_factory(number_of_tests) + new_results = [result.model_copy() for result in rm.get_results()] + for result in new_results: + result.name = host or "test_device" + result.result = "failure" + rm.add_test_results(new_results) + + report = ReportTable() + kwargs = {"host": host, "title": title} + kwargs = {k: v for k, v in kwargs.items() if v is not None} + res = report.report_summary_hosts(rm, **kwargs) # type: ignore[arg-type] + + assert isinstance(res, Table) + assert res.title == (title or "Summary per host") + assert res.row_count == expected_length |