rails-erd 0.4.5 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES.rdoc +18 -0
- data/LICENSE +1 -1
- data/README.md +3 -3
- data/Rakefile +57 -46
- data/bin/erd +4 -0
- data/lib/rails_erd.rb +4 -2
- data/lib/rails_erd/cli.rb +149 -0
- data/lib/rails_erd/diagram.rb +18 -16
- data/lib/rails_erd/diagram/graphviz.rb +23 -2
- data/lib/rails_erd/domain/attribute.rb +9 -3
- data/lib/rails_erd/domain/entity.rb +15 -15
- data/lib/rails_erd/domain/relationship.rb +11 -1
- data/lib/rails_erd/domain/relationship/cardinality.rb +15 -15
- data/lib/rails_erd/domain/specialization.rb +8 -8
- data/lib/rails_erd/version.rb +4 -0
- data/test/test_helper.rb +14 -11
- data/test/unit/attribute_test.rb +66 -3
- data/test/unit/cardinality_test.rb +10 -10
- data/test/unit/diagram_test.rb +44 -18
- data/test/unit/domain_test.rb +20 -20
- data/test/unit/entity_test.rb +19 -19
- data/test/unit/graphviz_test.rb +53 -10
- data/test/unit/rake_task_test.rb +8 -8
- data/test/unit/relationship_test.rb +31 -31
- data/test/unit/specialization_test.rb +3 -3
- metadata +72 -108
- data/.gemtest +0 -0
- data/Gemfile +0 -19
- data/Gemfile.lock +0 -44
- data/VERSION +0 -1
- data/rails-erd.gemspec +0 -105
data/test/unit/entity_test.rb
CHANGED
@@ -4,17 +4,17 @@ class EntityTest < ActiveSupport::TestCase
|
|
4
4
|
def create_entity(model)
|
5
5
|
Domain::Entity.new(Domain.new, model.name, model)
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
def create_generalized_entity(name)
|
9
9
|
Domain::Entity.new(Domain.new, name)
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
# Entity ===================================================================
|
13
13
|
test "model should return active record model" do
|
14
14
|
create_models "Foo"
|
15
15
|
assert_equal Foo, create_entity(Foo).model
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
test "name should return model name" do
|
19
19
|
create_models "Foo"
|
20
20
|
assert_equal "Foo", create_entity(Foo).name
|
@@ -25,7 +25,7 @@ class EntityTest < ActiveSupport::TestCase
|
|
25
25
|
foo, bar = create_entity(Foo), create_entity(Bar)
|
26
26
|
assert_equal [bar, foo], [foo, bar].sort
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
test "to_s should equal name" do
|
30
30
|
create_models "Foo"
|
31
31
|
assert_equal "Foo", create_entity(Foo).to_s
|
@@ -49,7 +49,7 @@ class EntityTest < ActiveSupport::TestCase
|
|
49
49
|
foo = domain.entity_by_name("Foo")
|
50
50
|
assert_equal domain.relationships.select { |r| r.destination == foo }, foo.relationships
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
test "relationships should return relationships that connect to this model" do
|
54
54
|
create_model "Foo", :bar => :references
|
55
55
|
create_model "Bar", :baz => :references do
|
@@ -67,24 +67,24 @@ class EntityTest < ActiveSupport::TestCase
|
|
67
67
|
# create_model "Foo"
|
68
68
|
# assert_nil create_entity(Foo).parent
|
69
69
|
# end
|
70
|
-
#
|
70
|
+
#
|
71
71
|
# test "parent should return nil for specialized entities with distinct tables" do
|
72
72
|
# create_model "Foo", :type => :string
|
73
73
|
# Object.const_set :SpecialFoo, Class.new(Foo)
|
74
74
|
# SpecialFoo.class_eval do
|
75
|
-
#
|
75
|
+
# self.table_name = "special_foo"
|
76
76
|
# end
|
77
77
|
# create_table "special_foo", {}, true
|
78
78
|
# assert_nil create_entity(SpecialFoo).parent
|
79
79
|
# end
|
80
|
-
#
|
80
|
+
#
|
81
81
|
# test "parent should return parent entity for specialized entities" do
|
82
82
|
# create_model "Foo", :type => :string
|
83
83
|
# Object.const_set :SpecialFoo, Class.new(Foo)
|
84
84
|
# domain = Domain.generate
|
85
85
|
# assert_equal domain.entity_by_name("Foo"), Domain::Entity.from_models(domain, [SpecialFoo]).first.parent
|
86
86
|
# end
|
87
|
-
#
|
87
|
+
#
|
88
88
|
# test "parent should return parent entity for specializations of specialized entities" do
|
89
89
|
# create_model "Foo", :type => :string
|
90
90
|
# Object.const_set :SpecialFoo, Class.new(Foo)
|
@@ -119,7 +119,7 @@ class EntityTest < ActiveSupport::TestCase
|
|
119
119
|
create_model "Bar"
|
120
120
|
assert_equal [false, false], Domain.generate.entities.map(&:disconnected?)
|
121
121
|
end
|
122
|
-
|
122
|
+
|
123
123
|
test "specialized should return false for regular entities" do
|
124
124
|
create_model "Foo"
|
125
125
|
assert_equal false, create_entity(Foo).specialized?
|
@@ -129,7 +129,7 @@ class EntityTest < ActiveSupport::TestCase
|
|
129
129
|
create_model "Foo", :type => :string
|
130
130
|
Object.const_set :SpecialFoo, Class.new(Foo)
|
131
131
|
SpecialFoo.class_eval do
|
132
|
-
|
132
|
+
self.table_name = "special_foo"
|
133
133
|
end
|
134
134
|
create_table "special_foo", {}, true
|
135
135
|
assert_equal false, create_entity(SpecialFoo).specialized?
|
@@ -153,17 +153,17 @@ class EntityTest < ActiveSupport::TestCase
|
|
153
153
|
Object.const_set :SpecialFoo, Class.new(Foo)
|
154
154
|
assert_equal true, create_entity(SpecialFoo).abstract?
|
155
155
|
end
|
156
|
-
|
156
|
+
|
157
157
|
test "generalized should return false for regular entity" do
|
158
158
|
create_model "Concrete"
|
159
159
|
assert_equal false, create_entity(Concrete).generalized?
|
160
160
|
end
|
161
|
-
|
161
|
+
|
162
162
|
test "abstract should return false for regular entity" do
|
163
163
|
create_model "Concrete"
|
164
164
|
assert_equal false, create_entity(Concrete).abstract?
|
165
165
|
end
|
166
|
-
|
166
|
+
|
167
167
|
# Attribute processing =====================================================
|
168
168
|
test "attributes should return list of attributes" do
|
169
169
|
create_model "Bar", :some_column => :integer, :another_column => :string
|
@@ -179,23 +179,23 @@ class EntityTest < ActiveSupport::TestCase
|
|
179
179
|
test "model should return nil for generalized entity" do
|
180
180
|
assert_nil create_generalized_entity("MyAbstractModel").model
|
181
181
|
end
|
182
|
-
|
182
|
+
|
183
183
|
test "name should return given name for generalized entity" do
|
184
184
|
assert_equal "MyAbstractModel", create_generalized_entity("MyAbstractModel").name
|
185
185
|
end
|
186
|
-
|
186
|
+
|
187
187
|
test "attributes should return empty array for generalized entity" do
|
188
188
|
assert_equal [], create_generalized_entity("MyAbstractModel").attributes
|
189
189
|
end
|
190
|
-
|
190
|
+
|
191
191
|
test "generalized should return true for generalized entity" do
|
192
192
|
assert_equal true, create_generalized_entity("MyAbstractModel").generalized?
|
193
193
|
end
|
194
|
-
|
194
|
+
|
195
195
|
test "specialized should return false for generalized entity" do
|
196
196
|
assert_equal false, create_generalized_entity("MyAbstractModel").specialized?
|
197
197
|
end
|
198
|
-
|
198
|
+
|
199
199
|
test "abstract should return true for generalized entity" do
|
200
200
|
assert_equal true, create_generalized_entity("MyAbstractModel").abstract?
|
201
201
|
end
|
data/test/unit/graphviz_test.rb
CHANGED
@@ -8,7 +8,7 @@ class GraphvizTest < ActiveSupport::TestCase
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def teardown
|
11
|
-
FileUtils.rm Dir["
|
11
|
+
FileUtils.rm Dir["erd.*"] rescue nil
|
12
12
|
RailsERD::Diagram.send :remove_const, :Graphviz rescue nil
|
13
13
|
end
|
14
14
|
|
@@ -54,9 +54,9 @@ class GraphvizTest < ActiveSupport::TestCase
|
|
54
54
|
test "file name should depend on file type" do
|
55
55
|
create_simple_domain
|
56
56
|
begin
|
57
|
-
assert_equal "
|
57
|
+
assert_equal "erd.svg", Diagram::Graphviz.create(:filetype => :svg)
|
58
58
|
ensure
|
59
|
-
FileUtils.rm "
|
59
|
+
FileUtils.rm "erd.svg" rescue nil
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
@@ -77,19 +77,19 @@ class GraphvizTest < ActiveSupport::TestCase
|
|
77
77
|
end
|
78
78
|
create_model "Bar", :column => :string
|
79
79
|
Diagram::Graphviz.create
|
80
|
-
assert File.exists?("
|
80
|
+
assert File.exists?("erd.png")
|
81
81
|
end
|
82
82
|
|
83
83
|
test "create should create output for domain without attributes" do
|
84
84
|
create_simple_domain
|
85
85
|
Diagram::Graphviz.create
|
86
|
-
assert File.exists?("
|
86
|
+
assert File.exists?("erd.png")
|
87
87
|
end
|
88
88
|
|
89
89
|
test "create should write to file with dot extension if type is dot" do
|
90
90
|
create_simple_domain
|
91
91
|
Diagram::Graphviz.create :filetype => :dot
|
92
|
-
assert File.exists?("
|
92
|
+
assert File.exists?("erd.dot")
|
93
93
|
end
|
94
94
|
|
95
95
|
test "create should write to file with dot extension without requiring graphviz" do
|
@@ -115,18 +115,18 @@ class GraphvizTest < ActiveSupport::TestCase
|
|
115
115
|
end
|
116
116
|
create_model "Bar", :column => :string
|
117
117
|
Diagram::Graphviz.create(:orientation => :vertical)
|
118
|
-
assert File.exists?("
|
118
|
+
assert File.exists?("erd.png")
|
119
119
|
end
|
120
120
|
|
121
121
|
test "create should create output for domain if orientation is vertical" do
|
122
122
|
create_simple_domain
|
123
123
|
Diagram::Graphviz.create(:orientation => :vertical)
|
124
|
-
assert File.exists?("
|
124
|
+
assert File.exists?("erd.png")
|
125
125
|
end
|
126
126
|
|
127
127
|
test "create should not create output if there are no connected models" do
|
128
128
|
Diagram::Graphviz.create rescue nil
|
129
|
-
assert !File.exists?("
|
129
|
+
assert !File.exists?("erd.png")
|
130
130
|
end
|
131
131
|
|
132
132
|
test "create should abort and complain if there are no connected models" do
|
@@ -341,7 +341,7 @@ class GraphvizTest < ActiveSupport::TestCase
|
|
341
341
|
assert_equal [["normal", "normal"]], find_dot_edge_styles(diagram(:notation => :simple))
|
342
342
|
end
|
343
343
|
|
344
|
-
# Advanced notation style
|
344
|
+
# Advanced notation style ==================================================
|
345
345
|
test "generate should use open dots for one to one cardinalities with bachman notation" do
|
346
346
|
create_one_to_one_assoc_domain
|
347
347
|
assert_equal [["odot", "odot"]], find_dot_edge_styles(diagram(:notation => :bachman))
|
@@ -383,4 +383,47 @@ class GraphvizTest < ActiveSupport::TestCase
|
|
383
383
|
end
|
384
384
|
assert_equal [["dotnormal", "dotnormal"]], find_dot_edge_styles(diagram(:notation => :bachman))
|
385
385
|
end
|
386
|
+
|
387
|
+
# Crows-foot notation style ================================================
|
388
|
+
test "generate should use 0/1 crowsfeet for one to one cardinalities with crowsfoot notation" do
|
389
|
+
create_one_to_one_assoc_domain
|
390
|
+
assert_equal [["teeodot", "teeodot"]], find_dot_edge_styles(diagram(:notation => :crowsfoot))
|
391
|
+
end
|
392
|
+
|
393
|
+
test "generate should use 1/1 crowsfeet for mandatory one to one cardinalities with crowsfoot notation" do
|
394
|
+
create_one_to_one_assoc_domain
|
395
|
+
One.class_eval do
|
396
|
+
validates_presence_of :other
|
397
|
+
end
|
398
|
+
assert_equal [["teeodot","teetee"]], find_dot_edge_styles(diagram(:notation => :crowsfoot))
|
399
|
+
end
|
400
|
+
|
401
|
+
test "generate should use 0/* crowsfeet with 0/1 crowsfeet for one to many cardinalities with crowsfoot notation" do
|
402
|
+
create_one_to_many_assoc_domain
|
403
|
+
assert_equal [["teeodot", "crowodot"]], find_dot_edge_styles(diagram(:notation => :crowsfoot))
|
404
|
+
end
|
405
|
+
|
406
|
+
test "generate should use 0/* crowsfeet with 1/1 crowsfett for mandatory one to many cardinalities with crowsfoot notation" do
|
407
|
+
create_one_to_many_assoc_domain
|
408
|
+
One.class_eval do
|
409
|
+
validates_presence_of :many
|
410
|
+
end
|
411
|
+
assert_equal [["teeodot", "crowtee"]], find_dot_edge_styles(diagram(:notation => :crowsfoot))
|
412
|
+
end
|
413
|
+
|
414
|
+
test "generate should use 0/* and 0/* crowsfeet for many to many cardinalities with crowsfoot notation" do
|
415
|
+
create_many_to_many_assoc_domain
|
416
|
+
assert_equal [["crowodot", "crowodot"]], find_dot_edge_styles(diagram(:notation => :crowsfoot))
|
417
|
+
end
|
418
|
+
|
419
|
+
test "generate should use 1/* and 1/* tail and head for mandatory many to many cardinalities with crowsfoot notation" do
|
420
|
+
create_many_to_many_assoc_domain
|
421
|
+
Many.class_eval do
|
422
|
+
validates_presence_of :more
|
423
|
+
end
|
424
|
+
More.class_eval do
|
425
|
+
validates_presence_of :many
|
426
|
+
end
|
427
|
+
assert_equal [["crowtee", "crowtee"]], find_dot_edge_styles(diagram(:notation => :crowsfoot))
|
428
|
+
end
|
386
429
|
end
|
data/test/unit/rake_task_test.rb
CHANGED
@@ -13,7 +13,7 @@ class RakeTaskTest < ActiveSupport::TestCase
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def teardown
|
16
|
-
FileUtils.rm "
|
16
|
+
FileUtils.rm "erd.dot" rescue nil
|
17
17
|
RailsERD::Diagram.send :remove_const, :Graphviz rescue nil
|
18
18
|
end
|
19
19
|
|
@@ -35,12 +35,12 @@ class RakeTaskTest < ActiveSupport::TestCase
|
|
35
35
|
test "generate task should create output based on domain model" do
|
36
36
|
create_simple_domain
|
37
37
|
Rake::Task["erd:generate"].execute
|
38
|
-
assert File.exists?("
|
38
|
+
assert File.exists?("erd.dot")
|
39
39
|
end
|
40
40
|
|
41
41
|
test "generate task should not create output if there are no connected models" do
|
42
42
|
Rake::Task["erd:generate"].execute rescue nil
|
43
|
-
assert !File.exists?("
|
43
|
+
assert !File.exists?("erd.dot")
|
44
44
|
end
|
45
45
|
|
46
46
|
test "generate task should eager load application environment" do
|
@@ -92,11 +92,11 @@ class RakeTaskTest < ActiveSupport::TestCase
|
|
92
92
|
rescue => e
|
93
93
|
message = e.message
|
94
94
|
end
|
95
|
-
|
95
|
+
assert_match /#{Regexp.escape(<<-MSG.strip).gsub("xxx", ".*?")}/, message
|
96
96
|
Loading models failed!
|
97
97
|
Error occurred while loading application: FooBar (RuntimeError)
|
98
|
-
test/unit/rake_task_test.rb:#{l1}:in `
|
99
|
-
test/unit/rake_task_test.rb:#{l2}:in `
|
98
|
+
test/unit/rake_task_test.rb:#{l1}:in `xxx'
|
99
|
+
test/unit/rake_task_test.rb:#{l2}:in `xxx'
|
100
100
|
MSG
|
101
101
|
end
|
102
102
|
|
@@ -110,13 +110,13 @@ Error occurred while loading application: FooBar (RuntimeError)
|
|
110
110
|
Rake::Task.define_task :environment
|
111
111
|
message = nil
|
112
112
|
begin
|
113
|
-
|
113
|
+
old_stderr, $stderr = $stderr, StringIO.new
|
114
114
|
Rake.application.options.trace = true
|
115
115
|
Rake::Task["erd:generate"].invoke
|
116
116
|
rescue => e
|
117
117
|
message = e.message
|
118
118
|
ensure
|
119
|
-
$
|
119
|
+
$stderr = old_stderr
|
120
120
|
end
|
121
121
|
assert_equal "FooBar", message
|
122
122
|
end
|
@@ -2,11 +2,11 @@ require File.expand_path("../test_helper", File.dirname(__FILE__))
|
|
2
2
|
|
3
3
|
class RelationshipTest < ActiveSupport::TestCase
|
4
4
|
N = Domain::Relationship::N
|
5
|
-
|
5
|
+
|
6
6
|
def domain_cardinalities
|
7
7
|
Domain.generate.relationships.map(&:cardinality)
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
# Relationship =============================================================
|
11
11
|
test "inspect should show source and destination" do
|
12
12
|
create_model "Foo", :bar => :references do
|
@@ -15,7 +15,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
15
15
|
create_model "Bar"
|
16
16
|
assert_match %r{#<RailsERD::Domain::Relationship:.* @source=Bar @destination=Foo>}, Domain.generate.relationships.first.inspect
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
test "source should return relationship source" do
|
20
20
|
create_model "Foo", :bar => :references do
|
21
21
|
belongs_to :bar
|
@@ -24,7 +24,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
24
24
|
domain = Domain.generate
|
25
25
|
assert_equal [domain.entity_by_name("Bar")], domain.relationships.map(&:source)
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
test "destination should return relationship destination" do
|
29
29
|
create_model "Foo", :bar => :references do
|
30
30
|
belongs_to :bar
|
@@ -33,7 +33,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
33
33
|
domain = Domain.generate
|
34
34
|
assert_equal [domain.entity_by_name("Foo")], domain.relationships.map(&:destination)
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
test "destination should return relationship destination if specified with absolute module path" do
|
38
38
|
create_model "Foo", :bar => :references
|
39
39
|
create_model "Bar" do
|
@@ -42,7 +42,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
42
42
|
domain = Domain.generate
|
43
43
|
assert_equal [domain.entity_by_name("Foo")], domain.relationships.map(&:destination)
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
# Relationship properties ==================================================
|
47
47
|
test "mutual should return false for one way relationship" do
|
48
48
|
create_model "Foo", :bar => :references do
|
@@ -51,7 +51,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
51
51
|
create_model "Bar"
|
52
52
|
assert_equal [false], Domain.generate.relationships.map(&:mutual?)
|
53
53
|
end
|
54
|
-
|
54
|
+
|
55
55
|
test "mutual should return true for mutual relationship" do
|
56
56
|
create_model "Foo", :bar => :references do
|
57
57
|
belongs_to :bar
|
@@ -61,12 +61,12 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
61
61
|
end
|
62
62
|
assert_equal [true], Domain.generate.relationships.map(&:mutual?)
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
test "mutual should return true for mutual many to many relationship" do
|
66
66
|
create_many_to_many_assoc_domain
|
67
67
|
assert_equal [true], Domain.generate.relationships.map(&:mutual?)
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
test "recursive should return false for ordinary relationship" do
|
71
71
|
create_model "Foo", :bar => :references do
|
72
72
|
belongs_to :bar
|
@@ -76,14 +76,14 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
76
76
|
end
|
77
77
|
assert_equal [false], Domain.generate.relationships.map(&:recursive?)
|
78
78
|
end
|
79
|
-
|
79
|
+
|
80
80
|
test "recursive should return true for self referencing relationship" do
|
81
81
|
create_model "Foo", :foo => :references do
|
82
82
|
belongs_to :foo
|
83
83
|
end
|
84
84
|
assert_equal [true], Domain.generate.relationships.map(&:recursive?)
|
85
85
|
end
|
86
|
-
|
86
|
+
|
87
87
|
test "indirect should return false for ordinary relationship" do
|
88
88
|
create_model "Foo", :bar => :references do
|
89
89
|
belongs_to :bar
|
@@ -93,7 +93,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
93
93
|
end
|
94
94
|
assert_equal [false], Domain.generate.relationships.map(&:indirect?)
|
95
95
|
end
|
96
|
-
|
96
|
+
|
97
97
|
test "indirect should return false for non mutual ordinary relationship" do
|
98
98
|
create_model "Foo", :bar => :references do
|
99
99
|
belongs_to :bar
|
@@ -101,7 +101,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
101
101
|
create_model "Bar"
|
102
102
|
assert_equal [false], Domain.generate.relationships.map(&:indirect?)
|
103
103
|
end
|
104
|
-
|
104
|
+
|
105
105
|
test "indirect should return true if relationship is a through association" do
|
106
106
|
create_model "Foo", :baz => :references, :bar => :references do
|
107
107
|
belongs_to :baz
|
@@ -117,7 +117,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
117
117
|
assert_equal true, Domain.generate.relationships.find { |rel|
|
118
118
|
rel.source.model == Bar and rel.destination.model == Baz }.indirect?
|
119
119
|
end
|
120
|
-
|
120
|
+
|
121
121
|
test "strength should return one for relationship with one association" do
|
122
122
|
create_model "Foo", :bar => :references
|
123
123
|
create_model "Bar" do
|
@@ -160,7 +160,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
160
160
|
end
|
161
161
|
assert_equal [1], Domain.generate.relationships.map(&:strength)
|
162
162
|
end
|
163
|
-
|
163
|
+
|
164
164
|
# Cardinalities ============================================================
|
165
165
|
test "cardinality should be zero-one to zero-one for optional one to one associations" do
|
166
166
|
create_one_to_one_assoc_domain
|
@@ -245,7 +245,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
245
245
|
end
|
246
246
|
assert_equal [Domain::Relationship::Cardinality.new(0..1, 5..17)], domain_cardinalities
|
247
247
|
end
|
248
|
-
|
248
|
+
|
249
249
|
test "cardinality should be zero-many to zero-many for optional many to many associations" do
|
250
250
|
create_many_to_many_assoc_domain
|
251
251
|
assert_equal [Domain::Relationship::Cardinality.new(0..N, 0..N)], domain_cardinalities
|
@@ -261,7 +261,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
261
261
|
end
|
262
262
|
assert_equal [Domain::Relationship::Cardinality.new(1..N, 1..N)], domain_cardinalities
|
263
263
|
end
|
264
|
-
|
264
|
+
|
265
265
|
test "cardinality should be n-m to n-m for limited many to many associations with single validations" do
|
266
266
|
create_many_to_many_assoc_domain
|
267
267
|
Many.class_eval do
|
@@ -289,7 +289,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
289
289
|
end
|
290
290
|
assert_equal [Domain::Relationship::Cardinality.new(9..17, 3..20)], domain_cardinalities
|
291
291
|
end
|
292
|
-
|
292
|
+
|
293
293
|
# Cardinality for non-mutual relationships =================================
|
294
294
|
test "cardinality should be zero-one to zero-many for non mutual relationship with belongs_to association" do
|
295
295
|
create_model "One"
|
@@ -306,7 +306,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
306
306
|
create_model "Many", :one => :references
|
307
307
|
assert_equal [Domain::Relationship::Cardinality.new(0..1, 0..N)], domain_cardinalities
|
308
308
|
end
|
309
|
-
|
309
|
+
|
310
310
|
test "cardinality should be zero-one to zero-one for non mutual relationship with has_one association" do
|
311
311
|
create_model "One" do
|
312
312
|
has_one :other
|
@@ -314,7 +314,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
314
314
|
create_model "Other", :one => :references
|
315
315
|
assert_equal [Domain::Relationship::Cardinality.new(0..1, 0..1)], domain_cardinalities
|
316
316
|
end
|
317
|
-
|
317
|
+
|
318
318
|
test "cardinality should be zero-many to zero-many for non mutual relationship with has_and_belongs_to_many association" do
|
319
319
|
create_table "many_more", :many_id => :integer, :more_id => :integer
|
320
320
|
create_model "Many"
|
@@ -323,7 +323,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
323
323
|
end
|
324
324
|
assert_equal [Domain::Relationship::Cardinality.new(0..N, 0..N)], domain_cardinalities
|
325
325
|
end
|
326
|
-
|
326
|
+
|
327
327
|
# Cardinality for multiple associations ====================================
|
328
328
|
test "cardinality should be zero-one to zero-many for conflicting one to many associations" do
|
329
329
|
create_model "CreditCard", :person => :references do
|
@@ -331,7 +331,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
331
331
|
end
|
332
332
|
create_model "Person" do
|
333
333
|
has_many :credit_cards
|
334
|
-
|
334
|
+
|
335
335
|
# A person may have a preferred card, but they are still able to have
|
336
336
|
# many cards. The association has an infinite maximum cardinality.
|
337
337
|
has_one :preferred_credit_card, :class_name => "CreditCard"
|
@@ -353,14 +353,14 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
353
353
|
end
|
354
354
|
assert_equal [Domain::Relationship::Cardinality.new(0..1, 1..N)], domain_cardinalities
|
355
355
|
end
|
356
|
-
|
356
|
+
|
357
357
|
test "cardinality should be n-m to n-m for conflicting validations in one to many associations" do
|
358
358
|
create_model "Spell", :wizard => :references do
|
359
359
|
end
|
360
360
|
create_model "Wizard" do
|
361
361
|
has_many :ice_spells, :class_name => "Spell"
|
362
362
|
has_many :fire_spells, :class_name => "Spell"
|
363
|
-
|
363
|
+
|
364
364
|
# Well, this can make sense, based on the conditions for the associations.
|
365
365
|
# We don't go that far yet. We ignore the lower values and opt for the
|
366
366
|
# higher values. It'll be okay. Really... You'll never need this.
|
@@ -369,7 +369,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
369
369
|
end
|
370
370
|
assert_equal [Domain::Relationship::Cardinality.new(0..1, 50..100)], domain_cardinalities
|
371
371
|
end
|
372
|
-
|
372
|
+
|
373
373
|
test "cardinality should be one to one-many for mandatory one to many associations on polymorphic interfaces" do
|
374
374
|
create_model "Cannon", :defensible => :references do
|
375
375
|
belongs_to :defensible, :polymorphic => true
|
@@ -385,7 +385,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
385
385
|
end
|
386
386
|
assert_equal [Domain::Relationship::Cardinality.new(1, 1..N)], domain_cardinalities
|
387
387
|
end
|
388
|
-
|
388
|
+
|
389
389
|
# Cardinality classes ======================================================
|
390
390
|
test "cardinality should be one to one for has_one associations" do
|
391
391
|
create_one_to_one_assoc_domain
|
@@ -403,7 +403,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
403
403
|
assert_equal [true], domain.relationships.map(&:to_one?)
|
404
404
|
assert_equal [false], domain.relationships.map(&:to_many?)
|
405
405
|
end
|
406
|
-
|
406
|
+
|
407
407
|
test "cardinality should be one to many for has_many associations" do
|
408
408
|
create_one_to_many_assoc_domain
|
409
409
|
domain = Domain.generate
|
@@ -418,7 +418,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
418
418
|
assert_equal [false], domain.relationships.map(&:to_one?)
|
419
419
|
assert_equal [true], domain.relationships.map(&:to_many?)
|
420
420
|
end
|
421
|
-
|
421
|
+
|
422
422
|
test "cardinality should be many to many for has_and_belongs_to_many associations" do
|
423
423
|
create_many_to_many_assoc_domain
|
424
424
|
domain = Domain.generate
|
@@ -434,7 +434,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
434
434
|
assert_equal [false], domain.relationships.map(&:to_one?)
|
435
435
|
assert_equal [true], domain.relationships.map(&:to_many?)
|
436
436
|
end
|
437
|
-
|
437
|
+
|
438
438
|
test "cardinality should be one to many for multiple associations with maximum cardinality of has_many" do
|
439
439
|
create_model "Foo", :bar => :references
|
440
440
|
create_model "Bar" do
|
@@ -444,7 +444,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
444
444
|
domain = Domain.generate
|
445
445
|
assert_equal [:one_to_many], domain.relationships.map(&:cardinality).map(&:name)
|
446
446
|
end
|
447
|
-
|
447
|
+
|
448
448
|
test "cardinality should be one to many if forward association is missing" do
|
449
449
|
create_model "Foo", :bar => :references do
|
450
450
|
belongs_to :bar
|
@@ -453,7 +453,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
453
453
|
domain = Domain.generate
|
454
454
|
assert_equal [:one_to_many], domain.relationships.map(&:cardinality).map(&:name)
|
455
455
|
end
|
456
|
-
|
456
|
+
|
457
457
|
test "cardinality should be one to many for has_many associations from generalized entity" do
|
458
458
|
create_model "Stronghold" do
|
459
459
|
has_many :cannons, :as => :defensible
|