test_datatable.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import pandas as pd
  2. import pytest
  3. import reflex as rx
  4. from reflex.components.gridjs.datatable import DataTable
  5. from reflex.utils import types
  6. from reflex.utils.exceptions import UntypedComputedVarError
  7. from reflex.utils.serializers import serialize, serialize_dataframe
  8. @pytest.mark.parametrize(
  9. "data_table_state,expected",
  10. [
  11. pytest.param(
  12. {
  13. "data": pd.DataFrame(
  14. [["foo", "bar"], ["foo1", "bar1"]],
  15. columns=["column1", "column2"], # pyright: ignore [reportArgumentType]
  16. )
  17. },
  18. "data",
  19. ),
  20. pytest.param({"data": ["foo", "bar"]}, ""),
  21. pytest.param({"data": [["foo", "bar"], ["foo1", "bar1"]]}, ""),
  22. ],
  23. indirect=["data_table_state"],
  24. )
  25. def test_validate_data_table(data_table_state: rx.State, expected):
  26. """Test the str/render function.
  27. Args:
  28. data_table_state: The state fixture.
  29. expected: expected var name.
  30. """
  31. if not types.is_dataframe(data_table_state.data._var_type):
  32. data_table_component = DataTable.create(
  33. data=data_table_state.data, columns=data_table_state.columns
  34. )
  35. else:
  36. data_table_component = DataTable.create(data=data_table_state.data)
  37. data_table_dict = data_table_component.render()
  38. # prefix expected with state name
  39. state_name = data_table_state.get_name()
  40. expected = f"{state_name}.{expected}" if expected else state_name
  41. assert data_table_dict["props"] == [
  42. f"columns:{expected}.columns",
  43. f"data:{expected}.data",
  44. ]
  45. @pytest.mark.parametrize(
  46. "props",
  47. [
  48. {"data": [["foo", "bar"], ["foo1", "bar1"]]},
  49. {
  50. "data": pd.DataFrame([["foo", "bar"], ["foo1", "bar1"]]),
  51. "columns": ["column1", "column2"],
  52. },
  53. ],
  54. )
  55. def test_invalid_props(props):
  56. """Test if value error is thrown when invalid props are passed.
  57. Args:
  58. props: props to pass in component.
  59. """
  60. with pytest.raises(ValueError):
  61. DataTable.create(**props)
  62. @pytest.mark.parametrize(
  63. "fixture, err_msg, is_data_frame",
  64. [
  65. (
  66. "data_table_state2",
  67. "Computed var 'data' must have a type annotation.",
  68. True,
  69. ),
  70. (
  71. "data_table_state3",
  72. "Computed var 'columns' must have a type annotation.",
  73. False,
  74. ),
  75. (
  76. "data_table_state4",
  77. "Computed var 'data' must have a type annotation.",
  78. False,
  79. ),
  80. ],
  81. )
  82. def test_computed_var_without_annotation(fixture, request, err_msg, is_data_frame):
  83. """Test if value error is thrown when the computed var assigned to the data/column prop is not annotated.
  84. Args:
  85. fixture: the state.
  86. request: fixture request.
  87. err_msg: expected error message.
  88. is_data_frame: whether data field is a pandas dataframe.
  89. """
  90. with pytest.raises(UntypedComputedVarError) as err:
  91. if is_data_frame:
  92. DataTable.create(data=request.getfixturevalue(fixture).data)
  93. else:
  94. DataTable.create(
  95. data=request.getfixturevalue(fixture).data,
  96. columns=request.getfixturevalue(fixture).columns,
  97. )
  98. assert err.value.args[0] == err_msg
  99. def test_serialize_dataframe():
  100. """Test if dataframe is serialized correctly."""
  101. df = pd.DataFrame(
  102. [["foo", "bar"], ["foo1", "bar1"]],
  103. columns=["column1", "column2"], # pyright: ignore [reportArgumentType]
  104. )
  105. value = serialize(df)
  106. assert value == serialize_dataframe(df)
  107. assert isinstance(value, dict)
  108. assert tuple(value) == ("columns", "data")