closure_tree 4.6.2 → 4.6.3

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/spec/matcher_spec.rb CHANGED
@@ -3,29 +3,31 @@ require 'spec_helper'
3
3
  describe 'ClosureTree::Test::Matcher' do
4
4
 
5
5
  describe 'be_a_closure_tree' do
6
- it { UUIDTag.should be_a_closure_tree }
7
- it { User.should be_a_closure_tree }
8
- it { Label.should be_a_closure_tree.ordered }
9
- it { Metal.should be_a_closure_tree.ordered(:sort_order) }
10
- it { MenuItem.should be_a_closure_tree }
11
- it { Contract.should_not be_a_closure_tree }
6
+ it { expect(UUIDTag).to be_a_closure_tree }
7
+ it { expect(User).to be_a_closure_tree }
8
+ it { expect(Label).to be_a_closure_tree.ordered }
9
+ it { expect(Metal).to be_a_closure_tree.ordered(:sort_order) }
10
+ it { expect(MenuItem).to be_a_closure_tree }
11
+ it { expect(Contract).not_to be_a_closure_tree }
12
12
  end
13
13
 
14
14
  describe 'ordered' do
15
- it { Label.should be_a_closure_tree.ordered }
16
- it { UUIDTag.should be_a_closure_tree.ordered }
17
- it { Metal.should be_a_closure_tree.ordered(:sort_order) }
15
+ it { expect(Label).to be_a_closure_tree.ordered }
16
+ it { expect(UUIDTag).to be_a_closure_tree.ordered }
17
+ it { expect(Metal).to be_a_closure_tree.ordered(:sort_order) }
18
18
  end
19
19
 
20
20
  describe 'advisory_lock' do
21
21
  it 'should use advisory lock' do
22
- User.should be_a_closure_tree.with_advisory_lock
23
- Label.should be_a_closure_tree.ordered.with_advisory_lock
24
- Metal.should be_a_closure_tree.ordered(:sort_order).with_advisory_lock
22
+ expect(User).to be_a_closure_tree.with_advisory_lock
23
+ expect(Label).to be_a_closure_tree.ordered.with_advisory_lock
24
+ expect(Metal).to be_a_closure_tree.ordered(:sort_order).with_advisory_lock
25
25
  end
26
26
 
27
- it 'should not use advisory lock' do
28
- MenuItem.should be_a_closure_tree.without_advisory_lock
27
+ describe MenuItem do
28
+ it 'should not use advisory lock' do
29
+ is_expected.to be_a_closure_tree.without_advisory_lock
30
+ end
29
31
  end
30
32
  end
31
33
 
data/spec/metal_spec.rb CHANGED
@@ -4,6 +4,6 @@ describe Metal do
4
4
  it "creates" do
5
5
  s = Metal.create(:value => 'System')
6
6
  s.reload
7
- s.should_not be_new_record
7
+ expect(s).not_to be_new_record
8
8
  end
9
9
  end
@@ -4,9 +4,9 @@ describe Namespace::Type do
4
4
 
5
5
  context "class injection" do
6
6
  it "should build hierarchy classname correctly" do
7
- Namespace::Type.hierarchy_class.to_s.should == "Namespace::TypeHierarchy"
8
- Namespace::Type._ct.hierarchy_class_name.should == "Namespace::TypeHierarchy"
9
- Namespace::Type._ct.short_hierarchy_class_name.should == "TypeHierarchy"
7
+ expect(Namespace::Type.hierarchy_class.to_s).to eq("Namespace::TypeHierarchy")
8
+ expect(Namespace::Type._ct.hierarchy_class_name).to eq("Namespace::TypeHierarchy")
9
+ expect(Namespace::Type._ct.short_hierarchy_class_name).to eq("TypeHierarchy")
10
10
  end
11
11
  end
12
12
 
@@ -58,28 +58,28 @@ describe 'Concurrent creation', if: support_concurrency do
58
58
 
59
59
  it 'will not create dupes from class methods' do
60
60
  run_workers
61
- Tag.roots.collect { |ea| ea.name }.should =~ @names
61
+ expect(Tag.roots.collect { |ea| ea.name }).to match_array(@names)
62
62
  # No dupe children:
63
63
  %w(a b c).each do |ea|
64
- Tag.where(name: ea).size.should == @iterations
64
+ expect(Tag.where(name: ea).size).to eq(@iterations)
65
65
  end
66
66
  end
67
67
 
68
68
  it 'will not create dupes from instance methods' do
69
69
  @target = Tag.create!(name: 'root')
70
70
  run_workers
71
- @target.reload.children.collect { |ea| ea.name }.should =~ @names
72
- Tag.where(name: @names).size.should == @iterations
71
+ expect(@target.reload.children.collect { |ea| ea.name }).to match_array(@names)
72
+ expect(Tag.where(name: @names).size).to eq(@iterations)
73
73
  %w(a b c).each do |ea|
74
- Tag.where(name: ea).size.should == @iterations
74
+ expect(Tag.where(name: ea).size).to eq(@iterations)
75
75
  end
76
76
  end
