diff --git a/backend/src/schema/resolvers/reports.spec.js b/backend/src/schema/resolvers/reports.spec.js index 4022be1b1..2c853d1fa 100644 --- a/backend/src/schema/resolvers/reports.spec.js +++ b/backend/src/schema/resolvers/reports.spec.js @@ -1,521 +1,586 @@ -import { GraphQLClient } from 'graphql-request' -import Factory from '../../seed/factories' -import { host, login, gql } from '../../jest/helpers' -import { getDriver, neode } from '../../bootstrap/neo4j' import { createTestClient } from 'apollo-server-testing' import createServer from '../.././server' +import Factory from '../../seed/factories' +import { gql } from '../../jest/helpers' +import { getDriver, neode as getNeode } from '../../bootstrap/neo4j' const factory = Factory() -const instance = neode() +const instance = getNeode() const driver = getDriver() -describe('report mutation', () => { - let reportMutation - let headers - let client - let variables - let createPostVariables - let user - const categoryIds = ['cat9'] - - const action = () => { - reportMutation = gql` - mutation($resourceId: ID!, $reasonCategory: ReasonCategory!, $reasonDescription: String!) { - report( - resourceId: $resourceId - reasonCategory: $reasonCategory - reasonDescription: $reasonDescription - ) { - createdAt - reasonCategory - reasonDescription - type - submitter { - email - } - user { - name - } - post { - title - } - comment { - content - } - } - } - ` - client = new GraphQLClient(host, { - headers, - }) - return client.request(reportMutation, variables) - } - - beforeEach(async () => { - variables = { - resourceId: 'whatever', - reasonCategory: 'other', - reasonDescription: 'Violates code of conduct !!!', - } - headers = {} - user = await factory.create('User', { - id: 'u1', - role: 'user', - email: 'test@example.org', - password: '1234', - }) - await factory.create('User', { - id: 'u2', - role: 'user', - name: 'abusive-user', - email: 'abusive-user@example.org', - }) - await instance.create('Category', { - id: 'cat9', - name: 'Democracy & Politics', - icon: 'university', - }) - }) - - afterEach(async () => { - await factory.cleanDatabase() - }) - - describe('unauthenticated', () => { - it('throws authorization error', async () => { - await expect(action()).rejects.toThrow('Not Authorised') - }) - }) - - describe('authenticated', () => { - beforeEach(async () => { - headers = await login({ - email: 'test@example.org', - password: '1234', - }) - }) - - describe('invalid resource id', () => { - it('returns null', async () => { - await expect(action()).resolves.toEqual({ - report: null, - }) - }) - }) - - describe('valid resource id', () => { - describe('reported resource is a user', () => { - beforeEach(async () => { - variables = { - ...variables, - resourceId: 'u2', - } - }) - - it('returns type "User"', async () => { - await expect(action()).resolves.toMatchObject({ - report: { - type: 'User', - }, - }) - }) - - it('returns resource in user attribute', async () => { - await expect(action()).resolves.toMatchObject({ - report: { - user: { - name: 'abusive-user', - }, - }, - }) - }) - - it('returns the submitter', async () => { - await expect(action()).resolves.toMatchObject({ - report: { - submitter: { - email: 'test@example.org', - }, - }, - }) - }) - - it('returns a date', async () => { - await expect(action()).resolves.toMatchObject({ - report: { - createdAt: expect.any(String), - }, - }) - }) - - it('returns the reason category', async () => { - variables = { - ...variables, - reasonCategory: 'criminal_behavior_violation_german_law', - } - await expect(action()).resolves.toMatchObject({ - report: { - reasonCategory: 'criminal_behavior_violation_german_law', - }, - }) - }) - - it('gives an error if the reason category is not in enum "ReasonCategory"', async () => { - variables = { - ...variables, - reasonCategory: 'my_category', - } - await expect(action()).rejects.toThrow( - 'got invalid value "my_category"; Expected type ReasonCategory', - ) - }) - - it('returns the reason description', async () => { - variables = { - ...variables, - reasonDescription: 'My reason!', - } - await expect(action()).resolves.toMatchObject({ - report: { - reasonDescription: 'My reason!', - }, - }) - }) - - it('sanitize the reason description', async () => { - variables = { - ...variables, - reasonDescription: 'My reason !', - } - await expect(action()).resolves.toMatchObject({ - report: { - reasonDescription: 'My reason !', - }, - }) - }) - }) - - describe('reported resource is a post', () => { - beforeEach(async () => { - await factory.create('Post', { - author: user, - id: 'p23', - title: 'Matt and Robert having a pair-programming', - categoryIds, - }) - variables = { - ...variables, - resourceId: 'p23', - } - }) - - it('returns type "Post"', async () => { - await expect(action()).resolves.toMatchObject({ - report: { - type: 'Post', - }, - }) - }) - - it('returns resource in post attribute', async () => { - await expect(action()).resolves.toMatchObject({ - report: { - post: { - title: 'Matt and Robert having a pair-programming', - }, - }, - }) - }) - - it('returns null in user attribute', async () => { - await expect(action()).resolves.toMatchObject({ - report: { - user: null, - }, - }) - }) - }) - - /* An der Stelle würde ich den p23 noch mal prüfen, diesmal muss aber eine error meldung kommen. - At this point I would check the p23 again, but this time there must be an error message. */ - - describe('reported resource is a comment', () => { - beforeEach(async () => { - createPostVariables = { - id: 'p1', - title: 'post to comment on', - content: 'please comment on me', - categoryIds, - } - await factory.create('Post', { ...createPostVariables, author: user }) - await factory.create('Comment', { - author: user, - postId: 'p1', - id: 'c34', - content: 'Robert getting tired.', - }) - variables = { - ...variables, - resourceId: 'c34', - } - }) - - it('returns type "Comment"', async () => { - await expect(action()).resolves.toMatchObject({ - report: { - type: 'Comment', - }, - }) - }) - - it('returns resource in comment attribute', async () => { - await expect(action()).resolves.toMatchObject({ - report: { - comment: { - content: 'Robert getting tired.', - }, - }, - }) - }) - }) - - /* An der Stelle würde ich den c34 noch mal prüfen, diesmal muss aber eine error meldung kommen. - At this point I would check the c34 again, but this time there must be an error message. */ - - describe('reported resource is a tag', () => { - beforeEach(async () => { - await factory.create('Tag', { - id: 't23', - }) - variables = { - ...variables, - resourceId: 't23', - } - }) - - it('returns null', async () => { - await expect(action()).resolves.toMatchObject({ - report: null, - }) - }) - }) - - /* An der Stelle würde ich den t23 noch mal prüfen, diesmal muss aber eine error meldung kommen. - At this point I would check the t23 again, but this time there must be an error message. */ - }) - }) -}) - -describe('reports query', () => { - let query, mutate, authenticatedUser, moderator, user, author - const categoryIds = ['cat9'] - +describe('report',()=>{ + let authenticatedUser, mutate, query const reportMutation = gql` - mutation($resourceId: ID!, $reasonCategory: ReasonCategory!, $reasonDescription: String!) { - report( - resourceId: $resourceId - reasonCategory: $reasonCategory - reasonDescription: $reasonDescription - ) { - type + mutation($resourceId: ID!, $reasonCategory: ReasonCategory!, $reasonDescription: String!) { + report( + resourceId: $resourceId + reasonCategory: $reasonCategory + reasonDescription: $reasonDescription + ) { + createdAt + reasonCategory + reasonDescription + type + submitter { + email + } + user { + name + } + post { + title + } + comment { + content } } - ` - const reportsQuery = gql` - query { - reports(orderBy: createdAt_desc) { - createdAt - reasonCategory - reasonDescription - submitter { - id - } - type - user { - id - } - post { - id - } - comment { - id - } - } - } - ` + } +` +const variables = { + resourceId: 'whatever', + reasonCategory: 'other', + reasonDescription: 'Violates code of conduct !!!', +} - beforeAll(async () => { - await factory.cleanDatabase() - const { server } = createServer({ - context: () => { + beforeAll(()=>{ + const {server} = createServer({ + context: ()=>{ return { driver, - user: authenticatedUser, + neode: instance, + user: authenticatedUser } - }, - }) - query = createTestClient(server).query - mutate = createTestClient(server).mutate + + } + } + ) + mutate = createTestClient(server).mutate + query = createTestClient(server).query }) - beforeEach(async () => { - authenticatedUser = null - - moderator = await factory.create('User', { - id: 'mod1', - role: 'moderator', - email: 'moderator@example.org', - password: '1234', - }) - user = await factory.create('User', { - id: 'user1', - role: 'user', - email: 'test@example.org', - password: '1234', - }) - author = await factory.create('User', { - id: 'auth1', - role: 'user', - name: 'abusive-user', - email: 'abusive-user@example.org', - }) - await instance.create('Category', { - id: 'cat9', - name: 'Democracy & Politics', - icon: 'university', - }) - - await Promise.all([ - factory.create('Post', { - author, - id: 'p1', - categoryIds, - content: 'Interesting Knowledge', - }), - factory.create('Post', { - author: moderator, - id: 'p2', - categoryIds, - content: 'More things to do …', - }), - factory.create('Post', { - author: user, - id: 'p3', - categoryIds, - content: 'I am at school …', - }), - ]) - await Promise.all([ - factory.create('Comment', { - author: user, - id: 'c1', - postId: 'p1', - }), - ]) - - authenticatedUser = await user.toJson() - await Promise.all([ - mutate({ - mutation: reportMutation, - variables: { - resourceId: 'p1', - reasonCategory: 'other', - reasonDescription: 'This comment is bigoted', - }, - }), - mutate({ - mutation: reportMutation, - variables: { - resourceId: 'c1', - reasonCategory: 'discrimination_etc', - reasonDescription: 'This post is bigoted', - }, - }), - mutate({ - mutation: reportMutation, - variables: { - resourceId: 'auth1', - reasonCategory: 'doxing', - reasonDescription: 'This user is harassing me with bigoted remarks', - }, - }), - ]) - authenticatedUser = null - }) - - afterEach(async () => { + afterEach(async()=>{ await factory.cleanDatabase() }) - describe('unauthenticated', () => { - it('throws authorization error', async () => { - authenticatedUser = null - expect(query({ query: reportsQuery })).resolves.toMatchObject({ - data: { reports: null }, - errors: [{ message: 'Not Authorised!' }], + describe('create report', ()=>{ + describe('unauthenticated',()=>{ + it.only('throws authorization error', async() =>{ + await expect(mutate({mutation: reportMutation, variables})).resolves.toMatchObject({ + data: {report: null}, + errors: [{message: 'Not Authorised!'}] + }) }) }) - - it('role "user" gets no reports', async () => { - authenticatedUser = await user.toJson() - expect(query({ query: reportsQuery })).resolves.toMatchObject({ - data: { reports: null }, - errors: [{ message: 'Not Authorised!' }], - }) - }) - - it('role "moderator" gets reports', async () => { - const expected = { - // to check 'orderBy: createdAt_desc' is not possible here, because 'createdAt' does not differ - reports: expect.arrayContaining([ - expect.objectContaining({ - createdAt: expect.any(String), - reasonCategory: 'doxing', - reasonDescription: 'This user is harassing me with bigoted remarks', - submitter: expect.objectContaining({ - id: 'user1', - }), - type: 'User', - user: expect.objectContaining({ - id: 'auth1', - }), - post: null, - comment: null, - }), - expect.objectContaining({ - createdAt: expect.any(String), - reasonCategory: 'other', - reasonDescription: 'This comment is bigoted', - submitter: expect.objectContaining({ - id: 'user1', - }), - type: 'Post', - user: null, - post: expect.objectContaining({ - id: 'p1', - }), - comment: null, - }), - expect.objectContaining({ - createdAt: expect.any(String), - reasonCategory: 'discrimination_etc', - reasonDescription: 'This post is bigoted', - submitter: expect.objectContaining({ - id: 'user1', - }), - type: 'Comment', - user: null, - post: null, - comment: expect.objectContaining({ - id: 'c1', - }), - }), - ]), - } - - authenticatedUser = await moderator.toJson() - const { data } = await query({ query: reportsQuery }) - expect(data).toEqual(expected) - }) }) }) + +// describe('report mutation', () => { +// let reportMutation +// let headers +// let client +// let variables +// let createPostVariables +// let user +// const categoryIds = ['cat9'] + +// const action = () => { +// reportMutation = gql` +// mutation($resourceId: ID!, $reasonCategory: ReasonCategory!, $reasonDescription: String!) { +// report( +// resourceId: $resourceId +// reasonCategory: $reasonCategory +// reasonDescription: $reasonDescription +// ) { +// createdAt +// reasonCategory +// reasonDescription +// type +// submitter { +// email +// } +// user { +// name +// } +// post { +// title +// } +// comment { +// content +// } +// } +// } +// ` +// client = new GraphQLClient(host, { +// headers, +// }) +// return client.request(reportMutation, variables) +// } + +// beforeEach(async () => { +// variables = { +// resourceId: 'whatever', +// reasonCategory: 'other', +// reasonDescription: 'Violates code of conduct !!!', +// } +// headers = {} +// user = await factory.create('User', { +// id: 'u1', +// role: 'user', +// email: 'test@example.org', +// password: '1234', +// }) +// await factory.create('User', { +// id: 'u2', +// role: 'user', +// name: 'abusive-user', +// email: 'abusive-user@example.org', +// }) +// await instance.create('Category', { +// id: 'cat9', +// name: 'Democracy & Politics', +// icon: 'university', +// }) +// }) + +// afterEach(async () => { +// await factory.cleanDatabase() +// }) + +// describe('unauthenticated', () => { +// it('throws authorization error', async () => { +// await expect(action()).rejects.toThrow('Not Authorised') +// }) +// }) + +// describe('authenticated', () => { +// beforeEach(async () => { +// headers = await login({ +// email: 'test@example.org', +// password: '1234', +// }) +// }) + +// describe('invalid resource id', () => { +// it('returns null', async () => { +// await expect(action()).resolves.toEqual({ +// report: null, +// }) +// }) +// }) + +// describe('valid resource id', () => { +// describe('reported resource is a user', () => { +// beforeEach(async () => { +// variables = { +// ...variables, +// resourceId: 'u2', +// } +// }) + +// it('returns type "User"', async () => { +// await expect(action()).resolves.toMatchObject({ +// report: { +// type: 'User', +// }, +// }) +// }) + +// it('returns resource in user attribute', async () => { +// await expect(action()).resolves.toMatchObject({ +// report: { +// user: { +// name: 'abusive-user', +// }, +// }, +// }) +// }) + +// it('returns the submitter', async () => { +// await expect(action()).resolves.toMatchObject({ +// report: { +// submitter: { +// email: 'test@example.org', +// }, +// }, +// }) +// }) + +// it('returns a date', async () => { +// await expect(action()).resolves.toMatchObject({ +// report: { +// createdAt: expect.any(String), +// }, +// }) +// }) + +// it('returns the reason category', async () => { +// variables = { +// ...variables, +// reasonCategory: 'criminal_behavior_violation_german_law', +// } +// await expect(action()).resolves.toMatchObject({ +// report: { +// reasonCategory: 'criminal_behavior_violation_german_law', +// }, +// }) +// }) + +// it('gives an error if the reason category is not in enum "ReasonCategory"', async () => { +// variables = { +// ...variables, +// reasonCategory: 'my_category', +// } +// await expect(action()).rejects.toThrow( +// 'got invalid value "my_category"; Expected type ReasonCategory', +// ) +// }) + +// it('returns the reason description', async () => { +// variables = { +// ...variables, +// reasonDescription: 'My reason!', +// } +// await expect(action()).resolves.toMatchObject({ +// report: { +// reasonDescription: 'My reason!', +// }, +// }) +// }) + +// it('sanitize the reason description', async () => { +// variables = { +// ...variables, +// reasonDescription: 'My reason !', +// } +// await expect(action()).resolves.toMatchObject({ +// report: { +// reasonDescription: 'My reason !', +// }, +// }) +// }) +// }) + +// describe('reported resource is a post', () => { +// beforeEach(async () => { +// await factory.create('Post', { +// author: user, +// id: 'p23', +// title: 'Matt and Robert having a pair-programming', +// categoryIds, +// }) +// variables = { +// ...variables, +// resourceId: 'p23', +// } +// }) + +// it('returns type "Post"', async () => { +// await expect(action()).resolves.toMatchObject({ +// report: { +// type: 'Post', +// }, +// }) +// }) + +// it('returns resource in post attribute', async () => { +// await expect(action()).resolves.toMatchObject({ +// report: { +// post: { +// title: 'Matt and Robert having a pair-programming', +// }, +// }, +// }) +// }) + +// it('returns null in user attribute', async () => { +// await expect(action()).resolves.toMatchObject({ +// report: { +// user: null, +// }, +// }) +// }) +// }) + +// /* An der Stelle würde ich den p23 noch mal prüfen, diesmal muss aber eine error meldung kommen. +// At this point I would check the p23 again, but this time there must be an error message. */ + +// describe('reported resource is a comment', () => { +// beforeEach(async () => { +// createPostVariables = { +// id: 'p1', +// title: 'post to comment on', +// content: 'please comment on me', +// categoryIds, +// } +// await factory.create('Post', { ...createPostVariables, author: user }) +// await factory.create('Comment', { +// author: user, +// postId: 'p1', +// id: 'c34', +// content: 'Robert getting tired.', +// }) +// variables = { +// ...variables, +// resourceId: 'c34', +// } +// }) + +// it('returns type "Comment"', async () => { +// await expect(action()).resolves.toMatchObject({ +// report: { +// type: 'Comment', +// }, +// }) +// }) + +// it('returns resource in comment attribute', async () => { +// await expect(action()).resolves.toMatchObject({ +// report: { +// comment: { +// content: 'Robert getting tired.', +// }, +// }, +// }) +// }) +// }) + +// /* An der Stelle würde ich den c34 noch mal prüfen, diesmal muss aber eine error meldung kommen. +// At this point I would check the c34 again, but this time there must be an error message. */ + +// describe('reported resource is a tag', () => { +// beforeEach(async () => { +// await factory.create('Tag', { +// id: 't23', +// }) +// variables = { +// ...variables, +// resourceId: 't23', +// } +// }) + +// it('returns null', async () => { +// await expect(action()).resolves.toMatchObject({ +// report: null, +// }) +// }) +// }) + +// /* An der Stelle würde ich den t23 noch mal prüfen, diesmal muss aber eine error meldung kommen. +// At this point I would check the t23 again, but this time there must be an error message. */ +// }) +// }) +// }) + +// describe('reports query', () => { +// let query, mutate, authenticatedUser, moderator, user, author +// const categoryIds = ['cat9'] + +// const reportMutation = gql` +// mutation($resourceId: ID!, $reasonCategory: ReasonCategory!, $reasonDescription: String!) { +// report( +// resourceId: $resourceId +// reasonCategory: $reasonCategory +// reasonDescription: $reasonDescription +// ) { +// type +// } +// } +// ` +// const reportsQuery = gql` +// query { +// reports(orderBy: createdAt_desc) { +// createdAt +// reasonCategory +// reasonDescription +// submitter { +// id +// } +// type +// user { +// id +// } +// post { +// id +// } +// comment { +// id +// } +// } +// } +// ` + +// beforeAll(async () => { +// await factory.cleanDatabase() +// const { server } = createServer({ +// context: () => { +// return { +// driver, +// user: authenticatedUser, +// } +// }, +// }) +// query = createTestClient(server).query +// mutate = createTestClient(server).mutate +// }) + +// beforeEach(async () => { +// authenticatedUser = null + +// moderator = await factory.create('User', { +// id: 'mod1', +// role: 'moderator', +// email: 'moderator@example.org', +// password: '1234', +// }) +// user = await factory.create('User', { +// id: 'user1', +// role: 'user', +// email: 'test@example.org', +// password: '1234', +// }) +// author = await factory.create('User', { +// id: 'auth1', +// role: 'user', +// name: 'abusive-user', +// email: 'abusive-user@example.org', +// }) +// await instance.create('Category', { +// id: 'cat9', +// name: 'Democracy & Politics', +// icon: 'university', +// }) + +// await Promise.all([ +// factory.create('Post', { +// author, +// id: 'p1', +// categoryIds, +// content: 'Interesting Knowledge', +// }), +// factory.create('Post', { +// author: moderator, +// id: 'p2', +// categoryIds, +// content: 'More things to do …', +// }), +// factory.create('Post', { +// author: user, +// id: 'p3', +// categoryIds, +// content: 'I am at school …', +// }), +// ]) +// await Promise.all([ +// factory.create('Comment', { +// author: user, +// id: 'c1', +// postId: 'p1', +// }), +// ]) + +// authenticatedUser = await user.toJson() +// await Promise.all([ +// mutate({ +// mutation: reportMutation, +// variables: { +// resourceId: 'p1', +// reasonCategory: 'other', +// reasonDescription: 'This comment is bigoted', +// }, +// }), +// mutate({ +// mutation: reportMutation, +// variables: { +// resourceId: 'c1', +// reasonCategory: 'discrimination_etc', +// reasonDescription: 'This post is bigoted', +// }, +// }), +// mutate({ +// mutation: reportMutation, +// variables: { +// resourceId: 'auth1', +// reasonCategory: 'doxing', +// reasonDescription: 'This user is harassing me with bigoted remarks', +// }, +// }), +// ]) +// authenticatedUser = null +// }) + +// afterEach(async () => { +// await factory.cleanDatabase() +// }) + +// describe('unauthenticated', () => { +// it('throws authorization error', async () => { +// authenticatedUser = null +// expect(query({ query: reportsQuery })).resolves.toMatchObject({ +// data: { reports: null }, +// errors: [{ message: 'Not Authorised!' }], +// }) +// }) + +// it('role "user" gets no reports', async () => { +// authenticatedUser = await user.toJson() +// expect(query({ query: reportsQuery })).resolves.toMatchObject({ +// data: { reports: null }, +// errors: [{ message: 'Not Authorised!' }], +// }) +// }) + +// it('role "moderator" gets reports', async () => { +// const expected = { +// // to check 'orderBy: createdAt_desc' is not possible here, because 'createdAt' does not differ +// reports: expect.arrayContaining([ +// expect.objectContaining({ +// createdAt: expect.any(String), +// reasonCategory: 'doxing', +// reasonDescription: 'This user is harassing me with bigoted remarks', +// submitter: expect.objectContaining({ +// id: 'user1', +// }), +// type: 'User', +// user: expect.objectContaining({ +// id: 'auth1', +// }), +// post: null, +// comment: null, +// }), +// expect.objectContaining({ +// createdAt: expect.any(String), +// reasonCategory: 'other', +// reasonDescription: 'This comment is bigoted', +// submitter: expect.objectContaining({ +// id: 'user1', +// }), +// type: 'Post', +// user: null, +// post: expect.objectContaining({ +// id: 'p1', +// }), +// comment: null, +// }), +// expect.objectContaining({ +// createdAt: expect.any(String), +// reasonCategory: 'discrimination_etc', +// reasonDescription: 'This post is bigoted', +// submitter: expect.objectContaining({ +// id: 'user1', +// }), +// type: 'Comment', +// user: null, +// post: null, +// comment: expect.objectContaining({ +// id: 'c1', +// }), +// }), +// ]), +// } + +// authenticatedUser = await moderator.toJson() +// const { data } = await query({ query: reportsQuery }) +// expect(data).toEqual(expected) +// }) +// }) +// })