From 91a13593dcb535111821cb69a8d99559a879b2b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=A4fer?= Date: Thu, 21 Feb 2019 02:09:07 +0100 Subject: [PATCH] Provide a better interface for factories You can now run graphql mutations *from the point of view* of a user. @mattwr18 @Tirokk Do you have a better idea how to name the factory builder? --- src/seed/factories/index.js | 65 +++++++++++++++++++++++++++++++++---- src/seed/factories/posts.js | 4 +-- src/seed/seed-db.js | 59 +++++++++++++++++---------------- 3 files changed, 89 insertions(+), 39 deletions(-) diff --git a/src/seed/factories/index.js b/src/seed/factories/index.js index 650071f2e..efbf7b248 100644 --- a/src/seed/factories/index.js +++ b/src/seed/factories/index.js @@ -1,7 +1,22 @@ import { GraphQLClient } from 'graphql-request' import { getDriver } from '../../bootstrap/neo4j' +import { request } from 'graphql-request' export const seedServerHost = 'http://127.0.0.1:4001' +export const testServerHost = 'http://127.0.0.1:4123' + +const authenticatedHeaders = async ({ email, password }, host = testServerHost) => { + const mutation = ` + mutation { + login(email:"${email}", password:"${password}"){ + token + } + }` + const response = await request(host, mutation) + return { + authorization: `Bearer ${response.login.token}` + } +} const factories = { 'badge': require('./badges.js').default, @@ -21,19 +36,19 @@ const relationFactories = { 'comment': require('./comments.js').relate } -const create = (model, parameters, options) => { +export const create = (model, parameters, options) => { const graphQLClient = new GraphQLClient(seedServerHost, options) const mutation = factories[model](parameters) return graphQLClient.request(mutation) } -const relate = (model, type, parameters, options) => { +export const relate = (model, type, parameters, options) => { const graphQLClient = new GraphQLClient(seedServerHost, options) const mutation = relationFactories[model](type, parameters) return graphQLClient.request(mutation) } -const cleanDatabase = async (options = {}) => { +export const cleanDatabase = async (options = {}) => { const { driver = getDriver() } = options @@ -48,8 +63,44 @@ const cleanDatabase = async (options = {}) => { } } -export { - create, - relate, - cleanDatabase +export default function factoryFun (options = {}) { + const { + neo4jDriver = getDriver(), + seedServerHost = 'http://127.0.0.1:4001', + testServerHost = 'http://127.0.0.1:4123' + } = options + + const graphQLClient = new GraphQLClient(seedServerHost) + + const result = { + neo4jDriver, + seedServerHost, + graphQLClient, + lastResponse: null, + async authenticateAs({email, password}) { + const headers = await authenticatedHeaders({email, password}, seedServerHost) + this.lastResponse = headers + this.graphQLClient = new GraphQLClient(seedServerHost, { headers }) + return this + }, + async create(node, properties) { + const mutation = factories[node](properties) + this.lastResponse = await this.graphQLClient.request(mutation) + return this + }, + async relate(node, relationship, properties) { + const mutation = relationFactories[node](relationship, properties) + this.lastResponse = await this.graphQLClient.request(mutation) + return this + }, + async cleanDatabase() { + this.lastResponse = await cleanDatabase({driver: this.neo4jDriver}) + return this + } + } + result.authenticateAs.bind(result) + result.create.bind(result) + result.relate.bind(result) + result.cleanDatabase.bind(result) + return result } diff --git a/src/seed/factories/posts.js b/src/seed/factories/posts.js index bd095dd20..eaa616b2b 100644 --- a/src/seed/factories/posts.js +++ b/src/seed/factories/posts.js @@ -2,7 +2,7 @@ import faker from 'faker' export default function (params) { const { - id = `u${faker.random.number()}`, + id = `p${faker.random.number()}`, title = faker.lorem.sentence(), content = [ faker.lorem.sentence(), @@ -27,7 +27,7 @@ export default function (params) { visibility: ${visibility}, disabled: ${disabled}, deleted: ${deleted} - ) { id, title } + ) { title, content } } ` } diff --git a/src/seed/seed-db.js b/src/seed/seed-db.js index 21cb543a8..1075c61d6 100644 --- a/src/seed/seed-db.js +++ b/src/seed/seed-db.js @@ -1,5 +1,4 @@ -import { create, relate, seedServerHost as host } from './factories' -import { authenticatedHeaders } from '../jest/helpers.js' +import factoryFun, { create, relate, seedServerHost as host } from './factories' /* eslint-disable no-multi-spaces */ (async function () { @@ -44,15 +43,6 @@ import { authenticatedHeaders } from '../jest/helpers.js' relate('user', 'Blacklisted', { from: 'u7', to: 'u6' }) ]) - const headers = await Promise.all([ - authenticatedHeaders({ email: 'admin@example.org', password: '1234' }, host), - authenticatedHeaders({ email: 'moderator@example.org', password: '1234' }, host), - authenticatedHeaders({ email: 'user@example.org', password: '1234' }, host), - authenticatedHeaders({ email: 'tick@example.org', password: '1234' }, host), - authenticatedHeaders({ email: 'trick@example.org', password: '1234' }, host), - authenticatedHeaders({ email: 'track@example.org', password: '1234' }, host) - ]) - await Promise.all([ create('category', { id: 'cat1', name: 'Just For Fun', slug: 'justforfun', icon: 'smile' }), create('category', { id: 'cat2', name: 'Happyness & Values', slug: 'happyness-values', icon: 'heart-o' }), @@ -79,23 +69,32 @@ import { authenticatedHeaders } from '../jest/helpers.js' create('tag', { id: 't4', name: 'Freiheit' }) ]) + const [ asAdmin, asModerator, asUser, asTick, asTrick, asTrack ] = await Promise.all([ + factoryFun().authenticateAs({ email: 'admin@example.org', password: '1234' }), + factoryFun().authenticateAs({ email: 'moderator@example.org', password: '1234' }), + factoryFun().authenticateAs({ email: 'user@example.org', password: '1234' }), + factoryFun().authenticateAs({ email: 'tick@example.org', password: '1234' }), + factoryFun().authenticateAs({ email: 'trick@example.org', password: '1234' }), + factoryFun().authenticateAs({ email: 'track@example.org', password: '1234' }) + ]) + await Promise.all([ - create('post', { id: 'p0' }, { headers: headers[0] }), - create('post', { id: 'p1' }, { headers: headers[1] }), - create('post', { id: 'p2' }, { headers: headers[2] }), - create('post', { id: 'p3' }, { headers: headers[3] }), - create('post', { id: 'p4' }, { headers: headers[4] }), - create('post', { id: 'p5' }, { headers: headers[5] }), - create('post', { id: 'p6' }, { headers: headers[0] }), - create('post', { id: 'p7' }, { headers: headers[1] }), - create('post', { id: 'p8' }, { headers: headers[2] }), - create('post', { id: 'p9' }, { headers: headers[3] }), - create('post', { id: 'p10' }, { headers: headers[4] }), - create('post', { id: 'p11' }, { headers: headers[5] }), - create('post', { id: 'p12' }, { headers: headers[0] }), - create('post', { id: 'p13' }, { headers: headers[1] }), - create('post', { id: 'p14' }, { headers: headers[2] }), - create('post', { id: 'p15' }, { headers: headers[3] }) + asAdmin .create('post', { id: 'p0' }), + asModerator.create('post', { id: 'p1' }), + asUser .create('post', { id: 'p2' }), + asTick .create('post', { id: 'p3' }), + asTrick .create('post', { id: 'p4' }), + asTrack .create('post', { id: 'p5' }), + asAdmin .create('post', { id: 'p6' }), + asModerator.create('post', { id: 'p7' }), + asUser .create('post', { id: 'p8' }), + asTick .create('post', { id: 'p9' }), + asTrick .create('post', { id: 'p10' }), + asTrack .create('post', { id: 'p11' }), + asAdmin .create('post', { id: 'p12' }), + asModerator.create('post', { id: 'p13' }), + asUser .create('post', { id: 'p14' }), + asTick .create('post', { id: 'p15' }) ]) await Promise.all([ @@ -170,9 +169,9 @@ import { authenticatedHeaders } from '../jest/helpers.js' ]) await Promise.all([ - create('report', { description: 'I don\'t like this comment', resource: { id: 'c1', type: 'comment' } }, { headers: headers[3] }), - create('report', { description: 'I don\'t like this post', resource: { id: 'p1', type: 'contribution' } }, { headers: headers[4] }), - create('report', { description: 'I don\'t like this user', resource: { id: 'u1', type: 'user' } }, { headers: headers[5] }) + asTick .create('report', { description: 'I don\'t like this comment', resource: { id: 'c1', type: 'comment' } }), + asTrick.create('report', { description: 'I don\'t like this post', resource: { id: 'p1', type: 'contribution' } }), + asTrack.create('report', { description: 'I don\'t like this user', resource: { id: 'u1', type: 'user' } }) ]) await Promise.all([