aboutsummaryrefslogtreecommitdiffstats
path: root/src/services/graphql/helpers/convert-post-to-article.test.ts
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2023-11-24 20:00:08 +0100
committerArmand Philippot <git@armandphilippot.com>2023-11-27 14:47:51 +0100
commitf111685c5886f3e77edfd3621c98d8ac1b9bcce4 (patch)
tree62a541fe3afeb64bf745443706fbfb02e96c5230 /src/services/graphql/helpers/convert-post-to-article.test.ts
parentbee515641cb144be9a855ff2cac258d2fedab21d (diff)
refactor(services, types): reorganize GraphQL fetchers and data types
The Typescript mapped types was useful for autocompletion in fetchers but their are harder to maintain. I think it's better to keep each query close to its fetcher to have a better understanding of the fetched data. So I: * colocate queries with their own fetcher * colocate mutations with their own mutator * remove Typescript mapped types for queries and mutations * move data convertors inside graphql services * rename most of data types and fetchers
Diffstat (limited to 'src/services/graphql/helpers/convert-post-to-article.test.ts')
-rw-r--r--src/services/graphql/helpers/convert-post-to-article.test.ts125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/services/graphql/helpers/convert-post-to-article.test.ts b/src/services/graphql/helpers/convert-post-to-article.test.ts
new file mode 100644
index 0000000..0a1c359
--- /dev/null
+++ b/src/services/graphql/helpers/convert-post-to-article.test.ts
@@ -0,0 +1,125 @@
+import { describe, expect, it } from '@jest/globals';
+import type { WPPost } from '../../../types';
+import { convertPostToArticle } from './convert-post-to-article';
+import { convertWPImgToImg } from './convert-wp-image-to-img';
+
+describe('convert-post-to-article', () => {
+ /* eslint-disable max-statements */
+ it('converts a WPPost object to an Article object', async () => {
+ const post: WPPost = {
+ acfPosts: null,
+ author: { node: { name: 'Vince5' } },
+ commentCount: 10,
+ contentParts: {
+ afterMore:
+ 'Eum est rerum neque placeat iure veniam enim consequatur assumenda. Quos eos placeat ea et vel sit ratione fugit. Modi qui sint iure beatae illo voluptas.',
+ beforeMore:
+ 'Omnis ab qui dolorem praesentium voluptas asperiores officiis. Id nostrum minus quae ducimus tenetur eum a rem eum. Aut odio libero sit soluta ullam odit.',
+ },
+ databaseId: 8,
+ date: '2022-05-04',
+ featuredImage: null,
+ info: { wordsCount: 300 },
+ modified: '2022-06-01',
+ seo: {
+ metaDesc: 'Est non debitis quas harum quasi voluptatem qui.',
+ title: 'consequuntur molestiae amet',
+ },
+ slug: '/the-post-slug',
+ title: 'ea vero repellat',
+ };
+ const result = await convertPostToArticle(post);
+
+ // eslint-disable-next-line @typescript-eslint/no-magic-numbers
+ expect.assertions(15);
+
+ expect(result.content).toBe(post.contentParts.afterMore);
+ expect(result.id).toBe(post.databaseId);
+ expect(result.intro).toBe(post.contentParts.beforeMore);
+ expect(result.meta.author).toBe(post.author.node.name);
+ expect(result.meta.commentsCount).toBe(post.commentCount);
+ expect(result.meta.cover).toBeUndefined();
+ expect(result.meta.dates.publication).toBe(post.date);
+ expect(result.meta.dates.update).toBe(post.modified);
+ expect(result.meta.seo.description).toBe(post.seo.metaDesc);
+ expect(result.meta.seo.title).toBe(post.seo.title);
+ expect(result.meta.thematics).toBeUndefined();
+ expect(result.meta.topics).toBeUndefined();
+ expect(result.meta.wordsCount).toBe(post.info.wordsCount);
+ expect(result.slug).toBe(post.slug);
+ expect(result.title).toBe(post.title);
+ });
+ /* eslint-enable max-statements */
+
+ it('can convert the cover', async () => {
+ const post = {
+ acfPosts: null,
+ author: { node: { name: 'Vince5' } },
+ commentCount: null,
+ contentParts: {
+ afterMore:
+ 'Eum est rerum neque placeat iure veniam enim consequatur assumenda. Quos eos placeat ea et vel sit ratione fugit. Modi qui sint iure beatae illo voluptas.',
+ beforeMore:
+ 'Omnis ab qui dolorem praesentium voluptas asperiores officiis. Id nostrum minus quae ducimus tenetur eum a rem eum. Aut odio libero sit soluta ullam odit.',
+ },
+ databaseId: 8,
+ date: '2022-05-04',
+ featuredImage: {
+ node: {
+ altText: 'molestiae praesentium animi',
+ mediaDetails: {
+ height: 480,
+ width: 640,
+ },
+ sourceUrl: 'https://picsum.photos/640/480',
+ title: 'ullam deserunt perspiciatis',
+ },
+ },
+ info: { wordsCount: 300 },
+ modified: '2022-06-01',
+ seo: {
+ metaDesc: 'Est non debitis quas harum quasi voluptatem qui.',
+ title: 'consequuntur molestiae amet',
+ },
+ slug: '/the-post-slug',
+ title: 'ea vero repellat',
+ } satisfies WPPost;
+ const result = await convertPostToArticle(post);
+
+ expect.assertions(1);
+
+ expect(result.meta.cover).toStrictEqual(
+ convertWPImgToImg(post.featuredImage.node)
+ );
+ });
+
+ it('can return 0 as comment count when not defined', async () => {
+ const post: WPPost = {
+ acfPosts: null,
+ author: { node: { name: 'Vince5' } },
+ commentCount: null,
+ contentParts: {
+ afterMore:
+ 'Eum est rerum neque placeat iure veniam enim consequatur assumenda. Quos eos placeat ea et vel sit ratione fugit. Modi qui sint iure beatae illo voluptas.',
+ beforeMore:
+ 'Omnis ab qui dolorem praesentium voluptas asperiores officiis. Id nostrum minus quae ducimus tenetur eum a rem eum. Aut odio libero sit soluta ullam odit.',
+ },
+ databaseId: 8,
+ date: '2022-05-04',
+ featuredImage: null,
+ info: { wordsCount: 300 },
+ modified: '2022-06-01',
+ seo: {
+ metaDesc: 'Est non debitis quas harum quasi voluptatem qui.',
+ title: 'consequuntur molestiae amet',
+ },
+ slug: '/the-post-slug',
+ title: 'ea vero repellat',
+ };
+ const result = await convertPostToArticle(post);
+
+ expect.assertions(1);
+
+ expect(result.meta.commentsCount).toBe(0);
+ });
+});