reflex/tests/units/components/datadisplay/test_datatable.py
Thomas Brandého 4c2b2ed1c6
removing deprecated features for 0.7.0 and removing py3.9 support (#4586)
* remove deprecated features and support for py3.9

* remove other deprecated stuff

* update lock file

* fix units tests

* relock poetry

* fix _replace for computed_var

* fix some merge typo

* fix typing of deploy args

* fix benchmarks.yml versions

* console.error instead of raising Exception

* fix tests

* ignore lambdas when resolving annotations

* simplify redirect logic in event.py

* more fixes

* fix unit tests again

* give back default annotations for lambdas

* fix signature check for on_submit

* remove useless stuff

* update pyi

* readd the getattr

* raise if log_level is wrong type

* silly goose, loglevel is a subclass of str

* i don't believe this code

* add guard

---------

Co-authored-by: Khaleel Al-Adhami <khaleel.aladhami@gmail.com>
2025-01-22 11:54:37 -08:00

123 lines
3.5 KiB
Python

import pandas as pd
import pytest
import reflex as rx
from reflex.components.gridjs.datatable import DataTable
from reflex.utils import types
from reflex.utils.exceptions import UntypedComputedVarError
from reflex.utils.serializers import serialize, serialize_dataframe
@pytest.mark.parametrize(
"data_table_state,expected",
[
pytest.param(
{
"data": pd.DataFrame(
[["foo", "bar"], ["foo1", "bar1"]], columns=["column1", "column2"]
)
},
"data",
),
pytest.param({"data": ["foo", "bar"]}, ""),
pytest.param({"data": [["foo", "bar"], ["foo1", "bar1"]]}, ""),
],
indirect=["data_table_state"],
)
def test_validate_data_table(data_table_state: rx.State, expected):
"""Test the str/render function.
Args:
data_table_state: The state fixture.
expected: expected var name.
"""
if not types.is_dataframe(data_table_state.data._var_type):
data_table_component = DataTable.create(
data=data_table_state.data, columns=data_table_state.columns
)
else:
data_table_component = DataTable.create(data=data_table_state.data)
data_table_dict = data_table_component.render()
# prefix expected with state name
state_name = data_table_state.get_name()
expected = f"{state_name}.{expected}" if expected else state_name
assert data_table_dict["props"] == [
f"columns={{{expected}.columns}}",
f"data={{{expected}.data}}",
]
@pytest.mark.parametrize(
"props",
[
{"data": [["foo", "bar"], ["foo1", "bar1"]]},
{
"data": pd.DataFrame([["foo", "bar"], ["foo1", "bar1"]]),
"columns": ["column1", "column2"],
},
],
)
def test_invalid_props(props):
"""Test if value error is thrown when invalid props are passed.
Args:
props: props to pass in component.
"""
with pytest.raises(ValueError):
DataTable.create(**props)
@pytest.mark.parametrize(
"fixture, err_msg, is_data_frame",
[
(
"data_table_state2",
"Computed var 'data' must have a type annotation.",
True,
),
(
"data_table_state3",
"Computed var 'columns' must have a type annotation.",
False,
),
(
"data_table_state4",
"Computed var 'data' must have a type annotation.",
False,
),
],
)
def test_computed_var_without_annotation(fixture, request, err_msg, is_data_frame):
"""Test if value error is thrown when the computed var assigned to the data/column prop is not annotated.
Args:
fixture: the state.
request: fixture request.
err_msg: expected error message.
is_data_frame: whether data field is a pandas dataframe.
"""
with pytest.raises(UntypedComputedVarError) as err:
if is_data_frame:
DataTable.create(data=request.getfixturevalue(fixture).data)
else:
DataTable.create(
data=request.getfixturevalue(fixture).data,
columns=request.getfixturevalue(fixture).columns,
)
assert err.value.args[0] == err_msg
def test_serialize_dataframe():
"""Test if dataframe is serialized correctly."""
df = pd.DataFrame(
[["foo", "bar"], ["foo1", "bar1"]], columns=["column1", "column2"]
)
value = serialize(df)
assert value == serialize_dataframe(df)
assert isinstance(value, dict)
assert tuple(value) == ("columns", "data")