visibility.test.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import { describe, it, expect } from "vitest";
  2. import React from "react";
  3. import { renderHook } from "@testing-library/react";
  4. import { VisibilityProvider, useVisibility, useIsVisible } from "./visibility";
  5. import { DataProvider } from "./data";
  6. const createWrapper =
  7. (data: Record<string, unknown> = {}, authState?: { isSignedIn: boolean }) =>
  8. ({ children }: { children: React.ReactNode }) => (
  9. <DataProvider initialData={data} authState={authState}>
  10. <VisibilityProvider>{children}</VisibilityProvider>
  11. </DataProvider>
  12. );
  13. describe("useVisibility", () => {
  14. it("provides isVisible function", () => {
  15. const { result } = renderHook(() => useVisibility(), {
  16. wrapper: createWrapper(),
  17. });
  18. expect(typeof result.current.isVisible).toBe("function");
  19. });
  20. it("provides visibility context", () => {
  21. const { result } = renderHook(() => useVisibility(), {
  22. wrapper: createWrapper({ test: true }),
  23. });
  24. expect(result.current.ctx.dataModel).toEqual({ test: true });
  25. });
  26. });
  27. describe("useIsVisible", () => {
  28. it("returns true for undefined condition", () => {
  29. const { result } = renderHook(() => useIsVisible(undefined), {
  30. wrapper: createWrapper(),
  31. });
  32. expect(result.current).toBe(true);
  33. });
  34. it("returns true for true condition", () => {
  35. const { result } = renderHook(() => useIsVisible(true), {
  36. wrapper: createWrapper(),
  37. });
  38. expect(result.current).toBe(true);
  39. });
  40. it("returns false for false condition", () => {
  41. const { result } = renderHook(() => useIsVisible(false), {
  42. wrapper: createWrapper(),
  43. });
  44. expect(result.current).toBe(false);
  45. });
  46. it("evaluates path conditions against data", () => {
  47. const { result: trueResult } = renderHook(
  48. () => useIsVisible({ path: "/isVisible" }),
  49. { wrapper: createWrapper({ isVisible: true }) },
  50. );
  51. expect(trueResult.current).toBe(true);
  52. const { result: falseResult } = renderHook(
  53. () => useIsVisible({ path: "/isVisible" }),
  54. { wrapper: createWrapper({ isVisible: false }) },
  55. );
  56. expect(falseResult.current).toBe(false);
  57. });
  58. it("evaluates auth conditions", () => {
  59. const { result: signedInResult } = renderHook(
  60. () => useIsVisible({ auth: "signedIn" }),
  61. { wrapper: createWrapper({}, { isSignedIn: true }) },
  62. );
  63. expect(signedInResult.current).toBe(true);
  64. const { result: signedOutResult } = renderHook(
  65. () => useIsVisible({ auth: "signedOut" }),
  66. { wrapper: createWrapper({}, { isSignedIn: false }) },
  67. );
  68. expect(signedOutResult.current).toBe(true);
  69. });
  70. it("evaluates logic expressions", () => {
  71. const { result } = renderHook(() => useIsVisible({ eq: [1, 1] }), {
  72. wrapper: createWrapper(),
  73. });
  74. expect(result.current).toBe(true);
  75. });
  76. it("evaluates complex conditions with data", () => {
  77. const { result } = renderHook(
  78. () =>
  79. useIsVisible({
  80. and: [{ path: "/user/isAdmin" }, { eq: [{ path: "/count" }, 5] }],
  81. }),
  82. { wrapper: createWrapper({ user: { isAdmin: true }, count: 5 }) },
  83. );
  84. expect(result.current).toBe(true);
  85. });
  86. });