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?
This commit is contained in:
Robert Schäfer 2019-02-21 02:09:07 +01:00
parent b3e476e039
commit 91a13593dc
3 changed files with 89 additions and 39 deletions

View File

@ -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
}

View File

@ -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 }
}
`
}

View File

@ -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([