Added Tests

Co-authored-by: Tristan Nolde <TrisNol@users.noreply.github.com>
This commit is contained in:
Tim 2023-11-10 18:04:19 +01:00
parent 410b690873
commit e5769b3c25
5 changed files with 404 additions and 467 deletions

View File

@ -20,7 +20,7 @@
},
{
"cell_type": "code",
"execution_count": 37,
"execution_count": 5,
"id": "b6eea59adeae27d4",
"metadata": {
"ExecuteTime": {
@ -36,7 +36,7 @@
"'c:\\\\Users\\\\trimr\\\\Projekte\\\\aki_prj23_transparenzregister'"
]
},
"execution_count": 37,
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
@ -53,7 +53,7 @@
},
{
"cell_type": "code",
"execution_count": 38,
"execution_count": 6,
"id": "eb9498d3",
"metadata": {},
"outputs": [],
@ -71,7 +71,7 @@
},
{
"cell_type": "code",
"execution_count": 39,
"execution_count": 7,
"id": "6a317af6",
"metadata": {},
"outputs": [],
@ -92,7 +92,7 @@
},
{
"cell_type": "code",
"execution_count": 40,
"execution_count": 8,
"id": "2d17651a",
"metadata": {},
"outputs": [
@ -102,7 +102,7 @@
"'SELECT to_company.id AS id_company_to, to_company.name AS name_company_to, relation.relation AS relation_type, from_company.name AS name_company_from, from_company.id AS id_company_from \\nFROM company AS to_company JOIN (relation JOIN company_relation ON relation.id = company_relation.id) ON relation.company_id = to_company.id JOIN company AS from_company ON company_relation.company2_id = from_company.id'"
]
},
"execution_count": 40,
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
@ -150,183 +150,48 @@
},
{
"cell_type": "code",
"execution_count": 42,
"execution_count": 12,
"id": "444cd402",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id_company_to</th>\n",
" <th>name_company_to</th>\n",
" <th>relation_type</th>\n",
" <th>name_company_from</th>\n",
" <th>id_company_from</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>5</td>\n",
" <td>2. Schaper Objekt GmbH &amp; Co. Kiel KG</td>\n",
" <td>KOMMANDITIST</td>\n",
" <td>Multi-Center Warenvertriebs GmbH</td>\n",
" <td>2213</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>32</td>\n",
" <td>Alb-Windkraft GmbH &amp; Co. KG</td>\n",
" <td>KOMMANDITIST</td>\n",
" <td>EnBW Windkraftprojekte GmbH</td>\n",
" <td>845</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>34</td>\n",
" <td>Anneliese Köster GmbH &amp; Co. KG</td>\n",
" <td>KOMMANDITIST</td>\n",
" <td>INDUS Holding Aktiengesellschaft</td>\n",
" <td>1903</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>74</td>\n",
" <td>AURELIUS Equity Opportunities SE &amp; Co. KGaA</td>\n",
" <td>HAFTENDER_GESELLSCHAFTER</td>\n",
" <td>AURELIUS Management SE</td>\n",
" <td>163</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>77</td>\n",
" <td>Aurelius KG</td>\n",
" <td>HAFTENDER_GESELLSCHAFTER</td>\n",
" <td>Aurelius Verwaltungs GmbH</td>\n",
" <td>80</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>573</th>\n",
" <td>3137</td>\n",
" <td>Zalando BTD 011 SE &amp; Co. KG</td>\n",
" <td>HAFTENDER_GESELLSCHAFTER</td>\n",
" <td>Zalando SE</td>\n",
" <td>3112</td>\n",
" </tr>\n",
" <tr>\n",
" <th>574</th>\n",
" <td>3137</td>\n",
" <td>Zalando BTD 011 SE &amp; Co. KG</td>\n",
" <td>KOMMANDITIST</td>\n",
" <td>Zalando Operations GmbH</td>\n",
" <td>3103</td>\n",
" </tr>\n",
" <tr>\n",
" <th>575</th>\n",
" <td>3138</td>\n",
" <td>zLabels Creation &amp; Sales GmbH &amp; Co. KG</td>\n",
" <td>HAFTENDER_GESELLSCHAFTER</td>\n",
" <td>zLabels GmbH</td>\n",
" <td>3113</td>\n",
" </tr>\n",
" <tr>\n",
" <th>576</th>\n",
" <td>3145</td>\n",
" <td>Zalando Customer Care International SE &amp; Co. KG</td>\n",
" <td>HAFTENDER_GESELLSCHAFTER</td>\n",
" <td>Zalando SE</td>\n",
" <td>3112</td>\n",
" </tr>\n",
" <tr>\n",
" <th>577</th>\n",
" <td>3145</td>\n",
" <td>Zalando Customer Care International SE &amp; Co. KG</td>\n",
" <td>KOMMANDITIST</td>\n",
" <td>Zalando Operations GmbH</td>\n",
" <td>3103</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>578 rows × 5 columns</p>\n",
"</div>"
],
"text/plain": [
" id_company_to name_company_to \\\n",
"0 5 2. Schaper Objekt GmbH & Co. Kiel KG \n",
"1 32 Alb-Windkraft GmbH & Co. KG \n",
"2 34 Anneliese Köster GmbH & Co. KG \n",
"3 74 AURELIUS Equity Opportunities SE & Co. KGaA \n",
"4 77 Aurelius KG \n",
".. ... ... \n",
"573 3137 Zalando BTD 011 SE & Co. KG \n",
"574 3137 Zalando BTD 011 SE & Co. KG \n",
"575 3138 zLabels Creation & Sales GmbH & Co. KG \n",
"576 3145 Zalando Customer Care International SE & Co. KG \n",
"577 3145 Zalando Customer Care International SE & Co. KG \n",
"\n",
" relation_type name_company_from \\\n",
"0 KOMMANDITIST Multi-Center Warenvertriebs GmbH \n",
"1 KOMMANDITIST EnBW Windkraftprojekte GmbH \n",
"2 KOMMANDITIST INDUS Holding Aktiengesellschaft \n",
"3 HAFTENDER_GESELLSCHAFTER AURELIUS Management SE \n",
"4 HAFTENDER_GESELLSCHAFTER Aurelius Verwaltungs GmbH \n",
".. ... ... \n",
"573 HAFTENDER_GESELLSCHAFTER Zalando SE \n",
"574 KOMMANDITIST Zalando Operations GmbH \n",
"575 HAFTENDER_GESELLSCHAFTER zLabels GmbH \n",
"576 HAFTENDER_GESELLSCHAFTER Zalando SE \n",
"577 KOMMANDITIST Zalando Operations GmbH \n",
"\n",
" id_company_from \n",
"0 2213 \n",
"1 845 \n",
"2 1903 \n",
"3 163 \n",
"4 80 \n",
".. ... \n",
"573 3112 \n",
"574 3103 \n",
"575 3113 \n",
"576 3112 \n",
"577 3103 \n",
"\n",
"[578 rows x 5 columns]"
"[{'id_company_to': 2,\n",
" 'name_company_to': '1. Staiger Grundstücksverwaltung GmbH & Co. KG',\n",
" 'relation_type': 'HAFTENDER_GESELLSCHAFTER',\n",
" 'name_company_from': 'Staiger I. Verwaltung-GmbH',\n",
" 'id_company_from': 3226},\n",
" {'id_company_to': 3,\n",
" 'name_company_to': '1 A Autenrieth Kunststofftechnik GmbH & Co. KG',\n",
" 'relation_type': 'HAFTENDER_GESELLSCHAFTER',\n",
" 'name_company_from': 'Autenrieth Verwaltungs-GmbH',\n",
" 'id_company_from': 3324},\n",
" {'id_company_to': 5,\n",
" 'name_company_to': '2. Schaper Objekt GmbH & Co. Kiel KG',\n",
" 'relation_type': 'KOMMANDITIST',\n",
" 'name_company_from': 'Multi-Center Warenvertriebs GmbH',\n",
" 'id_company_from': 2213},\n",
" {'id_company_to': 6,\n",
" 'name_company_to': 'AASP Filmproduktionsgesellschaft mbH & Co. Leonie KG',\n",
" 'relation_type': 'INHABER',\n",
" 'name_company_from': 'ABN AMRO Structured Products Gesellschaft für Fondsbeteiligungen mbH',\n",
" 'id_company_from': 3332},\n",
" {'id_company_to': 6,\n",
" 'name_company_to': 'AASP Filmproduktionsgesellschaft mbH & Co. Leonie KG',\n",
" 'relation_type': 'KOMMANDITIST',\n",
" 'name_company_from': 'Kallang GmbH',\n",
" 'id_company_from': 3316}]"
]
},
"execution_count": 42,
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"company_relations = pd.read_sql_query(str(relations_company_query), session.bind)\n",
"company_relations"
"company_relations.head().to_dict(orient=\"records\")"
]
},
{
@ -339,7 +204,7 @@
},
{
"cell_type": "code",
"execution_count": 43,
"execution_count": 14,
"id": "52af1d30",
"metadata": {},
"outputs": [],
@ -385,194 +250,58 @@
},
{
"cell_type": "code",
"execution_count": 45,
"execution_count": 15,
"id": "c78b3e65",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id_company</th>\n",
" <th>name_company</th>\n",
" <th>relation_type</th>\n",
" <th>id_person</th>\n",
" <th>lastname</th>\n",
" <th>firstname</th>\n",
" <th>date_of_birth</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>0 10 24 Telefondienste GmbH</td>\n",
" <td>GESCHAEFTSFUEHRER</td>\n",
" <td>1</td>\n",
" <td>Tetau</td>\n",
" <td>Nicolas</td>\n",
" <td>1971-01-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>0 10 24 Telefondienste GmbH</td>\n",
" <td>PROKURIST</td>\n",
" <td>2</td>\n",
" <td>Dammast</td>\n",
" <td>Lutz</td>\n",
" <td>1966-12-06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>1. Staiger Grundstücksverwaltung GmbH &amp; Co. KG</td>\n",
" <td>KOMMANDITIST</td>\n",
" <td>3</td>\n",
" <td>Tutsch</td>\n",
" <td>Rosemarie</td>\n",
" <td>1941-10-09</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2</td>\n",
" <td>1. Staiger Grundstücksverwaltung GmbH &amp; Co. KG</td>\n",
" <td>KOMMANDITIST</td>\n",
" <td>4</td>\n",
" <td>Staiger</td>\n",
" <td>Marc</td>\n",
" <td>1969-10-22</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2</td>\n",
" <td>1. Staiger Grundstücksverwaltung GmbH &amp; Co. KG</td>\n",
" <td>KOMMANDITIST</td>\n",
" <td>5</td>\n",
" <td>Staiger</td>\n",
" <td>Michaela</td>\n",
" <td>1971-03-03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14891</th>\n",
" <td>3144</td>\n",
" <td>Wohnungsbaugesellschaft mit beschränkter Haftu...</td>\n",
" <td>GESCHAEFTSFUEHRER</td>\n",
" <td>878</td>\n",
" <td>Weirich</td>\n",
" <td>Torsten</td>\n",
" <td>1975-07-21</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14892</th>\n",
" <td>3144</td>\n",
" <td>Wohnungsbaugesellschaft mit beschränkter Haftu...</td>\n",
" <td>GESCHAEFTSFUEHRER</td>\n",
" <td>1840</td>\n",
" <td>Brusinski</td>\n",
" <td>Bastian</td>\n",
" <td>1980-10-29</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14893</th>\n",
" <td>3145</td>\n",
" <td>Zalando Customer Care International SE &amp; Co. KG</td>\n",
" <td>PROKURIST</td>\n",
" <td>9359</td>\n",
" <td>Pape</td>\n",
" <td>Ute</td>\n",
" <td>1978-12-13</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14894</th>\n",
" <td>3146</td>\n",
" <td>zebotec GmbH</td>\n",
" <td>GESCHAEFTSFUEHRER</td>\n",
" <td>9628</td>\n",
" <td>Neff</td>\n",
" <td>Werner</td>\n",
" <td>1981-11-24</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14895</th>\n",
" <td>3146</td>\n",
" <td>zebotec GmbH</td>\n",
" <td>GESCHAEFTSFUEHRER</td>\n",
" <td>9629</td>\n",
" <td>Morris</td>\n",
" <td>Richard</td>\n",
" <td>1971-01-02</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>14896 rows × 7 columns</p>\n",
"</div>"
],
"text/plain": [
" id_company name_company \\\n",
"0 1 0 10 24 Telefondienste GmbH \n",
"1 1 0 10 24 Telefondienste GmbH \n",
"2 2 1. Staiger Grundstücksverwaltung GmbH & Co. KG \n",
"3 2 1. Staiger Grundstücksverwaltung GmbH & Co. KG \n",
"4 2 1. Staiger Grundstücksverwaltung GmbH & Co. KG \n",
"... ... ... \n",
"14891 3144 Wohnungsbaugesellschaft mit beschränkter Haftu... \n",
"14892 3144 Wohnungsbaugesellschaft mit beschränkter Haftu... \n",
"14893 3145 Zalando Customer Care International SE & Co. KG \n",
"14894 3146 zebotec GmbH \n",
"14895 3146 zebotec GmbH \n",
"\n",
" relation_type id_person lastname firstname date_of_birth \n",
"0 GESCHAEFTSFUEHRER 1 Tetau Nicolas 1971-01-02 \n",
"1 PROKURIST 2 Dammast Lutz 1966-12-06 \n",
"2 KOMMANDITIST 3 Tutsch Rosemarie 1941-10-09 \n",
"3 KOMMANDITIST 4 Staiger Marc 1969-10-22 \n",
"4 KOMMANDITIST 5 Staiger Michaela 1971-03-03 \n",
"... ... ... ... ... ... \n",
"14891 GESCHAEFTSFUEHRER 878 Weirich Torsten 1975-07-21 \n",
"14892 GESCHAEFTSFUEHRER 1840 Brusinski Bastian 1980-10-29 \n",
"14893 PROKURIST 9359 Pape Ute 1978-12-13 \n",
"14894 GESCHAEFTSFUEHRER 9628 Neff Werner 1981-11-24 \n",
"14895 GESCHAEFTSFUEHRER 9629 Morris Richard 1971-01-02 \n",
"\n",
"[14896 rows x 7 columns]"
"[{'id_company': 1,\n",
" 'name_company': '0 10 24 Telefondienste GmbH',\n",
" 'relation_type': 'GESCHAEFTSFUEHRER',\n",
" 'id_person': 1,\n",
" 'lastname': 'Tetau',\n",
" 'firstname': 'Nicolas',\n",
" 'date_of_birth': datetime.date(1971, 1, 2)},\n",
" {'id_company': 1,\n",
" 'name_company': '0 10 24 Telefondienste GmbH',\n",
" 'relation_type': 'PROKURIST',\n",
" 'id_person': 2,\n",
" 'lastname': 'Dammast',\n",
" 'firstname': 'Lutz',\n",
" 'date_of_birth': datetime.date(1966, 12, 6)},\n",
" {'id_company': 2,\n",
" 'name_company': '1. Staiger Grundstücksverwaltung GmbH & Co. KG',\n",
" 'relation_type': 'KOMMANDITIST',\n",
" 'id_person': 3,\n",
" 'lastname': 'Tutsch',\n",
" 'firstname': 'Rosemarie',\n",
" 'date_of_birth': datetime.date(1941, 10, 9)},\n",
" {'id_company': 2,\n",
" 'name_company': '1. Staiger Grundstücksverwaltung GmbH & Co. KG',\n",
" 'relation_type': 'KOMMANDITIST',\n",
" 'id_person': 4,\n",
" 'lastname': 'Staiger',\n",
" 'firstname': 'Marc',\n",
" 'date_of_birth': datetime.date(1969, 10, 22)},\n",
" {'id_company': 2,\n",
" 'name_company': '1. Staiger Grundstücksverwaltung GmbH & Co. KG',\n",
" 'relation_type': 'KOMMANDITIST',\n",
" 'id_person': 5,\n",
" 'lastname': 'Staiger',\n",
" 'firstname': 'Michaela',\n",
" 'date_of_birth': datetime.date(1971, 3, 3)}]"
]
},
"execution_count": 45,
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"person_relations = pd.read_sql_query(str(relations_person_query), session.bind)\n",
"person_relations"
"person_relations.head().to_dict(orient=\"records\")"
]
},
{

View File

@ -9,7 +9,6 @@ import pandas as pd
import plotly.graph_objects as go
from cachetools import TTLCache, cached
from dash import Input, Output, callback, dash_table, dcc, html
from loguru import logger
from aki_prj23_transparenzregister.utils.networkx.network_2d import (
create_2d_graph,
@ -66,13 +65,11 @@ network = None
def person_relation_type_filter() -> np.ndarray:
"""Returns an Numpy Array of String with Person telation types."""
logger.debug("Updating Person Dropdown")
return get_all_person_relations()["relation_type"].unique()
def company_relation_type_filter() -> np.ndarray:
"""Returns an Numpy Array of String with Company relation types."""
logger.debug("Updating Person Dropdown")
return get_all_company_relations()["relation_type"].unique()
@ -88,17 +85,14 @@ def update_table(
Returns:
tuple[dict, list]: _description_
"""
logger.debug("Updateing Table")
table_df = metrics.sort_values(metric_dropdown_value, ascending=False).head(10)
table_df = table_df[["designation", "category", metric_dropdown_value]]
table_df.to_dict("records")
columns = [{"name": i, "id": i} for i in table_df.columns]
return table_df.to_dict("records"), columns # type: ignore
def layout() -> list[html.Div]:
"""Generates the Layout of the Homepage."""
logger.debug("Layouting Homepage")
person_relation_types = person_relation_type_filter()
company_relation_types = company_relation_type_filter()
top_companies_dict, top_companies_columns, figure = update_figure(
@ -348,7 +342,6 @@ def update_graph_data(
Returns:
tuple[nx.Graph, pd.DataFrame, dict, list]: _description_
"""
logger.debug("Updating Graph data")
# Get Data
person_df = get_all_person_relations()
company_df = get_all_company_relations()
@ -356,8 +349,6 @@ def update_graph_data(
person_relation = filter_relation_type(person_df, person_relation_type)
company_relation = filter_relation_type(company_df, company_relation_type)
# company_relation = filter_relation_with_more_than_one_connection(company_relation, "id_company_to", "id_company_from")
# Create Edge and Node List from data
nodes_tmp, edges_tmp = create_edge_and_node_list(person_relation, company_relation)
@ -414,7 +405,6 @@ def update_figure( # noqa: PLR0913
Returns:
Network Graph(Plotly Figure): Plotly Figure in 3 or 2D
"""
logger.debug("Update Figure")
_ = c_relation_filter_value, p_relation_filter_value
graph, metrics, nodes, edges = update_graph_data(
@ -454,29 +444,3 @@ def update_figure( # noqa: PLR0913
slider_value, # type: ignore
),
)
@callback(
Output("company_dropdown", "style"),
[
Input("dropdown_data_soruce_filter", "value"),
],
)
def update_dropdown(datasource_value: str) -> str:
"""_summary_.
Args:
datasource_value (str): _description_
Returns:
str: _description_
"""
style = ""
match datasource_value:
case "Company Data only":
style = "visibility: visible;"
case "Person Data only":
style = "visibility: hidden;"
case "Company & Person Data":
style = "visibility: visible;"
return style

View File

@ -158,42 +158,6 @@ def filter_relation_type(
]
def filter_relation_with_more_than_one_connection(
relation_dataframe: pd.DataFrame, id_column_name_to: str, id_column_name_from: str
) -> pd.DataFrame:
"""Method to filter all Entries in an DataFrame which has more than one connection.
Args:
relation_dataframe (pd.DataFrame): _description_
id_column_name_to (_type_): _description_
id_column_name_from (_type_): _description_
Returns:
relation_dataframe (pd.DataFrame): The DataFrame which now only contains entries with more than one connection.
"""
tmp_df = pd.DataFrame(columns=relation_dataframe.columns.values)
for _index, row in relation_dataframe.iterrows():
count = 0
id = row[id_column_name_to]
for _index_sub, row_sub in relation_dataframe.iterrows():
if id == row_sub[id_column_name_to]:
count = count + 1
if id == row_sub[id_column_name_from]:
count = count + 1
if count > 1:
break
if count > 1:
# tmp_df = pd.concat([tmp_df, pd.DataFrame(row)])+
tmp_df.loc[len(tmp_df)] = row # type: ignore
count = 0
else:
count = 0
continue
count = 0
return tmp_df
def create_edge_and_node_list(
person_relations: pd.DataFrame, company_relations: pd.DataFrame
) -> tuple[dict, list]:
@ -362,7 +326,7 @@ def create_edge_and_node_list_for_company(
return nodes, edges
def get_all_metrics_from_id(company_id: str) -> pd.Series:
def get_all_metrics_from_id(company_id: int) -> pd.Series:
"""Returns all Metric for the given ID.
Args:
@ -380,11 +344,14 @@ def get_all_metrics_from_id(company_id: str) -> pd.Series:
graph, metrics = initialize_network_with_reduced_metrics(
nodes=nodes_tmp, edges=edges_tmp
)
return metrics.loc[metrics["id"] == company_id].iloc[0]
filtered_metrics = metrics.loc[metrics["id"] == company_id]
if len(filtered_metrics) == 0:
return pd.Series([])
return filtered_metrics.iloc[0]
@lru_cache
def get_relations_number_from_id(id: str) -> tuple[int, int, int]:
def get_relations_number_from_id(id: int) -> tuple[int, int, int]:
"""Returns all Relation in 1, 2 and 3 lvl of one Node.
Args:
@ -399,7 +366,6 @@ def get_relations_number_from_id(id: str) -> tuple[int, int, int]:
# Create Edge and Node List from data
nodes_tmp, edges_tmp = create_edge_and_node_list(person_df, company_df)
graph = initialize_network_without_metrics(nodes=nodes_tmp, edges=edges_tmp)
neighbors = nx.all_neighbors(graph, id)

View File

@ -1,7 +1,195 @@
"""Test for the Home Page."""
import datetime
from collections.abc import Generator
from unittest.mock import patch
import pandas as pd
import pytest
from aki_prj23_transparenzregister.ui.pages import home
def test_import() -> None:
"""Checks if an import co company_stats_dash can be made."""
assert home is not None
@pytest.mark.tim()
def test_person_relation_type_filter() -> None:
with patch(
"aki_prj23_transparenzregister.ui.pages.home.get_all_person_relations"
) as mock_filter:
data = [
{"relation_type": "Eigentümer"},
{"relation_type": "Inhaber"},
{"relation_type": "Eigentümer"},
]
mock_filter.return_value = pd.DataFrame(data)
assert list(home.person_relation_type_filter()) == ["Eigentümer", "Inhaber"]
@pytest.mark.tim()
def test_company_relation_type_filter() -> None:
with patch(
"aki_prj23_transparenzregister.ui.pages.home.get_all_company_relations"
) as mock_filter:
data = [
{"relation_type": "Eigentümer"},
{"relation_type": "Inhaber"},
{"relation_type": "Eigentümer"},
]
mock_filter.return_value = pd.DataFrame(data)
assert list(home.company_relation_type_filter()) == ["Eigentümer", "Inhaber"]
@pytest.mark.tim()
def test_update_table() -> None:
metrics = pd.DataFrame(
[
{
"designation": "Mustermann, Max",
"category": "Person",
"centrality": 3.14,
"betweenness": 42,
},
{
"designation": "Musterfrau, Martina",
"category": "Person",
"centrality": 42,
"betweenness": 3.14,
},
]
)
selected_metric = "centrality"
expected_result_df = [
{
"designation": "Musterfrau, Martina",
"category": "Person",
"centrality": 42.0,
},
{
"designation": "Mustermann, Max",
"category": "Person",
"centrality": 3.14,
},
]
expected_result_columns = [
{"name": "designation", "id": "designation"},
{"name": "category", "id": "category"},
{"name": "centrality", "id": "centrality"},
]
result_df, result_columns = home.update_table(selected_metric, metrics)
assert result_df == expected_result_df
assert result_columns == expected_result_columns
@pytest.fixture(scope="session", autouse=True)
def _get_person_relations() -> Generator:
data = [
{
"id_company": 1,
"name_company": "0 10 24 Telefondienste GmbH",
"relation_type": "GESCHAEFTSFUEHRER",
"id_person": 1,
"lastname": "Tetau",
"firstname": "Nicolas",
"date_of_birth": datetime.date(1971, 1, 2),
},
{
"id_company": 1,
"name_company": "0 10 24 Telefondienste GmbH",
"relation_type": "PROKURIST",
"id_person": 2,
"lastname": "Dammast",
"firstname": "Lutz",
"date_of_birth": datetime.date(1966, 12, 6),
},
{
"id_company": 2,
"name_company": "1. Staiger Grundstücksverwaltung GmbH & Co. KG",
"relation_type": "KOMMANDITIST",
"id_person": 3,
"lastname": "Tutsch",
"firstname": "Rosemarie",
"date_of_birth": datetime.date(1941, 10, 9),
},
{
"id_company": 2,
"name_company": "1. Staiger Grundstücksverwaltung GmbH & Co. KG",
"relation_type": "HAFTENDER_GESELLSCHAFTER",
"id_person": 4,
"lastname": "Staiger",
"firstname": "Marc",
"date_of_birth": datetime.date(1969, 10, 22),
},
{
"id_company": 2,
"name_company": "1. Staiger Grundstücksverwaltung GmbH & Co. KG",
"relation_type": "HAFTENDER_GESELLSCHAFTER",
"id_person": 5,
"lastname": "Staiger",
"firstname": "Michaela",
"date_of_birth": datetime.date(1971, 3, 3),
},
]
with patch(
"aki_prj23_transparenzregister.ui.pages.home.get_all_person_relations"
) as mock_get_person_relations:
mock_get_person_relations.return_value = pd.DataFrame(data)
yield
@pytest.fixture(scope="session", autouse=True)
def _get_company_relations() -> Generator:
data = [
{
"id_company_to": 2,
"name_company_to": "1. Staiger Grundstücksverwaltung GmbH & Co. KG",
"relation_type": "GESCHAEFTSFUEHRER",
"name_company_from": "Staiger I. Verwaltung-GmbH",
"id_company_from": 3226,
},
{
"id_company_to": 3,
"name_company_to": "1 A Autenrieth Kunststofftechnik GmbH & Co. KG",
"relation_type": "GESCHAEFTSFUEHRER",
"name_company_from": "Autenrieth Verwaltungs-GmbH",
"id_company_from": 3324,
},
{
"id_company_to": 5,
"name_company_to": "2. Schaper Objekt GmbH & Co. Kiel KG",
"relation_type": "KOMMANDITIST",
"name_company_from": "Multi-Center Warenvertriebs GmbH",
"id_company_from": 2213,
},
{
"id_company_to": 6,
"name_company_to": "AASP Filmproduktionsgesellschaft mbH & Co. Leonie KG",
"relation_type": "INHABER",
"name_company_from": "ABN AMRO Structured Products Gesellschaft für Fondsbeteiligungen mbH",
"id_company_from": 3332,
},
{
"id_company_to": 6,
"name_company_to": "AASP Filmproduktionsgesellschaft mbH & Co. Leonie KG",
"relation_type": "KOMMANDITIST",
"name_company_from": "Kallang GmbH",
"id_company_from": 3316,
},
]
with patch(
"aki_prj23_transparenzregister.ui.pages.home.get_all_company_relations"
) as mock_get_person_relations:
mock_get_person_relations.return_value = pd.DataFrame(data)
yield
@pytest.mark.tim()
def test_update_graph_data() -> None:
graph_result, metrics_result, nodes_result, edges_result = home.update_graph_data(
"HAFTENDER_GESELLSCHAFTER", "GESCHAEFTSFUEHRER"
)
assert graph_result is not None

View File

@ -1,5 +1,7 @@
"""Test the initialize Network function."""
import datetime
from collections.abc import Generator
from unittest.mock import patch
import pandas as pd
import pytest
@ -7,16 +9,108 @@ from sqlalchemy.orm import Session
from aki_prj23_transparenzregister.ui.session_handler import SessionHandler
from aki_prj23_transparenzregister.utils.networkx import networkx_data
from aki_prj23_transparenzregister.utils.networkx.networkx_data import (
create_edge_and_node_list,
create_edge_and_node_list_for_company,
filter_relation_type,
filter_relation_with_more_than_one_connection,
find_all_company_relations,
find_company_relations,
get_all_company_relations,
get_all_person_relations,
)
@pytest.fixture(scope="session", autouse=True)
def _get_person_relations() -> Generator:
data = [
{
"id_company": 1,
"name_company": "0 10 24 Telefondienste GmbH",
"relation_type": "GESCHAEFTSFUEHRER",
"id_person": 1,
"lastname": "Tetau",
"firstname": "Nicolas",
"date_of_birth": datetime.date(1971, 1, 2),
},
{
"id_company": 1,
"name_company": "0 10 24 Telefondienste GmbH",
"relation_type": "PROKURIST",
"id_person": 2,
"lastname": "Dammast",
"firstname": "Lutz",
"date_of_birth": datetime.date(1966, 12, 6),
},
{
"id_company": 2,
"name_company": "1. Staiger Grundstücksverwaltung GmbH & Co. KG",
"relation_type": "KOMMANDITIST",
"id_person": 3,
"lastname": "Tutsch",
"firstname": "Rosemarie",
"date_of_birth": datetime.date(1941, 10, 9),
},
{
"id_company": 2,
"name_company": "1. Staiger Grundstücksverwaltung GmbH & Co. KG",
"relation_type": "KOMMANDITIST",
"id_person": 4,
"lastname": "Staiger",
"firstname": "Marc",
"date_of_birth": datetime.date(1969, 10, 22),
},
{
"id_company": 2,
"name_company": "1. Staiger Grundstücksverwaltung GmbH & Co. KG",
"relation_type": "KOMMANDITIST",
"id_person": 5,
"lastname": "Staiger",
"firstname": "Michaela",
"date_of_birth": datetime.date(1971, 3, 3),
},
]
with patch(
"aki_prj23_transparenzregister.utils.networkx.networkx_data.get_all_person_relations"
) as mock_get_person_relations:
mock_get_person_relations.return_value = pd.DataFrame(data)
yield
@pytest.fixture(scope="session", autouse=True)
def _get_company_relations() -> Generator:
data = [
{
"id_company_to": 2,
"name_company_to": "1. Staiger Grundstücksverwaltung GmbH & Co. KG",
"relation_type": "HAFTENDER_GESELLSCHAFTER",
"name_company_from": "Staiger I. Verwaltung-GmbH",
"id_company_from": 3226,
},
{
"id_company_to": 3,
"name_company_to": "1 A Autenrieth Kunststofftechnik GmbH & Co. KG",
"relation_type": "HAFTENDER_GESELLSCHAFTER",
"name_company_from": "Autenrieth Verwaltungs-GmbH",
"id_company_from": 3324,
},
{
"id_company_to": 5,
"name_company_to": "2. Schaper Objekt GmbH & Co. Kiel KG",
"relation_type": "KOMMANDITIST",
"name_company_from": "Multi-Center Warenvertriebs GmbH",
"id_company_from": 2213,
},
{
"id_company_to": 6,
"name_company_to": "AASP Filmproduktionsgesellschaft mbH & Co. Leonie KG",
"relation_type": "INHABER",
"name_company_from": "ABN AMRO Structured Products Gesellschaft für Fondsbeteiligungen mbH",
"id_company_from": 3332,
},
{
"id_company_to": 6,
"name_company_to": "AASP Filmproduktionsgesellschaft mbH & Co. Leonie KG",
"relation_type": "KOMMANDITIST",
"name_company_from": "Kallang GmbH",
"id_company_from": 3316,
},
]
with patch(
"aki_prj23_transparenzregister.utils.networkx.networkx_data.get_all_company_relations"
) as mock_get_person_relations:
mock_get_person_relations.return_value = pd.DataFrame(data)
yield
@pytest.fixture(autouse=True)
@ -70,48 +164,37 @@ def test_import() -> None:
def test_find_all_company_relations() -> None:
"""This Test methods tests if the correct type is returned for the corresponding Function."""
company_relations_df = find_all_company_relations()
company_relations_df = networkx_data.find_all_company_relations()
assert type(company_relations_df) is pd.DataFrame
def test_get_all_company_relations() -> None:
"""This Test methods tests if the correct type is returned for the corresponding Function."""
company_relations_df = get_all_company_relations()
company_relations_df = networkx_data.get_all_company_relations()
assert type(company_relations_df) is pd.DataFrame
def test_get_all_person_relations() -> None:
"""This Test methods tests if the correct type is returned for the corresponding Function."""
company_relations_df = get_all_person_relations()
company_relations_df = networkx_data.get_all_person_relations()
assert type(company_relations_df) is pd.DataFrame
def test_filter_relation_type() -> None:
"""This Test methods tests if the correct type is returned for the corresponding Function."""
relation_dataframe = get_all_company_relations()
relation_dataframe = networkx_data.get_all_company_relations()
selected_relation_type = "HAFTENDER_GESELLSCHAFTER"
company_relations_df = filter_relation_type(
company_relations_df = networkx_data.filter_relation_type(
relation_dataframe, selected_relation_type
)
assert type(company_relations_df) is pd.DataFrame
def test_filter_relation_with_more_than_one_connection() -> None:
"""This Test methods tests if the correct type is returned for the corresponding Function."""
relation_dataframe = get_all_company_relations()
id_column_name_to = "c_1"
id_column_name_from = "c_2"
relations_df = filter_relation_with_more_than_one_connection(
relation_dataframe, id_column_name_to, id_column_name_from
)
assert type(relations_df) is pd.DataFrame
def test_create_edge_and_node_list() -> None:
"""This Test methods tests if the correct type is returned for the corresponding Function."""
person_df = get_all_person_relations()
company_df = get_all_company_relations()
nodes, edges = create_edge_and_node_list(person_df, company_df)
person_df = networkx_data.get_all_person_relations()
company_df = networkx_data.get_all_company_relations()
nodes, edges = networkx_data.create_edge_and_node_list(person_df, company_df)
assert isinstance(nodes, dict)
assert isinstance(edges, list)
@ -119,32 +202,39 @@ def test_create_edge_and_node_list() -> None:
def test_find_company_relations() -> None:
"""This Test methods tests if the correct type is returned for the corresponding Function."""
selected_company_id = 1
company_relations_df, person_df = find_company_relations(selected_company_id)
company_relations_df, person_df = networkx_data.find_company_relations(
selected_company_id
)
assert type(company_relations_df) is pd.DataFrame
assert type(person_df) is pd.DataFrame
def test_create_edge_and_node_list_for_company() -> None:
"""This Test methods tests if the correct type is returned for the corresponding Function."""
company_relations = get_all_company_relations()
nodes, edges = create_edge_and_node_list_for_company(company_relations)
company_relations = networkx_data.get_all_company_relations()
nodes, edges = networkx_data.create_edge_and_node_list_for_company(
company_relations
)
assert isinstance(nodes, dict)
assert isinstance(edges, list)
# @pytest.mark.tim()
# def test_get_all_metrics_from_id() -> None:
# """This Test methods tests if the correct type is returned for the corresponding Function."""
# company_id = 2549
# metrics = get_all_metrics_from_id(company_id)
# assert type(metrics) is pd.Series
def test_get_all_metrics_from_id() -> None:
"""This Test methods tests if the correct type is returned for the corresponding Function."""
company_id = 2
metrics = networkx_data.get_all_metrics_from_id(company_id)
assert type(metrics) is pd.Series
# @pytest.mark.tim()
# def test_get_relations_number_from_id() -> None:
# """This Test methods tests if the correct type and number of relations is received."""
# # id = "c_2549"
# id = "c_2667"
# relations_lvl_1, relations_lvl_2, relations_lvl_3 = get_relations_number_from_id(id)
# assert type(relations_lvl_1) is int
# assert type(relations_lvl_2) is int
# assert type(relations_lvl_3) is int
def test_get_relations_number_from_id() -> None:
"""This Test methods tests if the correct type and number of relations is received."""
# id = "c_2549"
id = 2
(
relations_lvl_1,
relations_lvl_2,
relations_lvl_3,
) = networkx_data.get_relations_number_from_id(id)
assert isinstance(relations_lvl_1, int)
assert isinstance(relations_lvl_2, int)
assert isinstance(relations_lvl_3, int)