From: Ruben Beltran del Rio Date: Sun, 2 May 2021 15:08:43 +0000 (+0200) Subject: Add error/empty cases for forums X-Git-Url: https://git.r.bdr.sh/rbdr/forum/commitdiff_plain/605230e032808155d62ed773cc551b5ae1847a5f?hp=fcbbc49687afeeecdc9388b367b1d7f2d0c76214 Add error/empty cases for forums --- diff --git a/pacts/forumsstore-forumapiserver.json b/pacts/forumsstore-forumapiserver.json index c3d2c0d..c0e784b 100644 --- a/pacts/forumsstore-forumapiserver.json +++ b/pacts/forumsstore-forumapiserver.json @@ -8,6 +8,7 @@ "interactions": [ { "description": "a request to list the forums", + "providerState": "there's forums", "request": { "method": "POST", "path": "/graphql", @@ -16,7 +17,7 @@ }, "body": { "operationName": "GetForums", - "query": "query GetForums {\n forums {\n id\n glyph\n label\n position\n __typename\n }\n }", + "query": "query GetForums {\n forums {\n id\n glyph\n label\n position\n __typename\n }\n }", "variables": { } }, @@ -68,6 +69,7 @@ }, { "description": "a request to get a single forum", + "providerState": "there's forums", "request": { "method": "POST", "path": "/graphql", @@ -76,7 +78,7 @@ }, "body": { "operationName": "GetForum", - "query": "query GetForum($id: ID!) {\n forum(id: $id) {\n id\n glyph\n label\n position\n topics {\n id\n title\n updated_at\n ttl\n __typename\n }\n __typename\n }\n }", + "query": "query GetForum($id: ID!) {\n forum(id: $id) {\n id\n glyph\n label\n position\n topics {\n id\n title\n updated_at\n ttl\n __typename\n }\n __typename\n }\n }", "variables": { "id": "freezer" } @@ -144,6 +146,134 @@ } } } + }, + { + "description": "a request to list the forums", + "providerState": "there's no forums", + "request": { + "method": "POST", + "path": "/graphql", + "headers": { + "content-type": "application/json" + }, + "body": { + "operationName": "GetForums", + "query": "query GetForums {\n forums {\n id\n glyph\n label\n position\n __typename\n }\n }", + "variables": { + } + }, + "matchingRules": { + "$.body.query": { + "match": "regex", + "regex": "query\\s*GetForums\\s*\\{\\s*forums\\s*\\{\\s*id\\s*glyph\\s*label\\s*position\\s*__typename\\s*\\}\\s*\\}" + } + } + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json; charset=utf-8" + }, + "body": { + "data": { + "forums": [ + + ] + } + } + } + }, + { + "description": "a request to get a single forum", + "providerState": "there's no forums", + "request": { + "method": "POST", + "path": "/graphql", + "headers": { + "content-type": "application/json" + }, + "body": { + "operationName": "GetForum", + "query": "query GetForum($id: ID!) {\n forum(id: $id) {\n id\n glyph\n label\n position\n topics {\n id\n title\n updated_at\n ttl\n __typename\n }\n __typename\n }\n }", + "variables": { + "id": "freezer" + } + }, + "matchingRules": { + "$.body.query": { + "match": "regex", + "regex": "query\\s*GetForum\\(\\$id:\\s*ID!\\)\\s*\\{\\s*forum\\(id:\\s*\\$id\\)\\s*\\{\\s*id\\s*glyph\\s*label\\s*position\\s*topics\\s*\\{\\s*id\\s*title\\s*updated_at\\s*ttl\\s*__typename\\s*\\}\\s*__typename\\s*\\}\\s*\\}" + } + } + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json; charset=utf-8" + }, + "body": { + "data": { + "forum": null + } + } + } + }, + { + "description": "a request to list the forums", + "providerState": "there's an error", + "request": { + "method": "POST", + "path": "/graphql", + "headers": { + "content-type": "application/json" + }, + "body": { + "operationName": "GetForums", + "query": "query GetForums {\n forums {\n id\n glyph\n label\n position\n __typename\n }\n }", + "variables": { + } + }, + "matchingRules": { + "$.body.query": { + "match": "regex", + "regex": "query\\s*GetForums\\s*\\{\\s*forums\\s*\\{\\s*id\\s*glyph\\s*label\\s*position\\s*__typename\\s*\\}\\s*\\}" + } + } + }, + "response": { + "status": 500, + "headers": { + } + } + }, + { + "description": "a request to get a single forum", + "providerState": "there's an error", + "request": { + "method": "POST", + "path": "/graphql", + "headers": { + "content-type": "application/json" + }, + "body": { + "operationName": "GetForum", + "query": "query GetForum($id: ID!) {\n forum(id: $id) {\n id\n glyph\n label\n position\n topics {\n id\n title\n updated_at\n ttl\n __typename\n }\n __typename\n }\n }", + "variables": { + "id": "freezer" + } + }, + "matchingRules": { + "$.body.query": { + "match": "regex", + "regex": "query\\s*GetForum\\(\\$id:\\s*ID!\\)\\s*\\{\\s*forum\\(id:\\s*\\$id\\)\\s*\\{\\s*id\\s*glyph\\s*label\\s*position\\s*topics\\s*\\{\\s*id\\s*title\\s*updated_at\\s*ttl\\s*__typename\\s*\\}\\s*__typename\\s*\\}\\s*\\}" + } + } + }, + "response": { + "status": 500, + "headers": { + } + } } ], "metadata": { diff --git a/src/config/__mocks__/config.js b/src/config/__mocks__/config.js index 0cd8b97..b70ee31 100644 --- a/src/config/__mocks__/config.js +++ b/src/config/__mocks__/config.js @@ -1,7 +1,15 @@ export const apollo = { uri: 'http://localhost:1234/graphql', name: 'COOL_APP', - version: '9.9.9' + version: '9.9.9', + defaultOptions: { + watchQuery: { + fetchPolicy: 'no-cache' + }, + query: { + fetchPolicy: 'no-cache' + } + } }; export const version = '9.9.9'; diff --git a/src/stores/forums.test.js b/src/stores/forums.test.js index 694316b..e117828 100644 --- a/src/stores/forums.test.js +++ b/src/stores/forums.test.js @@ -30,156 +30,406 @@ describe('Forums store pact', () => { afterEach(() => internals.provider.verify()); afterAll(() => internals.provider.finalize()); - describe('GetForums', () => { - - beforeAll(async () => { - - const forumQuery = new GraphQLInteraction() - .uponReceiving('a request to list the forums') - .withRequest({ - path: '/graphql', - method: 'POST' - }) - .withOperation('GetForums') - .withQuery( - `query GetForums { - forums { - id - glyph - label - position - __typename - } - }` - ) - .withVariables({}) - .willRespondWith({ - status: 200, - headers: { - 'Content-Type': 'application/json; charset=utf-8' - }, - body: { - data: { - forums: eachLike({ - id: like('butter'), - glyph: like('⌘'), - label: like('test_forums.butter'), - position: like(1) - }) + describe('When there\'s forums', () => { + + describe('GetForums', () => { + + beforeAll(async () => { + + const forumQuery = new GraphQLInteraction() + .given('there\'s forums') + .uponReceiving('a request to list the forums') + .withRequest({ + path: '/graphql', + method: 'POST' + }) + .withOperation('GetForums') + .withQuery( + `query GetForums { + forums { + id + glyph + label + position + __typename + } + }` + ) + .withVariables({}) + .willRespondWith({ + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + }, + body: { + data: { + forums: eachLike({ + id: like('butter'), + glyph: like('⌘'), + label: like('test_forums.butter'), + position: like(1) + }) + } } - } + }); + return await internals.provider.addInteraction(forumQuery); + }); + + test('it returns the forums', async () => { + + const forums = getForums(); + const { counter, promise: resolveAfterTwo } = resolveAfter(2); + let response = null; + forums.subscribe((forumsValue) => { + + response = forumsValue; + counter(); }); - return await internals.provider.addInteraction(forumQuery); + expect(response.data).toBeInstanceOf(Array); + expect(response.data.length).toBe(0); + expect(response.loading).toBe(true); + expect(response.error).toBe(undefined); + await resolveAfterTwo; + expect(response.data).toEqual(expect.arrayContaining([{ + id: 'butter', + glyph: '⌘', + label: 'test_forums.butter', + position: 1 + }])); + expect(response.loading).toBe(false); + expect(response.error).toBe(undefined); + }); }); - test('it returns the forums', async () => { + describe('GetForum', () => { + + beforeAll(async () => { + + const forumQuery = new GraphQLInteraction() + .given('there\'s forums') + .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 forums = getForums(); - const { counter, promise: resolveAfterTwo } = resolveAfter(2); - let response = null; - forums.subscribe((forumsValue) => { + const forum = getForum('freezer'); + const { counter, promise: resolveAfterTwo } = resolveAfter(2); + let response = null; + forum.subscribe((forumsValue) => { - response = forumsValue; - counter(); + response = forumsValue; + counter(); + }); + expect(response.data).toBe(null); + 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); }); - expect(response.data).toEqual(expect.arrayContaining([])); - expect(response.loading).toBe(true); - expect(response.error).toBe(undefined); - await resolveAfterTwo; - expect(response.data).toEqual(expect.arrayContaining([{ - id: 'butter', - glyph: '⌘', - label: 'test_forums.butter', - position: 1 - }])); - expect(response.loading).toBe(false); - 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 { + describe('When there\'s no forums', () => { + + describe('GetForums', () => { + + beforeAll(async () => { + + const forumQuery = new GraphQLInteraction() + .given('there\'s no forums') + .uponReceiving('a request to list the forums') + .withRequest({ + path: '/graphql', + method: 'POST' + }) + .withOperation('GetForums') + .withQuery( + `query GetForums { + forums { id - title - updated_at - ttl + glyph + label + position __typename } - __typename + }` + ) + .withVariables({}) + .willRespondWith({ + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + }, + body: { + data: { + forums: [] + } } - }` - ) - .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 forums', async () => { + + const forums = getForums(); + const { counter, promise: resolveAfterTwo } = resolveAfter(2); + let response = null; + forums.subscribe((forumsValue) => { + + response = forumsValue; + counter(); + }); + expect(response.data).toBeInstanceOf(Array); + expect(response.data.length).toBe(0); + expect(response.loading).toBe(true); + expect(response.error).toBe(undefined); + await resolveAfterTwo; + expect(response.data).toBeInstanceOf(Array); + expect(response.data.length).toBe(0); + expect(response.loading).toBe(false); + expect(response.error).toBe(undefined); + }); + }); + + describe('GetForum', () => { + + beforeAll(async () => { + + const forumQuery = new GraphQLInteraction() + .given('there\'s no forums') + .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: null + } } - } + }); + 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).toBe(null); + expect(response.loading).toBe(true); + expect(response.error).toBe(undefined); + await resolveAfterTwo; + expect(response.data).toBe(null); + expect(response.loading).toBe(false); + expect(response.error).toBe(undefined); + }); + }); + }); + + describe('When there\'s an error', () => { + + describe('GetForums', () => { + + beforeAll(async () => { + + const forumQuery = new GraphQLInteraction() + .given('there\'s an error') + .uponReceiving('a request to list the forums') + .withRequest({ + path: '/graphql', + method: 'POST' + }) + .withOperation('GetForums') + .withQuery( + `query GetForums { + forums { + id + glyph + label + position + __typename + } + }` + ) + .withVariables({}) + .willRespondWith({ + status: 500 + }); + return await internals.provider.addInteraction(forumQuery); + }); + + test('it returns the error', async () => { + + const forums = getForums(); + const { counter, promise: resolveAfterTwo } = resolveAfter(2); + let response = null; + forums.subscribe((forumsValue) => { + + response = forumsValue; + counter(); }); - return await internals.provider.addInteraction(forumQuery); + expect(response.data).toBeInstanceOf(Array); + expect(response.data.length).toBe(0); + expect(response.loading).toBe(true); + expect(response.error).toBe(undefined); + await resolveAfterTwo; + expect(response.data).toBeInstanceOf(Array); + expect(response.data.length).toBe(0); + expect(response.loading).toBe(false); + expect(response.error).toBeInstanceOf(Error); + }); }); - test('it returns the forum', async () => { + describe('GetForum', () => { - const forum = getForum('freezer'); - const { counter, promise: resolveAfterTwo } = resolveAfter(2); - let response = null; - forum.subscribe((forumsValue) => { + beforeAll(async () => { - response = forumsValue; - counter(); + const forumQuery = new GraphQLInteraction() + .given('there\'s an error') + .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: 500 + }); + return await internals.provider.addInteraction(forumQuery); + }); + + test('it returns the error', async () => { + + const forum = getForum('freezer'); + const { counter, promise: resolveAfterTwo } = resolveAfter(2); + let response = null; + forum.subscribe((forumsValue) => { + + response = forumsValue; + counter(); + }); + expect(response.data).toBe(null); + expect(response.loading).toBe(true); + expect(response.error).toBe(undefined); + await resolveAfterTwo; + expect(response.data).toBe(null); + expect(response.loading).toBe(false); + expect(response.error).toBeInstanceOf(Error); }); - 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); }); }); });