hydra-collections 2.0.5 → 3.0.0.beta1

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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.gitmodules +0 -4
  4. data/.rspec +1 -0
  5. data/Gemfile +9 -0
  6. data/README.md +3 -3
  7. data/Rakefile +8 -8
  8. data/{lib → app/controllers/concerns}/hydra/collections/selects_collections.rb +3 -8
  9. data/app/controllers/concerns/hydra/collections_controller_behavior.rb +19 -20
  10. data/app/helpers/collections_search_helper.rb +2 -1
  11. data/app/models/concerns/hydra/collection.rb +80 -16
  12. data/app/views/collections/_search_form.html.erb +0 -16
  13. data/hydra-collections.gemspec +4 -4
  14. data/lib/hydra/collections/accepts_batches.rb +5 -5
  15. data/lib/hydra/collections/collectible.rb +15 -8
  16. data/lib/hydra/collections/solr_document_behavior.rb +0 -15
  17. data/lib/hydra/collections/version.rb +1 -1
  18. data/spec/controllers/catalog_controller_spec.rb +5 -19
  19. data/spec/controllers/collections_controller_spec.rb +125 -154
  20. data/spec/controllers/other_collections_controller_spec.rb +13 -15
  21. data/spec/controllers/selects_collections_spec.rb +39 -48
  22. data/spec/factories.rb +0 -14
  23. data/spec/factories/users.rb +0 -14
  24. data/spec/helpers/collections_helper_spec.rb +14 -16
  25. data/spec/helpers/collections_search_helper_spec.rb +4 -2
  26. data/spec/lib/collectible_spec.rb +7 -7
  27. data/spec/models/collection_spec.rb +40 -42
  28. data/spec/spec_helper.rb +12 -1
  29. data/spec/{support → test_app_templates}/app/models/sample.rb +0 -0
  30. data/spec/{support → test_app_templates}/app/models/solr_document.rb +0 -0
  31. data/spec/{support → test_app_templates}/app/views/catalog/_document_header.html.erb +0 -0
  32. data/spec/{support → test_app_templates}/app/views/catalog/_index_collection.html.erb +0 -0
  33. data/spec/{support → test_app_templates}/app/views/catalog/_sort_and_per_page.html.erb +0 -0
  34. data/spec/{support → test_app_templates}/db/migrate/20111101221803_create_searches.rb +0 -0
  35. data/spec/{support → test_app_templates}/lib/generators/test_app_generator.rb +10 -2
  36. data/spec/{support → test_app_templates}/lib/tasks/rspec.rake +0 -0
  37. data/tasks/hydra-collections-dev.rake +16 -56
  38. metadata +33 -36
  39. data/app/models/datastreams/hydra/collection_rdf_datastream.rb +0 -58
  40. data/spec/factories/.gitkeep +0 -0
@@ -14,21 +14,21 @@ class OtherCollection < ActiveFedora::Base
14
14
  include Hydra::Collection
15
15
  include Hydra::Collections::Collectible
16
16
 
17
- def to_solr(solr_doc={}, opts={})
18
- super(solr_doc, opts)
19
- solr_doc = index_collection_pids(solr_doc)
20
- return solr_doc
17
+ def to_solr(solr_doc={})
18
+ super.tap do |solr_doc|
19
+ index_collection_ids(solr_doc)
20
+ end
21
21
  end
22
-
23
22
  end
23
+
24
24
  class Member < ActiveFedora::Base
25
25
  include Hydra::Collections::Collectible
26
26
  attr_accessor :title
27
27
 
28
- def to_solr(solr_doc={}, opts={})
29
- super(solr_doc, opts)
30
- solr_doc = index_collection_pids(solr_doc)
31
- return solr_doc
28
+ def to_solr(solr_doc={})
29
+ super.tap do |solr_doc|
30
+ index_collection_ids(solr_doc)
31
+ end
32
32
  end
33
33
 
34
34
  end
@@ -75,12 +75,10 @@ describe OtherCollectionsController, :type => :controller do
75
75
  end
76
76
  it "should show the collections" do
77
77
  routes.draw { resources :other_collections, except: :index }
