test_event.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. import pytest
  2. from pynecone import event
  3. from pynecone.event import Event, EventHandler, EventSpec
  4. from pynecone.utils import format
  5. from pynecone.vars import Var
  6. def make_var(value) -> Var:
  7. """Make a variable.
  8. Args:
  9. value: The value of the var.
  10. Returns:
  11. The var.
  12. """
  13. var = Var.create(value)
  14. assert var is not None
  15. return var
  16. def test_create_event():
  17. """Test creating an event."""
  18. event = Event(token="token", name="state.do_thing", payload={"arg": "value"})
  19. assert event.token == "token"
  20. assert event.name == "state.do_thing"
  21. assert event.payload == {"arg": "value"}
  22. def test_call_event_handler():
  23. """Test that calling an event handler creates an event spec."""
  24. def test_fn():
  25. pass
  26. test_fn.__qualname__ = "test_fn"
  27. def test_fn_with_args(_, arg1, arg2):
  28. pass
  29. test_fn_with_args.__qualname__ = "test_fn_with_args"
  30. handler = EventHandler(fn=test_fn)
  31. event_spec = handler()
  32. assert event_spec.handler == handler
  33. assert event_spec.args == ()
  34. assert format.format_event(event_spec) == 'E("test_fn", {})'
  35. handler = EventHandler(fn=test_fn_with_args)
  36. event_spec = handler(make_var("first"), make_var("second"))
  37. # Test passing vars as args.
  38. assert event_spec.handler == handler
  39. assert event_spec.args == (("arg1", "first"), ("arg2", "second"))
  40. assert (
  41. format.format_event(event_spec)
  42. == 'E("test_fn_with_args", {arg1:first,arg2:second})'
  43. )
  44. # Passing args as strings should format differently.
  45. event_spec = handler("first", "second") # type: ignore
  46. assert (
  47. format.format_event(event_spec)
  48. == 'E("test_fn_with_args", {arg1:"first",arg2:"second"})'
  49. )
  50. first, second = 123, "456"
  51. handler = EventHandler(fn=test_fn_with_args)
  52. event_spec = handler(first, second) # type: ignore
  53. assert (
  54. format.format_event(event_spec)
  55. == 'E("test_fn_with_args", {arg1:123,arg2:"456"})'
  56. )
  57. assert event_spec.handler == handler
  58. assert event_spec.args == (
  59. ("arg1", format.json_dumps(first)),
  60. ("arg2", format.json_dumps(second)),
  61. )
  62. handler = EventHandler(fn=test_fn_with_args)
  63. with pytest.raises(TypeError):
  64. handler(test_fn) # type: ignore
  65. def test_event_redirect():
  66. """Test the event redirect function."""
  67. spec = event.redirect("/path")
  68. assert isinstance(spec, EventSpec)
  69. assert spec.handler.fn.__qualname__ == "_redirect"
  70. assert spec.args == (("path", "/path"),)
  71. assert format.format_event(spec) == 'E("_redirect", {path:"/path"})'
  72. spec = event.redirect(Var.create_safe("path"))
  73. assert format.format_event(spec) == 'E("_redirect", {path:path})'
  74. def test_event_console_log():
  75. """Test the event console log function."""
  76. spec = event.console_log("message")
  77. assert isinstance(spec, EventSpec)
  78. assert spec.handler.fn.__qualname__ == "_console"
  79. assert spec.args == (("message", "message"),)
  80. assert format.format_event(spec) == 'E("_console", {message:"message"})'
  81. spec = event.console_log(Var.create_safe("message"))
  82. assert format.format_event(spec) == 'E("_console", {message:message})'
  83. def test_event_window_alert():
  84. """Test the event window alert function."""
  85. spec = event.window_alert("message")
  86. assert isinstance(spec, EventSpec)
  87. assert spec.handler.fn.__qualname__ == "_alert"
  88. assert spec.args == (("message", "message"),)
  89. assert format.format_event(spec) == 'E("_alert", {message:"message"})'
  90. spec = event.window_alert(Var.create_safe("message"))
  91. assert format.format_event(spec) == 'E("_alert", {message:message})'
  92. def test_set_focus():
  93. """Test the event set focus function."""
  94. spec = event.set_focus("input1")
  95. assert isinstance(spec, EventSpec)
  96. assert spec.handler.fn.__qualname__ == "_set_focus"
  97. assert spec.args == (("ref", Var.create_safe("ref_input1")),)
  98. assert format.format_event(spec) == 'E("_set_focus", {ref:ref_input1})'
  99. spec = event.set_focus("input1")
  100. assert format.format_event(spec) == 'E("_set_focus", {ref:ref_input1})'
  101. def test_set_value():
  102. """Test the event window alert function."""
  103. spec = event.set_value("input1", "")
  104. assert isinstance(spec, EventSpec)
  105. assert spec.handler.fn.__qualname__ == "_set_value"
  106. assert spec.args == (
  107. ("ref", Var.create_safe("ref_input1")),
  108. ("value", ""),
  109. )
  110. assert format.format_event(spec) == 'E("_set_value", {ref:ref_input1,value:""})'
  111. spec = event.set_value("input1", Var.create_safe("message"))
  112. assert (
  113. format.format_event(spec) == 'E("_set_value", {ref:ref_input1,value:message})'
  114. )