import pandas as pd
import pytest
from fasthtml.components import *
from fasthtml.xtend import Script
from components.datagrid_new.components.ColumnsSettings import ColumnsSettings
from components.datagrid_new.components.DataGrid import DataGrid
from components.datagrid_new.constants import ColumnType
from core.settings_management import SettingsManager, MemoryDbEngine
from helpers import matches, search_elements_by_path
COLUMNS_SETTINGS_ID = "columns_settings_id"
TEST_GRID_ID = "test_grid_id"
TEST_GRID_KEY = ("RepositoryName", "test_grid_key")
@pytest.fixture()
def empty_dg(session):
return DataGrid(session,
_id=TEST_GRID_ID,
settings_manager=SettingsManager(MemoryDbEngine()),
key=TEST_GRID_KEY)
@pytest.fixture()
def dg(empty_dg):
df = pd.DataFrame({
'Name': ['Alice', 'Bob'],
'Age': [20, 25],
'Male': [False, True],
})
# hack for the test because multiple dg are created with the same id
empty_dg._columns_settings._owner = empty_dg
empty_dg.init_from_dataframe(df)
return empty_dg
@pytest.fixture
def cs(session, dg):
return ColumnsSettings(session, COLUMNS_SETTINGS_ID, owner=dg)
def test_i_can_render(cs):
actual = cs.__ft__()
expected = Div(
Div(
H1("Columns Settings"),
Div(
Div(), # header
Div(), # body
Div(), # buttons
cls="dt2-cs-container"
),
),
Script(f"bindColumnsSettings('{cs.get_id()}')"),
id=cs.get_id(),
)
assert matches(actual, expected)
def test_i_can_render_when_no_dataframe(empty_dg):
columns_settings = empty_dg._columns_settings
actual = columns_settings.__ft__()
expected = Div(
Div(
H1("Columns Settings"),
Div(
Div(), # header
Div(), # body
Div(), # buttons
cls="dt2-cs-container"
),
),
Script(f"bindColumnsSettings('{columns_settings.get_id()}')"),
id=columns_settings.get_id(),
)
assert matches(actual, expected)
def test_i_can_render_columns_settings(cs):
def _mk_options(selected_value):
return [Option(value.value, selected=True if selected_value == value else None) for value in ColumnType]
actual = cs.__ft__()
to_compare = search_elements_by_path(actual, "div", attrs={"class": "dt2-cs-container"})[0]
expected = Div(
Div(
Div(cls="place-self-center"),
Div("Title"),
Div("Type"),
Div("Visible"),
Div("Usable"),
Div("Width"),
cls="dt2-cs-header dt2-cs-columns"
),
Div(
Div(
A(cls="dt2-item-handle"),
Input(name="title_name", type="input", value="Name"),
Select(
*_mk_options(ColumnType.Text),
name="type_name",
),
Input(name=f"visible_name", type="checkbox", checked=True),
Input(name=f"usable_name", type="checkbox", checked=True),
Input(name=f"width_name", type="input", value=100),
data_col="name",
),
Div(
A(cls="dt2-item-handle"),
Input(name="title_age", type="input", value="Age"),
Select(
*_mk_options(ColumnType.Number),
name="type_age",
),
Input(name=f"visible_age", type="checkbox", checked=True),
Input(name=f"usable_age", type="checkbox", checked=True),
Input(name=f"width_age", type="input", value=100),
data_col="age",
),
Div(
A(cls="dt2-item-handle"),
Input(name="title_male", type="input", value="Male"),
Select(
*_mk_options(ColumnType.Bool),
name="type_male",
),
Input(name=f"visible_male", type="checkbox", checked=True),
Input(name=f"usable_male", type="checkbox", checked=True),
Input(name=f"width_male", type="input", value=100),
data_col="male",
),
),
Div(), # buttons
cls="dt2-cs-container",
)
assert matches(to_compare, expected)