78
- get :show, id: collection.id
79
- expect(assigns[:collection].title).to eq(collection.title)
80
- ids = assigns[:member_docs].map {|d| d.id}
81
- expect(ids).to include asset1.pid
82
- expect(ids).to include asset2.pid
83
- expect(ids).to include asset3.pid
78
+ get :show, id: collection
79
+ expect(assigns[:collection].title).to eq collection.title
80
+ ids = assigns[:member_docs].map(&:id)
81
+ expect(ids).to include(asset1.id, asset2.id, asset3.id)
84
82
  end
85
83
  end
86
84
 
@@ -24,7 +24,7 @@ describe SelectsCollectionsController, :type => :controller do
24
24
  end
25
25
 
26
26
  describe "Select Collections" do
27
- before (:all) do
27
+ before do
28
28
  @user = FactoryGirl.find_or_create(:user)
29
29
  @collection = Collection.new title:"Test Public"
30
30
  @collection.apply_depositor_metadata(@user.user_key)
@@ -41,36 +41,34 @@ describe SelectsCollectionsController, :type => :controller do
41
41
  @collection4 = Collection.new title:"Test No Access"
42
42
  @collection4.apply_depositor_metadata('abc123@test.com')
43
43
  @collection4.save
44
- @collections = []
45
- (1..11).each do |i|
46
- collection = Collection.new title:"Test Public #{i}"
47
- collection.apply_depositor_metadata(@user.user_key)
48
- collection.read_groups = ["public"]
49
- collection.save
50
- @collections << collection
51
- end
52
- end
53
- after (:all) do
54
- Collection.delete_all
55
44
  end
45
+
56
46
  describe "Public Access" do
57
- before (:each) do
47
+ let(:user_collections) do
58
48
  subject.find_collections
59
- @user_collections = subject.instance_variable_get (:@user_collections)
60
- expect(@user_collections).to be_kind_of(Array)
49
+ subject.instance_variable_get(:@user_collections)
61
50
  end
62
- it "should return public collections" do
63
- expect(@user_collections.index{|d| d.id == @collection.id}).not_to be_nil
51
+
52
+ it "should only return public collections" do
53
+ expect(user_collections.map(&:id)).to match_array [@collection.id]
64
54
  end
65
- it "should return all public collections" do
66
- expect(@user_collections.count).to eq(12)
55
+
56
+ context "when there are more than 10" do
57
+ before do
58
+ 11.times do |i|
59
+ Collection.new(title:"Test Public #{i}").tap do |col|
60
+ col.apply_depositor_metadata(@user.user_key)
61
+ col.read_groups = ["public"]
62
+ col.save!
63
+ end
64
+ end
65
+ end
66
+ it "should return all public collections" do
67
+ expect(user_collections.count).to eq(12)
68
+ end
67
69
  end
68
- it "should not return non public collections" do
69
- expect(@user_collections.index{|d| d.id == @collection2.id}).to be_nil
70
- expect(@user_collections.index{|d| d.id == @collection3.id}).to be_nil
71
- expect(@user_collections.index{|d| d.id == @collection4.id}).to be_nil
72
- end
73
70
  end
71
+
74
72
  describe "Read Access" do
75
73
  describe "not signed in" do
76
74
  it "should error if the user is not signed in" do
@@ -78,45 +76,38 @@ describe SelectsCollectionsController, :type => :controller do
78
76
  end
79
77
  end
80
78
  describe "signed in" do
81
- before (:each) do
82
- sign_in @user
79
+ before { sign_in @user }
80
+
81
+ let(:user_collections) do
83
82
  subject.find_collections_with_read_access
84
- @user_collections = subject.instance_variable_get (:@user_collections)
85
- expect(@user_collections).to be_kind_of(Array)
83
+ subject.instance_variable_get(:@user_collections)
86
84
  end