77
77
 
78
78
  it 'creates dupe roots without advisory locks' do
79
79
  # disable with_advisory_lock:
80
- Tag.stub(:with_advisory_lock).and_return { |_lock_name, &block| block.call }
80
+ allow(Tag).to receive(:with_advisory_lock) { |_lock_name, &block| block.call }
81
81
  run_workers
82
- Tag.where(name: @names).size.should > @iterations
82
+ expect(Tag.where(name: @names).size).to be > @iterations
83
83
  end
84
84
 
85
85
  class SiblingPrependerWorker < WorkerBase
@@ -133,8 +133,8 @@ describe 'Concurrent creation', if: support_concurrency do
133
133
  creator_threads.each { |ea| ea.join }
134
134
  run_destruction = false
135
135
  destroyer_threads.each { |ea| ea.join }
136
- added_children.should =~ expected_children
137
- deleted_children.should =~ expected_children
136
+ expect(added_children).to match(expected_children)
137
+ expect(deleted_children).to match(expected_children)
138
138
  end
139
139
 
140
140
  xit 'fails to deadlock while simultaneously deleting items from the same hierarchy' do
@@ -149,7 +149,7 @@ describe 'Concurrent creation', if: support_concurrency do
149
149
  end
150
150
  end
151
151
  destroyer_threads.each { |ea| ea.join }
152
- User.all.should be_empty
152
+ expect(User.all).to be_empty
153
153
  end
154
154
 
155
155
  class SiblingPrependerWorker < WorkerBase
@@ -168,10 +168,10 @@ describe 'Concurrent creation', if: support_concurrency do
168
168
  run_workers(SiblingPrependerWorker)
169
169
  children = Label.roots
170
170
  uniq_order_values = children.collect { |ea| ea.order_value }.uniq
171
- children.size.should == uniq_order_values.size
171
+ expect(children.size).to eq(uniq_order_values.size)
172
172
 
173
173
  # The only non-root node should be "root":
174
- Label.all.select { |ea| ea.root? }.should == [@target.parent]
174
+ expect(Label.all.select { |ea| ea.root? }).to eq([@target.parent])
175
175
  end
176
176
 
177
177
  end
data/spec/support_spec.rb CHANGED
@@ -4,11 +4,11 @@ describe ClosureTree::Support do
4
4
  let(:sut) { Tag._ct }
5
5
  it 'passes through table names without prefix and suffix' do
6
6
  expected = 'some_random_table_name'
7
- sut.remove_prefix_and_suffix(expected).should == expected
7
+ expect(sut.remove_prefix_and_suffix(expected)).to eq(expected)
8
8
  end
9
9
  it 'extracts through table name with prefix and suffix' do
10
10
  expected = 'some_random_table_name'
11
11
  tn = ActiveRecord::Base.table_name_prefix + expected + ActiveRecord::Base.table_name_suffix
12
- sut.remove_prefix_and_suffix(tn).should == expected
12
+ expect(sut.remove_prefix_and_suffix(tn)).to eq(expected)
13
13
  end
14
14
  end
data/spec/tag_examples.rb CHANGED
@@ -9,19 +9,19 @@ shared_examples_for Tag do
9
9
 
10
10
  it 'has correct accessible_attributes' do
11
11
  if tag_class._ct.use_attr_accessible?
12
- tag_class.accessible_attributes.to_a.should =~ %w(parent name title)
12
+ expect(tag_class.accessible_attributes.to_a).to match_array(%w(parent name title))
13
13
  end
14
14
  end
15
15
 
16
16
  it 'should build hierarchy classname correctly' do
17
- tag_class.hierarchy_class.should == tag_hierarchy_class
18
- tag_class._ct.hierarchy_class_name.should == tag_hierarchy_class.to_s
19
- tag_class._ct.short_hierarchy_class_name.should == tag_hierarchy_class.to_s
17
+ expect(tag_class.hierarchy_class).to eq(tag_hierarchy_class)
18
+ expect(tag_class._ct.hierarchy_class_name).to eq(tag_hierarchy_class.to_s)
19
+ expect(tag_class._ct.short_hierarchy_class_name).to eq(tag_hierarchy_class.to_s)
20
20
  end
21
21
 
22
22
  it 'should have a correct parent column name' do
23
23
  expected_parent_column_name = tag_class == UUIDTag ? "parent_uuid" : "parent_id"
24
- tag_class._ct.parent_column_name.should == expected_parent_column_name
24
+ expect(tag_class._ct.parent_column_name).to eq(expected_parent_column_name)
25
25
  end
26
26
  end
27
27
 
@@ -29,13 +29,13 @@ shared_examples_for Tag do
29
29
 
30
30
  context "with no tags" do
31
31
  it "should return no entities" do
32
- tag_class.roots.should be_empty
33
- tag_class.leaves.should be_empty
32
+ expect(tag_class.roots).to be_empty
33
+ expect(tag_class.leaves).to be_empty
34
34
  end
35
35
 
36
36
  it "#find_or_create_by_path" do
37
37
  a = tag_class.create!(:name => 'a')
38
- a.find_or_create_by_path(%w{b c}).ancestry_path.should == %w{a b c}
38
+ expect(a.find_or_create_by_path(%w{b c}).ancestry_path).to eq(%w{a b c})
39
39
  end
40
40
  end
41
41
 
@@ -45,21 +45,21 @@ shared_examples_for Tag do
45
45
  end
46
46
 
47
47
  it "should be a leaf" do
48
- @tag.leaf?.should be_true
48
+ expect(@tag.leaf?).to be_truthy
49
49
  end
50
50
 
51
51
  it "should be a root" do
52
- @tag.root?.should be_true
52
+ expect(@tag.root?).to be_truthy
53
53
  end
54
54
 
55
55
  it 'has no parent' do
56
- @tag.parent.should be_nil
56
+ expect(@tag.parent).to be_nil
57
57
  end
58
58
 
59
59
  it "should return the only entity as a root and leaf" do
60
- tag_class.all.should == [@tag]
61
- tag_class.roots.should == [@tag]
62
- tag_class.leaves.should == [@tag]
60
+ expect(tag_class.all).to eq([@tag])
61
+ expect(tag_class.roots).to eq([@tag])
62
+ expect(tag_class.leaves).to eq([@tag])
63
63
  end
64
64
 
65
65
  context "with child" do
@@ -68,16 +68,16 @@ shared_examples_for Tag do
68
68
  end
69
69
 
70
70
  def assert_roots_and_leaves
71
- @tag.root?.should be_true
72
- @tag.leaf?.should be_false
71
+ expect(@tag.root?).to be_truthy
72
+ expect(@tag.leaf?).to be_falsey
73
73
 
74
- @child.root?.should be_false
75
- @child.leaf?.should be_true
74
+ expect(@child.root?).to be_falsey
75
+ expect(@child.leaf?).to be_truthy
76
76
  end
77
77
 
78
78
  def assert_parent_and_children
79
- @child.reload.parent.should == @tag
80
- @tag.reload.children.to_a.should == [@child]
79
+ expect(@child.reload.parent).to eq(@tag)
80
+ expect(@tag.reload.children.to_a).to eq([@child])
81
81
  end
82
82
 
83
83
  it "adds children through add_child" do
@@ -100,15 +100,15 @@ shared_examples_for Tag do
100
100
  @leaf = @root.add_child(tag_class.create!(:name => "leaf"))
101
101
  end
102
102
  it "should return a simple root and leaf" do
103
- tag_class.roots.should == [@root]
104
- tag_class.leaves.should == [@leaf]
103
+ expect(tag_class.roots).to eq([@root])
104
+ expect(tag_class.leaves).to eq([@leaf])
105
105
  end
106
106
  it "should return child_ids for root" do
107
- @root.child_ids.should == [@leaf.id]
107
+ expect(@root.child_ids).to eq([@leaf.id])
108
108
  end
109
109
 
110
110
  it "should return an empty array for leaves" do
111
- @leaf.child_ids.should be_empty
111
+ expect(@leaf.child_ids).to be_empty
112
112
  end
113
113
  end
114
114
 
@@ -121,55 +121,55 @@ shared_examples_for Tag do
121
121
  end
122
122
 
123
123
  it "should create all tags" do
124
- tag_class.all.to_a.should =~ [@root, @mid, @leaf]
124
+ expect(tag_class.all.to_a).to match_array([@root, @mid, @leaf])
125
125
  end
126
126
 
127
127
  it "should return a root and leaf without middle tag" do
128
- tag_class.roots.should == [@root]
129
- tag_class.leaves.should == [@leaf]
128
+ expect(tag_class.roots).to eq([@root])
129
+ expect(tag_class.leaves).to eq([@leaf])
130
130
  end
131
131
 
132
132
  it "should delete leaves" do
133
133
  tag_class.leaves.destroy_all
134
- tag_class.roots.should == [@root] # untouched
135
- tag_class.leaves.should == [@mid]
134
+ expect(tag_class.roots).to eq([@root]) # untouched
135
+ expect(tag_class.leaves).to eq([@mid])
136
136
  end
137
137
 
138
138
  it "should delete everything if you delete the roots" do
139
139
  tag_class.roots.destroy_all
140
- tag_class.all.should be_empty
141
- tag_class.roots.should be_empty
142
- tag_class.leaves.should be_empty
143
- DestroyedTag.all.map { |t| t.name }.should =~ %w{root mid leaf}
140
+ expect(tag_class.all).to be_empty
141
+ expect(tag_class.roots).to be_empty
142
+ expect(tag_class.leaves).to be_empty
143
+ expect(DestroyedTag.all.map { |t| t.name }).to match_array(%w{root mid leaf})
144
144
  end
145
145
 
146
146
  it 'fix self_and_ancestors properly on reparenting' do
147
147
  t = tag_class.create! :name => 'moar leaf'
148
- t.self_and_ancestors.to_a.should == [t]
148
+ expect(t.self_and_ancestors.to_a).to eq([t])
149
149
  @mid.children << t
150
- t.self_and_ancestors.to_a.should == [t, @mid, @root]
150
+ expect(t.self_and_ancestors.to_a).to eq([t, @mid, @root])
151
151
  end
152
152
 
153
153
  it 'prevents ancestor loops' do
154
154
  @leaf.add_child @root
155
- @root.should_not be_valid
156
- @root.reload.descendants.should include(@leaf)
155
+ expect(@root).not_to be_valid
156
+ expect(@root.reload.descendants).to include(@leaf)
157
157
  end
158
158
 
159
159
  it 'moves non-leaves' do
160
160
  new_root = tag_class.create! :name => "new_root"
161
161
  new_root.children << @mid
162
- @root.reload.descendants.should be_empty
163
- new_root.descendants.should == [@mid, @leaf]
164
- @leaf.reload.ancestry_path.should == %w{new_root mid leaf}
162
+ expect(@root.reload.descendants).to be_empty
163
+ expect(new_root.descendants).to eq([@mid, @leaf])
164
+ expect(@leaf.reload.ancestry_path).to eq(%w{new_root mid leaf})
165
165
  end
166
166
 
167
167
  it 'moves leaves' do
168
168
  new_root = tag_class.create! :name => "new_root"
169
169
  new_root.children << @leaf
170
- new_root.descendants.should == [@leaf]
171
- @root.reload.descendants.should == [@mid]
172
- @leaf.reload.ancestry_path.should == %w{new_root leaf}
170
+ expect(new_root.descendants).to eq([@leaf])
171
+ expect(@root.reload.descendants).to eq([@mid])
172
+ expect(@leaf.reload.ancestry_path).to eq(%w{new_root leaf})
173
173
  end
174
174
  end
175
175
 
@@ -181,55 +181,55 @@ shared_examples_for Tag do
181
181
  end
182
182
 
183
183
  it "should create all tags" do
184
- tag_class.all.to_a.should =~ [@root, @mid, @leaf]
184
+ expect(tag_class.all.to_a).to match_array([@root, @mid, @leaf])
185
185
  end
186
186
 
187
187
  it "should return a root and leaf without middle tag" do
188
- tag_class.roots.should == [@root]
189
- tag_class.leaves.should == [@leaf]
188
+ expect(tag_class.roots).to eq([@root])
189
+ expect(tag_class.leaves).to eq([@leaf])
190
190
  end
191
191
 
192
192
  it "should prevent parental loops from torso" do
193
193
  @mid.children << @root
194
- @root.valid?.should be_false
195
- @mid.reload.children.should == [@leaf]
194
+ expect(@root.valid?).to be_falsey
195
+ expect(@mid.reload.children).to eq([@leaf])
196
196
  end
197
197
 
198
198
  it "should prevent parental loops from toes" do
199
199
  @leaf.children << @root
200
- @root.valid?.should be_false
201
- @leaf.reload.children.should be_empty
200
+ expect(@root.valid?).to be_falsey
201
+ expect(@leaf.reload.children).to be_empty
202
202
  end
203
203
 
204
204
  it "should support re-parenting" do
205
205
  @root.children << @leaf
206
- tag_class.leaves.should == [@leaf, @mid]
206
+ expect(tag_class.leaves).to eq([@leaf, @mid])
207
207
  end
208
208
 
209
209
  it "cleans up hierarchy references for leaves" do
210
210
  @leaf.destroy
211
- tag_hierarchy_class.where(:ancestor_id => @leaf.id).should be_empty
212
- tag_hierarchy_class.where(:descendant_id => @leaf.id).should be_empty
211
+ expect(tag_hierarchy_class.where(:ancestor_id => @leaf.id)).to be_empty
212
+ expect(tag_hierarchy_class.where(:descendant_id => @leaf.id)).to be_empty
213
213
  end
214
214
 
215
215
  it "cleans up hierarchy references" do
216
216
  @mid.destroy
217
- tag_hierarchy_class.where(:ancestor_id => @mid.id).should be_empty
218
- tag_hierarchy_class.where(:descendant_id => @mid.id).should be_empty
219
- @root.reload.should be_root
217
+ expect(tag_hierarchy_class.where(:ancestor_id => @mid.id)).to be_empty
218
+ expect(tag_hierarchy_class.where(:descendant_id => @mid.id)).to be_empty
219
+ expect(@root.reload).to be_root
220
220
  root_hiers = @root.ancestor_hierarchies.to_a
221
- root_hiers.size.should == 1
222
- tag_hierarchy_class.where(:ancestor_id => @root.id).should == root_hiers
223
- tag_hierarchy_class.where(:descendant_id => @root.id).should == root_hiers
221
+ expect(root_hiers.size).to eq(1)
222
+ expect(tag_hierarchy_class.where(:ancestor_id => @root.id)).to eq(root_hiers)
223
+ expect(tag_hierarchy_class.where(:descendant_id => @root.id)).to eq(root_hiers)
224
224
  end
225
225
 
226
226
  it "should have different hash codes for each hierarchy model" do
227
227
  hashes = tag_hierarchy_class.all.map(&:hash)
