From 53b63ac27c2275262db9a04be02210a3287aa71d Mon Sep 17 00:00:00 2001
From: Armand Philippot <git@armandphilippot.com>
Date: Fri, 1 Dec 2023 19:34:58 +0100
Subject: refactor(pages): refine Blog pages

* replace usePostsList with useArticlesList to keep names coherent
* remove useIsMounted hook
* rewrite useRedirection hook
* add redirect in getStaticProps to avoid unecessary fetching
* move Pagination component in a noscript tag
* use hooks to refresh thematics and topics lists
* complete Cypress tests
---
 .../use-articles-list/use-articles-list.test.tsx   | 109 +++++++++++++++++++++
 1 file changed, 109 insertions(+)
 create mode 100644 src/utils/hooks/use-articles-list/use-articles-list.test.tsx

(limited to 'src/utils/hooks/use-articles-list/use-articles-list.test.tsx')

diff --git a/src/utils/hooks/use-articles-list/use-articles-list.test.tsx b/src/utils/hooks/use-articles-list/use-articles-list.test.tsx
new file mode 100644
index 0000000..6191ed6
--- /dev/null
+++ b/src/utils/hooks/use-articles-list/use-articles-list.test.tsx
@@ -0,0 +1,109 @@
+import {
+  afterEach,
+  beforeEach,
+  describe,
+  expect,
+  it,
+  jest,
+} from '@jest/globals';
+import { act, renderHook, waitFor } from '@testing-library/react';
+import type { ReactNode } from 'react';
+import { SWRConfig } from 'swr';
+import { wpPostsFixture } from '../../../../tests/fixtures';
+import { getConnection } from '../../../../tests/utils/graphql';
+import { convertPostPreviewToArticlePreview } from '../../../services/graphql';
+import { useArticlesList } from './use-articles-list';
+
+const wrapper = ({ children }: { children?: ReactNode }) => {
+  const map = new Map();
+
+  return (
+    <SWRConfig
+      value={{
+        provider: () => map,
+        isOnline() {
+          return true;
+        },
+        isVisible() {
+          return true;
+        },
+        initFocus() {
+          /* nothing */
+        },
+        initReconnect() {
+          /* nothing */
+        },
+      }}
+    >
+      {children}
+    </SWRConfig>
+  );
+};
+
+describe('useArticlesList', () => {
+  beforeEach(() => {
+    /* Not sure why it is needed, but without it Jest was complaining with `You
+     * are trying to import a file after the Jest environment has been torn
+     * down`... Maybe because of useSWR? */
+    jest.useFakeTimers({
+      doNotFake: ['queueMicrotask'],
+    });
+  });
+
+  afterEach(() => {
+    jest.runOnlyPendingTimers();
+    jest.useRealTimers();
+  });
+
+  it('can return the first new result index when loading more posts', async () => {
+    const perPage = 5;
+    const { result } = renderHook(() => useArticlesList({ perPage }), {
+      wrapper,
+    });
+
+    expect.assertions(2);
+
+    expect(result.current.firstNewResultIndex).toBeUndefined();
+
+    await act(async () => {
+      await result.current.loadMore();
+    });
+
+    // Assuming there is more than one page.
+    expect(result.current.firstNewResultIndex).toBe(perPage + 1);
+  });
+
+  it('converts a WordPress post connection to an article connection', async () => {
+    const perPage = 1;
+    const { result } = renderHook(() => useArticlesList({ perPage }), {
+      wrapper,
+    });
+    const connection = getConnection({
+      after: null,
+      data: wpPostsFixture,
+      first: perPage,
+    });
+
+    expect.hasAssertions();
+
+    await waitFor(() => {
+      expect(result.current.articles).toBeDefined();
+    });
+
+    expect(result.current.articles).toStrictEqual([
+      {
+        edges: connection.edges.map((edge) => {
+          return {
+            cursor: edge.cursor,
+            node: convertPostPreviewToArticlePreview(edge.node),
+          };
+        }),
+        pageInfo: {
+          endCursor: connection.pageInfo.endCursor,
+          hasNextPage: connection.pageInfo.hasNextPage,
+          total: connection.pageInfo.total,
+        },
+      },
+    ]);
+  });
+});
-- 
cgit v1.2.3

