You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
demo-graphql-oauth/src/app/UserResolver.spec.ts

152 lines
3.7 KiB

import { gql } from "apollo-server"
import { createConnection, getConnection } from "typeorm"
import { callSchema, connectionOptionsforTesting } from "./schema"
import { signToken, verifyToken } from "./userResolver/auth"
import { LoginTokens } from "./userResolver/LoginTokens"
import { User } from "./userResolver/User"
beforeAll(async () => {
return await createConnection(connectionOptionsforTesting())
})
afterAll(async () => {
return await getConnection().close()
})
afterEach(async () => {
return await getConnection().synchronize(true)
})
describe("resolver of user", () => {
describe("createUser mutation should", () => {
it("return email as it creates user with mutation", async () => {
const createUserMutation = gql`
mutation {
createUser(email: "email@email.com", password: "password") {
email
}
}
`
const response = await callSchema(createUserMutation)
expect(response.errors).toBeUndefined()
expect(response.data).toMatchObject({
createUser: { email: "email@email.com" },
})
})
})
describe("users query should", () => {
it("return emails of registered users", async () => {
const usersQuery = gql`
query {
users {
email
}
}
`
const user = await User.create({
email: "email@email.com",
}).save()
const response = await callSchema(usersQuery)
expect(response.errors).toBeUndefined()
expect(response.data).toMatchObject({
users: [{ email: user.email }],
})
})
})
describe("loginTokens query should", () => {
const loginTokensQuery = gql`
query {
loginTokens(email: "email@email.com", password: "good-password") {
accessToken
}
}
`
it("return error for non-existent user", async () => {
const response = await callSchema(loginTokensQuery)
expect(response.errors).not.toBeUndefined()
expect(response.data).toBeNull()
})
it("return error for bad password", async () => {
await User.create({
email: "email@email.com",
password: "BAD-password",
}).save()
const response = await callSchema(loginTokensQuery)
expect(response.errors).not.toBeUndefined()
expect(response.data).toBeNull()
})
it("return a valid access token with good credentials", async () => {
await User.create({
email: "email@email.com",
password: "good-password",
}).save()
const response = await callSchema(loginTokensQuery)
const accessToken = response.data!.loginTokens.accessToken
const loginTokens = new LoginTokens()
loginTokens.accessToken = accessToken
expect(response.errors).toBeUndefined()
expect(response.data).toMatchObject({ loginTokens })
expect(verifyToken(accessToken)).toBeTruthy()
})
})
describe("me query should", () => {
const meQuery = gql`
query {
me {
email
}
}
`
it("return an error without a valid jwt token", async () => {
const context = {
req: {
headers: {
authorization: "Bearer INVALID-TOKEN",
},
},
}
const response = await callSchema(meQuery, context)
expect(response.errors).not.toBeUndefined()
expect(response.data).toBeNull()
})
it("return an user with a valid jwt token", async () => {
const user = await User.create({
email: "email@email.com",
}).save()
const context = {
req: {
headers: {
authorization: "Bearer " + signToken({ userId: user.id }),
},
},
}
const response = await callSchema(meQuery, context)
expect(response.errors).toBeUndefined()
expect(response.data).toMatchObject({
me: { email: user.email },
})
})
})
})