Ensure sub_sequence_id is valid on sequence AST.

pull/281/head
Rick Carlino 2016-10-14 14:08:30 -05:00
parent 612419338f
commit 6a69db4f7b
8 changed files with 42 additions and 13 deletions

View File

@ -22,6 +22,7 @@ gem 'active_model_serializers', '~> 0.8.3'
gem 'ice_cube'
gem 'rack-cors', require: 'rack/cors'
gem 'mysql'
gem 'database_cleaner'
source 'https://rails-assets.org' do
gem 'rails-assets-lodash'

View File

@ -107,6 +107,7 @@ GEM
adamantium (~> 0.2.0)
equalizer (~> 0.0.9)
concurrent-ruby (1.0.2)
database_cleaner (1.5.3)
diff-lcs (1.2.5)
docile (1.1.5)
domain_name (0.5.20160826)
@ -352,6 +353,7 @@ DEPENDENCIES
capybara
codeclimate-test-reporter
coffee-rails
database_cleaner
devise!
factory_girl_rails
faker

View File

@ -28,7 +28,10 @@ class Sequence < ActiveRecord::Base
.defineArg(:data_type, [String])
.defineArg(:milliseconds, [Fixnum])
.defineArg(:message, [String])
.defineArg(:sub_sequence_id, [Fixnum])
.defineArg(:sub_sequence_id, [Fixnum]) do |node|
missing = !exists?(node.value)
node.invalidate!("Sequence ##{ node.value } does not exist.") if missing
end
.defineArg(:lhs, [String])
.defineArg(:op, [String])
.defineArg(:rhs, [Fixnum])

View File

@ -5,17 +5,14 @@ describe Api::SequencesController do
include Devise::Test::ControllerHelpers
describe '#create' do
let(:nodes) {
f = File.read("./spec/lib/celery_script/ast_fixture3.json")
JSON.parse(f)["body"]
}
let(:user) { FactoryGirl.create(:user) }
let(:nodes) { sequence_body_for(user) }
it 'handles a well formed AST in the body attribute' do
sign_in user
input = { name: "Scare Birds",
body: nodes }
sequence_body_for(user)
post :create,
input.merge(format: :json)
expect(response.status).to eq(200)

View File

@ -1,4 +1,23 @@
module Helpers
AST_FIXTURE = File.read("./spec/lib/celery_script/ast_fixture3.json").freeze
# Create a VALID fake sequence.body for a particular user. Creates a fake
# subsequence in the DB when called.
def sequence_body_for(input)
body = JSON.parse(AST_FIXTURE)["body"]
case input
when User; id = FactoryGirl.create(:sequence, device: user.device).id
when Sequence; id = input.id
else; raise "?????"
end
body.map! do |node|
has_subseq = node.dig("args", "sub_sequence_id");
node["args"]["sub_sequence_id"] = id if has_subseq
node
end
body
end
def sign_in_as(user)
# For when you're actually testing the login UI components. Otherwise,
# consider using the devise test helper `sign_in`

View File

@ -1,9 +1,15 @@
require 'spec_helper'
describe CeleryScript::Checker do
file = File.read("./spec/lib/celery_script/ast_fixture3.json")
let(:hash) { JSON.parse(file).deep_symbolize_keys }
let(:hash) do
{
kind: "sequence",
args: {},
comment: "Properly formatted, syntactically valid sequence.",
body: sequence_body_for(FactoryGirl.create(:sequence))
}.deep_symbolize_keys
end
let(:tree) do
CeleryScript::AstNode.new(hash)

View File

@ -3,10 +3,7 @@ require 'spec_helper'
describe Sequences::Create do
let(:user) { FactoryGirl.create(:user) }
let(:device) { user.device }
let(:body) {
f = File.read("./spec/lib/celery_script/ast_fixture3.json")
JSON.parse(f)["body"]
}
let(:body) { sequence_body_for(user) }
name = Faker::Pokemon.name
let(:sequence_params) do

View File

@ -38,6 +38,11 @@ SmarfDoc.config do |c|
c.output_file = 'api_docs.md'
end
require 'database_cleaner'
DatabaseCleaner.strategy = :truncation
# then, whenever you need to clean the DB
DatabaseCleaner.clean
RSpec.configure do |config|
config.backtrace_exclusion_patterns = [/gems/]
@ -49,7 +54,6 @@ RSpec.configure do |config|
if ENV['docs']
config.before(:each, type: :controller) do
SmarfDoc.run!(request, response)
ActiveRecord::Base.subclasses.(&:destroy_all)
end
end