Files
Netbox-Documentation/tests/test_importers.py
T

128 lines
4.0 KiB
Python

from io import BytesIO
import importlib.util
from pathlib import Path
import sys
import pytest
from openpyxl import Workbook
from openpyxl.styles import PatternFill, Font
from openpyxl.worksheet.table import Table
spec = importlib.util.spec_from_file_location(
"documentation_importers", Path(__file__).parents[1] / "netbox_documentation" / "importers.py"
)
importers = importlib.util.module_from_spec(spec)
sys.modules[spec.name] = importers
spec.loader.exec_module(importers)
ImportFailure = importers.ImportFailure
import_document = importers.import_document
import_excel_sheets = importers.import_excel_sheets
class Upload(BytesIO):
def __init__(self, value, name):
super().__init__(value)
self.name = name
def test_markdown_import():
result = import_document(Upload(b"# Hallo", "test.md"))
assert result.markdown == "# Hallo"
def test_xlsx_imports_sheets_as_tables():
workbook = Workbook()
sheet = workbook.active
sheet.title = "Server"
sheet.append(["Name", "IP"])
sheet.append(["web01", "10.0.0.1"])
stream = BytesIO()
workbook.save(stream)
result = import_document(Upload(stream.getvalue(), "server.xlsx"))
assert "<h2>Server</h2>" in result.markdown
assert result.body_format == "html"
assert "web01" in result.markdown
def test_xlsx_preserves_cell_fill_and_font_colors_as_html():
workbook = Workbook()
sheet = workbook.active
sheet["A1"] = "Standort"
sheet["A1"].fill = PatternFill(fill_type="solid", fgColor="A5BF60")
sheet["A1"].font = Font(color="FFFFFF", bold=True)
sheet["A2"] = "Verwaltung"
sheet["A2"].fill = PatternFill(fill_type="solid", fgColor="EAF0DC")
stream = BytesIO()
workbook.save(stream)
result = import_document(Upload(stream.getvalue(), "farben.xlsx"))
assert result.body_format == "html"
assert "background-color: #a5bf60" in result.markdown
assert "color: #ffffff" in result.markdown
assert "font-weight: bold" in result.markdown
assert "background-color: #eaf0dc" in result.markdown
def test_rejects_legacy_excel():
with pytest.raises(ImportFailure, match="xlsx"):
import_document(Upload(b"", "legacy.xls"))
def test_excel_multi_sheet_import_creates_one_result_per_sheet():
workbook = Workbook()
first = workbook.active
first.title = "Server"
first.append(["Name", "IP"])
first.append(["web01", "10.0.0.1"])
second = workbook.create_sheet("Kontakte")
second.append(["Name", "Telefon"])
second.append(["Leitstelle", "1234"])
workbook.create_sheet("Leer")
stream = BytesIO()
workbook.save(stream)
results = import_excel_sheets(Upload(stream.getvalue(), "kunde.xlsx"))
assert [result.title for result in results] == ["Server", "Kontakte"]
assert "web01" in results[0].markdown
assert "Leitstelle" in results[1].markdown
def test_excel_flatten_turns_cells_into_document_flow():
workbook = Workbook()
sheet = workbook.active
sheet.append(["Name", "IP"])
sheet.append(["db01", "10.0.0.2"])
stream = BytesIO()
workbook.save(stream)
results = import_excel_sheets(Upload(stream.getvalue(), "server.xlsx"), flatten=True)
assert results[0].markdown == "Name \nIP\n\ndb01 \n10.0.0.2"
assert "Datensatz" not in results[0].markdown
assert "Feld" not in results[0].markdown
assert "|" not in results[0].markdown
def test_excel_flatten_preserves_explicit_excel_tables_only():
workbook = Workbook()
sheet = workbook.active
sheet["A1"] = "Name"
sheet["B1"] = "IP"
sheet["A2"] = "web01"
sheet["B2"] = "10.0.0.1"
sheet["D1"] = "Normaler Hinweis"
sheet.add_table(Table(displayName="ServerTable", ref="A1:B2"))
stream = BytesIO()
workbook.save(stream)
results = import_excel_sheets(Upload(stream.getvalue(), "server.xlsx"), flatten=True)
markdown = results[0].markdown
assert "Normaler Hinweis" in markdown
assert "| Name" in markdown
assert "| web01" in markdown
assert "Datensatz" not in markdown