hydra-collections 2.0.3 → 2.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f6e1f62bb76da1eeb957dbebbf2ab9fbf713ddea
4
- data.tar.gz: cd34402c757b5de010ec1b70222e1da46fad1ac3
3
+ metadata.gz: 0848c18173f62f89254d85e85b584440db5c9360
4
+ data.tar.gz: f1f144ffa8fbc44c61ab2ad810c89ce8e7b18f38
5
5
  SHA512:
6
- metadata.gz: 84d26804dad9ca6907b2ae84b1e4bbace3c65be9b795655e9511f91dc979a9521f9c646fc2188a22b30345bfe1542b9a19cf7532f43f77a3f093e0213f6b8f7f
7
- data.tar.gz: 44176bea487fdeff2da52cb9b24bac2e0fe1ca3e92dae75b6297476cf39ae11a97dd058c84015b95b0a263ff18ec69d0253c5e3f0e28211dbfca0782cf3083d6
6
+ metadata.gz: 025f951414c29038af78092e552353de53181095da0f5fe6c16831a4a12e7d6e8c6de5fb30f68cab3f75e44bae2ee95d830c13a6455821339dd800332de82031
7
+ data.tar.gz: 7825b8ed470364197333795a2edd070df64a4935734864721a4914cf82970df572db73142fb33e031f8594045656ccc8b84754a9fe86647fff941b8ee9145a1e
data/.travis.yml CHANGED
@@ -1,18 +1,14 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 2.1
4
- gemfile:
5
- - gemfiles/rails3.gemfile
6
- - gemfiles/rails4.gemfile
4
+ - 2.0
7
5
  env:
8
6
  global:
9
7
  - NOKOGIRI_USE_SYSTEM_LIBRARIES=true
10
8
  notifications:
11
9
  email:
12
10
  recipients:
13
- - "michael@psu.edu"
14
- - "cam156@psu.edu"
15
- - "dmc186@psu.edu"
11
+ - "ul-dlt-hydra@lists.psu.edu"
16
12
  on_success: "change"
17
13
  on_failure: "always"
18
14
  irc:
@@ -20,4 +16,4 @@ notifications:
20
16
  - "irc.freenode.org#scholarsphere"
21
17
  - "irc.freenode.org#projecthydra"
22
18
  template:
23
- - "%{repository}//%{branch}@%{commit} by %{author}: %{message} - %{build_url}"
19
+ - "%{repository}//%{branch}@%{commit} by %{author}: %{message} - %{build_url}"
data/Changelog.md CHANGED
@@ -1,6 +1,30 @@
1
+ # 2.0.4
2
+
3
+ * Updating dependencies
4
+ * Refactoring collection membership methods
5
+ * More thorough testing of relationships in Solr
6
+ * Update to Rspec 3
7
+
8
+ # 2.0.3
9
+
10
+ * Pin to Rspec 2.99
11
+ * Made compatible with hydra-head 7.1
12
+
13
+ # 2.0.2
14
+
15
+ * Javascript is turbolinks-capable
16
+
17
+ # 2.0.1
18
+
19
+ * Fixes to searching and RDF datastreams
20
+
21
+ # 2.0.0
22
+
23
+ * Made compatible with hydra-head 7
24
+
1
25
  # 1.3.2
2
26
 
3
- Fixes delete button behavior
27
+ * Fixes delete button behavior
4
28
 
5
29
  # 1.2.0.rc1
6
30
 
data/Gemfile CHANGED
@@ -5,8 +5,9 @@ gemspec
5
5
 
6
6
  group :development, :test do
7
7
  gem 'sqlite3'
8
- gem "factory_girl_rails", "~> 4.1.0"
8
+ gem "factory_girl_rails"
9
9
  gem 'devise'
10
- gem 'capybara', '~>1.1.3'
10
+ gem 'capybara'
11
11
  gem 'jettywrapper'
12
+ gem 'byebug', require: false
12
13
  end
@@ -60,10 +60,7 @@ module Hydra
60
60
 
61
61
  def create
62
62
  @collection.apply_depositor_metadata(current_user.user_key)
63
- unless batch.empty?
64
- params[:collection][:members]="add"
65
- process_member_changes
66
- end
63
+ add_members_to_collection unless batch.empty?
67
64
  if @collection.save
68
65
  after_create
69
66
  else
@@ -98,7 +95,6 @@ module Hydra
98
95
  end
99
96
  end
100
97
 
101
-
102
98
  def after_destroy (id)
103
99
  respond_to do |format|
104
100
  format.html { redirect_to catalog_index_path, notice: 'Collection was successfully deleted.' }
@@ -114,12 +110,12 @@ module Hydra
114
110
  end
115
111
 
116
112
  def destroy
117
- if @collection.destroy
118
- after_destroy(params[:id])
119
- else
120
- after_destroy_error(params[:id])
121
- end
122
- end
113
+ if @collection.destroy
114
+ after_destroy(params[:id])
115
+ else
116
+ after_destroy_error(params[:id])
117
+ end
118
+ end
123
119
 
124
120
  protected
125
121
 
@@ -136,37 +132,38 @@ module Hydra
136
132
  end
