Merging upstream version 1.1.0.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
50f8dbf7e8
commit
2044ea6182
196 changed files with 10121 additions and 3780 deletions
|
@ -5,8 +5,9 @@
|
|||
|
||||
from __future__ import annotations
|
||||
|
||||
from json import load as json_load
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
from typing import TYPE_CHECKING, Any, Literal
|
||||
|
||||
import pytest
|
||||
from pydantic import ValidationError
|
||||
|
@ -27,30 +28,25 @@ from anta.tests.system import (
|
|||
VerifyReloadCause,
|
||||
VerifyUptime,
|
||||
)
|
||||
from tests.lib.utils import generate_test_ids_list
|
||||
from tests.units.test_models import FakeTestWithInput
|
||||
|
||||
# Test classes used as expected values
|
||||
if TYPE_CHECKING:
|
||||
from _pytest.mark.structures import ParameterSet
|
||||
|
||||
DATA_DIR: Path = Path(__file__).parent.parent.resolve() / "data"
|
||||
|
||||
INIT_CATALOG_DATA: list[dict[str, Any]] = [
|
||||
{
|
||||
"name": "test_catalog",
|
||||
"filename": "test_catalog.yml",
|
||||
"tests": [
|
||||
(VerifyEOSVersion, VerifyEOSVersion.Input(versions=["4.31.1F"])),
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "test_catalog_with_tags",
|
||||
"filename": "test_catalog_with_tags.yml",
|
||||
"tests": [
|
||||
INIT_CATALOG_PARAMS: list[ParameterSet] = [
|
||||
pytest.param("test_catalog.yml", "yaml", [(VerifyEOSVersion, VerifyEOSVersion.Input(versions=["4.31.1F"]))], id="test_catalog_yaml"),
|
||||
pytest.param("test_catalog.json", "json", [(VerifyEOSVersion, VerifyEOSVersion.Input(versions=["4.31.1F"]))], id="test_catalog_json"),
|
||||
pytest.param(
|
||||
"test_catalog_with_tags.yml",
|
||||
"yaml",
|
||||
[
|
||||
(
|
||||
VerifyUptime,
|
||||
VerifyUptime.Input(
|
||||
minimum=10,
|
||||
filters=VerifyUptime.Input.Filters(tags={"fabric"}),
|
||||
filters=VerifyUptime.Input.Filters(tags={"spine"}),
|
||||
),
|
||||
),
|
||||
(
|
||||
|
@ -60,176 +56,143 @@ INIT_CATALOG_DATA: list[dict[str, Any]] = [
|
|||
filters=VerifyUptime.Input.Filters(tags={"leaf"}),
|
||||
),
|
||||
),
|
||||
(VerifyReloadCause, {"filters": {"tags": ["leaf", "spine"]}}),
|
||||
(VerifyReloadCause, {"filters": {"tags": ["spine", "leaf"]}}),
|
||||
(VerifyCoredump, VerifyCoredump.Input()),
|
||||
(VerifyAgentLogs, AntaTest.Input()),
|
||||
(VerifyCPUUtilization, VerifyCPUUtilization.Input(filters=VerifyCPUUtilization.Input.Filters(tags={"leaf"}))),
|
||||
(VerifyMemoryUtilization, VerifyMemoryUtilization.Input(filters=VerifyMemoryUtilization.Input.Filters(tags={"testdevice"}))),
|
||||
(VerifyCPUUtilization, None),
|
||||
(VerifyMemoryUtilization, None),
|
||||
(VerifyFileSystemUtilization, None),
|
||||
(VerifyNTP, {}),
|
||||
(VerifyMlagStatus, None),
|
||||
(VerifyL3MTU, {"mtu": 1500, "filters": {"tags": ["demo"]}}),
|
||||
(VerifyMlagStatus, {"filters": {"tags": ["leaf"]}}),
|
||||
(VerifyL3MTU, {"mtu": 1500, "filters": {"tags": ["spine"]}}),
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "test_empty_catalog",
|
||||
"filename": "test_empty_catalog.yml",
|
||||
"tests": [],
|
||||
},
|
||||
{
|
||||
"name": "test_empty_dict_catalog",
|
||||
"filename": "test_empty_dict_catalog.yml",
|
||||
"tests": [],
|
||||
},
|
||||
id="test_catalog_with_tags",
|
||||
),
|
||||
pytest.param("test_empty_catalog.yml", "yaml", [], id="test_empty_catalog"),
|
||||
pytest.param("test_empty_dict_catalog.yml", "yaml", [], id="test_empty_dict_catalog"),
|
||||
]
|
||||
CATALOG_PARSE_FAIL_DATA: list[dict[str, Any]] = [
|
||||
{
|
||||
"name": "undefined_tests",
|
||||
"filename": "test_catalog_with_undefined_tests.yml",
|
||||
"error": "FakeTest is not defined in Python module anta.tests.software",
|
||||
},
|
||||
{
|
||||
"name": "undefined_module",
|
||||
"filename": "test_catalog_with_undefined_module.yml",
|
||||
"error": "Module named anta.tests.undefined cannot be imported",
|
||||
},
|
||||
{
|
||||
"name": "undefined_module",
|
||||
"filename": "test_catalog_with_undefined_module.yml",
|
||||
"error": "Module named anta.tests.undefined cannot be imported",
|
||||
},
|
||||
{
|
||||
"name": "syntax_error",
|
||||
"filename": "test_catalog_with_syntax_error_module.yml",
|
||||
"error": "Value error, Module named tests.data.syntax_error cannot be imported. Verify that the module exists and there is no Python syntax issues.",
|
||||
},
|
||||
{
|
||||
"name": "undefined_module_nested",
|
||||
"filename": "test_catalog_with_undefined_module_nested.yml",
|
||||
"error": "Module named undefined from package anta.tests cannot be imported",
|
||||
},
|
||||
{
|
||||
"name": "not_a_list",
|
||||
"filename": "test_catalog_not_a_list.yml",
|
||||
"error": "Value error, Syntax error when parsing: True\nIt must be a list of ANTA tests. Check the test catalog.",
|
||||
},
|
||||
{
|
||||
"name": "test_definition_not_a_dict",
|
||||
"filename": "test_catalog_test_definition_not_a_dict.yml",
|
||||
"error": "Value error, Syntax error when parsing: VerifyEOSVersion\nIt must be a dictionary. Check the test catalog.",
|
||||
},
|
||||
{
|
||||
"name": "test_definition_multiple_dicts",
|
||||
"filename": "test_catalog_test_definition_multiple_dicts.yml",
|
||||
"error": "Value error, Syntax error when parsing: {'VerifyEOSVersion': {'versions': ['4.25.4M', '4.26.1F']}, "
|
||||
"'VerifyTerminAttrVersion': {'versions': ['4.25.4M']}}\nIt must be a dictionary with a single entry. Check the indentation in the test catalog.",
|
||||
},
|
||||
{"name": "wrong_type_after_parsing", "filename": "test_catalog_wrong_type.yml", "error": "must be a dict, got str"},
|
||||
CATALOG_PARSE_FAIL_PARAMS: list[ParameterSet] = [
|
||||
pytest.param(
|
||||
"test_catalog_wrong_format.toto",
|
||||
"toto",
|
||||
"'toto' is not a valid format for an AntaCatalog file. Only 'yaml' and 'json' are supported.",
|
||||
id="undefined_tests",
|
||||
),
|
||||
pytest.param("test_catalog_invalid_json.json", "json", "JSONDecodeError", id="invalid_json"),
|
||||
pytest.param("test_catalog_with_undefined_tests.yml", "yaml", "FakeTest is not defined in Python module anta.tests.software", id="undefined_tests"),
|
||||
pytest.param("test_catalog_with_undefined_module.yml", "yaml", "Module named anta.tests.undefined cannot be imported", id="undefined_module"),
|
||||
pytest.param(
|
||||
"test_catalog_with_syntax_error_module.yml",
|
||||
"yaml",
|
||||
"Value error, Module named tests.data.syntax_error cannot be imported. Verify that the module exists and there is no Python syntax issues.",
|
||||
id="syntax_error",
|
||||
),
|
||||
pytest.param(
|
||||
"test_catalog_with_undefined_module_nested.yml",
|
||||
"yaml",
|
||||
"Module named undefined from package anta.tests cannot be imported",
|
||||
id="undefined_module_nested",
|
||||
),
|
||||
pytest.param(
|
||||
"test_catalog_not_a_list.yml",
|
||||
"yaml",
|
||||
"Value error, Syntax error when parsing: True\nIt must be a list of ANTA tests. Check the test catalog.",
|
||||
id="not_a_list",
|
||||
),
|
||||
pytest.param(
|
||||
"test_catalog_test_definition_not_a_dict.yml",
|
||||
"yaml",
|
||||
"Value error, Syntax error when parsing: VerifyEOSVersion\nIt must be a dictionary. Check the test catalog.",
|
||||
id="test_definition_not_a_dict",
|
||||
),
|
||||
pytest.param(
|
||||
"test_catalog_test_definition_multiple_dicts.yml",
|
||||
"yaml",
|
||||
"Value error, Syntax error when parsing: {'VerifyEOSVersion': {'versions': ['4.25.4M', '4.26.1F']}, 'VerifyTerminAttrVersion': {'versions': ['4.25.4M']}}\n"
|
||||
"It must be a dictionary with a single entry. Check the indentation in the test catalog.",
|
||||
id="test_definition_multiple_dicts",
|
||||
),
|
||||
pytest.param("test_catalog_wrong_type.yml", "yaml", "must be a dict, got str", id="wrong_type_after_parsing"),
|
||||
]
|
||||
CATALOG_FROM_DICT_FAIL_DATA: list[dict[str, Any]] = [
|
||||
{
|
||||
"name": "undefined_tests",
|
||||
"filename": "test_catalog_with_undefined_tests.yml",
|
||||
"error": "FakeTest is not defined in Python module anta.tests.software",
|
||||
},
|
||||
{
|
||||
"name": "wrong_type",
|
||||
"filename": "test_catalog_wrong_type.yml",
|
||||
"error": "Wrong input type for catalog data, must be a dict, got str",
|
||||
},
|
||||
CATALOG_FROM_DICT_FAIL_PARAMS: list[ParameterSet] = [
|
||||
pytest.param("test_catalog_with_undefined_tests.yml", "FakeTest is not defined in Python module anta.tests.software", id="undefined_tests"),
|
||||
pytest.param("test_catalog_wrong_type.yml", "Wrong input type for catalog data, must be a dict, got str", id="wrong_type"),
|
||||
]
|
||||
CATALOG_FROM_LIST_FAIL_DATA: list[dict[str, Any]] = [
|
||||
{
|
||||
"name": "wrong_inputs",
|
||||
"tests": [
|
||||
(
|
||||
FakeTestWithInput,
|
||||
AntaTest.Input(),
|
||||
),
|
||||
],
|
||||
"error": "Test input has type AntaTest.Input but expected type FakeTestWithInput.Input",
|
||||
},
|
||||
{
|
||||
"name": "no_test",
|
||||
"tests": [(None, None)],
|
||||
"error": "Input should be a subclass of AntaTest",
|
||||
},
|
||||
{
|
||||
"name": "no_input_when_required",
|
||||
"tests": [(FakeTestWithInput, None)],
|
||||
"error": "FakeTestWithInput test inputs are not valid: 1 validation error for Input\n\tstring\n\t Field required",
|
||||
},
|
||||
{
|
||||
"name": "wrong_input_type",
|
||||
"tests": [(FakeTestWithInput, {"string": True})],
|
||||
"error": "FakeTestWithInput test inputs are not valid: 1 validation error for Input\n\tstring\n\t Input should be a valid string",
|
||||
},
|
||||
CATALOG_FROM_LIST_FAIL_PARAMS: list[ParameterSet] = [
|
||||
pytest.param([(FakeTestWithInput, AntaTest.Input())], "Test input has type AntaTest.Input but expected type FakeTestWithInput.Input", id="wrong_inputs"),
|
||||
pytest.param([(None, None)], "Input should be a subclass of AntaTest", id="no_test"),
|
||||
pytest.param(
|
||||
[(FakeTestWithInput, None)],
|
||||
"FakeTestWithInput test inputs are not valid: 1 validation error for Input\n\tstring\n\t Field required",
|
||||
id="no_input_when_required",
|
||||
),
|
||||
pytest.param(
|
||||
[(FakeTestWithInput, {"string": True})],
|
||||
"FakeTestWithInput test inputs are not valid: 1 validation error for Input\n\tstring\n\t Input should be a valid string",
|
||||
id="wrong_input_type",
|
||||
),
|
||||
]
|
||||
TESTS_SETTER_FAIL_DATA: list[dict[str, Any]] = [
|
||||
{
|
||||
"name": "not_a_list",
|
||||
"tests": "not_a_list",
|
||||
"error": "The catalog must contain a list of tests",
|
||||
},
|
||||
{
|
||||
"name": "not_a_list_of_test_definitions",
|
||||
"tests": [42, 43],
|
||||
"error": "A test in the catalog must be an AntaTestDefinition instance",
|
||||
},
|
||||
TESTS_SETTER_FAIL_PARAMS: list[ParameterSet] = [
|
||||
pytest.param("not_a_list", "The catalog must contain a list of tests", id="not_a_list"),
|
||||
pytest.param([42, 43], "A test in the catalog must be an AntaTestDefinition instance", id="not_a_list_of_test_definitions"),
|
||||
]
|
||||
|
||||
|
||||
class TestAntaCatalog:
|
||||
"""Test for anta.catalog.AntaCatalog."""
|
||||
"""Tests for anta.catalog.AntaCatalog."""
|
||||
|
||||
@pytest.mark.parametrize("catalog_data", INIT_CATALOG_DATA, ids=generate_test_ids_list(INIT_CATALOG_DATA))
|
||||
def test_parse(self, catalog_data: dict[str, Any]) -> None:
|
||||
@pytest.mark.parametrize(("filename", "file_format", "tests"), INIT_CATALOG_PARAMS)
|
||||
def test_parse(self, filename: str, file_format: Literal["yaml", "json"], tests: list[tuple[type[AntaTest], AntaTest.Input | dict[str, Any] | None]]) -> None:
|
||||
"""Instantiate AntaCatalog from a file."""
|
||||
catalog: AntaCatalog = AntaCatalog.parse(DATA_DIR / catalog_data["filename"])
|
||||
catalog: AntaCatalog = AntaCatalog.parse(DATA_DIR / filename, file_format=file_format)
|
||||
|
||||
assert len(catalog.tests) == len(catalog_data["tests"])
|
||||
for test_id, (test, inputs_data) in enumerate(catalog_data["tests"]):
|
||||
assert len(catalog.tests) == len(tests)
|
||||
for test_id, (test, inputs_data) in enumerate(tests):
|
||||
assert catalog.tests[test_id].test == test
|
||||
if inputs_data is not None:
|
||||
inputs = test.Input(**inputs_data) if isinstance(inputs_data, dict) else inputs_data
|
||||
assert inputs == catalog.tests[test_id].inputs
|
||||
|
||||
@pytest.mark.parametrize("catalog_data", INIT_CATALOG_DATA, ids=generate_test_ids_list(INIT_CATALOG_DATA))
|
||||
def test_from_list(self, catalog_data: dict[str, Any]) -> None:
|
||||
@pytest.mark.parametrize(("filename", "file_format", "tests"), INIT_CATALOG_PARAMS)
|
||||
def test_from_list(
|
||||
self, filename: str, file_format: Literal["yaml", "json"], tests: list[tuple[type[AntaTest], AntaTest.Input | dict[str, Any] | None]]
|
||||
) -> None:
|
||||
"""Instantiate AntaCatalog from a list."""
|
||||
catalog: AntaCatalog = AntaCatalog.from_list(catalog_data["tests"])
|
||||
catalog: AntaCatalog = AntaCatalog.from_list(tests)
|
||||
|
||||
assert len(catalog.tests) == len(catalog_data["tests"])
|
||||
for test_id, (test, inputs_data) in enumerate(catalog_data["tests"]):
|
||||
assert len(catalog.tests) == len(tests)
|
||||
for test_id, (test, inputs_data) in enumerate(tests):
|
||||
assert catalog.tests[test_id].test == test
|
||||
if inputs_data is not None:
|
||||
inputs = test.Input(**inputs_data) if isinstance(inputs_data, dict) else inputs_data
|
||||
assert inputs == catalog.tests[test_id].inputs
|
||||
|
||||
@pytest.mark.parametrize("catalog_data", INIT_CATALOG_DATA, ids=generate_test_ids_list(INIT_CATALOG_DATA))
|
||||
def test_from_dict(self, catalog_data: dict[str, Any]) -> None:
|
||||
@pytest.mark.parametrize(("filename", "file_format", "tests"), INIT_CATALOG_PARAMS)
|
||||
def test_from_dict(
|
||||
self, filename: str, file_format: Literal["yaml", "json"], tests: list[tuple[type[AntaTest], AntaTest.Input | dict[str, Any] | None]]
|
||||
) -> None:
|
||||
"""Instantiate AntaCatalog from a dict."""
|
||||
file = DATA_DIR / catalog_data["filename"]
|
||||
with file.open(encoding="UTF-8") as file:
|
||||
data = safe_load(file)
|
||||
file = DATA_DIR / filename
|
||||
with file.open(encoding="UTF-8") as f:
|
||||
data = safe_load(f) if file_format == "yaml" else json_load(f)
|
||||
catalog: AntaCatalog = AntaCatalog.from_dict(data)
|
||||
|
||||
assert len(catalog.tests) == len(catalog_data["tests"])
|
||||
for test_id, (test, inputs_data) in enumerate(catalog_data["tests"]):
|
||||
assert len(catalog.tests) == len(tests)
|
||||
for test_id, (test, inputs_data) in enumerate(tests):
|
||||
assert catalog.tests[test_id].test == test
|
||||
if inputs_data is not None:
|
||||
inputs = test.Input(**inputs_data) if isinstance(inputs_data, dict) else inputs_data
|
||||
assert inputs == catalog.tests[test_id].inputs
|
||||
|
||||
@pytest.mark.parametrize("catalog_data", CATALOG_PARSE_FAIL_DATA, ids=generate_test_ids_list(CATALOG_PARSE_FAIL_DATA))
|
||||
def test_parse_fail(self, catalog_data: dict[str, Any]) -> None:
|
||||
@pytest.mark.parametrize(("filename", "file_format", "error"), CATALOG_PARSE_FAIL_PARAMS)
|
||||
def test_parse_fail(self, filename: str, file_format: Literal["yaml", "json"], error: str) -> None:
|
||||
"""Errors when instantiating AntaCatalog from a file."""
|
||||
with pytest.raises((ValidationError, TypeError)) as exec_info:
|
||||
AntaCatalog.parse(DATA_DIR / catalog_data["filename"])
|
||||
with pytest.raises((ValidationError, TypeError, ValueError, OSError)) as exec_info:
|
||||
AntaCatalog.parse(DATA_DIR / filename, file_format=file_format)
|
||||
if isinstance(exec_info.value, ValidationError):
|
||||
assert catalog_data["error"] in exec_info.value.errors()[0]["msg"]
|
||||
assert error in exec_info.value.errors()[0]["msg"]
|
||||
else:
|
||||
assert catalog_data["error"] in str(exec_info)
|
||||
assert error in str(exec_info)
|
||||
|
||||
def test_parse_fail_parsing(self, caplog: pytest.LogCaptureFixture) -> None:
|
||||
"""Errors when instantiating AntaCatalog from a file."""
|
||||
|
@ -241,25 +204,25 @@ class TestAntaCatalog:
|
|||
assert "Unable to parse ANTA Test Catalog file" in message
|
||||
assert "FileNotFoundError: [Errno 2] No such file or directory" in message
|
||||
|
||||
@pytest.mark.parametrize("catalog_data", CATALOG_FROM_LIST_FAIL_DATA, ids=generate_test_ids_list(CATALOG_FROM_LIST_FAIL_DATA))
|
||||
def test_from_list_fail(self, catalog_data: dict[str, Any]) -> None:
|
||||
@pytest.mark.parametrize(("tests", "error"), CATALOG_FROM_LIST_FAIL_PARAMS)
|
||||
def test_from_list_fail(self, tests: list[tuple[type[AntaTest], AntaTest.Input | dict[str, Any] | None]], error: str) -> None:
|
||||
"""Errors when instantiating AntaCatalog from a list of tuples."""
|
||||
with pytest.raises(ValidationError) as exec_info:
|
||||
AntaCatalog.from_list(catalog_data["tests"])
|
||||
assert catalog_data["error"] in exec_info.value.errors()[0]["msg"]
|
||||
AntaCatalog.from_list(tests)
|
||||
assert error in exec_info.value.errors()[0]["msg"]
|
||||
|
||||
@pytest.mark.parametrize("catalog_data", CATALOG_FROM_DICT_FAIL_DATA, ids=generate_test_ids_list(CATALOG_FROM_DICT_FAIL_DATA))
|
||||
def test_from_dict_fail(self, catalog_data: dict[str, Any]) -> None:
|
||||
@pytest.mark.parametrize(("filename", "error"), CATALOG_FROM_DICT_FAIL_PARAMS)
|
||||
def test_from_dict_fail(self, filename: str, error: str) -> None:
|
||||
"""Errors when instantiating AntaCatalog from a list of tuples."""
|
||||
file = DATA_DIR / catalog_data["filename"]
|
||||
with file.open(encoding="UTF-8") as file:
|
||||
data = safe_load(file)
|
||||
file = DATA_DIR / filename
|
||||
with file.open(encoding="UTF-8") as f:
|
||||
data = safe_load(f)
|
||||
with pytest.raises((ValidationError, TypeError)) as exec_info:
|
||||
AntaCatalog.from_dict(data)
|
||||
if isinstance(exec_info.value, ValidationError):
|
||||
assert catalog_data["error"] in exec_info.value.errors()[0]["msg"]
|
||||
assert error in exec_info.value.errors()[0]["msg"]
|
||||
else:
|
||||
assert catalog_data["error"] in str(exec_info)
|
||||
assert error in str(exec_info)
|
||||
|
||||
def test_filename(self) -> None:
|
||||
"""Test filename."""
|
||||
|
@ -268,34 +231,39 @@ class TestAntaCatalog:
|
|||
catalog = AntaCatalog(filename=Path("test"))
|
||||
assert catalog.filename == Path("test")
|
||||
|
||||
@pytest.mark.parametrize("catalog_data", INIT_CATALOG_DATA, ids=generate_test_ids_list(INIT_CATALOG_DATA))
|
||||
def test__tests_setter_success(self, catalog_data: dict[str, Any]) -> None:
|
||||
@pytest.mark.parametrize(("filename", "file_format", "tests"), INIT_CATALOG_PARAMS)
|
||||
def test__tests_setter_success(
|
||||
self,
|
||||
filename: str,
|
||||
file_format: Literal["yaml", "json"],
|
||||
tests: list[tuple[type[AntaTest], AntaTest.Input | dict[str, Any] | None]],
|
||||
) -> None:
|
||||
"""Success when setting AntaCatalog.tests from a list of tuples."""
|
||||
catalog = AntaCatalog()
|
||||
catalog.tests = [AntaTestDefinition(test=test, inputs=inputs) for test, inputs in catalog_data["tests"]]
|
||||
assert len(catalog.tests) == len(catalog_data["tests"])
|
||||
for test_id, (test, inputs_data) in enumerate(catalog_data["tests"]):
|
||||
catalog.tests = [AntaTestDefinition(test=test, inputs=inputs) for test, inputs in tests]
|
||||
assert len(catalog.tests) == len(tests)
|
||||
for test_id, (test, inputs_data) in enumerate(tests):
|
||||
assert catalog.tests[test_id].test == test
|
||||
if inputs_data is not None:
|
||||
inputs = test.Input(**inputs_data) if isinstance(inputs_data, dict) else inputs_data
|
||||
assert inputs == catalog.tests[test_id].inputs
|
||||
|
||||
@pytest.mark.parametrize("catalog_data", TESTS_SETTER_FAIL_DATA, ids=generate_test_ids_list(TESTS_SETTER_FAIL_DATA))
|
||||
def test__tests_setter_fail(self, catalog_data: dict[str, Any]) -> None:
|
||||
@pytest.mark.parametrize(("tests", "error"), TESTS_SETTER_FAIL_PARAMS)
|
||||
def test__tests_setter_fail(self, tests: list[Any], error: str) -> None:
|
||||
"""Errors when setting AntaCatalog.tests from a list of tuples."""
|
||||
catalog = AntaCatalog()
|
||||
with pytest.raises(TypeError) as exec_info:
|
||||
catalog.tests = catalog_data["tests"]
|
||||
assert catalog_data["error"] in str(exec_info)
|
||||
catalog.tests = tests
|
||||
assert error in str(exec_info)
|
||||
|
||||
def test_build_indexes_all(self) -> None:
|
||||
"""Test AntaCatalog.build_indexes()."""
|
||||
catalog: AntaCatalog = AntaCatalog.parse(DATA_DIR / "test_catalog_with_tags.yml")
|
||||
catalog.build_indexes()
|
||||
assert len(catalog.tests_without_tags) == 5
|
||||
assert len(catalog.tag_to_tests[None]) == 6
|
||||
assert "leaf" in catalog.tag_to_tests
|
||||
assert len(catalog.tag_to_tests["leaf"]) == 3
|
||||
all_unique_tests = catalog.tests_without_tags
|
||||
all_unique_tests = catalog.tag_to_tests[None]
|
||||
for tests in catalog.tag_to_tests.values():
|
||||
all_unique_tests.update(tests)
|
||||
assert len(all_unique_tests) == 11
|
||||
|
@ -307,8 +275,8 @@ class TestAntaCatalog:
|
|||
catalog.build_indexes({"VerifyUptime", "VerifyCoredump", "VerifyL3MTU"})
|
||||
assert "leaf" in catalog.tag_to_tests
|
||||
assert len(catalog.tag_to_tests["leaf"]) == 1
|
||||
assert len(catalog.tests_without_tags) == 1
|
||||
all_unique_tests = catalog.tests_without_tags
|
||||
assert len(catalog.tag_to_tests[None]) == 1
|
||||
all_unique_tests = catalog.tag_to_tests[None]
|
||||
for tests in catalog.tag_to_tests.values():
|
||||
all_unique_tests.update(tests)
|
||||
assert len(all_unique_tests) == 4
|
||||
|
@ -323,6 +291,17 @@ class TestAntaCatalog:
|
|||
tests = catalog.get_tests_by_tags(tags={"leaf", "spine"}, strict=True)
|
||||
assert len(tests) == 1
|
||||
|
||||
def test_merge_catalogs(self) -> None:
|
||||
"""Test the merge_catalogs function."""
|
||||
# Load catalogs of different sizes
|
||||
small_catalog = AntaCatalog.parse(DATA_DIR / "test_catalog.yml")
|
||||
medium_catalog = AntaCatalog.parse(DATA_DIR / "test_catalog_medium.yml")
|
||||
tagged_catalog = AntaCatalog.parse(DATA_DIR / "test_catalog_with_tags.yml")
|
||||
|
||||
# Merge the catalogs and check the number of tests
|
||||
final_catalog = AntaCatalog.merge_catalogs([small_catalog, medium_catalog, tagged_catalog])
|
||||
assert len(final_catalog.tests) == len(small_catalog.tests) + len(medium_catalog.tests) + len(tagged_catalog.tests)
|
||||
|
||||
def test_merge(self) -> None:
|
||||
"""Test AntaCatalog.merge()."""
|
||||
catalog1: AntaCatalog = AntaCatalog.parse(DATA_DIR / "test_catalog.yml")
|
||||
|
@ -332,11 +311,15 @@ class TestAntaCatalog:
|
|||
catalog3: AntaCatalog = AntaCatalog.parse(DATA_DIR / "test_catalog_medium.yml")
|
||||
assert len(catalog3.tests) == 228
|
||||
|
||||
assert len(catalog1.merge(catalog2).tests) == 2
|
||||
with pytest.deprecated_call():
|
||||
merged_catalog = catalog1.merge(catalog2)
|
||||
assert len(merged_catalog.tests) == 2
|
||||
assert len(catalog1.tests) == 1
|
||||
assert len(catalog2.tests) == 1
|
||||
|
||||
assert len(catalog2.merge(catalog3).tests) == 229
|
||||
with pytest.deprecated_call():
|
||||
merged_catalog = catalog2.merge(catalog3)
|
||||
assert len(merged_catalog.tests) == 229
|
||||
assert len(catalog2.tests) == 1
|
||||
assert len(catalog3.tests) == 228
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue