Fix Sequences#create

pull/280/head
Rick Carlino 2016-10-07 12:39:22 -05:00
parent 2f28be9033
commit 089dab3e87
6 changed files with 45 additions and 5 deletions

View File

@ -9,6 +9,7 @@ module Sequences
def validate
body.each_with_index do |node, index|
validate_kind(node, index)
validate_structure(node, index)
end
@ -32,7 +33,7 @@ module Sequences
sorry("'pin_mode'",
index + 1,
"be " + Sequence::ALLOWED_PIN_MODES.join(" or "),
"got #{ actual }")
"got #{ actual } (#{ actual.class })")
end
end
@ -81,6 +82,10 @@ module Sequences
private
def validate_kind(node, index)
# foo unless Sequence::NODE_KINDS.include?(node[:kind])
end
def validate_structure(node, index)
Sequence::ARGS_SCHEMA[node[:kind].to_sym].each do |arg|
value = node[:args][arg]

View File

@ -1,12 +1,33 @@
module Sequences
module AstValidatorsInstanceMethods
def validate_ast!
if body
run_ast_validations
else
body = []
end
end
def run_ast_validations
result = Sequences::AstParser.run(body: body)
errs = result.errors
if errs && errs.any?
errs.each do |err|
add_error(:body, :body, err[1].message)
end
end
end
end
module AstValidators
def ast_body(optionality = :required) # Or "optional"
self.include(AstValidatorsInstanceMethods)
self.send(optionality) do
array :body do
hash do
string :kind, in: Sequence::NODE_KINDS
string :kind
duck :args, methods: [:[], :[]=]
string :comments, default: nil
string :comments, default: nil, nils: true
end
end
end

View File

@ -13,6 +13,7 @@ module Sequences
end
def execute
validate_ast!
Sequence.create!(inputs)
end
end

View File

@ -1,3 +1,3 @@
class SequenceSerializer < ActiveModel::Serializer
attributes :id, :name, :color
attributes :id, :name, :color, :body, :args, :kind
end

View File

@ -5,9 +5,22 @@ describe Api::SequencesController do
include Devise::Test::ControllerHelpers
describe '#create' do
let(:nodes) {
JSON.parse(File.read("./spec/mutations/sequences/ast_fixture.json"))
}
let(:user) { FactoryGirl.create(:user) }
it 'handles a well formed AST in the body attribute' do
sign_in user
input = { name: "Scare Birds",
body: nodes }
post :create,
input.merge(format: :json)
binding.pry
expect(response.status).to eq(200)
end
it 'creates a new sequences for a user' do
sign_in user
input = { name: "Scare Birds" }

View File

@ -42,7 +42,7 @@ describe Sequences::AstParser do
expect(results.success?).to eq(false)
expect(results.errors.length).to eq(1)
actual = results.errors["bad_args"].message
expected = "Expected 'pin_mode' in step 3 to be 0 or 1 but got 6"
expected = "Expected 'pin_mode' in step 3 to be 0 or 1 but got 6 (Fixnum)"
expect(actual).to eq(expected)
end