This repository has been archived by the owner on Apr 17, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 158
/
discriminator_spec.rb
88 lines (69 loc) · 2.62 KB
/
discriminator_spec.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
describe DataMapper::Types::Discriminator do
before :all do
module ::Blog
class Article
include DataMapper::Resource
undef_method :type
property :id, Serial
property :title, String, :nullable => false
property :type, Discriminator
end
class Announcement < Article; end
class Release < Announcement; end
end
@article_model = Blog::Article
@announcement_model = Blog::Announcement
@release_model = Blog::Release
end
it 'should typecast to a Model' do
@article_model.properties[:type].typecast('Blog::Release').should equal(@release_model)
end
describe 'descendant tracking' do
it 'should set the descendants for the grandparent model' do
@article_model.descendants.to_a.should == [ @article_model, @announcement_model, @release_model ]
end
it 'should set the descendants for the parent model' do
@announcement_model.descendants.to_a.should == [ @announcement_model, @release_model ]
end
it 'should set the descendants for the child model' do
@release_model.descendants.to_a.should == [ @release_model ]
end
end
describe 'scoping' do
it 'should set the default scope for the grandparent model' do
@article_model.default_scope[:type].should equal(@article_model.descendants)
end
it 'should set the default scope for the parent model' do
@announcement_model.default_scope[:type].should equal(@announcement_model.descendants)
end
it 'should set the default scope for the child model' do
@release_model.default_scope[:type].should equal(@release_model.descendants)
end
end
supported_by :all do
before :all do
@skip = defined?(DataMapper::Adapters::YamlAdapter) && @adapter.kind_of?(DataMapper::Adapters::YamlAdapter)
end
before do
pending if @skip
end
before :all do
rescue_if 'TODO: fix YAML serialization/deserialization', @skip do
@announcement = @announcement_model.create(:title => 'Announcement')
end
end
it 'should persist the type' do
@announcement.model.get(*@announcement.key).type.should equal(@announcement_model)
end
it 'should be retrieved as an instance of the correct class' do
@announcement.model.get(*@announcement.key).should be_instance_of(@announcement_model)
end
it 'should include descendants in finders' do
@article_model.first.should eql(@announcement)
end
it 'should not include ancestors' do
@release_model.first.should be_nil
end
end
end