|
|
|
""" Stub file for testing the project """
|
|
|
|
|
|
|
|
from pathlib import Path
|
|
|
|
from collections import namedtuple
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
|
|
|
DummyValue = namedtuple("DummyValue", "value")
|
|
|
|
|
|
|
|
|
|
|
|
class DummySheet:
|
|
|
|
def __init__(self, data):
|
|
|
|
self._data = data
|
|
|
|
|
|
|
|
@property
|
|
|
|
def rows(self):
|
|
|
|
for line in self._data:
|
|
|
|
yield [DummyValue(value) for value in line]
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def example_file(request):
|
|
|
|
root_dir = Path(request.config.rootdir)
|
|
|
|
data_dir = root_dir / "test data"
|
|
|
|
return data_dir / "Verwendungsnachweis_und_Kassenstand_SAP_Zahlen.xlsx"
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def example_workbook(example_file):
|
|
|
|
import openpyxl
|
|
|
|
|
|
|
|
return openpyxl.open(example_file)
|
|
|
|
|
|
|
|
|
|
|
|
def test_check_export_headline():
|
|
|
|
from superx_budget import _check_export_headline, SuperXError
|
|
|
|
|
|
|
|
row = [DummyValue("nomatching header")]
|
|
|
|
|
|
|
|
with pytest.raises(SuperXError):
|
|
|
|
_check_export_headline(row)
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_export_metadata_ok():
|
|
|
|
from superx_budget import _get_export_metadata
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
|
|
value = "Haushaltsjahr: XXX;Stand:31.12.2020;Gruppierung:automatisch"
|
|
|
|
row = [DummyValue(value)]
|
|
|
|
metadata = _get_export_metadata(row)
|
|
|
|
|
|
|
|
assert metadata.account_year == "XXX"
|
|
|
|
assert metadata.export_date == datetime(2020, 12, 31)
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"faulty_data",
|
|
|
|
[
|
|
|
|
"Haushaltsjahr:XXX;Kein Stand:31.12.2020;Gruppierung:automatisch",
|
|
|
|
"Kein Haushaltsjahr:XXX;Stand:31.12.2020;Gruppierung:automatisch",
|
|
|
|
"Kein Haushaltsjahr:XXX;Kein Stand:31.12.2020;Gruppierung:automatisch",
|
|
|
|
"Haushaltsjahr:XXX;Stand:kein Datum;Gruppierung:automatisch",
|
|
|
|
"Haushaltsjahr:XXX;Stand:31.12.2020;keine Gruppierung:automatisch",
|
|
|
|
"Haushaltsjahr:XXX;Stand:31.12.2020;Gruppierung:nicht automatisch",
|
|
|
|
],
|
|
|
|
)
|
|
|
|
def test_get_export_metadata_raises_error(faulty_data):
|
|
|
|
from superx_budget import _get_export_metadata
|
|
|
|
|
|
|
|
row = [DummyValue(faulty_data)]
|
|
|
|
|
|
|
|
with pytest.raises(ValueError): # SuperXError is a subclass of ValueError
|
|
|
|
_get_export_metadata(row)
|
|
|
|
|
|
|
|
|
|
|
|
def test_skip_export_data_until_table_header_ok():
|
|
|
|
from superx_budget import _skip_export_data_until_table_header
|
|
|
|
|
|
|
|
rows = [
|
|
|
|
[DummyValue("")],
|
|
|
|
[DummyValue("")],
|
|
|
|
[DummyValue("Kostenstelle")],
|
|
|
|
[DummyValue("Daten")],
|
|
|
|
]
|
|
|
|
iterator = iter(rows)
|
|
|
|
_skip_export_data_until_table_header(iterator)
|
|
|
|
data_line = next(iterator)
|
|
|
|
|
|
|
|
assert data_line[0].value == "Daten"
|
|
|
|
|
|
|
|
|
|
|
|
def test_skip_export_data_until_table_header_raises_error():
|
|
|
|
from superx_budget import _skip_export_data_until_table_header, SuperXError
|
|
|
|
|
|
|
|
rows = [
|
|
|
|
[DummyValue("")],
|
|
|
|
[DummyValue("")],
|
|
|
|
[DummyValue("Keine Kostenstelle")],
|
|
|
|
[DummyValue("Daten")],
|
|
|
|
]
|
|
|
|
iterator = iter(rows)
|
|
|
|
with pytest.raises(SuperXError):
|
|
|
|
_skip_export_data_until_table_header(iterator)
|
|
|
|
|
|
|
|
|
|
|
|
def test_parse_data_table():
|
|
|
|
from superx_budget import _parse_data_table
|
|
|
|
|
|
|
|
rows = [
|
|
|
|
[DummyValue(v) for v in "ABCDEFGHIJ"],
|
|
|
|
[DummyValue("") for i in range(10)],
|
|
|
|
[DummyValue(v) for v in "qrstuvwxyzX"], # one column more
|
|
|
|
]
|
|
|
|
result = _parse_data_table(rows)
|
|
|
|
first_value, second_value = list(result)
|
|
|
|
|
|
|
|
assert first_value.cost_center == "A"
|
|
|
|
assert first_value.fonds == "B"
|
|
|
|
assert first_value.acutal_value == "J"
|
|
|
|
assert second_value.cost_center == "q"
|
|
|
|
assert second_value.acutal_value == "z"
|
|
|
|
|
|
|
|
|
|
|
|
def test_parse_export_data(example_workbook):
|
|
|
|
from superx_budget import parse_export_data
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
|
|
result = parse_export_data(example_workbook.active)
|
|
|
|
|
|
|
|
assert result.account_year == "2020"
|
|
|
|
assert result.export_date == datetime(2020, 3, 18)
|
|
|
|
assert len(result.data) == 212
|
|
|
|
|
|
|
|
first, last = result.data[0], result.data[-1]
|
|
|
|
assert first.cost_center == "1110200121"
|
|
|
|
assert first.fonds == "3310"
|
|
|
|
assert first.project == "1100000102"
|
|
|
|
assert first.kind == "1 - Personal"
|
|
|
|
assert first.budget_year is None
|
|
|
|
assert first.obligo == 0.01
|
|
|
|
assert first.expenses == 1000
|
|
|
|
assert first.revenue_actual == 2000
|
|
|
|
assert first.revenue_target == 3000
|
|
|
|
assert first.acutal_value == 4000
|
|
|
|
assert last.cost_center == "1110200121"
|
|
|
|
assert last.fonds == "1123"
|
|
|
|
assert last.project == "8200062807"
|
|
|
|
assert last.kind == "KASSENSTAND zum Ende des Betrachungszeitraums"
|
|
|
|
assert last.budget_year is None
|
|
|
|
assert last.obligo == 236
|
|
|
|
assert last.expenses == 1236
|
|
|
|
assert last.revenue_actual == 2236
|
|
|
|
assert last.revenue_target == 3236
|
|
|
|
assert last.acutal_value == 4236
|