137
133
 
138
134
  def process_member_changes
139
- unless params[:collection].nil?
140
- change_members = []
141
- batch.each do |pid|
142
- change_members << ActiveFedora::Base.find(pid, :cast=>true)
143
- end
135
+ case params[:collection][:members]
136
+ when "add" then add_members_to_collection
137
+ when "remove" then remove_members_from_collection
138
+ when "move" then move_members_between_collections
139
+ when Array then assign_batch_to_collection
140
+ end
141
+ end
144
142
 
145
- case params[:collection][:members]
146
- when "add"
147
- change_members.each do |member|
148
- @collection.members << member
149
- #@collection.add_relationship(:has_collection_member, "info:fedora/#{pid}")
150
- end
151
- when "remove"
152
- change_members.each do |member|
153
- @collection.members.delete(member)
154
- end
155
- when "move"
156
- @destination_collection = ::Collection.find(params[:destination_collection_id])
157
- change_members.each do |member|
158
- @collection.members.delete(member)
159
- @destination_collection.members << member
160
- end
161
- @destination_collection.save
162
- flash[:notice] = "Successfully moved #{change_members.count} files to #{@destination_collection.title} Collection."
163
- when Array
164
- @collection.members.replace(change_members)
165
- #@collection.clear_relationship(:has_collection_member)
166
- #params[:collection][:members].each do |pid|
167
- # @collection.add_relationship(:has_collection_member, "info:fedora/#{pid}")
168
- #end
169
- end
143
+ def add_members_to_collection collection = nil
144
+ collection ||= @collection
145
+ collection.members(true)
146
+ collection.member_ids = batch.concat(collection.member_ids)
147
+ end
148
+
149
+ def remove_members_from_collection
150
+ @collection.members(true)
151
+ @collection.member_ids = (@collection.member_ids - batch)
152
+ end
153
+
154
+ def assign_batch_to_collection
155
+ @collection.members(true)
156
+ @collection.member_ids = batch
157
+ end
158
+
159
+ def move_members_between_collections
160
+ destination_collection = ::Collection.find(params[:destination_collection_id])
161
+ remove_members_from_collection
162
+ add_members_to_collection(destination_collection)
163
+ if destination_collection.save
164
+ flash[:notice] = "Successfully moved #{batch.count} files to #{destination_collection.title} Collection."
165
+ else
166
+ flash[:error] = "An error occured. Files were not moved to #{destination_collection.title} Collection."
170
167
  end
171
168
  end
172
169
 
@@ -11,7 +11,7 @@ module Hydra
11
11
  has_metadata "descMetadata", type: Hydra::CollectionRdfDatastream
12
12
  has_metadata "properties", type: Hydra::Datastream::Properties
13
13
 
14
- has_and_belongs_to_many :members, :property => :has_collection_member, :class_name => "ActiveFedora::Base" , :after_remove => :remove_member
14
+ has_and_belongs_to_many :members, :property => :has_collection_member, :class_name => "ActiveFedora::Base" , :after_remove => :update_member
15
15
 
16
16
  has_attributes :depositor, datastream: :properties, multiple: false
17
17
 
@@ -25,10 +25,9 @@ module Hydra
25
25
  before_create :set_date_uploaded
26
26
  before_save :set_date_modified
27
27
 
28
- after_save :local_update_members
29
- after_create :create_member_index
28
+ after_save :update_all_members
30
29
 
31
- before_destroy :remove_all_members
30
+ before_destroy :update_all_members
32
31
  end
33
32
 
34
33
  def terms_for_editing
@@ -39,9 +38,13 @@ module Hydra
39
38
  self.descMetadata.class.config.keys.map{|v| v.to_sym}
40
39
  end
41
40
 
42
- def remove_member(member)
43
- #member.collections.delete self if member.respond_to?(:collections)
44
- member.reload.update_index
41
+ def update_all_members
42
+ self.members.collect { |m| update_member(m) }
43
+ end
44
+
45
+ # TODO: Use solr atomic updates to accelerate this process
46
+ def update_member member
47
+ member.update_index
45
48
  end
46
49
 
47
50
  private
@@ -54,34 +57,6 @@ module Hydra
54
57
  self.date_modified = Date.today
55
58
  end
56
59
 
57
- # cause the members to index the relationship
58
- def local_update_members
59
- if self.respond_to?(:members)
60
- self.members.each do |member|
61
- member.reload.update_index
62
- end
63
- end
64
- end
65
-
66
- def create_member_index
67
- self.members.each do |member|
68
- member.to_solr # not sure why this to_solr is needed but it caused the removal and update to work
69
- if member.respond_to?(:collections)
70
- member.collections << self
71
- member.update_index
72
- member.collections << self if self.members.size == 1 #again who konw why but this allows on asset to be added
73
- end
74
- end
75
- end
76
-
77
- def remove_all_members
78
- self.members.each do |member|
79
- member.to_solr # not sure why this to_solr is needed but it caused the removal and update to work
80
- member.collections.delete(self) if member.respond_to?(:collections)
81
- member.update_index
82
- end
83
- end
84
-
85
- end
60
+ end
86
61
 
