test_route.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import pytest
  2. from pytest_mock import MockerFixture
  3. from reflex import constants
  4. from reflex.app import App
  5. from reflex.route import catchall_in_route, get_route_args, verify_route_validity
  6. @pytest.mark.parametrize(
  7. "route_name, expected",
  8. [
  9. ("/users/[id]", {"id": constants.RouteArgType.SINGLE}),
  10. (
  11. "/posts/[postId]/comments/[commentId]",
  12. {
  13. "postId": constants.RouteArgType.SINGLE,
  14. "commentId": constants.RouteArgType.SINGLE,
  15. },
  16. ),
  17. ],
  18. )
  19. def test_route_args(route_name, expected):
  20. assert get_route_args(route_name) == expected
  21. @pytest.mark.parametrize(
  22. "route_name",
  23. [
  24. "/products/[id]/[id]",
  25. "/posts/[postId]/comments/[postId]",
  26. ],
  27. )
  28. def test_invalid_route_args(route_name):
  29. with pytest.raises(ValueError):
  30. get_route_args(route_name)
  31. @pytest.mark.parametrize(
  32. "route_name,expected",
  33. [
  34. ("/events/[year]/[month]/[...slug]", "[...slug]"),
  35. ("pages/shop/[[...slug]]", "[[...slug]]"),
  36. ],
  37. )
  38. def test_catchall_in_route(route_name, expected):
  39. assert catchall_in_route(route_name) == expected
  40. @pytest.mark.parametrize(
  41. "route_name",
  42. [
  43. "/products",
  44. "/products/[category]/[...]/details/[version]",
  45. "[...]",
  46. "/products/details",
  47. ],
  48. )
  49. def test_verify_valid_routes(route_name):
  50. verify_route_validity(route_name)
  51. @pytest.mark.parametrize(
  52. "route_name",
  53. [
  54. "/products/[...]/details/[category]/latest",
  55. "/blog/[...]/post/[year]/latest",
  56. "/products/[...]/details/[...]/[category]/[...]/latest",
  57. "/products/[...]/details/category",
  58. ],
  59. )
  60. def test_verify_invalid_routes(route_name):
  61. with pytest.raises(ValueError):
  62. verify_route_validity(route_name)
  63. @pytest.fixture()
  64. def app():
  65. return App()
  66. @pytest.mark.parametrize(
  67. "route1,route2",
  68. [
  69. ("/posts/[slug]", "/posts/[slug1]"),
  70. ("/posts/[slug]/info", "/posts/[slug1]/info1"),
  71. ("/posts/[slug]/info/[[slug1]]", "/posts/[slug1]/info1/[[slug2]]"),
  72. ("/posts/[slug]/info/[[slug1]]", "/posts/[slug]/info/[[slug2]]"),
  73. ("/posts/[slug]/info/[[...slug1]]", "/posts/[slug1]/info/[[...slug2]]"),
  74. ("/posts/[slug]/info/[[...slug1]]", "/posts/[slug]/info/[[...slug2]]"),
  75. ],
  76. )
  77. def test_check_routes_conflict_invalid(mocker: MockerFixture, app, route1, route2):
  78. mocker.patch.object(app, "_pages", {route1: []})
  79. with pytest.raises(ValueError):
  80. app._check_routes_conflict(route2)
  81. @pytest.mark.parametrize(
  82. "route1,route2",
  83. [
  84. ("/posts/[slug]", "/post/[slug1]"),
  85. ("/posts/[slug]", "/post/[slug]"),
  86. ("/posts/[slug]/info", "/posts/[slug]/info1"),
  87. ("/posts/[slug]/info/[[slug1]]", "/posts/[slug]/info1/[[slug1]]"),
  88. ("/posts/[slug]/info/[[slug1]]", "/posts/[slug]/info1/[[slug2]]"),
  89. (
  90. "/posts/[slug]/info/[slug2]/[[slug1]]",
  91. "/posts/[slug]/info1/[slug2]/[[slug1]]",
  92. ),
  93. (
  94. "/posts/[slug]/info/[slug1]/random1/[slug2]/x",
  95. "/posts/[slug]/info/[slug1]/random/[slug4]/x1",
  96. ),
  97. ("/posts/[slug]/info/[[...slug1]]", "/posts/[slug]/info1/[[...slug1]]"),
  98. ("/posts/[slug]/info/[[...slug1]]", "/posts/[slug]/info1/[[...slug2]]"),
  99. ("/posts/[slug]/info/[...slug1]", "/posts/[slug]/info1/[...slug1]"),
  100. ("/posts/[slug]/info/[...slug1]", "/posts/[slug]/info1/[...slug2]"),
  101. ],
  102. )
  103. def test_check_routes_conflict_valid(mocker: MockerFixture, app, route1, route2):
  104. mocker.patch.object(app, "_pages", {route1: []})
  105. # test that running this does not throw an error.
  106. app._check_routes_conflict(route2)