228
- hashes.should =~ hashes.uniq
228
+ expect(hashes).to match_array(hashes.uniq)
229
229
  end
230
230
 
231
231
  it "should return the same hash code for equal hierarchy models" do
232
- tag_hierarchy_class.first.hash.should == tag_hierarchy_class.first.hash
232
+ expect(tag_hierarchy_class.first.hash).to eq(tag_hierarchy_class.first.hash)
233
233
  end
234
234
  end
235
235
 
@@ -241,23 +241,26 @@ shared_examples_for Tag do
241
241
  parent.children << child2
242
242
  child3 = tag_class.new(:name => 'Third Child')
243
243
  parent.add_child child3
244
- grandparent.self_and_descendants.collect(&:name).should ==
244
+ expect(grandparent.self_and_descendants.collect(&:name)).to eq(
245
245
  ["Grandparent", "Parent", "First Child", "Second Child", "Third Child"]
246
- child1.ancestry_path.should ==
246
+ )
247
+ expect(child1.ancestry_path).to eq(
247
248
  ["Grandparent", "Parent", "First Child"]
248
- child3.ancestry_path.should ==
249
+ )
250
+ expect(child3.ancestry_path).to eq(
249
251
  ["Grandparent", "Parent", "Third Child"]
252
+ )
250
253
  d = tag_class.find_or_create_by_path %w(a b c d)
251
254
  h = tag_class.find_or_create_by_path %w(e f g h)
252
255
  e = h.root
253
256
  d.add_child(e) # "d.children << e" would work too, of course
254
- h.ancestry_path.should == %w(a b c d e f g h)
257
+ expect(h.ancestry_path).to eq(%w(a b c d e f g h))
255
258
  end
256
259
 
257
260
  it "roots sort alphabetically" do
258
261
  expected = ("a".."z").to_a
259
262
  expected.shuffle.each { |ea| tag_class.create!(:name => ea) }
260
- tag_class.roots.collect { |ea| ea.name }.should == expected
263
+ expect(tag_class.roots.collect { |ea| ea.name }).to eq(expected)
261
264
  end
262
265
 
263
266
  context "with simple tree" do
@@ -279,32 +282,32 @@ shared_examples_for Tag do
279
282
  end
280
283
 
281
284
  it 'should find global roots' do
282
- tag_class.roots.to_a.should =~ @expected_roots
285
+ expect(tag_class.roots.to_a).to match_array(@expected_roots)
283
286
  end
284
287
  it 'should return root? for roots' do
285
- @expected_roots.each { |ea| ea.should be_root }
288
+ @expected_roots.each { |ea| expect(ea).to be_root }
286
289
  end
287
290
  it 'should not return root? for non-roots' do
288
- [@b1, @b2, @c1a, @c1b].each { |ea| ea.should_not be_root }
291
+ [@b1, @b2, @c1a, @c1b].each { |ea| expect(ea).not_to be_root }
289
292
  end
290
293
  it 'should return the correct root' do
291
294
  {@a1 => @a1, @a2 => @a2, @a3 => @a3,
292
295
  @b1 => @a1, @b2 => @a2, @c1a => @a1, @c1b => @a1}.each do |node, root|
293
- node.root.should == root
296
+ expect(node.root).to eq(root)
294
297
  end
295
298
  end
296
299
  it 'should assemble global leaves' do
297
- tag_class.leaves.to_a.should =~ @expected_leaves
300
+ expect(tag_class.leaves.to_a).to match_array(@expected_leaves)
298
301
  end
299
302
  it 'assembles siblings properly' do
300
303
  @expected_siblings.each do |siblings|
301
304
  siblings.each do |ea|
302
- ea.self_and_siblings.to_a.should =~ siblings
303
- ea.siblings.to_a.should =~ siblings - [ea]
305
+ expect(ea.self_and_siblings.to_a).to match_array(siblings)
306
+ expect(ea.siblings.to_a).to match_array(siblings - [ea])
304
307
  end
305
308
  end
306
309
  @expected_only_children.each do |ea|
307
- ea.siblings.should == []
310
+ expect(ea.siblings).to eq([])
308
311
  end
309
312
  end
310
313
  it 'assembles before_siblings' do
@@ -312,7 +315,7 @@ shared_examples_for Tag do
312
315
  (siblings.size - 1).times do |i|
313
316
  target = siblings[i]
314
317
  expected_before = siblings.first(i)
315
- target.siblings_before.to_a.should == expected_before
318
+ expect(target.siblings_before.to_a).to eq(expected_before)
316
319
  end
317
320
  end
318
321
  end
@@ -321,49 +324,49 @@ shared_examples_for Tag do
321
324
  (siblings.size - 1).times do |i|
322
325
  target = siblings[i]
323
326
  expected_after = siblings.last(siblings.size - 1 - i)
324
- target.siblings_after.to_a.should == expected_after
327
+ expect(target.siblings_after.to_a).to eq(expected_after)
325
328
  end
326
329
  end
327
330
  end
328
331
  it 'should assemble instance leaves' do