87
62
  end
@@ -23,5 +23,5 @@ Gem::Specification.new do |spec|
23
23
 
24
24
  spec.add_development_dependency "bundler", "~> 1.3"
25
25
  spec.add_development_dependency "rake"
26
- spec.add_development_dependency "rspec-rails", '~> 2.99'
26
+ spec.add_development_dependency "rspec-rails"
27
27
  end
@@ -1,5 +1,5 @@
1
1
  module Hydra
2
2
  module Collections
3
- VERSION = "2.0.3"
3
+ VERSION = "2.0.4"
4
4
  end
5
5
  end
@@ -4,23 +4,24 @@ class AcceptsBatchesController < ApplicationController
4
4
  include Hydra::Collections::AcceptsBatches
5
5
  end
6
6
 
7
- describe AcceptsBatchesController do
7
+ describe AcceptsBatchesController, :type => :controller do
8
8
 
9
9
  describe "batch" do
10
10
  it "should accept batch from parameters" do
11
11
  controller.params["batch_document_ids"] = ["abc", "xyz"]
12
- controller.batch.should == ["abc", "xyz"]
12
+ expect(controller.batch).to eq(["abc", "xyz"])
13
13
  end
14
14
  describe ":all" do
15
+ let(:current_user) { double(user_key: 'vanessa') }
15
16
  before do
16
17
  doc1 = double(:id=>123)
17
18
  doc2 = double(:id=>456)
18
- Hydra::Collections::SearchService.any_instance.should_receive(:last_search_documents).and_return([doc1, doc2])
19
- controller.stub(current_user: double(user_key: 'vanessa'))
19
+ expect_any_instance_of(Hydra::Collections::SearchService).to receive(:last_search_documents).and_return([doc1, doc2])
20
+ allow(controller).to receive(:current_user).and_return(current_user)
20
21
  end
21
22
  it "should add every document in the current resultset to the batch" do
22
23
  controller.params["batch_document_ids"] = "all"
23
- controller.batch.should == [123, 456]
24
+ expect(controller.batch).to eq([123, 456])
24
25
  end
25
26
  end
26
27
  end
@@ -32,39 +33,36 @@ describe AcceptsBatchesController do
32
33
  subject.batch = @allowed + @disallowed
33
34
  end
34
35
  it "using filter_docs_with_access!" do
35
- @allowed.each {|doc_id| subject.should_receive(:can?).with(:foo, doc_id).and_return(true)}
36
- @disallowed.each {|doc_id| subject.should_receive(:can?).with(:foo, doc_id).and_return(false)}
36
+ @allowed.each {|doc_id| expect(subject).to receive(:can?).with(:foo, doc_id).and_return(true)}
37
+ @disallowed.each {|doc_id| expect(subject).to receive(:can?).with(:foo, doc_id).and_return(false)}
37
38
  subject.send(:filter_docs_with_access!, :foo)
38
- subject.batch.should
39
- flash[:notice].should == "You do not have permission to edit the documents: #{@disallowed.join(', ')}"
39
+ expect(flash[:notice]).to eq("You do not have permission to edit the documents: #{@disallowed.join(', ')}")
40
40
  end
41
41
  it "using filter_docs_with_edit_access!" do
42
- @allowed.each {|doc_id| subject.should_receive(:can?).with(:edit, doc_id).and_return(true)}
43
- @disallowed.each {|doc_id| subject.should_receive(:can?).with(:edit, doc_id).and_return(false)}
42
+ @allowed.each {|doc_id| expect(subject).to receive(:can?).with(:edit, doc_id).and_return(true)}
43
+ @disallowed.each {|doc_id| expect(subject).to receive(:can?).with(:edit, doc_id).and_return(false)}
44
44
  subject.send(:filter_docs_with_edit_access!)
45
- subject.batch.should
46
- flash[:notice].should == "You do not have permission to edit the documents: #{@disallowed.join(', ')}"
45
+ expect(flash[:notice]).to eq("You do not have permission to edit the documents: #{@disallowed.join(', ')}")
47
46
  end
48
47
  it "using filter_docs_with_read_access!" do
49
- @allowed.each {|doc_id| subject.should_receive(:can?).with(:read, doc_id).and_return(true)}
50
- @disallowed.each {|doc_id| subject.should_receive(:can?).with(:read, doc_id).and_return(false)}
48
+ @allowed.each {|doc_id| expect(subject).to receive(:can?).with(:read, doc_id).and_return(true)}
49
+ @disallowed.each {|doc_id| expect(subject).to receive(:can?).with(:read, doc_id).and_return(false)}
51
50
  subject.send(:filter_docs_with_read_access!)
52
- subject.batch.should
53
- flash[:notice].should == "You do not have permission to edit the documents: #{@disallowed.join(', ')}"
51
+ expect(flash[:notice]).to eq("You do not have permission to edit the documents: #{@disallowed.join(', ')}")
54
52
  end
55
53
  it "and be sassy if you didn't select anything" do
56
54
  subject.batch = []
57
55
  subject.send(:filter_docs_with_read_access!)
58
- flash[:notice].should == "Select something first"
56
+ expect(flash[:notice]).to eq("Select something first")
59
57
  end
60
58
 
61
59
  end
62
60
 
63
61
  it "should check for empty" do
64
62
  controller.batch = ["77826928", "94120425"]
65
- controller.check_for_empty_batch?.should == false
63
+ expect(controller.check_for_empty_batch?).to eq(false)
66
64
  controller.batch = []
67
- controller.check_for_empty_batch?.should == true
65
+ expect(controller.check_for_empty_batch?).to eq(true)
68
66
  end
69
67
 
70
68
 
@@ -16,9 +16,9 @@ require 'spec_helper'
16
16
 
17
17
  include Rails.application.routes.url_helpers
18
18
 
19
- describe CatalogController do
19
+ describe CatalogController, :type => :controller do
20
20
  before do
21
- controller.stub(:has_access?).and_return(true)
21
+ allow(controller).to receive(:has_access?).and_return(true)
22
22
  @user = FactoryGirl.find_or_create(:user)
23
23
  @collection = Collection.new title:"Test"
24
24
  @collection.apply_depositor_metadata(@user.user_key)
@@ -37,7 +37,7 @@ describe CatalogController do
37
37
  @routes = Rails.application.routes
38
38
  get :index
39
39
  expect(assigns(:user_collections)).to be_kind_of(Array)
40
- assigns(:user_collections).index{|d| d.id == @collection.id}.should_not be_nil
40
+ expect(assigns(:user_collections).index{|d| d.id == @collection.id}).not_to be_nil
41
41
  end
42
42
  end
43
43
 
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe CollectionsController do
3
+ describe CollectionsController, :type => :controller do
4
4
  before(:all) do
5
5
  @user = FactoryGirl.find_or_create(:user)
6
6
  # CollectionsController.config.default_solr_params = {:qf => 'title_tesim'}
@@ -25,12 +25,12 @@ describe CollectionsController do
25
25
  end
26
26
 
27
27
  before do
28
- controller.stub(:has_access?).and_return(true)
28
+ allow(controller).to receive(:has_access?).and_return(true)
29
29
 
30
30
  @user = FactoryGirl.find_or_create(:user)
31
31
  sign_in @user
32
- User.any_instance.stub(:groups).and_return([])
33
- controller.stub(:clear_session_user) ## Don't clear out the authenticated session
32
+ allow_any_instance_of(User).to receive(:groups).and_return([])
33
+ allow(controller).to receive(:clear_session_user) ## Don't clear out the authenticated session
34
34
  end
35
35
 
36
36
  describe '#new' do
@@ -39,9 +39,9 @@ describe CollectionsController do
39
39
  expect(assigns(:collection)).to be_kind_of(Collection)
40
40
  end
41
41
  it "should pass through batch ids if provided and stick them in the form" do
42
- pending "Couldn't get have_selector working before I had to move on. - MZ"
42
+ skip "Couldn't get have_selector working before I had to move on. - MZ"
43
43
  get :new, batch_document_ids: ["test2", "test88"]
44
- response.should have_selector("p[class='foo']")
44
+ expect(response).to have_selector("p[class='foo']")
45
45
  end
46
46
  end
47
47
 
@@ -49,45 +49,45 @@ describe CollectionsController do
49
49
  it "should create a Collection" do
50
50
  old_count = Collection.count
51
51
  post :create, collection: {title: "My First Collection ", description: "The Description\r\n\r\nand more"}
52
- Collection.count.should == old_count+1
53
- assigns[:collection].title.should == "My First Collection "
54
- assigns[:collection].description.should == "The Description\r\n\r\nand more"
55
- assigns[:collection].depositor.should == @user.user_key
56
- response.should redirect_to Hydra::Collections::Engine.routes.url_helpers.collection_path(assigns[:collection].id)
52
+ expect(Collection.count).to eq(old_count+1)
53
+ expect(assigns[:collection].title).to eq("My First Collection ")
54
+ expect(assigns[:collection].description).to eq("The Description\r\n\r\nand more")
55
+ expect(assigns[:collection].depositor).to eq(@user.user_key)
56
+ expect(response).to redirect_to Hydra::Collections::Engine.routes.url_helpers.collection_path(assigns[:collection].id)
57
57
  end
58
58
  it "should add docs to collection if batch ids provided" do
59
59
  @asset1 = ActiveFedora::Base.create!
60
60
  @asset2 = ActiveFedora::Base.create!
61
61
  post :create, batch_document_ids: [@asset1, @asset2], collection: {title: "My Secong Collection ", description: "The Description\r\n\r\nand more"}
62
- assigns[:collection].members.should == [@asset1, @asset2]
62
+ expect(assigns[:collection].members).to eq([@asset1, @asset2])
63
63
  end
64
64
  it "should call after_create" do
65
- controller.should_receive(:after_create).and_call_original
65
+ expect(controller).to receive(:after_create).and_call_original
66
66
  post :create, collection: {title: "My First Collection ", description: "The Description\r\n\r\nand more"}
67
67
  end
68
68
 
69
69
  it "should add one doc to collection if batch ids provided and add the collection id to the document in the colledction" do
70
70
  @asset1 = GenericFile.create!
