aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/organisms/posts-list/posts-list.test.tsx
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2023-11-13 17:45:59 +0100
committerArmand Philippot <git@armandphilippot.com>2023-11-13 17:45:59 +0100
commit56878f647ea0f1066fa3e222d7aa0d83057f496d (patch)
tree26f673a062741414bfa7db5d37990936ce115f49 /src/components/organisms/posts-list/posts-list.test.tsx
parent599b70cd2390d08ce26ee44174b3f39c6587110c (diff)
refactor(components): rewrite PostsList component
* remove NoResults component and move logic to Search page * add a usePostsList hook * remove Pagination from PostsList (it is only used if javascript is disabled and not on every posts list) * replace `byYear` prop with `sortByYear` * replace `loadMore` prop with `onLoadMore` * remove `showLoadMoreBtn` (we can use `loadMore` prop instead to determine if we need to display the button) * replace `titleLevel` prop with `headingLvl` * add `firstNewResult` prop to handle focus on the new results when loading more article (we should not focus a useless span but the item directly)
Diffstat (limited to 'src/components/organisms/posts-list/posts-list.test.tsx')
-rw-r--r--src/components/organisms/posts-list/posts-list.test.tsx75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/components/organisms/posts-list/posts-list.test.tsx b/src/components/organisms/posts-list/posts-list.test.tsx
new file mode 100644
index 0000000..8d91162
--- /dev/null
+++ b/src/components/organisms/posts-list/posts-list.test.tsx
@@ -0,0 +1,75 @@
+import { describe, expect, it, jest } from '@jest/globals';
+import { userEvent } from '@testing-library/user-event';
+import { render, screen as rtlScreen } from '../../../../tests/utils';
+import { type PostData, PostsList } from './posts-list';
+
+const posts = [
+ {
+ excerpt:
+ 'Omnis voluptatem et sit sit porro possimus quo rerum. Natus et sint cupiditate magnam omnis a consequuntur reprehenderit. Ex omnis voluptatem itaque id laboriosam qui dolorum facilis architecto. Impedit aliquid et qui quae dolorum accusamus rerum.',
+ heading: 'Post 1',
+ id: 'post1',
+ meta: { publicationDate: '2023-11-06' },
+ url: '#post1',
+ },
+ {
+ excerpt:
+ 'Nobis omnis excepturi deserunt laudantium unde totam quam. Voluptates maiores minima voluptatem nihil ea voluptatem similique. Praesentium ratione necessitatibus et et dolore voluptas illum dignissimos ipsum. Eius tempore ex.',
+ heading: 'Post 2',
+ id: 'post2',
+ meta: { publicationDate: '2023-02-05' },
+ url: '#post2',
+ },
+ {
+ excerpt:
+ 'Doloremque est dolorum explicabo. Laudantium quos delectus odit esse fugit officiis. Fugit provident vero harum atque. Eos nam qui sit ut minus voluptas. Reprehenderit rerum ut nostrum. Eos dolores mollitia quia ea voluptatem rerum vel.',
+ heading: 'Post 3',
+ id: 'post3',
+ meta: { publicationDate: '2022-10-04' },
+ url: '#post3',
+ },
+] satisfies PostData[];
+
+describe('PostsList', () => {
+ it('renders a list of posts', () => {
+ render(<PostsList posts={posts} />);
+
+ expect(rtlScreen.getAllByRole('article')).toHaveLength(posts.length);
+ });
+
+ it('can render a list of posts divided by year in sections', () => {
+ const yearHeadingLvl = 2;
+ const yearCount = new Set(
+ posts.map((post) => post.meta.publicationDate.split('-')[0])
+ ).size;
+
+ render(<PostsList headingLvl={yearHeadingLvl} posts={posts} sortByYear />);
+
+ expect(
+ rtlScreen.getAllByRole('heading', { level: yearHeadingLvl })
+ ).toHaveLength(yearCount);
+ expect(
+ rtlScreen.getAllByRole('heading', { level: yearHeadingLvl + 1 })
+ ).toHaveLength(posts.length);
+ });
+
+ it('can render a load more button', async () => {
+ const loadMore = jest.fn();
+ const user = userEvent.setup();
+
+ render(<PostsList onLoadMore={loadMore} posts={posts} />);
+
+ // eslint-disable-next-line @typescript-eslint/no-magic-numbers
+ expect.assertions(3);
+
+ expect(loadMore).not.toHaveBeenCalled();
+
+ const loadMoreBtn = rtlScreen.getByRole('button', { name: /Load more/ });
+
+ expect(loadMoreBtn).toBeInTheDocument();
+
+ await user.click(loadMoreBtn);
+
+ expect(loadMore).toHaveBeenCalledTimes(1);
+ });
+});