From 5cff508bd6d9b553e0bf8d9fcc5e29143062583b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=A4fer?= Date: Wed, 6 Mar 2019 00:55:26 +0100 Subject: [PATCH] Disable/enable fullfills tests --- src/middleware/permissionsMiddleware.js | 10 ++----- src/middleware/softDeleteMiddleware.spec.js | 10 ++++++- src/resolvers/moderation.js | 28 ++++++++++++++++--- src/resolvers/moderation.spec.js | 31 ++++++++++++++++----- src/resolvers/posts.js | 20 ------------- src/seed/factories/index.js | 5 ++++ src/seed/seed-db.js | 13 ++++++--- 7 files changed, 73 insertions(+), 44 deletions(-) diff --git a/src/middleware/permissionsMiddleware.js b/src/middleware/permissionsMiddleware.js index dff11b888..7fb6e75b8 100644 --- a/src/middleware/permissionsMiddleware.js +++ b/src/middleware/permissionsMiddleware.js @@ -1,4 +1,4 @@ -import { rule, shield, allow, and, or } from 'graphql-shield' +import { rule, shield, allow, or } from 'graphql-shield' /* * TODO: implement @@ -41,12 +41,6 @@ const isAuthor = rule({ cache: 'no_cache' })(async (parent, args, { user, driver return authorId === user.id }) -const fromUserMatchesCurrentUser = rule({ cache: 'no_cache' })(async (parent, args, { user, driver }) => { - if (!user) return false - const { from: { id: fromId } } = args - return user.id === fromId -}) - // Permissions const permissions = shield({ Query: { @@ -64,7 +58,7 @@ const permissions = shield({ DeleteBadge: isAdmin, enable: isModerator, - disable: isModerator, + disable: isModerator // addFruitToBasket: isAuthenticated // CreateUser: allow, }, diff --git a/src/middleware/softDeleteMiddleware.spec.js b/src/middleware/softDeleteMiddleware.spec.js index 283e16eb0..e9bc461f1 100644 --- a/src/middleware/softDeleteMiddleware.spec.js +++ b/src/middleware/softDeleteMiddleware.spec.js @@ -20,7 +20,15 @@ beforeEach(async () => { ]) const moderatorFactory = Factory() await moderatorFactory.authenticateAs({ email: 'moderator@example.org', password: '1234' }) - await moderatorFactory.relate('Post', 'DisabledBy', { from: 'm1', to: 'p2' }) + const disableMutation = ` + mutation { + disable(resource: { + id: "p2" + type: contribution + }) + } + ` + await moderatorFactory.mutate(disableMutation) }) afterEach(async () => { diff --git a/src/resolvers/moderation.js b/src/resolvers/moderation.js index 15fd291e9..8e171dbf6 100644 --- a/src/resolvers/moderation.js +++ b/src/resolvers/moderation.js @@ -1,10 +1,30 @@ export default { Mutation: { - disable: async (object, params, {user, driver}) => { - return true + disable: async (object, params, { user, driver }) => { + const { resource: { id: postId } } = params + const { id: userId } = user + const cypher = ` + MATCH (u:User {id: $userId}) + MATCH (p:Post {id: $postId}) + SET p.disabled = true + MERGE (p)<-[:DISABLED]-(u) + ` + const session = driver.session() + const res = await session.run(cypher, { postId, userId }) + session.close() + return Boolean(res) }, - enable: async (object, params, {user, driver}) => { - return true + enable: async (object, params, { user, driver }) => { + const { resource: { id: postId } } = params + const cypher = ` + MATCH (p:Post {id: $postId})<-[d:DISABLED]-() + SET p.disabled = false + DELETE d + ` + const session = driver.session() + const res = await session.run(cypher, { postId }) + session.close() + return Boolean(res) } } } diff --git a/src/resolvers/moderation.spec.js b/src/resolvers/moderation.spec.js index b6249a8b7..081d7c38d 100644 --- a/src/resolvers/moderation.spec.js +++ b/src/resolvers/moderation.spec.js @@ -65,8 +65,8 @@ describe('disable', () => { await expect(client.request(mutation)).resolves.toEqual(expected) }) - it('sets current user', async () => { - const before = { Post: [{ id: 'p9', disabledBy: null }] } + it('changes .disabledBy', async () => { + const before = { Post: [{ id: 'p9', disabledBy: null }] } const expected = { Post: [{ id: 'p9', disabledBy: { id: 'u7' } }] } await expect(client.request( @@ -101,10 +101,15 @@ describe('enable', () => { await factory.create('Post', { id: 'p9' // that's the ID we will look for }) - await factory.relate('Post', 'DisabledBy', { - from: 'u123', - to: 'p9' - }) // that's we want to delete + const disableMutation = ` + mutation { + disable(resource: { + id: "p9" + type: contribution + }) + } + ` + await factory.mutate(disableMutation) // that's we want to delete let headers = {} const { email, password } = params @@ -115,7 +120,6 @@ describe('enable', () => { client = new GraphQLClient(host, { headers }) } - const mutation = ` mutation { enable(resource: { @@ -153,6 +157,19 @@ describe('enable', () => { await expect(client.request(mutation)).resolves.toEqual(expected) }) + it('changes .disabledBy', async () => { + const before = { Post: [{ id: 'p9', disabledBy: { id: 'u123' } }] } + const expected = { Post: [{ id: 'p9', disabledBy: null }] } + + await expect(client.request( + '{ Post(disabled: true) { id, disabledBy { id } } }' + )).resolves.toEqual(before) + await client.request(mutation) + await expect(client.request( + '{ Post { id, disabledBy { id } } }' + )).resolves.toEqual(expected) + }) + it('updates .disabled on post', async () => { const before = { Post: [ { id: 'p9', disabled: true } ] } const expected = { Post: [ { id: 'p9', disabled: false } ] } diff --git a/src/resolvers/posts.js b/src/resolvers/posts.js index 33934699b..abf91e047 100644 --- a/src/resolvers/posts.js +++ b/src/resolvers/posts.js @@ -2,26 +2,6 @@ import { neo4jgraphql } from 'neo4j-graphql-js' export default { Mutation: { - AddPostDisabledBy: async (object, params, context, resolveInfo) => { - const { to: { id: postId } } = params - const session = context.driver.session() - await session.run(` - MATCH (p:Post {id: $postId}) - SET p.disabled = true`, { postId }) - session.close() - return neo4jgraphql(object, params, context, resolveInfo, false) - }, - - RemovePostDisabledBy: async (object, params, context, resolveInfo) => { - const { to: { id: postId } } = params - const session = context.driver.session() - await session.run(` - MATCH (p:Post {id: $postId}) - SET p.disabled = false`, { postId }) - session.close() - return neo4jgraphql(object, params, context, resolveInfo, false) - }, - CreatePost: async (object, params, context, resolveInfo) => { const result = await neo4jgraphql(object, params, context, resolveInfo, false) diff --git a/src/seed/factories/index.js b/src/seed/factories/index.js index ed35d2c3b..68dd99200 100644 --- a/src/seed/factories/index.js +++ b/src/seed/factories/index.js @@ -86,6 +86,10 @@ export default function Factory (options = {}) { this.lastResponse = await this.graphQLClient.request(mutation) return this }, + async mutate (mutation, variables) { + this.lastResponse = await this.graphQLClient.request(mutation, variables) + return this + }, async cleanDatabase () { this.lastResponse = await cleanDatabase({ driver: this.neo4jDriver }) return this @@ -94,6 +98,7 @@ export default function Factory (options = {}) { result.authenticateAs.bind(result) result.create.bind(result) result.relate.bind(result) + result.mutate.bind(result) result.cleanDatabase.bind(result) return result } diff --git a/src/seed/seed-db.js b/src/seed/seed-db.js index c20d524ef..310089ef7 100644 --- a/src/seed/seed-db.js +++ b/src/seed/seed-db.js @@ -98,10 +98,15 @@ import Factory from './factories' asTick.create('Post', { id: 'p15' }) ]) - await asModerator.relate('Post', 'DisabledBy', { - from: 'u2', - to: 'p15' - }) + const disableMutation = ` + mutation { + disable(resource: { + id: "p11" + type: contribution + }) + } + ` + await asModerator.mutate(disableMutation) await Promise.all([ f.relate('Post', 'Categories', { from: 'p0', to: 'cat16' }),