@teikei/api
Version:
Teikei API server. Teikei is the software that powers ernte-teilen.org, a website that maps out Community-supported Agriculture in Germany.
109 lines (98 loc) • 3.48 kB
JavaScript
import { MethodNotAllowed, BadRequest } from '@feathersjs/errors'
import uuid from 'uuid/v4'
import _ from 'lodash'
import app from '../../app'
import { truncateTestDatabase } from '../../../db/index'
import { sendConfirmationEmail } from '../../hooks/email'
jest.mock('../../hooks/email')
//disable auth
jest.mock('../../hooks/authorization')
describe('users service', () => {
const service = app.service('users')
it('gets registered', async () => {
expect(service).toBeTruthy()
})
const params = { provider: 'rest', headers: {} }
it('disallows find', async () => {
await expect(service.find(params)).rejects.toThrow(MethodNotAllowed)
})
it('disallows get', async () => {
await expect(service.get(1, params)).rejects.toThrow(MethodNotAllowed)
})
it('disallows update', async () => {
await expect(service.update(1, {}, params)).rejects.toThrow(
MethodNotAllowed
)
})
it('disallows remove', async () => {
await expect(service.remove(1, params)).rejects.toThrow(MethodNotAllowed)
})
describe('creates users', () => {
const data = () => ({
email: `${uuid()}@teikei.com`,
name: 'Guest',
phone: '1234',
password: 'guest'
})
it('stores the user', async () => {
const user = data()
const result = await service.create(user, params)
expect(result).not.toBeNull()
expect(result.email).toEqual(user.email)
expect(result.name).toEqual(user.name)
expect(result.phone).toEqual(user.phone)
})
it('generates a hashed password', async () => {
const user = data()
const result = await service.create(user, params)
const internal = await service.get(result.id)
expect(internal.password).toBeTruthy()
expect(internal.password).not.toEqual(user.password)
})
it('triggers a confirmation email', async () => {
const user = data()
await service.create(user, params)
expect(sendConfirmationEmail).toHaveBeenCalled()
})
it('sets user origin and verification info', async () => {
const user = data()
const result = await service.create(user, {
...params,
headers: { origin: 'teikei.com' }
})
const internal = await service.get(result.id)
expect(internal.origin).toEqual('teikei.com')
expect(internal.isVerified).toEqual(false)
expect(internal.verifyExpires).not.toBeNull()
expect(internal.verifyToken).not.toBeNull()
expect(internal.verifyShortToken).not.toBeNull()
expect(internal.verifyChanges).not.toBeNull()
})
it('sets a createdAt timestamp', async () => {
const user = data()
const result = await service.create(user, params)
expect(result.createdAt).not.toBeNull()
})
it('disallows creating users with existing email', async () => {
const user = data()
await service.create(user, params)
await expect(service.create(user, params)).rejects.toThrow(BadRequest)
})
it("doesn't expose the password and internal fields", async () => {
const user = data()
const result = await service.create(user, params)
const protectedFields = [
'password',
'origin',
'baseurl',
'verifyExpires',
'verifyToken',
'verifyShortToken'
]
protectedFields.forEach(p => expect(_.keys(result)).not.toContain(p))
})
})
describe('patches users', () => {
})
afterAll(() => truncateTestDatabase())
})