71
71
  post :create, batch_document_ids: [@asset1], collection: {title: "My Secong Collection ", description: "The Description\r\n\r\nand more"}
72
- assigns[:collection].members.should == [@asset1]
72
+ expect(assigns[:collection].members).to eq([@asset1])
73
73
  asset_results = blacklight_solr.get "select", params:{fq:["id:\"#{@asset1.pid}\""],fl:['id',Solrizer.solr_name(:collection)]}
74
- asset_results["response"]["numFound"].should == 1
74
+ expect(asset_results["response"]["numFound"]).to eq(1)
75
75
  doc = asset_results["response"]["docs"].first
76
- doc["id"].should == @asset1.pid
76
+ expect(doc["id"]).to eq(@asset1.pid)
77
77
  afterupdate = GenericFile.find(@asset1.pid)
78
- doc[Solrizer.solr_name(:collection)].should == afterupdate.to_solr[Solrizer.solr_name(:collection)]
78
+ expect(doc[Solrizer.solr_name(:collection)]).to eq(afterupdate.to_solr[Solrizer.solr_name(:collection)])
79
79
  end
80
80
  it "should add docs to collection if batch ids provided and add the collection id to the documents int he colledction" do
81
81
  @asset1 = GenericFile.create!
82
82
  @asset2 = GenericFile.create!
83
83
  post :create, batch_document_ids: [@asset1,@asset2], collection: {title: "My Secong Collection ", description: "The Description\r\n\r\nand more"}
84
- assigns[:collection].members.should == [@asset1,@asset2]
84
+ expect(assigns[:collection].members).to eq([@asset1,@asset2])
85
85
  asset_results = blacklight_solr.get "select", params:{fq:["id:\"#{@asset1.pid}\""],fl:['id',Solrizer.solr_name(:collection)]}
86
- asset_results["response"]["numFound"].should == 1
86
+ expect(asset_results["response"]["numFound"]).to eq(1)
87
87
  doc = asset_results["response"]["docs"].first
88
- doc["id"].should == @asset1.pid
88
+ expect(doc["id"]).to eq(@asset1.pid)
89
89
  afterupdate = GenericFile.find(@asset1.pid)
90
- doc[Solrizer.solr_name(:collection)].should == afterupdate.to_solr[Solrizer.solr_name(:collection)]
90
+ expect(doc[Solrizer.solr_name(:collection)]).to eq(afterupdate.to_solr[Solrizer.solr_name(:collection)])
91
91
  end
92
92
  end
93
93
 
@@ -99,68 +99,76 @@ describe CollectionsController do
99
99
  @asset1 = GenericFile.create!
100
100
  @asset2 = GenericFile.create!
101
101
  @asset3 = GenericFile.create!
102
- controller.stub(:authorize!).and_return(true)
103
- controller.should_receive(:authorize!).at_least(:once)
102
+ allow(controller).to receive(:authorize!).and_return(true)
103
+ expect(controller).to receive(:authorize!).at_least(:once)
104
104
  end
105
105
  it "should update collection metadata" do
106
106
  put :update, id: @collection.id, collection: {title: "New Title", description: "New Description"}
107
- response.should redirect_to Hydra::Collections::Engine.routes.url_helpers.collection_path(@collection.id)
108
- assigns[:collection].title.should == "New Title"
109
- assigns[:collection].description.should == "New Description"
107
+ expect(response).to redirect_to Hydra::Collections::Engine.routes.url_helpers.collection_path(@collection.id)
108
+ expect(assigns[:collection].title).to eq("New Title")
109
+ expect(assigns[:collection].description).to eq("New Description")
110
110
  end
111
111
 
112
112
  it "should call after_update" do
113
- controller.should_receive(:after_update).and_call_original
113
+ expect(controller).to receive(:after_update).and_call_original
114
114
  put :update, id: @collection.id, collection: {title: "New Title", description: "New Description"}
115
115
  end
116
116
  it "should support adding batches of members" do
117
117
  @collection.members << @asset1
118
118
  @collection.save
119
119
  put :update, id: @collection.id, collection: {members:"add"}, batch_document_ids:[@asset2, @asset3]
120
- response.should redirect_to Hydra::Collections::Engine.routes.url_helpers.collection_path(@collection.id)
121
- assigns[:collection].members.sort! { |a,b| a.pid <=> b.pid }.should == [@asset2, @asset3, @asset1].sort! { |a,b| a.pid <=> b.pid }
120
+ expect(response).to redirect_to Hydra::Collections::Engine.routes.url_helpers.collection_path(@collection.id)
121
+ expect(assigns[:collection].members.sort! { |a,b| a.pid <=> b.pid }).to eq([@asset2, @asset3, @asset1].sort! { |a,b| a.pid <=> b.pid })
122
122
  end
123
123
  it "should support removing batches of members" do
124
124
  @collection.members = [@asset1, @asset2, @asset3]
125
125
  @collection.save
126
126
  put :update, id: @collection.id, collection: {members:"remove"}, batch_document_ids:[@asset1, @asset3]
