mirror of
https://github.com/Horizontal42/netsleuth.git
synced 2026-11-11 02:12:04 +03:00
test: добавить тесты для валидатора входных данных
This commit is contained in:
parent
8c9ba33faf
commit
d438e3aa30
1 changed files with 137 additions and 0 deletions
137
tests/test_validator.py
Normal file
137
tests/test_validator.py
Normal file
|
|
@ -0,0 +1,137 @@
|
|||
"""Тесты для модуля валидации входных данных."""
|
||||
|
||||
import pytest
|
||||
import typer
|
||||
|
||||
from netsleuth.validator import (
|
||||
validate_bind_address,
|
||||
validate_port,
|
||||
validate_target,
|
||||
)
|
||||
|
||||
|
||||
class TestValidateTarget:
|
||||
"""Тесты валидации target."""
|
||||
|
||||
def test_valid_public_ipv4(self):
|
||||
"""Валидный публичный IPv4 должен проходить."""
|
||||
assert validate_target("8.8.8.8") == "8.8.8.8"
|
||||
assert validate_target("1.1.1.1") == "1.1.1.1"
|
||||
assert validate_target("93.184.216.34") == "93.184.216.34"
|
||||
|
||||
def test_valid_hostname(self):
|
||||
"""Валидный hostname должен проходить."""
|
||||
assert validate_target("google.com") == "google.com"
|
||||
assert validate_target("example.org") == "example.org"
|
||||
assert validate_target("my-server.example.com") == "my-server.example.com"
|
||||
|
||||
def test_localhost_rejected(self):
|
||||
"""Localhost должен быть отклонён."""
|
||||
with pytest.raises(typer.BadParameter) as exc_info:
|
||||
validate_target("127.0.0.1")
|
||||
assert "private/reserved" in str(exc_info.value).lower()
|
||||
|
||||
def test_private_class_a_rejected(self):
|
||||
"""Private Class A должен быть отклонён."""
|
||||
with pytest.raises(typer.BadParameter):
|
||||
validate_target("10.0.0.1")
|
||||
with pytest.raises(typer.BadParameter):
|
||||
validate_target("10.255.255.255")
|
||||
|
||||
def test_private_class_c_rejected(self):
|
||||
"""Private Class C должен быть отклонён."""
|
||||
with pytest.raises(typer.BadParameter):
|
||||
validate_target("192.168.0.1")
|
||||
with pytest.raises(typer.BadParameter):
|
||||
validate_target("192.168.255.255")
|
||||
|
||||
def test_private_class_b_rejected(self):
|
||||
"""Private Class B должен быть отклонён."""
|
||||
for i in range(16, 32):
|
||||
with pytest.raises(typer.BadParameter):
|
||||
validate_target(f"172.{i}.0.1")
|
||||
|
||||
def test_multicast_rejected(self):
|
||||
"""Multicast должен быть отклонён."""
|
||||
with pytest.raises(typer.BadParameter):
|
||||
validate_target("224.0.0.1")
|
||||
with pytest.raises(typer.BadParameter):
|
||||
validate_target("239.255.255.255")
|
||||
|
||||
def test_reserved_rejected(self):
|
||||
"""Reserved addresses должны быть отклонены."""
|
||||
with pytest.raises(typer.BadParameter):
|
||||
validate_target("240.0.0.1")
|
||||
with pytest.raises(typer.BadParameter):
|
||||
validate_target("0.0.0.0")
|
||||
|
||||
def test_ipv6_localhost_rejected(self):
|
||||
"""IPv6 localhost должен быть отклонён."""
|
||||
with pytest.raises(typer.BadParameter):
|
||||
validate_target("::1")
|
||||
|
||||
def test_ipv6_link_local_rejected(self):
|
||||
"""IPv6 link-local должен быть отклонён."""
|
||||
with pytest.raises(typer.BadParameter):
|
||||
validate_target("fe80::1")
|
||||
|
||||
def test_ipv6_unique_local_rejected(self):
|
||||
"""IPv6 unique local должен быть отклонён."""
|
||||
with pytest.raises(typer.BadParameter):
|
||||
validate_target("fc00::1")
|
||||
with pytest.raises(typer.BadParameter):
|
||||
validate_target("fd00::1")
|
||||
|
||||
|
||||
class TestValidateBindAddress:
|
||||
"""Тесты валидации bind address."""
|
||||
|
||||
def test_valid_ipv4(self):
|
||||
"""Валидный IPv4 должен проходить."""
|
||||
assert validate_bind_address("0.0.0.0") == "0.0.0.0"
|
||||
assert validate_bind_address("192.168.1.1") == "192.168.1.1"
|
||||
|
||||
def test_valid_ipv6(self):
|
||||
"""Валидный IPv6 должен проходить."""
|
||||
assert validate_bind_address("::") == "::"
|
||||
assert validate_bind_address("::1") == "::1"
|
||||
|
||||
def test_invalid_string_rejected(self):
|
||||
"""Невалидная строка должна быть отклонена."""
|
||||
with pytest.raises(typer.BadParameter) as exc_info:
|
||||
validate_bind_address("not-an-ip")
|
||||
assert "not a valid IP address" in str(exc_info.value)
|
||||
|
||||
def test_invalid_port_number(self):
|
||||
"""Невалидный порт должен быть отклонён."""
|
||||
with pytest.raises(typer.BadParameter):
|
||||
validate_bind_address("99999.99999.99999.99999")
|
||||
|
||||
|
||||
class TestValidatePort:
|
||||
"""Тесты валидации порта."""
|
||||
|
||||
def test_valid_ports(self):
|
||||
"""Валидные порты должны проходить."""
|
||||
assert validate_port(1) == 1
|
||||
assert validate_port(80) == 80
|
||||
assert validate_port(443) == 443
|
||||
assert validate_port(8080) == 8080
|
||||
assert validate_port(65535) == 65535
|
||||
|
||||
def test_port_zero_rejected(self):
|
||||
"""Порт 0 должен быть отклонён."""
|
||||
with pytest.raises(typer.BadParameter):
|
||||
validate_port(0)
|
||||
|
||||
def test_negative_port_rejected(self):
|
||||
"""Отрицательный порт должен быть отклонён."""
|
||||
with pytest.raises(typer.BadParameter):
|
||||
validate_port(-1)
|
||||
|
||||
def test_port_too_high_rejected(self):
|
||||
"""Порт > 65535 должен быть отклонён."""
|
||||
with pytest.raises(typer.BadParameter):
|
||||
validate_port(65536)
|
||||
with pytest.raises(typer.BadParameter):
|
||||
validate_port(99999)
|
||||
Loading…
Add table
Reference in a new issue