329
332
  {@a1 => [@b1b, @c1a, @c1b, @c1c], @b1 => [@c1a, @c1b, @c1c], @a2 => [@b2]}.each do |node, leaves|
330
- node.leaves.to_a.should == leaves
333
+ expect(node.leaves.to_a).to eq(leaves)
331
334
  end
332
- @expected_leaves.each { |ea| ea.leaves.to_a.should == [ea] }
335
+ @expected_leaves.each { |ea| expect(ea.leaves.to_a).to eq([ea]) }
333
336
  end
334
337
  it 'should return leaf? for leaves' do
335
- @expected_leaves.each { |ea| ea.should be_leaf }
338
+ @expected_leaves.each { |ea| expect(ea).to be_leaf }
336
339
  end
337
340
 
338
341
  it 'can move roots' do
339
342
  @c1a.children << @a2
340
343
  @b2.reload.children << @a3
341
- @a3.reload.ancestry_path.should ==%w(a1 b1 c1a a2 b2 a3)
344
+ expect(@a3.reload.ancestry_path).to eq(%w(a1 b1 c1a a2 b2 a3))
342
345
  end
343
346
 
344
347
  it 'cascade-deletes from roots' do
345
348
  victim_names = @a1.self_and_descendants.map(&:name)
346
349
  survivor_names = tag_class.all.map(&:name) - victim_names
347
350
  @a1.destroy
348
- tag_class.all.map(&:name).should == survivor_names
351
+ expect(tag_class.all.map(&:name)).to eq(survivor_names)
349
352
  end
350
353
  end
351
354
 
352
355
  context 'with_ancestor' do
353
356
  it 'works with no rows' do
354
- tag_class.with_ancestor.to_a.should be_empty
357
+ expect(tag_class.with_ancestor.to_a).to be_empty
355
358
  end
356
359
  it 'finds only children' do
357
360
  c = tag_class.find_or_create_by_path %w(A B C)
358
361
  a, b = c.parent.parent, c.parent
359
362
  spurious_tags = tag_class.find_or_create_by_path %w(D E)
360
- tag_class.with_ancestor(a).to_a.should == [b, c]
363
+ expect(tag_class.with_ancestor(a).to_a).to eq([b, c])
361
364
  end
362
365
  it 'limits subsequent where clauses' do
363
366
  a1c = tag_class.find_or_create_by_path %w(A1 B C)
364
367
  a2c = tag_class.find_or_create_by_path %w(A2 B C)
365
- tag_class.where(:name => "C").to_a.should =~ [a1c, a2c]
366
- tag_class.with_ancestor(a1c.parent.parent).where(:name => "C").to_a.should == [a1c]
368
+ expect(tag_class.where(:name => "C").to_a).to match_array([a1c, a2c])
369
+ expect(tag_class.with_ancestor(a1c.parent.parent).where(:name => "C").to_a).to eq([a1c])
367
370
  end
368
371
  end
369
372
 
@@ -379,65 +382,65 @@ shared_examples_for Tag do
379
382
  end
380
383
 
381
384
  it "should build ancestry path" do
382
- @child.ancestry_path.should == %w{grandparent parent child}
383
- @child.ancestry_path(:name).should == %w{grandparent parent child}
384
- @child.ancestry_path(:title).should == %w{Nonnie Mom Kid}
385
+ expect(@child.ancestry_path).to eq(%w{grandparent parent child})
386
+ expect(@child.ancestry_path(:name)).to eq(%w{grandparent parent child})
387
+ expect(@child.ancestry_path(:title)).to eq(%w{Nonnie Mom Kid})
385
388
  end
386
389
 
387
390
  it 'assembles ancestors' do
388
- @child.ancestors.should == [@parent, @grandparent]
389
- @child.self_and_ancestors.should == [@child, @parent, @grandparent]
391
+ expect(@child.ancestors).to eq([@parent, @grandparent])
392
+ expect(@child.self_and_ancestors).to eq([@child, @parent, @grandparent])
390
393
  end
391
394
 
392
395
  it "should find by path" do
393
396
  # class method:
394
- tag_class.find_by_path(%w{grandparent parent child}).should == @child
397
+ expect(tag_class.find_by_path(%w{grandparent parent child})).to eq(@child)
395
398
  # instance method:
396
- @parent.find_by_path(%w{child}).should == @child
397
- @grandparent.find_by_path(%w{parent child}).should == @child
398
- @parent.find_by_path(%w{child larvae}).should be_nil
399
+ expect(@parent.find_by_path(%w{child})).to eq(@child)
400
+ expect(@grandparent.find_by_path(%w{parent child})).to eq(@child)
401
+ expect(@parent.find_by_path(%w{child larvae})).to be_nil
399
402
  end
400
403
 
401
404
  it "finds correctly rooted paths" do
402
405
  decoy = tag_class.find_or_create_by_path %w(a b c d)
403
406
  b_d = tag_class.find_or_create_by_path %w(b c d)
