spec/unit/schema_spec.rb in syncano-4.0.0.alpha4 vs spec/unit/schema_spec.rb in syncano-4.0.0.pre
- old
+ new
@@ -1,17 +1,67 @@
require_relative '../spec_helper'
+
+require 'rspec/expectations'
+require 'active_attr/matchers/have_attribute_matcher'
+require 'shoulda-matchers'
+
describe Syncano::Schema do
- let(:connection) { double 'connection' }
+ include ActiveAttr::Matchers
+ let(:connection) { double("connection") }
+
+ subject { described_class.new connection }
+
before do
- expect(connection).to receive(:request).with(:get, described_class.schema_path) { schema }
+ expect(connection).to receive(:request).with(:get, described_class::SCHEMA_PATH) { schema }
+
+ Syncano::Resources.instance_eval do
+ constants.each do |const|
+ if ![:Base, :Collection, :Space].include?(const) && const_defined?(const)
+ remove_const const
+ end
+ end
+ end
end
- subject { described_class.new(connection) }
+ describe 'process!' do
+ it 'defintes classes according to the schema' do
+ expect { Syncano::Resources::Class }.to raise_error(NameError)
- specify '#resource_definitions' do
- expect(subject.definition).to be_kind_of(Hash)
+ subject.process!
+
+ expect { Syncano::Resources::Class }.to_not raise_error
+
+ expect(Syncano::Resources::Class).to have_attribute(:name)
+ expect(Syncano::Resources::Class).to have_attribute(:status)
+ expect(Syncano::Resources::Class).to have_attribute(:created_at)
+ expect(Syncano::Resources::Class).to have_attribute(:description)
+ expect(Syncano::Resources::Class).to have_attribute(:updated_at)
+ expect(Syncano::Resources::Class).to have_attribute(:objects_count)
+ expect(Syncano::Resources::Class).to have_attribute(:metadata)
+ expect(Syncano::Resources::Class).to have_attribute(:revision)
+
+ class_instance = Syncano::Resources::Class.new(connection, {}, { links: {} })
+
+ expect(class_instance).to validate_presence_of(:name)
+ expect(class_instance).to validate_length_of(:name).is_at_most(50)
+
+ expect(class_instance).to respond_to(:objects)
+
+ code_box_instance = Syncano::Resources::CodeBox.new(connection, {}, { links: {} })
+ expect(code_box_instance).to validate_inclusion_of(:runtime_name).
+ in_array(%w(nodejs ruby python))
+
+ end
+
+ it 'defines foreign keys attributes when attributes names collide with links' do
+ subject.process!
+
+ schedule_instance = Syncano::Resources::Schedule.new connection, {}, links: {}
+
+ expect(schedule_instance).to respond_to(:codebox)
+ end
end
def schema
JSON.parse('
[