First draft of regimen level variables ✔️

pull/1086/head
Rick Carlino 2019-01-10 11:45:26 -06:00
parent 11e09800a5
commit 5e3017cc10
6 changed files with 77 additions and 19 deletions

View File

@ -11,13 +11,11 @@ module Api
end
def create
mutate Regimens::Create.run(params.as_json, regimen_params)
mutate Regimens::Create.run(raw_json, regimen_params)
end
def update
mutate Regimens::Update.run(params.as_json,
regimen_params,
regimen: the_regimen)
mutate Regimens::Update.run(raw_json, regimen_params, regimen: the_regimen)
end
def destroy

View File

@ -166,7 +166,7 @@ module CeleryScript
raise TypeCheckError, (BAD_LEAF % [ value.kind,
value.parent.kind,
allowed.inspect,
actual.inspect]) unless ok
actual.inspect ]) unless ok
end
def bad_body_kind(prnt, child, i, ok)

View File

@ -1,5 +1,7 @@
module FarmEvents
module FragmentHelpers
BAD_MODULE = \
"The '%s' module cannot use FragmentHelpers"
def self.included(base); base.extend(ClassMethods); end
module ClassMethods; end
@ -45,10 +47,11 @@ module FarmEvents
end
def owner
case self.class.parent.name
module_name = self.class.parent.name
case module_name
when "FarmEvents" then farm_event
else
binding.pry
when "Regimens" then regimen
else; raise BAD_MODULE % module_name
end
end
end

View File

@ -1,8 +1,8 @@
module Regimens
class Update < Mutations::Command
BAD_RECORD = "Failed to instantiate nested RegimenItem. Offending item: "
include FarmEvents::FragmentHelpers
using Sequences::CanonicalCeleryHelpers
BAD_RECORD = "Failed to instantiate nested RegimenItem. Offending item: "
required do
model :device, class: Device
@ -24,8 +24,9 @@ module Regimens
ActiveRecord::Base.transaction do
regimen.regimen_items.destroy_all
inputs[:regimen_items].map! do |ri|
RegimenItem.new(ri).tap{ |r| r.validate! }
RegimenItem.new(ri).tap { |r| r.validate! }
end
handle_body_field
regimen.update_attributes!(inputs.slice(:name, :color, :regimen_items))
end
end

View File

@ -28,7 +28,7 @@ describe Api::RegimensController do
regimen_items: [
{ time_offset: 100, sequence_id: s.id }
] }
post :create, params: payload
post :create, body: payload.to_json, format: :json
expect(response.status).to eq(200)
declr = json.fetch(:body).first
expect(declr).to be
@ -51,7 +51,7 @@ describe Api::RegimensController do
old_regimen_count = Regimen.count
old_item_count = RegimenItem.count
post :create, params: payload
post :create, body: payload.to_json, format: :json
expect(response.status).to eq(200)
expect(Regimen.count).to be > old_regimen_count

View File

@ -1,13 +1,14 @@
require 'spec_helper'
require "spec_helper"
describe Api::RegimensController do
include Devise::Test::ControllerHelpers
describe '#update' do
describe "#update" do
let(:user) { FactoryBot.create(:user) }
let(:sequence) { FakeSequence.create( device: user.device) }
it 'updates an old regimen' do
it "updates an old regimen" do
sign_in user
existing = Regimens::Create.run!(device: user.device, name: "x", color: "red", regimen_items: [])
@ -30,14 +31,70 @@ describe Api::RegimensController do
}
]
}
put :update, params: payload
put :update, body: payload.to_json, params: { id: existing.id }
expect(response.status).to eq(200)
expect(existing.reload.regimen_items.count).to eq(payload["regimen_items"].length)
expect(json[:name]).to eq("something new")
expect(existing.name).to eq("something new")
end
it 'catches bad regimen_items' do
it "changes variable assignments in `body`" do
sequence = FakeSequence.with_parameters
user = FactoryBot.create(:user, device: sequence.device)
sign_in user
var_declr = [
{
kind: "variable_declaration",
args: {
label: "parent",
data_value: {
kind: "coordinate",
args: { x: 0, y: 0, z: 0 }
}
}
}
]
existing = Regimens::Create.run!(device: user.device,
name: "x",
color: "red",
regimen_items: [],
body: var_declr)
payload = {
id: existing.id,
name: "something new",
color: "blue",
body: [
{
kind: "variable_declaration",
args: {
label: "parent",
data_value: {
kind: "tool",
args: {
tool_id: FactoryBot.create(:tool, device: sequence.device).id
}
}
}
}
],
regimen_items: [
{
time_offset: 950700000,
sequence_id: sequence.id
}
]
}
put :update,
body: payload.to_json,
format: :json,
params: { id: existing.id }
expect(response.status).to eq(200)
path = [:body, 0, :args, :data_value, :kind]
expect(json.dig(*path)).to eq(payload.dig(*path))
end
it "catches bad regimen_items" do
sign_in user
existing = Regimens::Create.run!(device: user.device, name: "x", color: "red", regimen_items: [])
payload = {
@ -46,8 +103,7 @@ describe Api::RegimensController do
"color" => "blue",
"regimen_items" => [ { "time_offset" => 950700000, "sequence_id" => 0 } ]
}
put :update, params: payload
put :update, body: payload.to_json, params: { id: existing.id }, format: :json
expect(response.status).to eq(422)
expect(json[:regimen_items]).to be
expect(json[:regimen_items])