127
- response.should redirect_to Hydra::Collections::Engine.routes.url_helpers.collection_path(@collection.id)
128
- assigns[:collection].members.should == [@asset2]
127
+ expect(response).to redirect_to Hydra::Collections::Engine.routes.url_helpers.collection_path(@collection.id)
128
+ expect(assigns[:collection].members).to eq([@asset2])
129
129
  end
130
130
  it "should support setting members array" do
131
131
  put :update, id: @collection.id, collection: {members:"add"}, batch_document_ids:[@asset2, @asset3, @asset1]
132
- response.should redirect_to Hydra::Collections::Engine.routes.url_helpers.collection_path(@collection.id)
133
- assigns[:collection].members.sort! { |a,b| a.pid <=> b.pid }.should == [@asset2, @asset3, @asset1].sort! { |a,b| a.pid <=> b.pid }
132
+ expect(response).to redirect_to Hydra::Collections::Engine.routes.url_helpers.collection_path(@collection.id)
133
+ expect(assigns[:collection].members.sort! { |a,b| a.pid <=> b.pid }).to eq([@asset2, @asset3, @asset1].sort! { |a,b| a.pid <=> b.pid })
134
134
  end
135
135
  it "should support setting members array" do
136
136
  put :update, id: @collection.id, collection: {members:"add"}, batch_document_ids:[@asset2, @asset3, @asset1]
137
- response.should redirect_to Hydra::Collections::Engine.routes.url_helpers.collection_path(@collection.id)
138
- assigns[:collection].members.sort! { |a,b| a.pid <=> b.pid }.should == [@asset2, @asset3, @asset1].sort! { |a,b| a.pid <=> b.pid }
137
+ expect(response).to redirect_to Hydra::Collections::Engine.routes.url_helpers.collection_path(@collection.id)
138
+ expect(assigns[:collection].members.sort! { |a,b| a.pid <=> b.pid }).to eq([@asset2, @asset3, @asset1].sort! { |a,b| a.pid <=> b.pid })
139
139
  end
140
140
  it "should set/un-set collection on members" do
141
141
  # Add to collection (sets collection on members)
142
+ solr_doc_before_add = ActiveFedora::SolrInstanceLoader.new(ActiveFedora::Base, @asset2.pid).send(:solr_doc)
143
+ expect(solr_doc_before_add[Solrizer.solr_name(:collection)]).to be_nil
142
144
  put :update, id: @collection.id, collection: {members:"add"}, batch_document_ids:[@asset2, @asset3]
143
- assigns[:collection].members.sort! { |a,b| a.pid <=> b.pid }.should == [@asset2, @asset3].sort! { |a,b| a.pid <=> b.pid }
145
+ expect(assigns[:collection].members.sort! { |a,b| a.pid <=> b.pid }).to eq([@asset2, @asset3].sort! { |a,b| a.pid <=> b.pid })
144
146
  ## Check that member lists collection in its solr doc
145
147
  @asset2.reload
146
- @asset2.to_solr[Solrizer.solr_name(:collection)].should == [@collection.pid]
148
+ expect(@asset2.to_solr[Solrizer.solr_name(:collection)]).to eq([@collection.pid])
147
149
  ## Check that member was re-indexed with collection info
148
150
  asset_results = blacklight_solr.get "select", params:{fq:["id:\"#{@asset2.pid}\""],fl:['id',Solrizer.solr_name(:collection)]}
149
151
  doc = asset_results["response"]["docs"].first
150
- doc["id"].should == @asset2.pid
151
- doc[Solrizer.solr_name(:collection)].should == [@collection.pid]
152
-
152
+ expect(doc["id"]).to eq(@asset2.pid)
153
+ expect(doc[Solrizer.solr_name(:collection)]).to eq([@collection.pid])
154
+ solr_doc_after_add = ActiveFedora::SolrInstanceLoader.new(ActiveFedora::Base, @asset2.pid).send(:solr_doc)
155
+ expect(solr_doc_after_add[Solrizer.solr_name(:collection)]).to eq([@collection.pid])
156
+
153
157
  # Remove from collection (un-sets collection on members)
158
+ solr_doc_before_remove = ActiveFedora::SolrInstanceLoader.new(ActiveFedora::Base, @asset2.pid).send(:solr_doc)
159
+ expect(solr_doc_before_remove[Solrizer.solr_name(:collection)]).to eq([@collection.pid])
154
160
  put :update, id: @collection.id, collection: {members:"remove"}, batch_document_ids:[@asset2]
155
- assigns[:collection].members.should_not include(@asset2)
161
+ expect(assigns[:collection].members).not_to include(@asset2)
156
162
  ## Check that member no longer lists collection in its solr doc
157
163
  @asset2.reload
158
- @asset2.to_solr[Solrizer.solr_name(:collection)].should == []
164
+ expect(@asset2.to_solr[Solrizer.solr_name(:collection)]).to eq([])
159
165
  ## Check that member was re-indexed without collection info
160
166
  asset_results = blacklight_solr.get "select", params:{fq:["id:\"#{@asset2.pid}\""],fl:['id',Solrizer.solr_name(:collection)]}
161
167
  doc = asset_results["response"]["docs"].first
