]> git.r.bdr.sh - rbdr/forum/blobdiff - src/stores/forums.test.js
Add getForum pact, normalize stores
[rbdr/forum] / src / stores / forums.test.js
index 25293c803d04c80d175ace34d9fe8f5951fa7898..694316baac611c3528c6dfc01ee5b6954fe4b303 100644 (file)
@@ -3,19 +3,17 @@ import { resolve } from 'path';
 
 import { resolveAfter } from '$/utils/resolve_after';
 
-import { act } from '@testing-library/svelte';
-
 const { eachLike, like } = Matchers;
 
 jest.mock('$/config/config.js');
 
-import { getForums } from './forums';
+import { getForum, getForums } from './forums';
 
 const internals = {
   provider: null
 };
 
-describe('Forum store pact', () => {
+describe('Forums store pact', () => {
 
   beforeAll(async () => {
 
@@ -32,7 +30,7 @@ describe('Forum store pact', () => {
   afterEach(() => internals.provider.verify());
   afterAll(() => internals.provider.finalize());
 
-  describe('there are forums', () => {
+  describe('GetForums', () => {
 
     beforeAll(async () => {
 
@@ -98,4 +96,90 @@ describe('Forum store pact', () => {
       expect(response.error).toBe(undefined);
     });
   });
+
+  describe('GetForum', () => {
+
+    beforeAll(async () => {
+
+      const forumQuery = new GraphQLInteraction()
+        .uponReceiving('a request to get a single forum')
+        .withRequest({
+          path: '/graphql',
+          method: 'POST'
+        })
+        .withOperation('GetForum')
+        .withQuery(
+          `query GetForum($id: ID!) {
+            forum(id: $id) {
+              id
+              glyph
+              label
+              position
+              topics {
+                id
+                title
+                updated_at
+                ttl
+                __typename
+              }
+              __typename
+            }
+          }`
+        )
+        .withVariables({
+          id: 'freezer'
+        })
+        .willRespondWith({
+          status: 200,
+          headers: {
+            'Content-Type': 'application/json; charset=utf-8'
+          },
+          body: {
+            data: {
+              forum: like({
+                id: 'freezer',
+                glyph: like('✭'),
+                label: like('test_forums.freezer'),
+                position: like(3),
+                topics: eachLike({
+                  id: like('629de02c-151a-4db7-bb86-43b2add8a15a'),
+                  title: like('Very pacty topic'),
+                  updated_at: like(1619954611616),
+                  ttl: like(3601)
+                })
+              })
+            }
+          }
+        });
+      return await internals.provider.addInteraction(forumQuery);
+    });
+
+    test('it returns the forum', async () => {
+
+      const forum = getForum('freezer');
+      const { counter, promise: resolveAfterTwo } = resolveAfter(2);
+      let response = null;
+      forum.subscribe((forumsValue) => {
+
+        response = forumsValue;
+        counter();
+      });
+      expect(response.data).toEqual(expect.arrayContaining([]));
+      expect(response.loading).toBe(true);
+      expect(response.error).toBe(undefined);
+      await resolveAfterTwo;
+      expect(response.data.id).toBe('freezer');
+      expect(response.data.glyph).toBe('✭');
+      expect(response.data.label).toBe('test_forums.freezer');
+      expect(response.data.position).toBe(3);
+      expect(response.data.topics).toEqual(expect.arrayContaining([{
+        id: '629de02c-151a-4db7-bb86-43b2add8a15a',
+        title: 'Very pacty topic',
+        updated_at: 1619954611616,
+        ttl: 3601
+      }]));
+      expect(response.loading).toBe(false);
+      expect(response.error).toBe(undefined);
+    });
+  });
 });