82 lines
3.2 KiB
Python
82 lines
3.2 KiB
Python
# 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.
|
|
"""ANTA Inventory unit tests."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING, Any
|
|
|
|
import pytest
|
|
import yaml
|
|
from pydantic import ValidationError
|
|
|
|
from anta.inventory import AntaInventory
|
|
from anta.inventory.exceptions import InventoryIncorrectSchemaError, InventoryRootKeyError
|
|
from tests.data.json_data import ANTA_INVENTORY_TESTS_INVALID, ANTA_INVENTORY_TESTS_VALID
|
|
from tests.lib.utils import generate_test_ids_dict
|
|
|
|
if TYPE_CHECKING:
|
|
from pathlib import Path
|
|
|
|
|
|
class TestAntaInventory:
|
|
"""Test AntaInventory class."""
|
|
|
|
def create_inventory(self, content: str, tmp_path: Path) -> str:
|
|
"""Create fakefs inventory file."""
|
|
tmp_inventory = tmp_path / "mydir/myfile"
|
|
tmp_inventory.parent.mkdir()
|
|
tmp_inventory.touch()
|
|
tmp_inventory.write_text(yaml.dump(content, allow_unicode=True))
|
|
return str(tmp_inventory)
|
|
|
|
def check_parameter(self, parameter: str, test_definition: dict[Any, Any]) -> bool:
|
|
"""Check if parameter is configured in testbed."""
|
|
return "parameters" in test_definition and parameter in test_definition["parameters"]
|
|
|
|
@pytest.mark.parametrize("test_definition", ANTA_INVENTORY_TESTS_VALID, ids=generate_test_ids_dict)
|
|
def test_init_valid(self, test_definition: dict[str, Any], tmp_path: Path) -> None:
|
|
"""Test class constructor with valid data.
|
|
|
|
Test structure:
|
|
---------------
|
|
|
|
{
|
|
'name': 'ValidInventory_with_host_only',
|
|
'input': {"anta_inventory":{"hosts":[{"host":"192.168.0.17"},{"host":"192.168.0.2"}]}},
|
|
'expected_result': 'valid',
|
|
'parameters': {
|
|
'ipaddress_in_scope': '192.168.0.17',
|
|
'ipaddress_out_of_scope': '192.168.1.1',
|
|
}
|
|
}
|
|
|
|
"""
|
|
inventory_file = self.create_inventory(content=test_definition["input"], tmp_path=tmp_path)
|
|
try:
|
|
AntaInventory.parse(filename=inventory_file, username="arista", password="arista123")
|
|
except ValidationError as exc:
|
|
raise AssertionError from exc
|
|
|
|
@pytest.mark.parametrize("test_definition", ANTA_INVENTORY_TESTS_INVALID, ids=generate_test_ids_dict)
|
|
def test_init_invalid(self, test_definition: dict[str, Any], tmp_path: Path) -> None:
|
|
"""Test class constructor with invalid data.
|
|
|
|
Test structure:
|
|
---------------
|
|
|
|
{
|
|
'name': 'ValidInventory_with_host_only',
|
|
'input': {"anta_inventory":{"hosts":[{"host":"192.168.0.17"},{"host":"192.168.0.2"}]}},
|
|
'expected_result': 'invalid',
|
|
'parameters': {
|
|
'ipaddress_in_scope': '192.168.0.17',
|
|
'ipaddress_out_of_scope': '192.168.1.1',
|
|
}
|
|
}
|
|
|
|
"""
|
|
inventory_file = self.create_inventory(content=test_definition["input"], tmp_path=tmp_path)
|
|
with pytest.raises((InventoryIncorrectSchemaError, InventoryRootKeyError, ValidationError)):
|
|
AntaInventory.parse(filename=inventory_file, username="arista", password="arista123")
|