162
- doc["id"].should == @asset2.pid
163
- doc[Solrizer.solr_name(:collection)].should be_nil
168
+ expect(doc["id"]).to eq(@asset2.pid)
169
+ expect(doc[Solrizer.solr_name(:collection)]).to be_nil
170
+ solr_doc_after_remove = ActiveFedora::SolrInstanceLoader.new(ActiveFedora::Base, @asset2.pid).send(:solr_doc)
171
+ expect(solr_doc_after_remove[Solrizer.solr_name(:collection)]).to be_nil
164
172
  end
165
173
 
166
174
  it "should allow moving members between collections" do
@@ -170,8 +178,8 @@ describe CollectionsController do
170
178
  @collection2.apply_depositor_metadata(@user.user_key)
171
179
  @collection2.save
172
180
  put :update, id: @collection.id, collection: {members:"move"}, destination_collection_id:@collection2.pid, batch_document_ids:[@asset2, @asset3]
173
- ::Collection.find(@collection.pid).members.should == [@asset1]
174
- ::Collection.find(@collection2.pid).members.should == [@asset2, @asset3]
181
+ expect(::Collection.find(@collection.pid).members).to eq([@asset1])
182
+ expect(::Collection.find(@collection2.pid).members).to eq([@asset2, @asset3])
175
183
  end
176
184
 
177
185
  end
@@ -182,15 +190,15 @@ describe CollectionsController do
182
190
  @collection = Collection.new
183
191
  @collection.apply_depositor_metadata(@user.user_key)
184
192
  @collection.save
185
- controller.should_receive(:authorize!).and_return(true)
193
+ expect(controller).to receive(:authorize!).and_return(true)
186
194
  end
187
195
  it "should delete collection" do
188
196
  delete :destroy, id: @collection.id
189
- response.should redirect_to Rails.application.routes.url_helpers.catalog_index_path
190
- flash[:notice].should == "Collection was successfully deleted."
197
+ expect(response).to redirect_to Rails.application.routes.url_helpers.catalog_index_path
198
+ expect(flash[:notice]).to eq("Collection was successfully deleted.")
191
199
  end
192
200
  it "should after_destroy" do
193
- controller.should_receive(:after_destroy).and_call_original
201
+ expect(controller).to receive(:after_destroy).and_call_original
194
202
  delete :destroy, id: @collection.id
195
203
  end
196
204
  it "should call update members" do
@@ -199,18 +207,18 @@ describe CollectionsController do
199
207
  @collection.save
200
208
  @asset1 = @asset1.reload
201
209
  @asset1.update_index
202
- @asset1.collections.should == [@collection]
210
+ expect(@asset1.collections).to eq([@collection])
203
211
  asset_results = blacklight_solr.get "select", params:{fq:["id:\"#{@asset1.pid}\""],fl:['id',Solrizer.solr_name(:collection)]}
204
- asset_results["response"]["numFound"].should == 1
212
+ expect(asset_results["response"]["numFound"]).to eq(1)
205
213
  doc = asset_results["response"]["docs"].first
206
- doc[Solrizer.solr_name(:collection)].should == [@collection.pid]
214
+ expect(doc[Solrizer.solr_name(:collection)]).to eq([@collection.pid])
207
215
 
208
216
  delete :destroy, id: @collection.id
209
- @asset1.reload.collections.should == []
217
+ expect(@asset1.reload.collections).to eq([])
210
218
  asset_results = blacklight_solr.get "select", params:{fq:["id:\"#{@asset1.pid}\""],fl:['id',Solrizer.solr_name(:collection)]}
211
- asset_results["response"]["numFound"].should == 1
219
+ expect(asset_results["response"]["numFound"]).to eq(1)
212
220
  doc = asset_results["response"]["docs"].first
213
- doc[Solrizer.solr_name(:collection)].should be_nil
221
+ expect(doc[Solrizer.solr_name(:collection)]).to be_nil
214
222
  @asset1.destroy
215
223
  end
216
224
  end
@@ -229,16 +237,28 @@ describe CollectionsController do
229
237
  @collection.apply_depositor_metadata(@user.user_key)
230
238
  @collection.members = [@asset1,@asset2,@asset3]
231
239
  @collection.save
232
- controller.should_receive(:authorize!).and_return(true)
233
- controller.stub(:apply_gated_search)
240
+ allow(controller).to receive(:authorize!).and_return(true)
241
+ allow(controller).to receive(:apply_gated_search)
234
242
  end
235
243
  it "should show the collections" do
236
244
  get :show, id: @collection.id
237
- assigns[:collection].title.should == @collection.title
245
+ expect(assigns[:collection].title).to eq(@collection.title)
238
246
  ids = assigns[:member_docs].map {|d| d.id}
