diff options
| author | Ruben Beltran del Rio <ruben@unlimited.pizza> | 2021-05-02 19:53:10 +0200 |
|---|---|---|
| committer | Ruben Beltran del Rio <ruben@unlimited.pizza> | 2021-05-02 19:53:10 +0200 |
| commit | b15225c9dff2864ee774a0ab1dcf19d9353ec10b (patch) | |
| tree | c492bdda4ae0f1471a9fc8fda6583703cb227269 /src | |
| parent | 605230e032808155d62ed773cc551b5ae1847a5f (diff) | |
Add posts store pact test
Diffstat (limited to 'src')
| -rw-r--r-- | src/stores/forums.test.js | 17 | ||||
| -rw-r--r-- | src/stores/posts.test.js | 265 |
2 files changed, 274 insertions, 8 deletions
diff --git a/src/stores/forums.test.js b/src/stores/forums.test.js index e117828..eb4bc07 100644 --- a/src/stores/forums.test.js +++ b/src/stores/forums.test.js @@ -20,8 +20,9 @@ describe('Forums store pact', () => { internals.provider = new Pact({ port: 1234, dir: resolve(process.cwd(), 'pacts'), - consumer: 'ForumsStore', - provider: 'ForumAPIServer' + consumer: 'ForumClient', + provider: 'ForumServer', + pactfileWriteMode: 'update' }); await internals.provider.setup(); @@ -30,14 +31,14 @@ describe('Forums store pact', () => { afterEach(() => internals.provider.verify()); afterAll(() => internals.provider.finalize()); - describe('When there\'s forums', () => { + describe('When there\'s data', () => { describe('GetForums', () => { beforeAll(async () => { const forumQuery = new GraphQLInteraction() - .given('there\'s forums') + .given('there\'s data') .uponReceiving('a request to list the forums') .withRequest({ path: '/graphql', @@ -106,7 +107,7 @@ describe('Forums store pact', () => { beforeAll(async () => { const forumQuery = new GraphQLInteraction() - .given('there\'s forums') + .given('there\'s data') .uponReceiving('a request to get a single forum') .withRequest({ path: '/graphql', @@ -189,14 +190,14 @@ describe('Forums store pact', () => { }); }); - describe('When there\'s no forums', () => { + describe('When there\'s no data', () => { describe('GetForums', () => { beforeAll(async () => { const forumQuery = new GraphQLInteraction() - .given('there\'s no forums') + .given('there\'s no data') .uponReceiving('a request to list the forums') .withRequest({ path: '/graphql', @@ -256,7 +257,7 @@ describe('Forums store pact', () => { beforeAll(async () => { const forumQuery = new GraphQLInteraction() - .given('there\'s no forums') + .given('there\'s no data') .uponReceiving('a request to get a single forum') .withRequest({ path: '/graphql', diff --git a/src/stores/posts.test.js b/src/stores/posts.test.js new file mode 100644 index 0000000..acd843c --- /dev/null +++ b/src/stores/posts.test.js @@ -0,0 +1,265 @@ +import { GraphQLInteraction, Pact, Matchers } from '@pact-foundation/pact'; +import { resolve } from 'path'; + +import { resolveAfter } from '$/utils/resolve_after'; + +const { eachLike, like } = Matchers; + +jest.mock('$/config/config.js'); + +import { getPost } from './posts'; + +const internals = { + provider: null +}; + +describe('Posts store pact', () => { + + beforeAll(async () => { + + internals.provider = new Pact({ + port: 1234, + dir: resolve(process.cwd(), 'pacts'), + consumer: 'ForumClient', + provider: 'ForumServer', + pactfileWriteMode: 'update' + }); + + await internals.provider.setup(); + }); + + afterEach(() => internals.provider.verify()); + afterAll(() => internals.provider.finalize()); + + describe('When there\'s data', () => { + + describe('GetPost', () => { + + beforeAll(async () => { + + const postQuery = new GraphQLInteraction() + .given('there\'s data') + .uponReceiving('a request to get a single post') + .withRequest({ + path: '/graphql', + method: 'POST' + }) + .withOperation('GetPost') + .withQuery( + `query GetPost($id: ID!) { + post(id: $id) { + id + text + created_at + author { + id + handle + __typename + } + topic { + id + title + __typename + } + __typename + } + }` + ) + .withVariables({ + id: 'freezer' + }) + .willRespondWith({ + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + }, + body: { + data: { + post: like({ + id: like('8f75eba5-6989-4dd3-b466-e464546ce374'), + text: like('This is a very pacty post'), + created_at: like(1619976194937), + author: like({ + id: like('a805b3de-cac4-451c-a1e6-f078869c9db9'), + handle: like('pacts_person') + }), + topic: like({ + id: like('5c283ce1-0470-4b98-86f5-1fec9a22c9ac'), + title: like('The parent pacts topic') + }) + }) + } + } + }); + return await internals.provider.addInteraction(postQuery); + }); + + test('it returns the post', async () => { + + const post = getPost('freezer'); + const { counter, promise: resolveAfterTwo } = resolveAfter(2); + let response = null; + post.subscribe((postValue) => { + + response = postValue; + counter(); + }); + expect(response.data).toBe(null); + expect(response.loading).toBe(true); + expect(response.error).toBe(undefined); + await resolveAfterTwo; + expect(response.data).toEqual({ + id: '8f75eba5-6989-4dd3-b466-e464546ce374', + text: 'This is a very pacty post', + created_at: 1619976194937, + author: { + id: 'a805b3de-cac4-451c-a1e6-f078869c9db9', + handle: 'pacts_person' + }, + topic: { + id: '5c283ce1-0470-4b98-86f5-1fec9a22c9ac', + title: 'The parent pacts topic' + } + }); + expect(response.loading).toBe(false); + expect(response.error).toBe(undefined); + }); + }); + }); + + describe('When there\'s no data', () => { + + describe('GetPost', () => { + + beforeAll(async () => { + + const postQuery = new GraphQLInteraction() + .given('there\'s no data') + .uponReceiving('a request to get a single post') + .withRequest({ + path: '/graphql', + method: 'POST' + }) + .withOperation('GetPost') + .withQuery( + `query GetPost($id: ID!) { + post(id: $id) { + id + text + created_at + author { + id + handle + __typename + } + topic { + id + title + __typename + } + __typename + } + }` + ) + .withVariables({ + id: 'freezer' + }) + .willRespondWith({ + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + }, + body: { + data: { + post: null + } + } + }); + return await internals.provider.addInteraction(postQuery); + }); + + test('it returns the post', async () => { + + const post = getPost('freezer'); + const { counter, promise: resolveAfterTwo } = resolveAfter(2); + let response = null; + post.subscribe((postValue) => { + + response = postValue; + 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('GetPost', () => { + + beforeAll(async () => { + + const postQuery = new GraphQLInteraction() + .given('there\'s an error') + .uponReceiving('a request to get a single post') + .withRequest({ + path: '/graphql', + method: 'POST' + }) + .withOperation('GetPost') + .withQuery( + `query GetPost($id: ID!) { + post(id: $id) { + id + text + created_at + author { + id + handle + __typename + } + topic { + id + title + __typename + } + __typename + } + }` + ) + .withVariables({ + id: 'freezer' + }) + .willRespondWith({ + status: 500 + }); + return await internals.provider.addInteraction(postQuery); + }); + + test('it returns the error', async () => { + + const post = getPost('freezer'); + const { counter, promise: resolveAfterTwo } = resolveAfter(2); + let response = null; + post.subscribe((postValue) => { + + response = postValue; + 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); + }); + }); + }); +}); |