Separate out logic for tasks plus specs

This commit is contained in:
Daniel Saewitz 2013-03-01 05:16:55 -05:00
parent 26de70c17c
commit c080ddc683
2 changed files with 78 additions and 24 deletions

View file

@ -40,11 +40,11 @@ router.get '/status', (req, res) ->
res.json status: 'up'
router.get '/user', auth, (req, res) ->
self = req.userObj
user = req.userObj
delete self.apiToken
delete user.apiToken
res.json self
res.json user
router.get '/task/:id', auth, (req, res) ->
task = req.userObj.tasks[req.params.id]
@ -52,30 +52,41 @@ router.get '/task/:id', auth, (req, res) ->
res.json 200, task
router.put '/task/:id', auth, (req, res) ->
task = req.userObj.tasks[req.params.id]
return res.json 400, err: "No task found." if !task || _.isEmpty(task)
validateTask = (req, res, next) ->
task = {}
# If we're updating, get the task from the user
if req.method is 'PUT'
task = req.userObj?.tasks[req.params.id]
return res.json 400, err: "No task found." if !task || _.isEmpty(task)
title = sanitize(req.body.title).xss()
text = sanitize(req.body.text).xss()
newTask = { type, text, notes, value, up, down, completed } = req.body
task.title = title if title
task.text = text if text
#task.type = req.body.type if /^(habit|todo|daily|reward)$/.test req.body.type
text = sanitize(text).xss()
notes = sanitize(notes).xss()
value = sanitize(value).toInt()
req.user.set "tasks.#{task.id}", task
switch type
when 'habit'
newTask.up = true unless typeof up is 'boolean'
newTask.down = true unless typeof down is 'boolean'
when 'daily', 'todo'
newTask.completed = false unless typeof completed is 'boolean'
res.json 200, task
_.extend task, newTask
req.task = task
next()
router.post '/user/task', auth, (req, res) ->
task = { title, text, type, value, note } = req.body
return res.json 400, err: "type must be habit, todo, daily, or reward" unless /^habit|todo|daily|reward$/.test type
return res.json 400, err: "must have a title" unless check(title).notEmpty()
return res.json 400, err: "must have text" unless check(text).notEmpty()
router.put '/task/:id', auth, validateTask, (req, res) ->
req.user.set "tasks.#{req.task.id}", req.task
self = req.userObj
res.json 200, req.task
value ||= 0
router.post '/user/task', auth, validateTask, (req, res) ->
task = req.task
type = task.type
unless /^habit|todo|daily|reward$/.test type
return res.json 400, err: 'type must be habit, todo, daily, or reward'
model = req.getModel()
model.ref '_user', req.user
@ -85,8 +96,8 @@ router.post '/user/task', auth, (req, res) ->
res.json 201, task
router.get '/user/tasks', auth, (req, res) ->
self = req.userObj
return res.json 400, NO_USER_FOUND if !self || _.isEmpty(self)
user = req.userObj
return res.json 400, NO_USER_FOUND if !user || _.isEmpty(user)
model = req.getModel()
model.ref '_user', req.user

View file

@ -132,18 +132,61 @@ describe 'API', ->
expect(user.get().tasks[res.body.id]).to.be.an('object')
done()
it 'POST /api/v1/user/task (without type)', (done) ->
request.post("#{baseURL}/user/task")
.set('Accept', 'application/json')
.set('X-API-User', currentUser.id)
.set('X-API-Key', currentUser.apiToken)
.send({})
.end (res) ->
query = model.query('users').withIdAndToken(currentUser.id, currentUser.apiToken)
query.fetch (err, user) ->
expect(res.body.err).to.be 'type must be habit, todo, daily, or reward'
expect(res.statusCode).to.be 400
done()
it 'POST /api/v1/user/task (only type)', (done) ->
request.post("#{baseURL}/user/task")
.set('Accept', 'application/json')
.set('X-API-User', currentUser.id)
.set('X-API-Key', currentUser.apiToken)
.send(type: 'habit')
.end (res) ->
query = model.query('users').withIdAndToken(currentUser.id, currentUser.apiToken)
query.fetch (err, user) ->
expect(res.body.err).to.be undefined
expect(res.statusCode).to.be 201
expect(res.body.id).not.to.be.empty()
# Ensure that user owns the newly created object
expect(user.get().tasks[res.body.id]).to.be.an('object')
done()
it 'PUT /api/v1/task/:id', (done) ->
tid = _.pluck(currentUser.tasks, 'id')[0]
request.put("#{baseURL}/task/#{tid}")
.set('Accept', 'application/json')
.set('X-API-User', currentUser.id)
.set('X-API-Key', currentUser.apiToken)
.send(title: 'a new title',text: 'hi')
.send(text: 'bye')
.end (res) ->
expect(res.body.err).to.be undefined
expect(res.statusCode).to.be 200
currentUser.tasks[tid].text = 'bye'
expect(res.body).to.eql currentUser.tasks[tid]
done()
it 'PUT /api/v1/task/:id (update notes)', (done) ->
tid = _.pluck(currentUser.tasks, 'id')[0]
request.put("#{baseURL}/task/#{tid}")
.set('Accept', 'application/json')
.set('X-API-User', currentUser.id)
.set('X-API-Key', currentUser.apiToken)
.send(text: 'hi',notes:'foobar matey')
.end (res) ->
expect(res.body.err).to.be undefined
expect(res.statusCode).to.be 200
currentUser.tasks[tid].title = 'a new title'
currentUser.tasks[tid].text = 'hi'
currentUser.tasks[tid].notes = 'foobar matey'
expect(res.body).to.eql currentUser.tasks[tid]
done()