test: Increase test coverage and refactor v3

This commit is contained in:
TrisNol
2023-11-05 12:55:47 +01:00
parent e8d1a37cff
commit f7ec3eaf24
6 changed files with 1751 additions and 868 deletions

View File

@ -16,10 +16,12 @@ from aki_prj23_transparenzregister.models.company import (
PersonToCompanyRelationship,
RelationshipRoleEnum,
)
from aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1 import (
v1 as transform,
from aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1.v1 import (
V1_Transformer,
)
transform = V1_Transformer()
def test_parse_stakeholder_org_hidden_in_person() -> None:
data = {
@ -656,31 +658,31 @@ def test_map_last_update() -> None:
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1.v1.map_co_relation"
)
@patch(
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1.v1.map_company_id"
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1.v1.V1_Transformer.map_company_id"
)
@patch(
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1.v1.name_from_beteiligung"
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1.v1.V1_Transformer.name_from_beteiligung"
)
@patch(
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1.v1.loc_from_beteiligung"
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1.v1.V1_Transformer.loc_from_beteiligung"
)
@patch(
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1.v1.map_last_update"
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1.v1.V1_Transformer.map_last_update"
)
@patch(
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1.v1.map_rechtsform"
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1.v1.V1_Transformer.map_rechtsform"
)
@patch(
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1.v1.map_capital"
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1.v1.V1_Transformer.map_capital"
)
@patch(
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1.v1.map_business_purpose"
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1.v1.V1_Transformer.map_business_purpose"
)
@patch(
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1.v1.map_founding_date"
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1.v1.V1_Transformer.map_founding_date"
)
@patch(
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1.v1.parse_stakeholder"
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v1.v1.V1_Transformer.parse_stakeholder"
)
def test_map_unternehmensregister_json( # noqa: PLR0913
mock_map_parse_stakeholder: Mock,

View File

@ -0,0 +1,731 @@
"""Testing utils/data_extraction/unternehmensregister/transform.py."""
from unittest.mock import Mock, patch
from aki_prj23_transparenzregister.models.company import (
Capital,
CapitalTypeEnum,
Company,
CompanyID,
CompanyRelationshipEnum,
CompanyToCompanyRelationship,
CompanyTypeEnum,
CurrencyEnum,
DistrictCourt,
Location,
PersonName,
PersonToCompanyRelationship,
RelationshipRoleEnum,
)
from aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v3.v3 import (
V3_Transformer,
)
transform = V3_Transformer()
def test_parse_stakeholder_org_hidden_in_person() -> None:
data = {
"tns:beteiligter": {
"tns:auswahl_beteiligter": {
"tns:natuerlichePerson": {
"tns:vollerName": {"tns:nachname": '"Some Company KG'},
"tns:anschrift": {"tns:ort": "Area 51"},
}
}
},
"tns:rolle": {"tns:rollenbezeichnung": {"code": "275"}},
}
expected_result = CompanyToCompanyRelationship(
role=RelationshipRoleEnum.KOMMANDITIST, # type: ignore
name="Some Company KG",
type=CompanyRelationshipEnum.COMPANY,
location=Location(**{"city": "Area 51"}),
)
assert transform.parse_stakeholder(data) == expected_result
def test_parse_stakeholder_person() -> None:
data = {
"tns:beteiligter": {
"tns:auswahl_beteiligter": {
"tns:natuerlichePerson": {
"tns:vollerName": {
"tns:vorname": "Stephen",
"tns:nachname": "King",
},
"tns:anschrift": {"tns:ort": "Maine"},
"tns:geburt": {"tns:geburtsdatum": "1947-09-21"},
}
}
},
"tns:rolle": {"tns:rollenbezeichnung": {"code": "269"}},
}
expected_result = PersonToCompanyRelationship(
role=RelationshipRoleEnum.GESCHAEFTSLEITER, # type: ignore
date_of_birth="1947-09-21",
name=PersonName(**{"firstname": "Stephen", "lastname": "King"}),
type=CompanyRelationshipEnum.PERSON,
location=Location(**{"city": "Maine"}),
)
assert transform.parse_stakeholder(data) == expected_result
def test_parse_stakeholder_person_missing_date_of_birth() -> None:
data = {
"tns:beteiligter": {
"tns:auswahl_beteiligter": {
"tns:natuerlichePerson": {
"tns:vollerName": {
"tns:vorname": "Stephen",
"tns:nachname": "King",
},
"tns:anschrift": {"tns:ort": "Maine"},
}
}
},
"tns:rolle": {"tns:rollenbezeichnung": {"code": "269"}},
}
expected_result = PersonToCompanyRelationship(
role=RelationshipRoleEnum.GESCHAEFTSLEITER, # type: ignore
date_of_birth=None,
name=PersonName(**{"firstname": "Stephen", "lastname": "King"}),
type=CompanyRelationshipEnum.PERSON,
location=Location(**{"city": "Maine"}),
)
assert transform.parse_stakeholder(data) == expected_result
def test_parse_stakeholder_org() -> None:
data = {
"tns:beteiligter": {
"tns:auswahl_beteiligter": {
"tns:organisation": {
"tns:bezeichnung": {
"tns:bezeichnung.aktuell": "Transparenzregister kG"
},
"tns:anschrift": {
"tns:ort": "Iserlohn",
"tns:strasse": "Hauptstrasse",
"tns:hausnummer": "42",
"tns:postleitzahl": "58636",
},
}
}
},
"tns:rolle": {"tns:rollenbezeichnung": {"code": "268"}},
}
expected_result = CompanyToCompanyRelationship(
name="Transparenzregister kG",
role=RelationshipRoleEnum.DIREKTOR, # type: ignore
type=CompanyRelationshipEnum.COMPANY,
location=Location(
**{
"city": "Iserlohn",
"zip_code": "58636",
"house_number": "42",
"street": "Hauptstrasse",
}
),
)
assert transform.parse_stakeholder(data) == expected_result
def test_parse_stakeholder_org_loc_from_sitz() -> None:
data = {
"tns:beteiligter": {
"tns:auswahl_beteiligter": {
"tns:organisation": {
"tns:bezeichnung": {
"tns:bezeichnung.aktuell": "Transparenzregister kG"
},
"tns:sitz": {
"tns:ort": "Iserlohn",
"tns:strasse": "Hauptstrasse",
"tns:hausnummer": "42",
"tns:postleitzahl": "58636",
},
}
}
},
"tns:rolle": {"tns:rollenbezeichnung": {"code": "268"}},
}
expected_result = CompanyToCompanyRelationship(
name="Transparenzregister kG",
role=RelationshipRoleEnum.DIREKTOR, # type: ignore
type=CompanyRelationshipEnum.COMPANY,
location=Location(
**{
"city": "Iserlohn",
"zip_code": "58636",
"house_number": "42",
"street": "Hauptstrasse",
}
),
)
assert transform.parse_stakeholder(data) == expected_result
def test_parse_stakeholder_no_result() -> None:
data: dict = {"tns:beteiligter": {"tns:auswahl_beteiligter": {}}} # type: ignore
assert transform.parse_stakeholder(data) is None
def test_loc_from_beteiligung() -> None:
data = {
"tns:grunddaten": {
"tns:verfahrensdaten": {
"tns:beteiligung": [
{
"tns:beteiligter": {
"tns:auswahl_beteiligter": {
"tns:organisation": {
"tns:anschrift": {
"tns:strasse": "Gewerbestraße",
"tns:hausnummer": "8",
"tns:postleitzahl": "72535",
"tns:ort": "Heroldstatt",
},
},
}
}
},
]
}
}
}
expected_result = Location(
city="Heroldstatt", house_number="8", street="Gewerbestraße", zip_code="72535"
)
assert transform.loc_from_beteiligung(data) == expected_result
def test_loc_from_beteiligung_number_contained_in_street() -> None:
data = {
"tns:grunddaten": {
"tns:verfahrensdaten": {
"tns:beteiligung": [
{
"tns:beteiligter": {
"tns:auswahl_beteiligter": {
"tns:organisation": {
"tns:anschrift": {
"tns:strasse": "Gewerbestraße8",
"tns:postleitzahl": "72535",
"tns:ort": "Heroldstatt",
},
},
}
}
},
]
}
}
}
expected_result = Location(
city="Heroldstatt", house_number="8", street="Gewerbestraße", zip_code="72535"
)
assert transform.loc_from_beteiligung(data) == expected_result
def test_loc_from_beteiligung_no_result() -> None:
data = {
"tns:grunddaten": {
"tns:verfahrensdaten": {
"tns:beteiligung": [
{
"tns:beteiligter": {
"tns:auswahl_beteiligter": {
"tns:organisation": {
"tns:anschrift": {
"tns:postleitzahl": "72535",
"tns:ort": "Heroldstatt",
},
},
}
}
},
]
}
}
}
expected_result = Location(
city="Heroldstatt", house_number=None, street=None, zip_code="72535"
)
assert transform.loc_from_beteiligung(data) == expected_result
def test_loc_from_beteiligung_combine() -> None:
data = {
"tns:grunddaten": {
"tns:verfahrensdaten": {
"tns:beteiligung": [
{
"tns:beteiligter": {
"tns:auswahl_beteiligter": {
"tns:organisation": {
"tns:anschrift": {
"tns:postleitzahl": "72535",
"tns:strasse": "Pliangenserstr. 40",
"tns:hausnummer": "a",
"tns:ort": "Heroldstatt",
},
},
}
}
},
]
}
}
}
expected_result = Location(
city="Heroldstatt",
house_number="40a",
street="Pliangenserstraße",
zip_code="72535",
)
assert transform.loc_from_beteiligung(data) == expected_result
def test_name_from_beteiligung() -> None:
data = {
"tns:grunddaten": {
"tns:verfahrensdaten": {
"tns:beteiligung": [
{
"tns:beteiligter": {
"tns:auswahl_beteiligter": {
"tns:organisation": {
"tns:bezeichnung": {
"tns:bezeichnung.aktuell": "1 A Autenrieth Kunststofftechnik GmbH & Co. KG"
},
},
}
},
}
]
}
}
}
expected_result = "1 A Autenrieth Kunststofftechnik GmbH & Co. KG"
assert transform.name_from_beteiligung(data) == expected_result
def test_name_from_beteiligung_remove_quotes() -> None:
data = {
"tns:grunddaten": {
"tns:verfahrensdaten": {
"tns:beteiligung": [
{
"tns:beteiligter": {
"tns:auswahl_beteiligter": {
"tns:organisation": {
"tns:bezeichnung": {
"tns:bezeichnung.aktuell": '"Siemes Verwaltungs-GmbH"'
},
},
}
},
}
]
}
}
}
expected_result = "Siemes Verwaltungs-GmbH"
assert transform.name_from_beteiligung(data) == expected_result
def test_map_rechtsform() -> None:
data = {
"tns:fachdatenRegister": {
"tns:basisdatenRegister": {
"tns:rechtstraeger": {
"tns:angabenZurRechtsform": {
"tns:rechtsform": {
"code": "Gesellschaft mit beschränkter Haftung"
},
}
},
}
}
}
expected_result = CompanyTypeEnum.GMBH
assert transform.map_rechtsform("", data) == expected_result
def test_map_rechtsform_from_name() -> None:
data = [
("GEA Farm Technologies GmbH", "Gesellschaft mit beschränkter Haftung"),
("Atos SE", "Europäische Aktiengesellschaft (SE)"),
("Bilkenroth KG", "Kommanditgesellschaft"),
("jfoiahfo8sah 98548902 öhz ö", None),
]
for company_name, expected_result in data:
assert transform.map_rechtsform(company_name, {}) == expected_result
def test_map_capital_kg_single() -> None:
capital = Capital(
currency=CurrencyEnum.EURO, value=69000, type=CapitalTypeEnum.HAFTEINLAGE # type: ignore
)
data = {
"tns:fachdatenRegister": {
"tns:auswahl_zusatzangaben": {
"tns:personengesellschaft": {
"tns:zusatzKG": {
"tns:datenKommanditist": {
"tns:hafteinlage": {
"tns:zahl": str(capital.value),
"tns:waehrung": {"code": capital.currency},
},
}
}
}
}
}
}
result = transform.map_capital(data, CompanyTypeEnum.KG) # type: ignore
assert result == capital
def test_map_capital_kg_sum() -> None:
capital = Capital(
currency=CurrencyEnum.EURO, value=20000, type=CapitalTypeEnum.HAFTEINLAGE # type: ignore
)
data = {
"tns:fachdatenRegister": {
"tns:auswahl_zusatzangaben": {
"tns:personengesellschaft": {
"tns:zusatzKG": {
"tns:datenKommanditist": [
{
"tns:hafteinlage": {
"tns:zahl": str(10000),
"tns:waehrung": {"code": capital.currency},
}
},
{
"tns:hafteinlage": {
"tns:zahl": str(10000),
"tns:waehrung": {"code": capital.currency},
},
},
]
}
}
}
}
}
result = transform.map_capital(data, CompanyTypeEnum.KG) # type: ignore
assert result == capital
def test_map_capital_no_fachdaten() -> None:
data: dict = {"tns:fachdatenRegister": {}}
result = transform.map_capital(data, CompanyTypeEnum.KG) # type: ignore
assert result is None
def test_map_capital_gmbh() -> None:
capital = Capital(
currency=CurrencyEnum.DEUTSCHE_MARK, value=42, type=CapitalTypeEnum.STAMMKAPITAL # type: ignore
)
data = {
"tns:fachdatenRegister": {
"tns:auswahl_zusatzangaben": {
"tns:kapitalgesellschaft": {
"tns:zusatzGmbH": {
"tns:stammkapital": {
"tns:zahl": str(capital.value),
"tns:waehrung": {"code": capital.currency},
},
}
}
}
}
}
result = transform.map_capital(data, CompanyTypeEnum.GMBH) # type: ignore
assert result == capital
def test_map_capital_ag() -> None:
capital = Capital(
currency=CurrencyEnum.DEUTSCHE_MARK, value=42, type=CapitalTypeEnum.GRUNDKAPITAL # type: ignore
)
data = {
"tns:fachdatenRegister": {
"tns:auswahl_zusatzangaben": {
"tns:kapitalgesellschaft": {
"tns:zusatzAktiengesellschaft": {
"tns:grundkapital": {
"tns:hoehe": {
"tns:zahl": str(capital.value),
"tns:waehrung": {"code": capital.currency},
}
},
}
}
}
}
}
result = transform.map_capital(data, CompanyTypeEnum.SE) # type: ignore
assert result == capital
def test_map_capital_personengesellschaft() -> None:
capital = Capital(
currency=CurrencyEnum.DEUTSCHE_MARK, value=42, type=CapitalTypeEnum.STAMMKAPITAL # type: ignore
)
data = {
"tns:fachdatenRegister": {
"tns:auswahl_zusatzangaben": {
"tns:personengesellschaft": {
"tns:zusatzGmbH": {
"tns:stammkapital": {
"tns:zahl": str(capital.value),
"tns:waehrung": {"code": capital.currency},
},
}
}
}
}
}
result = transform.map_capital(data, CompanyTypeEnum.OHG) # type: ignore
assert result == capital
def test_map_capital_einzelkaufmann() -> None:
capital = Capital(
currency=CurrencyEnum.DEUTSCHE_MARK, value=42, type=CapitalTypeEnum.STAMMKAPITAL # type: ignore
)
data = {
"tns:fachdatenRegister": {
"tns:auswahl_zusatzangaben": {
"Personengesellschaft": {
"tns:zusatzGmbH": {
"tns:stammkapital": {
"tns:zahl": str(capital.value),
"tns:waehrung": {"code": capital.currency},
},
}
}
}
}
}
result = transform.map_capital(data, CompanyTypeEnum.EINZELKAUFMANN) # type: ignore
assert result is None
def test_map_capital_partial_null_values() -> None:
capital = Capital(
currency=CurrencyEnum.DEUTSCHE_MARK, value=42, type=CapitalTypeEnum.STAMMKAPITAL # type: ignore
)
data = {
"tns:fachdatenRegister": {
"tns:auswahl_zusatzangaben": {
"tns:personengesellschaft": {
"tns:zusatzGmbH": {
"tns:stammkapital": {
"tns:zahl": None,
"tns:waehrung": {"code": capital.currency},
},
}
}
}
}
}
result = transform.map_capital(data, CompanyTypeEnum.OHG) # type: ignore
assert result is None
def test_map_business_purpose() -> None:
business_purpose = "Handel mit Betäubungsmitteln aller Art"
data = {
"tns:fachdatenRegister": {
"tns:basisdatenRegister": {"tns:gegenstand": business_purpose}
}
}
result = transform.map_business_purpose(data)
assert result == business_purpose
def test_map_business_purpose_no_result() -> None:
data: dict = {}
result = transform.map_business_purpose(data)
assert result is None
def test_map_founding_date_from_tag_der_ersten_eintragung() -> None:
data = {
"some entry": "Tag der ersten Eintragung: 01.05.2004",
"some other entry": "hfjdoöiashföahöf iodsazo8 5z4o fdsha8oü gfdsö",
}
expected_result = "2004-05-01"
result = transform.map_founding_date(data)
assert result == expected_result
def test_map_founding_date_from_gesellschaftsvertrag() -> None:
data = {
"some entry": "hfjdoöiashföahöf iodsazo8 5z4o fdsha8oü gfdsö",
"some other entry": "Das Wesen der Rekursion ist der Selbstaufruf Gesellschaftsvertrag vom 22.12.1996 Hallo Welt",
}
expected_result = "1996-12-22"
result = transform.map_founding_date(data)
assert result == expected_result
def test_map_founding_date_from_gruendungsdatum() -> None:
data = {
"tns:fachdatenRegister": {
"tns:basisdatenRegister": {
"tns:satzungsdatum": {"tns:aktuellesSatzungsdatum": "1998-01-01"}
}
}
}
expected_result = "1998-01-01"
result = transform.map_founding_date(data)
assert result == expected_result
def test_map_founding_date_no_result() -> None:
data: dict = {"tns:fachdatenRegister": {"tns:basisdatenRegister": {}}}
result = transform.map_founding_date(data)
assert result is None
def test_map_company_id() -> None:
district_court = DistrictCourt("Amtsgericht Ulm", "Ulm")
company_id = CompanyID(district_court, "HRA 4711")
data = {
"tns:grunddaten": {
"tns:verfahrensdaten": {
"tns:instanzdaten": {
"tns:aktenzeichen": {
"tns:auswahl_aktenzeichen": {
"tns:aktenzeichen.freitext": company_id.hr_number
}
},
},
"tns:beteiligung": [
{},
{
"tns:beteiligter": {
"tns:auswahl_beteiligter": {
"tns:organisation": {
"tns:bezeichnung": {
"tns:bezeichnung.aktuell": district_court.name
},
"tns:anschrift": {
"tns:ort": district_court.city,
},
}
}
},
},
],
},
},
}
result = transform.map_company_id(data)
assert result == company_id
def test_map_last_update() -> None:
date = "2024-01-01"
data = {"tns:fachdatenRegister": {"tns:auszug": {"tns:letzteEintragung": date}}}
result = transform.map_last_update(data)
assert result == date
@patch(
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v3.v3.map_co_relation"
)
@patch(
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v3.v3.V3_Transformer.map_company_id"
)
@patch(
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v3.v3.V3_Transformer.name_from_beteiligung"
)
@patch(
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v3.v3.V3_Transformer.loc_from_beteiligung"
)
@patch(
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v3.v3.V3_Transformer.map_last_update"
)
@patch(
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v3.v3.V3_Transformer.map_rechtsform"
)
@patch(
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v3.v3.V3_Transformer.map_capital"
)
@patch(
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v3.v3.V3_Transformer.map_business_purpose"
)
@patch(
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v3.v3.V3_Transformer.map_founding_date"
)
@patch(
"aki_prj23_transparenzregister.utils.data_extraction.unternehmensregister.transform.v3.v3.V3_Transformer.parse_stakeholder"
)
def test_map_unternehmensregister_json( # noqa: PLR0913
mock_map_parse_stakeholder: Mock,
mock_map_founding_date: Mock,
mock_map_business_purpose: Mock,
mock_map_capital: Mock,
mock_map_rechtsform: Mock,
mock_map_last_update: Mock,
mock_loc_from_beteiligung: Mock,
mock_map_name_from_beteiligung: Mock,
mock_map_company_id: Mock,
mock_map_co_relation: Mock,
) -> None:
expected_result = Company(
**{ # type: ignore
"id": Mock(),
"name": Mock(),
"location": Mock(),
"last_update": Mock(),
"company_type": Mock(),
"capital": Mock(),
"business_purpose": Mock(),
"founding_date": Mock(),
"relationships": [Mock()],
}
)
mock_map_company_id.return_value = expected_result.id
mock_map_name_from_beteiligung.return_value = expected_result.name
mock_loc_from_beteiligung.return_value = expected_result.location
mock_map_last_update.return_value = expected_result.last_update
mock_map_rechtsform.return_value = expected_result.company_type
mock_map_capital.return_value = expected_result.capital
mock_map_business_purpose.return_value = expected_result.business_purpose
mock_map_founding_date.return_value = expected_result.founding_date
mock_map_parse_stakeholder.return_value = expected_result.relationships[0]
mock_map_co_relation.side_effect = lambda x: x
data: dict = {
"rootLayerWithSomeStuipStringNooneCaresAbout": {
"tns:grunddaten": {"tns:verfahrensdaten": {"tns:beteiligung": [{}, {}, {}]}}
}
}
result = transform.map_unternehmensregister_json(data)
assert result == expected_result