87
- it "should return public and read access (edit access implies read) collections" do
88
- expect(@user_collections.index{|d| d.id == @collection.id}).not_to be_nil
89
- expect(@user_collections.index{|d| d.id == @collection2.id}).not_to be_nil
90
- expect(@user_collections.index{|d| d.id == @collection3.id}).not_to be_nil
85
+
86
+ it "should return only public and read access (edit access implies read) collections" do
87
+ expect(user_collections.map(&:id)).to match_array [@collection.id, @collection2.id, @collection3.id]
91
88
  end
92
- it "should not return non public collections" do
93
- expect(@user_collections.index{|d| d.id == @collection4.id}).to be_nil
94
- end
95
89
  end
96
90
  end
91
+
97
92
  describe "Edit Access" do
98
93
  describe "not signed in" do
99
94
  it "should error if the user is not signed in" do
100
95
  expect { subject.find_collections_with_edit_access }.to raise_error
101
96
  end
102
97
  end
98
+
103
99
  describe "signed in" do
104
- before (:each) do
105
- sign_in @user
100
+ before { sign_in @user }
101
+
102
+ let(:user_collections) do
106
103
  subject.find_collections_with_edit_access
107
- @user_collections = subject.instance_variable_get (:@user_collections)
108
- expect(@user_collections).to be_kind_of(Array)
109
- end
110
- it "should return public or editable collections" do
111
- expect(@user_collections.index{|d| d.id == @collection.id}).not_to be_nil
112
- expect(@user_collections.index{|d| d.id == @collection3.id}).not_to be_nil
113
- end
114
- it "should not return non public or editable collections" do
115
- expect(@user_collections.index{|d| d.id == @collection2.id}).to be_nil
116
- expect(@user_collections.index{|d| d.id == @collection4.id}).to be_nil
104
+ subject.instance_variable_get(:@user_collections)
117
105
  end
106
+
107
+ it "should return only public or editable collections" do
108
+ expect(user_collections.map(&:id)).to match_array [@collection.id, @collection3.id]
109
+ end
118
110
  end
119
111
  end
120
112
  end
121
-
122
113
  end
data/spec/factories.rb CHANGED
@@ -1,17 +1,3 @@
1
- # Copyright © 2012 The Pennsylvania State University
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
1
  FactoryGirl.define do
16
2
  factory :collection
17
3
  end
@@ -1,17 +1,3 @@
1
- # Copyright © 2012 The Pennsylvania State University
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
1
  FactoryGirl.define do
16
2
  factory :user, :class => User do |u|
17
3
  email 'jilluser@example.com'
@@ -22,17 +22,15 @@ describe CollectionsHelper, :type => :helper do
22
22
  end
23
23
  end
24
24
  describe "button_for_delete_collection" do
25
- before (:all) do
25
+ before do
26
26
  @collection = Collection.create(title: "Test Public")
27
27
  end
28
- after (:all) do
29
- @collection.delete
30
- end
28
+
31
29
  it " should create a button to the collections delete path" do
32
30
  str = button_for_delete_collection @collection
33
31
  doc = Nokogiri::HTML(str)
34
32
  form = doc.xpath('//form').first
35
- expect(form.attr('action')).to eq("#{collections.collection_path(@collection.pid)}")
33
+ expect(form.attr('action')).to eq collections.collection_path(@collection)
36
34
  i = form.children.first.children[1]
37
35
  expect(i.attr('type')).to eq('submit')
38
36
  end
@@ -40,7 +38,7 @@ describe CollectionsHelper, :type => :helper do
40
38
  str = button_for_delete_collection @collection, "Delete My Button"
41
39
  doc = Nokogiri::HTML(str)
42
40
  form = doc.xpath('//form').first
43
- expect(form.attr('action')).to eq("#{collections.collection_path(@collection.pid)}")
41
+ expect(form.attr('action')).to eq collections.collection_path(@collection)
44
42
  i = form.children.first.children[1]
45
43
  expect(i.attr('value')).to eq("Delete My Button")
46
44
  end
@@ -55,7 +53,7 @@ describe CollectionsHelper, :type => :helper do
55
53
  str = button_for_remove_from_collection item
56
54
  doc = Nokogiri::HTML(str)
57
55
  form = doc.xpath('//form').first
