|
@@ -0,0 +1,117 @@
|
|
|
+/** crud.test.js
|
|
|
+ * Test file for crud.js.
|
|
|
+ */
|
|
|
+
|
|
|
+import { crudHttpApi, crudLocalstorageApi, reduxCrudGen } from './crud'
|
|
|
+import { put, call, takeEvery } from 'redux-saga/effects'
|
|
|
+
|
|
|
+describe('HTTP API', () => {
|
|
|
+ it('opens http connections', () => {
|
|
|
+ const action = {
|
|
|
+ type: 'project/LIST_REQUEST',
|
|
|
+ id: 1,
|
|
|
+ data: {name: 'Titlis'}
|
|
|
+ }
|
|
|
+ const options = { uri: 'http://localhost:4000/db' }
|
|
|
+ return crudHttpApi(action, options).then(data => {
|
|
|
+ expect(JSON.parse(data)).toHaveLength(1)
|
|
|
+ })
|
|
|
+ })
|
|
|
+})
|
|
|
+
|
|
|
+describe('LocalStorage API', () => {
|
|
|
+ it('reads from localstorage', () => {
|
|
|
+ })
|
|
|
+ it('writes to localstorage', () => {
|
|
|
+ })
|
|
|
+})
|
|
|
+
|
|
|
+describe('Crud Generator', () => {
|
|
|
+ const api = () => null
|
|
|
+ const project = reduxCrudGen('project', 'PROJ', api)
|
|
|
+ it('generates action types', () => {
|
|
|
+ expect(project.actionTypes).toHaveProperty('CREATE_REQUEST', 'project/CREATE_REQUEST')
|
|
|
+ expect(project.actionTypes).toHaveProperty('READ_REQUEST', 'project/READ_REQUEST')
|
|
|
+ expect(project.actionTypes).toHaveProperty('UPDATE_REQUEST', 'project/UPDATE_REQUEST')
|
|
|
+ expect(project.actionTypes).toHaveProperty('DELETE_REQUEST', 'project/DELETE_REQUEST')
|
|
|
+ expect(project.actionTypes).toHaveProperty('CREATE_SUCCESS', 'project/CREATE_SUCCESS')
|
|
|
+ expect(project.actionTypes).toHaveProperty('READ_SUCCESS', 'project/READ_SUCCESS')
|
|
|
+ expect(project.actionTypes).toHaveProperty('UPDATE_SUCCESS', 'project/UPDATE_SUCCESS')
|
|
|
+ expect(project.actionTypes).toHaveProperty('DELETE_SUCCESS', 'project/DELETE_SUCCESS')
|
|
|
+ expect(project.actionTypes).toHaveProperty('CREATE_FAILURE', 'project/CREATE_FAILURE')
|
|
|
+ expect(project.actionTypes).toHaveProperty('READ_FAILURE', 'project/READ_FAILURE')
|
|
|
+ expect(project.actionTypes).toHaveProperty('UPDATE_FAILURE', 'project/UPDATE_FAILURE')
|
|
|
+ expect(project.actionTypes).toHaveProperty('DELETE_FAILURE', 'project/DELETE_FAILURE')
|
|
|
+ })
|
|
|
+ it('generates actions', () => {
|
|
|
+ expect(project.actions).toHaveProperty('createProject')
|
|
|
+ expect(project.actions).toHaveProperty('readProject')
|
|
|
+ expect(project.actions).toHaveProperty('updateProject')
|
|
|
+ expect(project.actions).toHaveProperty('deleteProject')
|
|
|
+ })
|
|
|
+ it('actions return action objects', () => {
|
|
|
+ const id = 1
|
|
|
+ const data = { payload: 'Some thing' }
|
|
|
+ expect(project.actions.createProject(data)).toEqual({type: 'project/CREATE_REQUEST', data})
|
|
|
+ expect(project.actions.readProject(id, data)).toEqual({type: 'project/READ_REQUEST', id, data})
|
|
|
+ expect(project.actions.updateProject(id, data)).toEqual({type: 'project/UPDATE_REQUEST', id, data})
|
|
|
+ expect(project.actions.deleteProject(id)).toEqual({type: 'project/DELETE_REQUEST', id})
|
|
|
+ })
|
|
|
+ it('generates the empty state', () => {
|
|
|
+ expect(project.state).toEqual([])
|
|
|
+ })
|
|
|
+ it('generates the worker', () => {
|
|
|
+ expect(project.worker).not.toBeUndefined()
|
|
|
+ })
|
|
|
+ it('worker handles api calls', () => {
|
|
|
+ const triggerAction = { type: 'project/READ_REQUEST', id: 1, data: 'API in' }
|
|
|
+ const data = 'API out'
|
|
|
+ const expectedAction1 = { type: 'project/READ_SUCCESS', data }
|
|
|
+ const error = 'Oopsie...'
|
|
|
+ const expectedAction2 = { type: 'project/READ_FAILURE', error }
|
|
|
+ const iterator1 = project.worker(triggerAction)
|
|
|
+ expect(iterator1.next().value).toEqual(call(api, triggerAction))
|
|
|
+ expect(iterator1.next(data).value).toEqual(put(expectedAction1))
|
|
|
+ expect(iterator1.next().done).toBe(true)
|
|
|
+ const iterator2 = project.worker(triggerAction)
|
|
|
+ expect(iterator2.next().value).toEqual(call(api, triggerAction))
|
|
|
+ expect(iterator2.throw(error).value).toEqual(put(expectedAction2))
|
|
|
+ expect(iterator2.next().done).toBe(true)
|
|
|
+ })
|
|
|
+ it('generates the watcher', () => {
|
|
|
+ expect(project.watcher).not.toBeUndefined()
|
|
|
+ })
|
|
|
+ it('watcher intercepts the requests', () => {
|
|
|
+ const iterator1 = project.watcher()
|
|
|
+ expect(iterator1.next().value).toEqual(takeEvery('project/CREATE_REQUEST', project.worker))
|
|
|
+ expect(iterator1.next().value).toEqual(takeEvery('project/READ_REQUEST', project.worker))
|
|
|
+ expect(iterator1.next().value).toEqual(takeEvery('project/UPDATE_REQUEST', project.worker))
|
|
|
+ expect(iterator1.next().value).toEqual(takeEvery('project/DELETE_REQUEST', project.worker))
|
|
|
+ expect(iterator1.next().done).toBe(true)
|
|
|
+ })
|
|
|
+ it('generates the reducer', () => {
|
|
|
+ expect(project.reducer).not.toBeUndefined()
|
|
|
+ })
|
|
|
+ it('reducer returns the empty state', () => {
|
|
|
+ const state = []
|
|
|
+ const action = { type: 'project/CREATE_SUCCESS' }
|
|
|
+ expect(project.reducer()).toEqual([])
|
|
|
+ })
|
|
|
+ it('reducer returns the empty state', () => {
|
|
|
+ let state = []
|
|
|
+ state = project.reducer()
|
|
|
+ expect(state).toEqual([])
|
|
|
+ expect(state).toEqual([])
|
|
|
+ })
|
|
|
+ it('reducer handles the crud actions', () => {
|
|
|
+ let state = []
|
|
|
+ state = project.reducer()
|
|
|
+ expect(state).toEqual([])
|
|
|
+ state = project.reducer(state, { type: 'project/CREATE_SUCCESS', data: { name: 'MyNewObject', happy: true } })
|
|
|
+ expect(state).toEqual([{ name: 'MyNewObject', happy: true }])
|
|
|
+ state = project.reducer(state, { type: 'project/UPDATE_SUCCESS', id: 0, data: { name: 'MyUpdatedObject' } })
|
|
|
+ expect(state).toEqual([{ name: 'MyUpdatedObject', happy: true }])
|
|
|
+ state = project.reducer(state, { type: 'project/DELETE_SUCCESS', id: 0 })
|
|
|
+ expect(state).toEqual([])
|
|
|
+ })
|
|
|
+})
|