239
- ids.should include @asset1.pid
240
- ids.should include @asset2.pid
241
- ids.should include @asset3.pid
247
+ expect(ids).to include @asset1.pid
248
+ expect(ids).to include @asset2.pid
249
+ expect(ids).to include @asset3.pid
250
+ end
251
+ context "when items have been added and removed" do
252
+ it "should return the items that are in the collection and not return items that have been removed" do
253
+ asset4 = GenericFile.create!(title: "Fourth of the Assets")
254
+ put :update, id: @collection.id, collection: {members:"remove"}, batch_document_ids:[@asset2.pid]
255
+ controller.batch = nil
256
+ put :update, id: @collection.id, collection: {members:"add"}, batch_document_ids:[asset4.pid]
257
+ get :show, id: @collection.id
258
+ ids = assigns[:member_docs].map(&:id)
259
+ expect(ids).to include @asset1.pid, @asset3.pid, asset4.pid
260
+ expect(ids).to_not include @asset2.pid
261
+ end
242
262
  end
243
263
  describe "additional collections" do
244
264
  before do
@@ -249,46 +269,46 @@ describe CollectionsController do
249
269
  @collection2.members = [@asset4]
250
270
  @collection2.save
251
271
  @asset4 = @asset4.reload
252
- @asset4.collections.should == [@collection2]
272
+ expect(@asset4.collections).to eq([@collection2])
253
273
  end
254
274
 
255
275
  it "should show only the collections assets" do
256
276
  get :show, id: @collection.pid
257
- assigns[:collection].title.should == @collection.title
277
+ expect(assigns[:collection].title).to eq(@collection.title)
258
278
  ids = assigns[:member_docs].map {|d| d.id}
259
- ids.should include @asset1.pid
260
- ids.should include @asset2.pid
261
- ids.should include @asset3.pid
262
- ids.should_not include @asset4.pid
279
+ expect(ids).to include @asset1.pid
280
+ expect(ids).to include @asset2.pid
281
+ expect(ids).to include @asset3.pid
282
+ expect(ids).not_to include @asset4.pid
263
283
 
264
284
  end
265
285
  it "should show only the other collections assets" do
266
286
 
267
287
  get :show, id: @collection2.pid
268
- assigns[:collection].title.should == @collection2.title
288
+ expect(assigns[:collection].title).to eq(@collection2.title)
269
289
  ids = assigns[:member_docs].map {|d| d.id}
270
- ids.should_not include @asset1.pid
271
- ids.should_not include @asset2.pid
272
- ids.should_not include @asset3.pid
273
- ids.should include @asset4.pid
290
+ expect(ids).not_to include @asset1.pid
291
+ expect(ids).not_to include @asset2.pid
292
+ expect(ids).not_to include @asset3.pid
293
+ expect(ids).to include @asset4.pid
274
294
 
275
295
  end
276
296
  end
277
297
 
278
298
  it "when the collection is empty it should show no assets" do
279
299
  get :show, id: Collection.create(title: "Empty collection").id
280
- assigns[:collection].title.should == "Empty collection"
281
- assigns[:member_docs].should be_empty
300
+ expect(assigns[:collection].title).to eq("Empty collection")
301
+ expect(assigns[:member_docs]).to be_empty
282
302
  end
283
303
 
284
304
  # NOTE: This test depends on title_tesim being in the qf in solrconfig.xml
285
305
  it "should query the collections" do
286
306
  get :show, id: @collection.id, cq:"\"#{@asset1.title}\""
287
- assigns[:collection].title.should == @collection.title
307
+ expect(assigns[:collection].title).to eq(@collection.title)
288
308
  ids = assigns[:member_docs].map {|d| d.id}
289
- ids.should include @asset1.pid
290
- ids.should_not include @asset2.pid
291
- ids.should_not include @asset3.pid
309
+ expect(ids).to include @asset1.pid
310
+ expect(ids).not_to include @asset2.pid
311
+ expect(ids).not_to include @asset3.pid
292
312
  end
293
313
 
294
314
  # NOTE: This test depends on title_tesim being in the qf in solrconfig.xml
@@ -296,20 +316,20 @@ describe CollectionsController do
296
316
  @asset4 = GenericFile.create!(title: "#{@asset1.id} #{@asset1.title}")
297
317
  @asset5 = GenericFile.create!(title: "#{@asset1.title}")
298
318
  get :show, id: @collection.id, cq:"\"#{@asset1.title}\""
299
- assigns[:collection].title.should == @collection.title
319
+ expect(assigns[:collection].title).to eq(@collection.title)
300
320
  ids = assigns[:member_docs].map {|d| d.id}
301
- ids.should include @asset1.pid
302
- ids.should_not include @asset2.pid
303
- ids.should_not include @asset3.pid
304
- ids.should_not include @asset4.pid
305
- ids.should_not include @asset5.pid
321
+ expect(ids).to include @asset1.pid
322
+ expect(ids).not_to include @asset2.pid
323
+ expect(ids).not_to include @asset3.pid
324
+ expect(ids).not_to include @asset4.pid
325
+ expect(ids).not_to include @asset5.pid
306
326
  end
307
327
 
308
328
  it "should query the collections with rows" do
309
329
  get :show, id: @collection.id, rows:"2"
310
- assigns[:collection].title.should == @collection.title
330
+ expect(assigns[:collection].title).to eq(@collection.title)
311
331
  ids = assigns[:member_docs].map {|d| d.id}
312
- ids.count.should == 2
332
+ expect(ids.count).to eq(2)
313
333
  end
314
334
 
315
335
  end