404
- tag_class.find_by_path(%w(b c d)).should == b_d
405
- tag_class.find_by_path(%w(c d)).should be_nil
407
+ expect(tag_class.find_by_path(%w(b c d))).to eq(b_d)
408
+ expect(tag_class.find_by_path(%w(c d))).to be_nil
406
409
  end
407
410
 
408
411
  it "find_by_path for 1 node" do
409
412
  b = tag_class.find_or_create_by_path %w(a b)
410
413
  b2 = b.root.find_by_path(%w(b))
411
- b2.should == b
414
+ expect(b2).to eq(b)
412
415
  end
413
416
 
414
417
  it "find_by_path for 2 nodes" do
415
418
  c = tag_class.find_or_create_by_path %w(a b c)
416
- c.root.find_by_path(%w(b c)).should == c
417
- c.root.find_by_path(%w(a c)).should be_nil
418
- c.root.find_by_path(%w(c)).should be_nil
419
+ expect(c.root.find_by_path(%w(b c))).to eq(c)
420
+ expect(c.root.find_by_path(%w(a c))).to be_nil
421
+ expect(c.root.find_by_path(%w(c))).to be_nil
419
422
  end
420
423
 
421
424
  it "find_by_path for 3 nodes" do
422
425
  d = tag_class.find_or_create_by_path %w(a b c d)
423
- d.root.find_by_path(%w(b c d)).should == d
424
- tag_class.find_by_path(%w(a b c d)).should == d
425
- tag_class.find_by_path(%w(d)).should be_nil
426
+ expect(d.root.find_by_path(%w(b c d))).to eq(d)
427
+ expect(tag_class.find_by_path(%w(a b c d))).to eq(d)
428
+ expect(tag_class.find_by_path(%w(d))).to be_nil
426
429
  end
427
430
 
428
431
  it "should return nil for missing nodes" do
429
- tag_class.find_by_path(%w{missing}).should be_nil
430
- tag_class.find_by_path(%w{grandparent missing}).should be_nil
431
- tag_class.find_by_path(%w{grandparent parent missing}).should be_nil
432
- tag_class.find_by_path(%w{grandparent parent missing child}).should be_nil
432
+ expect(tag_class.find_by_path(%w{missing})).to be_nil
433
+ expect(tag_class.find_by_path(%w{grandparent missing})).to be_nil
434
+ expect(tag_class.find_by_path(%w{grandparent parent missing})).to be_nil
435
+ expect(tag_class.find_by_path(%w{grandparent parent missing child})).to be_nil
433
436
  end
434
437
 
435
438
  it ".find_or_create_by_path" do
436
439
  grandparent = tag_class.find_or_create_by_path(%w{grandparent})
437
- grandparent.should == @grandparent
440
+ expect(grandparent).to eq(@grandparent)
438
441
  child = tag_class.find_or_create_by_path(%w{grandparent parent child})
439
- child.should == @child
440
- tag_class.find_or_create_by_path(%w{events anniversary}).ancestry_path.should == %w{events anniversary}
442
+ expect(child).to eq(@child)
443
+ expect(tag_class.find_or_create_by_path(%w{events anniversary}).ancestry_path).to eq(%w{events anniversary})
441
444
  end
442
445
 
443
446
  it "should respect attribute hashes with both selection and creation" do
@@ -445,18 +448,18 @@ shared_examples_for Tag do
445
448
  attrs = {:title => expected_title}
446
449
  existing_title = @grandparent.title
447
450
  new_grandparent = tag_class.find_or_create_by_path(%w{grandparent}, attrs)
448
- new_grandparent.should_not == @grandparent
449
- new_grandparent.title.should == expected_title
450
- @grandparent.reload.title.should == existing_title
451
+ expect(new_grandparent).not_to eq(@grandparent)
452
+ expect(new_grandparent.title).to eq(expected_title)
453
+ expect(@grandparent.reload.title).to eq(existing_title)
451
454
  end
452
455
 
453
456
  it "should create a hierarchy with a given attribute" do
454
457
  expected_title = 'unicorn rainbows'
455
458
  attrs = {:title => expected_title}
456
459
  child = tag_class.find_or_create_by_path(%w{grandparent parent child}, attrs)
457
- child.should_not == @child
460
+ expect(child).not_to eq(@child)
458
461
  [child, child.parent, child.parent.parent].each do |ea|
459
- ea.title.should == expected_title
462
+ expect(ea.title).to eq(expected_title)
460
463
  end
461
464
  end
462
465
  end
@@ -477,22 +480,22 @@ shared_examples_for Tag do
477
480
 
478
481
  context "#hash_tree" do
479
482
  it "returns {} for depth 0" do
480
- tag_class.hash_tree(:limit_depth => 0).should == {}
483
+ expect(tag_class.hash_tree(:limit_depth => 0)).to eq({})
481
484
  end
482
485
  it "limit_depth 1" do
483
- tag_class.hash_tree(:limit_depth => 1).should == {@a => {}}
486
+ expect(tag_class.hash_tree(:limit_depth => 1)).to eq({@a => {}})
484
487
  end
485
488
  it "limit_depth 2" do
