Skip to content

Upgrade Graphql Deps, Integration #1107

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Sep 30, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 17 additions & 40 deletions npm-shrinkwrap.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -102,15 +102,15 @@
"dotenv": "^2.0.0",
"emailjs": "^1.0.8",
"express": "^4.13.3",
"express-graphql": "^0.4.9",
"express-graphql": "^0.6.11",
"express-sslify": "^1.0.1",
"extract-text-webpack-plugin": "^1.0.1",
"file-loader": "^0.8.5",
"form-urlencoded": "^1.5.0",
"git-clone": "^0.1.0",
"google-libphonenumber": "^2.0.6",
"graphql": "^0.4.18",
"graphql-custom-types": "^0.3.0",
"graphql": "^0.11.5",
"graphql-custom-types": "^1.1.0",
"history": "^2.0.0",
"immutability-helper": "^2.0.0",
"isomorphic-fetch": "^2.2.1",
Expand Down
4 changes: 1 addition & 3 deletions src/common/containers/UserForm/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,7 @@ function mapStateToProps(state, props) {
const user = findAny(users.users, identifier, ['id', 'handle'])

const sortedPhases = Object.values(phases.phases).sort((p1, p2) => p1.number - p2.number)
const sortedPhaseOptions = [
{value: null, label: 'No Phase'}, ...sortedPhases.map(phaseToOption)
]
const sortedPhaseOptions = [...sortedPhases.map(phaseToOption), {value: null, label: 'No Phase'}]

let formType = FORM_TYPES.UPDATE
if (identifier && !user && !users.isBusy) {
Expand Down
39 changes: 39 additions & 0 deletions src/server/actions/__tests__/updateUser.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/* eslint-env mocha */
/* global expect, testContext */
/* eslint-disable prefer-arrow-callback, no-unused-expressions */
import factory from 'src/test/factories'
import {resetDB, useFixture} from 'src/test/helpers'

import {LEARNER, STAFF} from 'src/common/models/user'

import updateUser from '../updateUser'

describe(testContext(__filename), function () {
beforeEach(resetDB)

beforeEach(function () {
useFixture.nockClean()
})

it('returns correct user for identifier', async function () {
const {Member} = require('src/server/services/dataService')

const roles = [LEARNER]
const user = await factory.build('user', {roles})
const phase = await factory.build('phase')
const member = await factory.create('member', {id: user.id, phaseId: phase.id})

useFixture.nockIDMGetUser(user)

const updateValues = {phaseNumber: null, roles: [STAFF, LEARNER]}
const updatedUserValues = Object.assign({}, user, updateValues)
useFixture.nockIDMUpdateUser(updatedUserValues)
useFixture.nockIDMGetUser(updatedUserValues)

const updatedIDMUser = await updateUser(user.id, updateValues)
expect(updatedIDMUser.roles.sort()).to.deep.eql(updateValues.roles.sort())

const updatedMember = await Member.get(member.id)
expect(updatedMember.phaseId).to.eq(null)
})
})
9 changes: 5 additions & 4 deletions src/server/actions/updateUser.js
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
import getUser from 'src/server/actions/getUser'
import {Member, Phase} from 'src/server/services/dataService'
import {updateUser as idmUpdateUser} from 'src/server/services/idmService'

export default async function updateUser(userId, values) {
const {Member, Phase} = require('src/server/services/dataService')
const {updateUser: idmUpdateUser} = require('src/server/services/idmService')

const {phaseNumber, roles} = values || {}

const user = await getUser(userId)

if (typeof phaseNumber !== 'undefined') {
const phase = phaseNumber === null ? null : (await Phase.filter({number: phaseNumber}))[0]
await Member.get(values.id).update({phaseId: phase ? phase.id : null})
await Member.get(userId).update({phaseId: phase ? phase.id : null})
}

if (Array.isArray(roles) && !_identicalRoles(user.roles, roles)) {
await idmUpdateUser({
id: userId,
email: user.email,
name: user.name, // FIXME: should not have to include unchanged values
name: user.name,
roles,
})
}
Expand Down
5 changes: 3 additions & 2 deletions src/server/graphql/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,18 @@ import rootSchema from './rootSchema'

const app = new express.Router()
const sentry = new raven.Client(config.server.sentryDSN)

const corsOptions = {
origin: [
/\.learnersguild.org/,
/\.learnersguild.dev/,
],
exposedHeaders: ['LearnersGuild-JWT'],
}

app.use('/graphql', cors(corsOptions), graphqlHTTP(req => ({
schema: rootSchema,
rootValue: {currentUser: req.user},
context: {currentUser: req.user},
rootValue: {},
pretty: true,
formatError: error => {
const serverError = formatServerError(error)
Expand Down
22 changes: 11 additions & 11 deletions src/server/graphql/mutations/__tests__/deleteProject.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@
/* global expect, testContext */
/* eslint-disable prefer-arrow-callback, no-unused-expressions */
import factory from 'src/test/factories'
import {resetDB, runGraphQLQuery} from 'src/test/helpers'
import {resetDB, runGraphQLMutation} from 'src/test/helpers'

import fields from '../index'
import deleteProject from '../deleteProject'

const query = `
query($identifier: String!) {
const fields = {deleteProject}
const mutation = `
mutation($identifier: String!) {
deleteProject(identifier: $identifier) {
success
}
Expand All @@ -23,17 +24,16 @@ describe(testContext(__filename), function () {

it('returns success for valid identifier', async function () {
const project = await factory.create('project')
const result = await runGraphQLQuery(
query,
fields,
{identifier: project.id},
{currentUser: this.currentUser},
)
const context = {currentUser: this.currentUser}
const variables = {identifier: project.id}
const result = await runGraphQLMutation(fields, mutation, context, variables)
expect(result.data.deleteProject.success).to.equal(true)
})

it('throws an error if user is not authorized', function () {
const result = runGraphQLQuery(query, fields, {identifier: ''}, {currentUser: null})
const context = {currentUser: null}
const variables = {identifier: ''}
const result = runGraphQLMutation(fields, mutation, context, variables)
return expect(result).to.eventually.be.rejectedWith(/not authorized/i)
})
})
Original file line number Diff line number Diff line change
Expand Up @@ -2,43 +2,41 @@
/* global expect, testContext */
/* eslint-disable prefer-arrow-callback, no-unused-expressions */
import factory from 'src/test/factories'
import {resetDB, runGraphQLQuery} from 'src/test/helpers'
import {resetDB, runGraphQLMutation} from 'src/test/helpers'
import {Member} from 'src/server/services/dataService'
import {ADMIN} from 'src/common/models/user'

import fields from '../index'
import reassignMembersToChapter from '../reassignMembersToChapter'

const fields = {reassignMembersToChapter}
const mutation = `
mutation($memberIds: [ID]!, $chapterId: ID!) {
reassignMembersToChapter(memberIds: $memberIds, chapterId: $chapterId) { id }
}
`

describe(testContext(__filename), function () {
beforeEach(resetDB)

it('updates members', async function () {
it('updates member chapter', async function () {
const chapter = await factory.create('chapter')
const members = await factory.createMany('member', 2)
const memberIds = members.map(p => p.id)

const results = await runGraphQLQuery(
`
query($memberIds: [ID]!, $chapterId: ID!) {
reassignMembersToChapter(memberIds: $memberIds, chapterId: $chapterId) { id }
}
`,
fields,
{memberIds: members.map(p => p.id), chapterId: chapter.id},
{currentUser: {roles: [ADMIN]}},
)
const context = {currentUser: {roles: [ADMIN]}}
const variables = {memberIds: members.map(p => p.id), chapterId: chapter.id}

const result = await runGraphQLMutation(fields, mutation, context, variables)

expect(
results.data.reassignMembersToChapter.map(p => p.id).sort()
result.data.reassignMembersToChapter.map(p => p.id).sort()
).to.deep.equal(
memberIds.sort()
)

const updatedMembers = await Member.getAll(...memberIds)
updatedMembers.forEach(p => {
updatedMembers.forEach(p => (
expect(p.chapterId).to.equal(chapter.id)
})
))
})

it('unauthorized users recieve an appropriate error')
it('invalid queries recieve an appropriate error')
})
48 changes: 21 additions & 27 deletions src/server/graphql/mutations/__tests__/saveChapter.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,23 @@
import factory from 'src/test/factories'
import {resetDB, runGraphQLMutation} from 'src/test/helpers'

import fields from '../index'
import saveChapter from '../saveChapter'

const fields = {saveChapter}
const query = `
mutation($chapter: InputChapter!) {
saveChapter(chapter: $chapter) {
id
name
channelName
timezone
githubTeamId
inviteCodes
createdAt
updatedAt
}
}
`

describe(testContext(__filename), function () {
beforeEach(resetDB)
Expand All @@ -15,26 +31,6 @@ describe(testContext(__filename), function () {
this.member = await factory.create('member', {id: this.user.id})
})

before(function () {
this.saveChapter = function (inputChapter) {
return runGraphQLMutation(
`mutation($chapter: InputChapter!) { saveChapter(chapter: $chapter) {
id
name
channelName
timezone
githubTeamId
inviteCodes
createdAt
updatedAt
}}`,
fields,
{chapter: inputChapter},
{currentUser: this.user},
)
}
})

it('creates a new chapter', async function () {
const {
name,
Expand All @@ -43,12 +39,10 @@ describe(testContext(__filename), function () {
inviteCodes,
} = await factory.build('chapter', {name: 'justachaptername'})

const result = await this.saveChapter({
name,
channelName,
timezone,
inviteCodes,
})
const context = {currentUser: this.user}
const variables = {chapter: {name, channelName, timezone, inviteCodes}}

const result = await runGraphQLMutation(fields, query, context, variables)

const newChapter = result.data.saveChapter
expect(newChapter).to.have.property('name').eq(name)
Expand Down
Loading