Files
ayurishchevandClaude Sonnet 5 bcf8156085 Initial commit: RIPE CIDR/FQDN collector
Collector daemon, FastAPI server (addresses, diff, collect, sources),
SQLite storage with change journal, Docker Compose deployment,
tests, documentation and project rules.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-21 07:29:38 +03:00

55 lines
2.6 KiB
Python

import datetime
import os
import sys
import pytest
from fastapi.testclient import TestClient
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import api_server
import cidr_collector as cc
import db
import formatters
VALUES = ["10.0.0.0/23", "10.0.0.0/24", "10.0.1.5", "2001:db8::/32", "1.1.1.1"]
def test_select_default_aggregate_and_version():
# По умолчанию вывод прежний: строки как есть, лексикографическая сортировка
assert formatters.build_output(VALUES) == sorted(VALUES)
assert formatters.build_output(VALUES, ip_version="6") == ["2001:db8::/32"]
assert "2001:db8::/32" not in formatters.build_output(VALUES, ip_version="4")
# Агрегация: /24 и 10.0.1.5 поглощены /23, одиночный IP печатается без /32
assert formatters.build_output(VALUES, aggregate=True) == ["1.1.1.1", "10.0.0.0/23", "2001:db8::/32"]
@pytest.mark.parametrize("fmt,v4_line,v6_line", [
("nftables", "add element inet ripe ripe_v4 {", "add element inet ripe ripe_v6 {"),
("mikrotik", "/ip firewall address-list add list=ripe address=10.0.0.0/23",
"/ipv6 firewall address-list add list=ripe address=2001:db8::/32"),
("bird", "define RIPE_V4 = [", "define RIPE_V6 = ["),
("frr", "ip prefix-list ripe_v4 seq 10 permit 10.0.0.0/23", "ipv6 prefix-list ripe_v6 seq 5 permit 2001:db8::/32"),
])
def test_render_formats(fmt, v4_line, v6_line):
out = formatters.build_output(VALUES, fmt, aggregate=True)
assert v4_line in out and v6_line in out and out.endswith("\n")
# Пустая версия пропускается
only_v6 = formatters.build_output(VALUES, fmt, ip_version="6")
assert v6_line in only_v6 and v4_line not in only_v6
def test_api_formats(tmp_path, monkeypatch):
monkeypatch.setattr(cc, "DB_FILE", str(tmp_path / "ripe.db"))
monkeypatch.setattr(cc, "DATA_FILE", str(tmp_path / "data.json"))
monkeypatch.setattr(cc, "FQDN_DATA_FILE", str(tmp_path / "fqdn_data.json"))
with db.session() as conn, db.transaction(conn):
db.merge_source(conn, "asn", "1", {"10.0.0.0/23", "2001:db8::/32"}, datetime.datetime.now(), 90)
client = TestClient(api_server.app)
assert client.get("/addresses").json() == ["10.0.0.0/23", "2001:db8::/32"]
resp = client.get("/addresses", params={"format": "mikrotik", "name": "tg"})
assert resp.headers["content-type"].startswith("text/plain")
assert "list=tg address=10.0.0.0/23" in resp.text
assert client.get("/addresses", params={"name": "bad name;"}).status_code == 422