58
- expect(form.attr('action')).to eq("#{collections.collection_path(@collection.pid)}")
56
+ expect(form.attr('action')).to eq collections.collection_path(@collection)
59
57
  expect(form.css('input#collection_members[type="hidden"][value="remove"]')).not_to be_empty
60
58
  expect(form.css('input[type="hidden"][name="batch_document_ids[]"][value="changeme:123"]')).not_to be_empty
61
59
  end
@@ -77,34 +75,34 @@ describe CollectionsHelper, :type => :helper do
77
75
  str = button_for_remove_from_collection item
78
76
  doc = Nokogiri::HTML(str)
79
77
  form = doc.xpath('//form').first
80
- expect(form.attr('action')).to eq("#{collections.collection_path(@collection.pid)}")
78
+ expect(form.attr('action')).to eq collections.collection_path(@collection)
81
79
  expect(form.css('input#collection_members[type="hidden"][value="remove"]')).not_to be_empty
82
80
  expect(form.css('input[type="hidden"][name="batch_document_ids[]"][value="changeme:123"]')).not_to be_empty
83
81
  end
84
82
 
85
83
  end
86
- end
84
+ end
85
+
87
86
  describe "button_for_remove_selected_from_collection" do
88
- before (:all) do
89
- @collection = Collection.create title:"Test Public"
90
- end
91
- after (:all) do
92
- @collection.delete
87
+ before do
88
+ @collection = Collection.create title: "Test Public"
93
89
  end
90
+
94
91
  it " should create a button to the collections delete path" do
95
92
  str = button_for_remove_selected_from_collection @collection
96
93
  doc = Nokogiri::HTML(str)
97
94
  form = doc.xpath('//form').first
98
- expect(form.attr('action')).to eq("#{collections.collection_path(@collection.pid)}")
95
+ expect(form.attr('action')).to eq collections.collection_path(@collection)
99
96
  i = form.children[2]
100
97
  expect(i.attr('value')).to eq("remove")
101
98
  expect(i.attr('name')).to eq("collection[members]")
102
99
  end
100
+
103
101
  it "should create a button with my text" do
104
102
  str = button_for_remove_selected_from_collection @collection, "Remove My Button"
105
103
  doc = Nokogiri::HTML(str)
106
104
  form = doc.css('form').first
107
- expect(form.attr('action')).to eq collections.collection_path(@collection.id)
105
+ expect(form.attr('action')).to eq collections.collection_path(@collection)
108
106
  expect(form.css('input[type="submit"]').attr('value').value).to eq "Remove My Button"
109
107
  end
110
108
  end
@@ -4,11 +4,13 @@ describe CollectionsSearchHelper, :type => :helper do
4
4
  describe "collection_name" do
5
5
  let (:collection_without_title) { Collection.create() }
6
6
  let (:collection_with_title) { Collection.create(title: "Title of Collection 2") }
7
+
7
8
  it "should return the pid if no title available" do
8
- expect(collection_name(collection_without_title.pid)).to eq(collection_without_title.pid)
9
+ expect(collection_name(collection_without_title.id)).to eq collection_without_title.id
9
10
  end
11
+
10
12
  it "should return the title value associated with the given pid" do
11
- expect(collection_name(collection_with_title.pid)).to eq("Title of Collection 2")
13
+ expect(collection_name(collection_with_title.id)).to eq "Title of Collection 2"
12
14
  end
13
15
  end
14
16
  end
@@ -15,17 +15,17 @@ describe Hydra::Collections::Collectible do
15
15
  @collection1.members << @collectible
16
16
  @collection1.save
17
17
  @collectible.collections << @collection2
18
- reloaded = CollectibleThing.find(@collectible.pid)
19
- expect(@collection2.reload.members).to eq([@collectible])
20
- expect(reloaded.collections).to eq([@collection1, @collection2])
18
+ reloaded = CollectibleThing.find(@collectible.id)
19
+ expect(@collection2.reload.members).to eq [@collectible]
20
+ expect(reloaded.collections).to eq [@collection1, @collection2]
21
21
  end
22
22
  end
