Fix Sequences#create
parent
2f28be9033
commit
089dab3e87
|
@ -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]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -13,6 +13,7 @@ module Sequences
|
|||
end
|
||||
|
||||
def execute
|
||||
validate_ast!
|
||||
Sequence.create!(inputs)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
class SequenceSerializer < ActiveModel::Serializer
|
||||
attributes :id, :name, :color
|
||||
attributes :id, :name, :color, :body, :args, :kind
|
||||
end
|
||||
|
|
|
@ -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" }
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue