Add update actipon and tests

pull/120/head
Rick Carlino 2015-01-16 07:42:45 -06:00
parent 614f2729f9
commit 79d447191e
10 changed files with 65 additions and 5 deletions

View File

@ -19,7 +19,7 @@ private
def mutate(outcome, options = {})
if outcome.success?
render options.merge(json: outcome)
render options.merge(json: outcome.result)
else
render options.merge(json: outcome.errors.message, status: 422)
end

View File

@ -13,6 +13,10 @@ module Api
end
end
def update
mutate Steps::Update.run(params: params, step: step)
end
private
def sequence

View File

@ -4,7 +4,7 @@ module Steps
required do
string :message_type, in: Step::MESSAGE_TYPES
model :sequence
model :sequence, class: Sequence
hash :command do
model :*, class: Object
end

View File

@ -0,0 +1,26 @@
module Steps
class Update < Mutations::Command
using MongoidRefinements
required do
model :step, class: Step
hash :params do
optional do
string :message_type, in: Step::MESSAGE_TYPES
hash :command do
model :*, class: Object
end
end
end
end
def execute
# FIXME: Right now, we do almost 0 validation on command objects.
# There are 7 different command types, with different validation rules.
# Maybe:
# 1. Create a StepValidatorFactory
# 2. Create a SingleCommandValidator, ReadStatusValidator, etc.
update(step, params)
end
end
end

View File

@ -1,4 +1,3 @@
class StepSerializer < ActiveModel::Serializer
attributes :_id
attributes :_id, :message_type, :command
end

View File

@ -4,7 +4,7 @@ Dss::Application.routes.draw do
namespace :api, defaults: {format: :json} do
resources :devices, only: [:index, :destroy, :create, :update]
resources :sequences, only: [:create, :destroy] do
resources :steps, only: [:create, :destroy]
resources :steps, only: [:create, :update, :destroy]
end
end

View File

@ -21,5 +21,14 @@ module MongoidRefinements
model.errors.messages
end
end
# See documentation for `create()`.
def update(model, inputs = {})
if model.update_attributes(inputs)
model
else
model.errors.messages
end
end
end
end

View File

@ -0,0 +1,22 @@
require 'spec_helper'
describe Api::StepsController do
include Devise::TestHelpers
describe '#update' do
let(:sequence) { FactoryGirl.create(:sequence) }
let(:step) { sequence.steps[0] }
let(:user) { sequence.user }
it 'updates a step' do
sign_in user
params = { id: step._id.to_s,
sequence_id: sequence._id.to_s,
message_type: 'read_status'}
patch :update, params
expect(response.status).to eq(200)
expect(step.reload.message_type).to eq("read_status")
end
end
end