23
- describe "index_collection_pids" do
24
- it "should add pids for all associated collections" do
23
+ describe "index_collection_ids" do
24
+ it "should add ids for all associated collections" do
25
25
  @collectible.save
26
26
  @collectible.collections << @collection1
27
27
  @collectible.collections << @collection2
28
- expect(@collectible.index_collection_pids["collection_sim"]).to eq([@collection1.pid, @collection2.pid])
28
+ expect(@collectible.index_collection_ids["collection_sim"]).to eq [@collection1.id, @collection2.id]
29
29
  end
30
30
  end
31
- end
31
+ end
@@ -7,9 +7,9 @@ describe Collection, :type => :model do
7
7
  include Hydra::Collections::Collectible
8
8
 
9
9
  def to_solr(solr_doc={}, opts={})
10
- super(solr_doc, opts)
11
- solr_doc = index_collection_pids(solr_doc)
12
- return solr_doc
10
+ super(solr_doc, opts).tap do |solr_doc|
11
+ solr_doc = index_collection_ids(solr_doc)
12
+ end
13
13
  end
14
14
 
15
15
  end
@@ -18,56 +18,44 @@ describe Collection, :type => :model do
18
18
  @user.destroy
19
19
  Object.send(:remove_const, :GenericFile)
20
20
  end
21
- before(:each) do
21
+
22
+ before do
22
23
  @collection = Collection.new
23
24
  @collection.apply_depositor_metadata(@user.user_key)
24
- @collection.save
25
+ @collection.save!
25
26
  @gf1 = GenericFile.create
26
27
  @gf2 = GenericFile.create
27
28
  end
28
- after(:each) do
29
- @collection.destroy rescue
30
- @gf1.destroy
31
- @gf2.destroy
32
- end
29
+
33
30
  it "should have a depositor" do
34
31
  expect(@collection.depositor).to eq(@user.user_key)
35
32
  end
33
+
36
34
  it "should allow the depositor to edit and read" do
37
35
  ability = Ability.new(@user)
38
- expect(ability.can?(:read, @collection)).to eq(true)
39
- expect(ability.can?(:edit, @collection)).to eq(true)
36
+ expect(ability.can?(:read, @collection)).to be true
37
+ expect(ability.can?(:edit, @collection)).to be true
40
38
  end
39
+
41
40
  it "should be empty by default" do
42
41
  expect(@collection.members).to be_empty
43
42
  end
43
+
44
44
  it "should have many files" do
45
45
  @collection.members = [@gf1, @gf2]
46
46
  @collection.save
47
- expect(Collection.find(@collection.pid).members).to eq([@gf1, @gf2])
47
+ expect(@collection.reload.members).to match_array [@gf1, @gf2]
48
48
  end
49
+
49
50
  it "should allow new files to be added" do
50
51
  @collection.members = [@gf1]
51
52
  @collection.save
52
- @collection = Collection.find(@collection.pid)
53
+ @collection.reload
53
54
  @collection.members << @gf2
54
55
  @collection.save
55
- expect(Collection.find(@collection.pid).members).to eq([@gf1, @gf2])
56
+ expect(@collection.reload.members).to match_array [@gf1, @gf2]
56
57
  end
57
- it "should allow files to be removed" do
58
- @collection.members = [@gf1, @gf2]
59
- @collection.save
60
58
 
61
- expect(@gf1.collections).to eq [@collection] # This line forces the "collections" to be cached.
62
- # We need to ensure that deleting causes the collection to be flushed.
63
- solr_doc_before_remove = ActiveFedora::SolrInstanceLoader.new(ActiveFedora::Base, @gf1.pid).send(:solr_doc)
64
- expect(solr_doc_before_remove["collection_tesim"]).to eq([@collection.pid])
65
- @collection.reload.members.delete(@gf1)
66
- @collection.save
67
- expect(Collection.find(@collection.pid).members).to eq([@gf2])
68
- solr_doc_after_remove = ActiveFedora::SolrInstanceLoader.new(ActiveFedora::Base, @gf1.pid).send(:solr_doc)
69
- expect(solr_doc_after_remove["collection_tesim"]).to be_nil
70
- end
71
59
  it "should set the date uploaded on create" do
