spec/model_spec.rb in cistern-2.2.7 vs spec/model_spec.rb in cistern-2.3.0
- old
+ new
@@ -6,15 +6,15 @@
identity :id
attribute :name
attribute :properties
def save
- attributes
+ dirty_attributes
end
end
- it 'should merge and save attributes' do
+ it 'should merge and save dirty attributes' do
model = UpdateSpec.new(name: 'steve')
model.save
expect(model.update(name: 'karen')).to eq(name: 'karen')
end
@@ -53,11 +53,11 @@
class SpecificModelService
include Cistern::Client
end
class SpecificModelService::Jimbob < SpecificModelService::Model
- service_method :john_boy
+ cistern_method :john_boy
end
expect(SpecificModelService.new).not_to respond_to(:jimbob)
expect(SpecificModelService.new).to respond_to(:john_boy)
expect(SpecificModelService.new.john_boy).to be_a(SpecificModelService::Jimbob)
@@ -78,172 +78,20 @@
model.name = 'anotherstring'
expect(duplicate.name).to eq('string')
end
- context 'attribute parsing' do
- class TypeSpec < Sample::Model
- identity :id
- attribute :name, type: :string
- attribute :created_at, type: :time
- attribute :flag, type: :boolean
- attribute :list, type: :array
- attribute :number, type: :integer
- attribute :floater, type: :float
- attribute :butternut_id, squash: %w(squash id), type: :integer
- attribute :butternut_type, squash: %w(squash type)
- attribute :squash
- attribute :vegetable, aliases: 'squash'
- attribute :custom, parser: lambda { |v, _| "X!#{v}" }
- attribute :default, default: 'im a squash'
- attribute :string_allow_nil, type: :string, allow_nil: true
-
- attribute :same_alias_1, aliases: 'nested'
- attribute :same_alias_2, aliases: 'nested'
-
- attribute :same_alias_squashed_1, squash: %w(nested attr_1)
- attribute :same_alias_squashed_2, squash: %w(nested attr_2)
- attribute :same_alias_squashed_3, squash: %w(nested attr_2)
- attribute :adam_attributes, aliases: 'attributes'
-
- def save
- requires :flag
- end
+ describe 'deprecation', :deprecated do
+ class DeprecatedModelService
+ include Cistern::Client
end
- it 'should parse string' do
- expect(TypeSpec.new(name: 1).name).to eq('1')
- expect(TypeSpec.new(name: "b").name).to eq('b')
- expect(TypeSpec.new(name: nil).name).to eq("")
- end
-
- it 'should allow nils in string types' do
- expect(TypeSpec.new(string_allow_nil: nil).string_allow_nil).to eq(nil)
- end
- it "should handle a 'attributes' aliased attribute" do
- expect(TypeSpec.new(attributes: 'x').adam_attributes).to eq('x')
- end
-
- it 'should parse time' do
- time = Time.now
- created_at = TypeSpec.new(created_at: time.to_s).created_at
- expect(created_at).to be_a(Time)
- expect(created_at.to_i).to eq(time.to_i)
- end
-
- it 'should parse boolean' do
- expect(TypeSpec.new(flag: 'false').flag).to be_falsey
- expect(TypeSpec.new(flag: 'true').flag).to be_truthy
- expect(TypeSpec.new(flag: false).flag).to be_falsey
- expect(TypeSpec.new(flag: true).flag).to be_truthy
- expect(TypeSpec.new(flag: '0').flag).to be_falsey
- expect(TypeSpec.new(flag: '1').flag).to be_truthy
- expect(TypeSpec.new(flag: 0).flag).to be_falsey
- expect(TypeSpec.new(flag: 1).flag).to be_truthy
- expect(TypeSpec.new(flag: false)).not_to be_flag
- expect(TypeSpec.new(flag: true)).to be_flag
- end
-
- it 'should parse an array' do
- expect(TypeSpec.new(list: []).list).to eq([])
- expect(TypeSpec.new(list: 'item').list).to eq(['item'])
- end
-
- it 'should parse a float' do
- expect(TypeSpec.new(floater: '0.01').floater).to eq(0.01)
- expect(TypeSpec.new(floater: 0.01).floater).to eq(0.01)
- end
-
- it 'should use custom parser' do
- expect(TypeSpec.new(custom: '15').custom).to eq('X!15')
- end
-
- it 'should squash, cast, alias an attribute and keep a vanilla reference' do
- # vanilla squash
- expect(TypeSpec.new({ 'squash' => { 'id' => '12', 'type' => 'fred' } }).butternut_type).to eq('fred')
- expect(TypeSpec.new({ 'squash' => { 'id' => '12', 'type' => nil } }).butternut_type).to be_nil
- expect(TypeSpec.new({ 'squash' => nil }).butternut_type).to be_nil
-
- # composite processors: squash and cast
- expect(TypeSpec.new({ 'squash' => { 'id' => '12', 'type' => 'fred' } }).butternut_id).to eq(12)
- expect(TypeSpec.new({ 'squash' => { 'id' => nil, 'type' => 'fred' } }).butternut_id).to be_nil
- expect(TypeSpec.new({ 'squash' => { 'type' => 'fred' } }).butternut_id).to be_nil
-
- # override intermediate processing
- expect(TypeSpec.new({ 'squash' => { 'id' => '12', 'type' => 'fred' } }).squash).to eq({ 'id' => '12', 'type' => 'fred' })
-
- # alias of override
- expect(TypeSpec.new({ 'squash' => { 'id' => '12', 'type' => 'fred' } }).vegetable).to eq({ 'id' => '12', 'type' => 'fred' })
- end
-
- it 'should set a default value' do
- expect(TypeSpec.new.default).to eq('im a squash')
- end
-
- it 'should override a default value' do
- expect(TypeSpec.new(default: 'now im a different squash').default).to eq('now im a different squash')
- end
-
- context 'allowing the same alias for multiple attributes' do
- it 'should do so when not squashing' do
- type_spec = TypeSpec.new({ 'nested' => 'bamboo' })
- expect(type_spec.same_alias_1).to eq('bamboo')
- expect(type_spec.same_alias_2).to eq('bamboo')
+ it 'responds to #service' do
+ class Deprecation < DeprecatedModelService::Model
+ service_method :deprecator
end
- it 'should do so when squashing' do
- type_spec = TypeSpec.new({ 'nested' => { 'attr_1' => 'bamboo', 'attr_2' => 'panda' } })
- expect(type_spec.same_alias_squashed_1).to eq('bamboo')
- expect(type_spec.same_alias_squashed_2).to eq('panda')
- expect(type_spec.same_alias_squashed_3).to eq('panda')
- end
- end
-
- it 'should slice out unaccounted for attributes' do
- expect(TypeSpec.new({ 'something' => { 'id' => '12' } }).attributes.keys).not_to include('something')
- end
-
- describe '#requires' do
- it 'should raise if attribute not provided' do
- expect { TypeSpec.new({ 'service' => 'fake', 'something' => { 'id' => '12' } }).save }.to raise_exception(ArgumentError)
- end
-
- it 'should raise if attribute is provided and is nil' do
- expect { TypeSpec.new({ 'service' => 'fake', 'custom' => nil }).save }.to raise_exception(ArgumentError)
- end
- end
- end
-
- context 'attribute coverage info collecting', :coverage do
- class CoverageSpec < Sample::Model
- identity :id
-
- attribute :used, type: :string
- attribute :unused, type: :string
- end
-
- let!(:obj) { CoverageSpec.new(used: 'foo', unused: 'bar') }
-
- before(:each) do
- CoverageSpec.attributes[:used][:coverage_hits] = 0
- expect(obj.used).to eq('foo') # once
- expect(obj.used).to eq('foo') # twice
- end
-
- it 'should store the file path where the attribute was defined' do
- expect(CoverageSpec.attributes[:used][:coverage_file]).to eq(__FILE__)
- expect(CoverageSpec.attributes[:unused][:coverage_file]).to eq(__FILE__)
- end
-
- it 'should store the line number where the attribute was defined' do
- src_lines = File.read(__FILE__).lines
-
- expect(src_lines[CoverageSpec.attributes[:used][:coverage_line] - 1]).to match(/attribute :used/)
- expect(src_lines[CoverageSpec.attributes[:unused][:coverage_line] - 1]).to match(/attribute :unused/)
- end
-
- it "should store how many times an attribute's reader is called" do
- expect(CoverageSpec.attributes[:used][:coverage_hits]).to eq(2)
- expect(CoverageSpec.attributes[:unused][:coverage_hits]).to eq(0)
+ sample = DeprecatedModelService.new.deprecator
+ expect(sample.service).to eq(sample.cistern)
end
end
end