486
- tag_class.hash_tree(:limit_depth => 2).should == {@a => {@b => {}, @b2 => {}}}
489
+ expect(tag_class.hash_tree(:limit_depth => 2)).to eq({@a => {@b => {}, @b2 => {}}})
487
490
  end
488
491
  it "limit_depth 3" do
489
- tag_class.hash_tree(:limit_depth => 3).should == {@a => {@b => {@c1 => {}, @c2 => {}}, @b2 => {}}}
492
+ expect(tag_class.hash_tree(:limit_depth => 3)).to eq({@a => {@b => {@c1 => {}, @c2 => {}}, @b2 => {}}})
490
493
  end
491
494
  it "limit_depth 4" do
492
- tag_class.hash_tree(:limit_depth => 4).should == @full_tree
495
+ expect(tag_class.hash_tree(:limit_depth => 4)).to eq(@full_tree)
493
496
  end
494
497
  it "no limit holdum" do
495
- tag_class.hash_tree.should == @full_tree
498
+ expect(tag_class.hash_tree).to eq(@full_tree)
496
499
  end
497
500
  end
498
501
 
@@ -500,7 +503,7 @@ shared_examples_for Tag do
500
503
  # the named scope is complicated enough that an incorrect join could result in unnecessarily
501
504
  # duplicated rows:
502
505
  a = scope.collect { |ea| ea.id }
503
- a.should == a.uniq
506
+ expect(a).to eq(a.uniq)
504
507
  end
505
508
 
506
509
  context "#hash_tree_scope" do
@@ -529,25 +532,25 @@ shared_examples_for Tag do
529
532
  before :each do
530
533
  end
531
534
  it "returns {} for depth 0" do
532
- @b.hash_tree(:limit_depth => 0).should == {}
535
+ expect(@b.hash_tree(:limit_depth => 0)).to eq({})
533
536
  end
534
537
  it "limit_depth 1" do
535
- @b.hash_tree(:limit_depth => 1).should == {@b => {}}
538
+ expect(@b.hash_tree(:limit_depth => 1)).to eq({@b => {}})
536
539
  end
537
540
  it "limit_depth 2" do
538
- @b.hash_tree(:limit_depth => 2).should == {@b => {@c1 => {}, @c2 => {}}}
541
+ expect(@b.hash_tree(:limit_depth => 2)).to eq({@b => {@c1 => {}, @c2 => {}}})
539
542
  end
540
543
  it "limit_depth 3" do
541
- @b.hash_tree(:limit_depth => 3).should == {@b => {@c1 => {@d1 => {}}, @c2 => {@d2 => {}}}}
544
+ expect(@b.hash_tree(:limit_depth => 3)).to eq({@b => {@c1 => {@d1 => {}}, @c2 => {@d2 => {}}}})
542
545
  end
543
546
  it "no limit holdum from subsubroot" do
544
- @c1.hash_tree.should == {@c1 => {@d1 => {}}}
547
+ expect(@c1.hash_tree).to eq({@c1 => {@d1 => {}}})
545
548
  end
546
549
  it "no limit holdum from subroot" do
547
- @b.hash_tree.should == {@b => {@c1 => {@d1 => {}}, @c2 => {@d2 => {}}}}
550
+ expect(@b.hash_tree).to eq({@b => {@c1 => {@d1 => {}}, @c2 => {@d2 => {}}}})
548
551
  end
549
552
  it "no limit holdum from root" do
550
- @a.hash_tree.should == @full_tree
553
+ expect(@a.hash_tree).to eq(@full_tree)
551
554
  end
552
555
  end
553
556
  end
@@ -556,13 +559,13 @@ shared_examples_for Tag do
556
559
  it 'should find_or_create very deep nodes' do
557
560
  expected_ancestry_path = (1..200).to_a.map { |ea| ea.to_s }
558
561
  target = tag_class.find_or_create_by_path(expected_ancestry_path)
559
- target.ancestry_path.should == expected_ancestry_path
562
+ expect(target.ancestry_path).to eq(expected_ancestry_path)
560
563
  end
561
564
  end
562
565
 
563
566
  describe 'DOT rendering' do
564
567
  it 'should render for an empty scope' do
565
- tag_class.to_dot_digraph(tag_class.where("0=1")).should == "digraph G {\n}\n"
568
+ expect(tag_class.to_dot_digraph(tag_class.where("0=1"))).to eq("digraph G {\n}\n")
566
569
  end
567
570
  it 'should render for an empty scope' do
568
571
  tag_class.find_or_create_by_path(%w(a b1 c1))
@@ -570,7 +573,7 @@ shared_examples_for Tag do
570
573
  tag_class.find_or_create_by_path(%w(a b2 c3))
571
574
  a, b1, b2, c1, c2, c3 = %w(a b1 b2 c1 c2 c3).map { |ea| tag_class.where(:name => ea).first.id }
572
575
  dot = tag_class.roots.first.to_dot_digraph
573
- dot.should == <<-DOT
576
+ expect(dot).to eq <<-DOT
574
577
  digraph G {
575
578
  #{a} [label="a"]
576
579
  #{a} -> #{b1}