"""Tests for the sql entities.""" import datetime from typing import Any import pytest import sqlalchemy as sa from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import Session from aki_prj23_transparenzregister.utils.sql import entities def test_import() -> None: # """Tests if the entities can be imported.""" assert entities @pytest.mark.parametrize( "company_data", [ # Test case 1: All coordinates are set or all are null (Expect failure) { "hr": "HR124", "court_id": 2, "name": "Invalid Company", "street": "456 Elm St", "zip_code": "54321", "city": "Invalid City", "longitude": 1.23, "latitude": None, "pos_accuracy": 0.1, "last_update": datetime.date.fromisoformat("2023-10-02"), "sector": "Tech", }, # Test case 2: Longitude must not be null if latitude is set (Expect failure) { "hr": "HR124", "court_id": 2, "name": "Invalid Company", "street": "456 Elm St", "zip_code": "54321", "city": "Invalid City", "longitude": None, "latitude": 4.56, "pos_accuracy": 0.1, "last_update": datetime.date.fromisoformat("2023-10-02"), "sector": "Tech", }, # Test case 3: Unique name and city constraint (Expect failure) { "hr": "HR124", "court_id": 2, "name": "Unique Company", "street": "456 Elm St", "zip_code": "54321", "city": "City A", "longitude": 1.23, "latitude": None, "pos_accuracy": 0.1, "last_update": datetime.date.fromisoformat("2023-10-02"), "sector": "Tech", }, { "hr": "HR125", "court_id": 3, "name": "Unique Company", "street": "789 Oak St", "zip_code": "98765", "city": "City B", "longitude": 2.34, "latitude": 5.67, "pos_accuracy": None, "last_update": datetime.date.fromisoformat("2023-10-03"), "sector": "Tech", }, ], ) def test_constraint_enforcement( empty_db: sa.orm.Session, company_data: dict[str, Any] ) -> None: """Tests if the constraint around longitude and latitude passes.""" company = entities.Company(**company_data) empty_db.add(company) with pytest.raises(IntegrityError): empty_db.commit() @pytest.mark.parametrize( ("company_data", "expect_failure"), [ # Test case 1: Valid longitude and latitude values (Expect success) ( { "hr": "HR124", "court_id": 2, "name": "Valid Company", "street": "456 Elm St", "zip_code": "54321", "city": "Valid City", "longitude": 45.0, "latitude": -20.0, "pos_accuracy": 0.1, "last_update": datetime.date.fromisoformat("2023-10-03"), "sector": "Tech", }, False, ), # Test case 2: Longitude out of range (Expect failure) ( { "hr": "HR124", "court_id": 2, "name": "Invalid Longitude", "street": "456 Elm St", "zip_code": "54321", "city": "Invalid City", "longitude": 200.0, # Out of valid range "latitude": 30.0, "pos_accuracy": 0.1, "last_update": datetime.date.fromisoformat("2023-10-02"), "sector": "Tech", }, True, ), # Test case 3: Latitude out of range (Expect failure) ( { "hr": "HR124", "court_id": 2, "name": "Invalid Latitude", "street": "456 Elm St", "zip_code": "54321", "city": "Invalid City", "longitude": 45.0, "latitude": -100.0, # Out of valid range "pos_accuracy": 0.1, "last_update": datetime.date.fromisoformat("2023-10-02"), "sector": "Tech", }, True, ), ], ) def test_coordinate_range_constraints( empty_db: sa.orm.Session, company_data: dict[str, Any], expect_failure: bool ) -> None: company = entities.Company(**company_data) empty_db.add(company) if expect_failure: with pytest.raises(IntegrityError): empty_db.commit() else: empty_db.commit() @pytest.mark.parametrize( ("company_data", "expect_failure"), [ # Test case 1: Valid data with all columns set (Expect success) ( { "hr": "HR124", "court_id": 2, "name": "Valid Company", "street": "456 Elm St", "zip_code": "54321", "city": "Valid City", "longitude": 45.0, "latitude": -20.0, "pos_accuracy": 0.1, "capital_value": 1000000.0, "original_currency": "EUR", "capital_type": "Equity", "last_update": datetime.date.fromisoformat("2023-10-02"), "sector": "Tech", }, False, ), # Test case 2: All capital-related columns are NULL (Expect success) ( { "hr": "HR125", "court_id": 3, "name": "No Capital Info", "street": "789 Oak St", "zip_code": "98765", "city": "No Capital City", "longitude": None, "latitude": None, "pos_accuracy": None, "capital_value": None, "original_currency": None, "capital_type": None, "last_update": datetime.date.fromisoformat("2023-10-03"), "sector": "Tech", }, False, ), # Test case 3: Only some of the capital-related columns are set (Expect failure) ( { "hr": "HR126", "court_id": 4, "name": "Partial Capital Info", "street": "101 Elm St", "zip_code": "54321", "city": "Partial Capital City", "longitude": None, "latitude": None, "pos_accuracy": None, "capital_value": 500000.0, "original_currency": None, # Invalid because not all columns are set "capital_type": None, # Invalid because not all columns are set "last_update": datetime.date.fromisoformat("2023-10-04"), "sector": "Finance", }, True, ), ( { "hr": "HR126", "court_id": 4, "name": "Partial Capital Info", "street": "101 Elm St", "zip_code": "54321", "city": "Partial Capital City", "longitude": None, "latitude": None, "pos_accuracy": None, "capital_value": 500000.0, "original_currency": "DM", "capital_type": None, # Invalid because not all columns are set "last_update": datetime.date.fromisoformat("2023-10-04"), "sector": "Finance", }, True, ), ( { "hr": "HR126", "court_id": 4, "name": "Partial Capital Info", "street": "101 Elm St", "zip_code": "54321", "city": "Partial Capital City", "longitude": None, "latitude": None, "pos_accuracy": None, "capital_value": None, "original_currency": "EUR", # Invalid because not all columns are set "capital_type": "Hafteinlage", # Invalid because not all columns are set "last_update": datetime.date.fromisoformat("2023-10-04"), "sector": "Finance", }, True, ), ], ) def test_capital_columns_constraints( empty_db: Session, company_data: dict[str, Any], expect_failure: bool ) -> None: company = entities.Company(**company_data) empty_db.add(company) if expect_failure: with pytest.raises(IntegrityError): empty_db.commit() else: empty_db.commit()