72
60
  @collection.save
73
61
  expect(@collection.date_uploaded).to be_kind_of(Date)
@@ -75,7 +63,7 @@ describe Collection, :type => :model do
75
63
  it "should update the date modified on update" do
76
64
  uploaded_date = Date.today
77
65
  modified_date = Date.tomorrow
78
- allow(Date).to receive(:today).and_return(uploaded_date, modified_date)
66
+ expect(Date).to receive(:today).twice.and_return(uploaded_date, modified_date)
79
67
  @collection.save
80
68
  expect(@collection.date_modified).to eq(uploaded_date)
81
69
  @collection.members = [@gf1]
@@ -88,33 +76,41 @@ describe Collection, :type => :model do
88
76
  it "should have a title" do
89
77
  @collection.title = "title"
90
78
  @collection.save
91
- expect(Collection.find(@collection.pid).title).to eq(@collection.title)
79
+ expect(Collection.find(@collection.id).title).to eq(@collection.title)
92
80
  end
93
81
  it "should have a description" do
94
82
  @collection.description = "description"
95
83
  @collection.save
96
- expect(Collection.find(@collection.pid).description).to eq(@collection.description)
84
+ expect(Collection.find(@collection.id).description).to eq(@collection.description)
97
85
  end
86
+
98
87
  it "should have the expected display terms" do
99
- expect(@collection.terms_for_display).to eq([:part_of, :contributor, :creator, :title, :description, :publisher, :date_created, :date_uploaded, :date_modified, :subject, :language, :rights, :resource_type, :identifier, :based_near, :tag, :related_url])
88
+ expect(@collection.terms_for_display).to include(
89
+ :part_of, :contributor, :creator, :title, :description, :publisher,
90
+ :date_created, :date_uploaded, :date_modified, :subject, :language, :rights,
91
+ :resource_type, :identifier, :based_near, :tag, :related_url
92
+ )
100
93
  end
101
94
  it "should have the expected edit terms" do
102
- expect(@collection.terms_for_editing).to eq([:part_of, :contributor, :creator, :title, :description, :publisher, :date_created, :subject, :language, :rights, :resource_type, :identifier, :based_near, :tag, :related_url])
95
+ expect(@collection.terms_for_editing).to include(
96
+ :part_of, :contributor, :creator, :title, :description, :publisher, :date_created,
97
+ :subject, :language, :rights, :resource_type, :identifier, :based_near, :tag, :related_url
98
+ )
103
99
  end
104
100
  it "should not delete member files when deleted" do
105
101
  @collection.members = [@gf1, @gf2]
106
102
  @collection.save
107
103
  @collection.destroy
108
- expect(GenericFile.exists?(@gf1.pid)).to be_truthy
109
- expect(GenericFile.exists?(@gf2.pid)).to be_truthy
104
+ expect(GenericFile).to exist(@gf1.id)
105
+ expect(GenericFile).to exist(@gf2.id)
110
106
  end
111
107
 
112
108
  describe "Collection by another name" do
113
109
  before (:all) do
114
110
  class OtherCollection < ActiveFedora::Base
115
111
  include Hydra::Collection
116
- include Hydra::Collections::Collectible
117
112
  end
113
+
118
114
  class Member < ActiveFedora::Base
119
115
  include Hydra::Collections::Collectible
120
116
  end
@@ -124,15 +120,17 @@ describe Collection, :type => :model do
124
120
  Object.send(:remove_const, :Member)
125
121
  end
126
122
 
127
- it "have members that know about the collection" do
128
- collection = OtherCollection.new
129
- member = Member.create
123
+ let(:member) { Member.create }
124
+ let(:collection) { OtherCollection.new }
125
+
126
+ before do
130
127
  collection.members << member
131
128
  collection.save
129
+ end
130
+
131
+ it "have members that know about the collection" do
132
132
  member.reload
133
- expect(member.collections).to eq([collection])
134
- collection.destroy
135
- member.destroy
133
+ expect(member.collections).to eq [collection]
136
134
  end
137
135
  end
138
136