hydra-core 8.2.0 → 9.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/concerns/hydra/controller/controller_behavior.rb +5 -6
- data/app/controllers/concerns/hydra/controller/download_behavior.rb +37 -39
- data/app/models/concerns/hydra/model_methods.rb +22 -22
- data/hydra-core.gemspec +3 -3
- data/lib/generators/hydra/head_generator.rb +0 -2
- data/lib/generators/hydra/templates/catalog_controller.rb +1 -2
- data/lib/generators/hydra/templates/config/initializers/hydra_config.rb +8 -8
- data/lib/hydra-core.rb +4 -0
- data/lib/hydra-head/version.rb +1 -2
- data/spec/controllers/catalog_controller_spec.rb +6 -8
- data/spec/controllers/downloads_controller_spec.rb +40 -47
- data/spec/lib/catalog_spec.rb +15 -0
- data/spec/lib/model_methods_spec.rb +19 -9
- data/spec/spec_helper.rb +9 -5
- data/spec/support/lib/generators/test_app_generator.rb +1 -8
- data/spec/support/lib/tasks/rspec.rake +2 -1
- data/tasks/rspec.rake +1 -7
- metadata +25 -31
- data/app/search_builders/hydra/search_builder.rb +0 -5
- data/lib/generators/hydra/hyhead_fixtures_generator.rb +0 -27
- data/lib/generators/hydra/templates/config/blacklight.yml +0 -9
- data/lib/railties/hydra-fixtures.rake +0 -49
- data/spec/models/mods_asset_spec.rb +0 -16
- data/spec/search_builders/search_builder_spec.rb +0 -22
- data/spec/support/app/models/generic_content.rb +0 -21
- data/spec/support/spec/fixtures/hydra_test_generic_content.foxml.xml +0 -138
- data/spec/support/spec/fixtures/hydrangea_fixture_mods_article1.foxml.xml +0 -234
- data/tasks/hydra-head-fixtures.rake +0 -58
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e233f2087f4d4d190c24ffe41bfd5915ac668bf7
|
4
|
+
data.tar.gz: 0d257fe1e9583e99e60df8d863bb30e9eba9f7c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a0843e0f816379e1da9da3e6af2c07855cbddf7310c42d63fdf45fc1f06940e8585f1a349287b974591249503a1aa5389782f8a850d6b32898a05f838c3a707
|
7
|
+
data.tar.gz: 39f081771adf23e600202ad12c4550a08ea0d7df4d8da6cc50e779bcdec2e4d7806261938258b02f0a4602402b6019105131df4d1953bab2affbb77a6e410b67
|
@@ -12,6 +12,9 @@ module Hydra::Controller::ControllerBehavior
|
|
12
12
|
extend ActiveSupport::Concern
|
13
13
|
|
14
14
|
included do
|
15
|
+
# Other modules to auto-include
|
16
|
+
include Hydra::AccessControlsEnforcement
|
17
|
+
|
15
18
|
# Catch permission errors
|
16
19
|
rescue_from CanCan::AccessDenied do |exception|
|
17
20
|
if (exception.action == :edit)
|
@@ -24,11 +27,7 @@ module Hydra::Controller::ControllerBehavior
|
|
24
27
|
end
|
25
28
|
end
|
26
29
|
end
|
27
|
-
|
28
|
-
# Override blacklight to produce a search_builder that has the current collection in context
|
29
|
-
def search_builder processor_chain = search_params_logic
|
30
|
-
super.tap { |builder| builder.current_ability = current_ability }
|
31
|
-
end
|
30
|
+
|
32
31
|
|
33
32
|
# get the currently configured user identifier. Can be overridden to return whatever (ie. login, email, etc)
|
34
33
|
# defaults to using whatever you have set as the Devise authentication_key
|
@@ -39,7 +38,7 @@ module Hydra::Controller::ControllerBehavior
|
|
39
38
|
module ClassMethods
|
40
39
|
# get the solr name for a field with this name and using the given solrizer descriptor
|
41
40
|
def solr_name(name, *opts)
|
42
|
-
ActiveFedora::
|
41
|
+
ActiveFedora::SolrQueryBuilder.solr_name(name, *opts)
|
43
42
|
end
|
44
43
|
end
|
45
44
|
end
|
@@ -5,14 +5,12 @@ module Hydra
|
|
5
5
|
|
6
6
|
included do
|
7
7
|
include Hydra::Controller::ControllerBehavior
|
8
|
-
before_filter :load_asset
|
9
|
-
before_filter :load_datastream
|
10
8
|
before_filter :authorize_download!
|
11
9
|
end
|
12
|
-
|
10
|
+
|
13
11
|
# Responds to http requests to show the datastream
|
14
12
|
def show
|
15
|
-
if datastream.
|
13
|
+
if datastream.new_record?
|
16
14
|
render_404
|
17
15
|
else
|
18
16
|
send_content
|
@@ -34,41 +32,34 @@ module Hydra
|
|
34
32
|
:id
|
35
33
|
end
|
36
34
|
|
37
|
-
def load_asset
|
38
|
-
@asset = ActiveFedora::Base.load_instance_from_solr(params[asset_param_key])
|
39
|
-
end
|
40
|
-
|
41
|
-
def load_datastream
|
42
|
-
@ds = datastream_to_show
|
43
|
-
end
|
44
|
-
|
45
35
|
# Customize the :download ability in your Ability class, or override this method
|
46
36
|
def authorize_download!
|
47
37
|
authorize! :download, datastream
|
48
38
|
end
|
49
39
|
|
50
40
|
def asset
|
51
|
-
@asset
|
41
|
+
@asset ||= ActiveFedora::Base.find(params[asset_param_key])
|
52
42
|
end
|
53
43
|
|
54
44
|
def datastream
|
55
|
-
@ds
|
45
|
+
@ds ||= datastream_to_show
|
56
46
|
end
|
57
47
|
|
58
48
|
# Override this method to change which datastream is shown.
|
59
|
-
# Loads the
|
49
|
+
# Loads the file specified by the HTTP parameter `:datastream_id`.
|
60
50
|
# If this object does not have a datastream by that name, return the default datastream
|
61
51
|
# as returned by {#default_content_ds}
|
62
|
-
# @return [ActiveFedora::
|
52
|
+
# @return [ActiveFedora::File] the file
|
63
53
|
def datastream_to_show
|
64
|
-
ds = asset.
|
65
|
-
ds
|
54
|
+
ds = asset.attached_files[params[:datastream_id]] if params.has_key?(:datastream_id)
|
55
|
+
ds ||= default_content_ds
|
66
56
|
raise "Unable to find a datastream for #{asset}" if ds.nil?
|
67
57
|
ds
|
68
58
|
end
|
69
|
-
|
59
|
+
|
70
60
|
# Handle the HTTP show request
|
71
61
|
def send_content
|
62
|
+
|
72
63
|
response.headers['Accept-Ranges'] = 'bytes'
|
73
64
|
|
74
65
|
if request.head?
|
@@ -82,60 +73,67 @@ module Hydra
|
|
82
73
|
|
83
74
|
# Create some headers for the datastream
|
84
75
|
def content_options
|
85
|
-
{disposition: 'inline', type: datastream.
|
76
|
+
{disposition: 'inline', type: datastream.mime_type, filename: datastream_name}
|
86
77
|
end
|
87
78
|
|
88
79
|
# Override this if you'd like a different filename
|
89
80
|
# @return [String] the filename
|
90
81
|
def datastream_name
|
91
|
-
params[:filename] || asset.label
|
82
|
+
params[:filename] || datastream.original_name || (asset.respond_to?(:label) && asset.label) || datastream.id
|
92
83
|
end
|
93
84
|
|
94
85
|
|
95
86
|
# render an HTTP HEAD response
|
96
87
|
def content_head
|
97
|
-
response.headers['Content-Length'] = datastream.
|
98
|
-
response.headers['Content-Type'] = datastream.
|
88
|
+
response.headers['Content-Length'] = datastream.size
|
89
|
+
response.headers['Content-Type'] = datastream.mime_type
|
99
90
|
head :ok
|
100
91
|
end
|
101
|
-
|
92
|
+
|
102
93
|
|
103
94
|
# render an HTTP Range response
|
104
95
|
def send_range
|
105
96
|
_, range = request.headers['HTTP_RANGE'].split('bytes=')
|
106
97
|
from, to = range.split('-').map(&:to_i)
|
107
|
-
to = datastream.
|
98
|
+
to = datastream.size - 1 unless to
|
108
99
|
length = to - from + 1
|
109
|
-
response.headers['Content-Range'] = "bytes #{from}-#{to}/#{datastream.
|
100
|
+
response.headers['Content-Range'] = "bytes #{from}-#{to}/#{datastream.size}"
|
110
101
|
response.headers['Content-Length'] = "#{length}"
|
111
102
|
self.status = 206
|
112
103
|
prepare_file_headers
|
113
|
-
|
104
|
+
datastream.stream(request.headers['HTTP_RANGE']) do |block|
|
105
|
+
response.stream.write block
|
106
|
+
end
|
107
|
+
ensure
|
108
|
+
response.stream.close
|
114
109
|
end
|
115
110
|
|
116
111
|
def send_file_contents
|
117
112
|
self.status = 200
|
118
113
|
prepare_file_headers
|
119
|
-
|
114
|
+
datastream.stream do |block|
|
115
|
+
response.stream.write block
|
116
|
+
end
|
117
|
+
ensure
|
118
|
+
response.stream.close
|
120
119
|
end
|
121
|
-
|
120
|
+
|
122
121
|
def prepare_file_headers
|
123
122
|
send_file_headers! content_options
|
124
|
-
response.headers['Content-Type'] = datastream.
|
125
|
-
self.content_type = datastream.
|
123
|
+
response.headers['Content-Type'] = datastream.mime_type
|
124
|
+
self.content_type = datastream.mime_type
|
126
125
|
end
|
127
126
|
|
128
|
-
private
|
129
|
-
|
127
|
+
private
|
128
|
+
|
130
129
|
def default_content_ds
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
return asset.datastreams[DownloadsController.default_content_dsid]
|
130
|
+
if asset.class.respond_to?(:default_content_ds)
|
131
|
+
asset.attached_files[asset.class.default_content_ds]
|
132
|
+
elsif asset.attached_files.key?(DownloadsController.default_content_dsid)
|
133
|
+
asset.attached_files[DownloadsController.default_content_dsid]
|
136
134
|
end
|
137
135
|
end
|
138
|
-
|
136
|
+
|
139
137
|
module ClassMethods
|
140
138
|
def default_content_dsid
|
141
139
|
"content"
|
@@ -1,39 +1,40 @@
|
|
1
|
+
require 'mime/types'
|
2
|
+
|
1
3
|
module Hydra::ModelMethods
|
2
|
-
|
3
|
-
#
|
4
|
+
|
4
5
|
# Adds metadata about the depositor to the asset
|
5
6
|
# Most important behavior: if the asset has a rightsMetadata datastream, this method will add +depositor_id+ to its individual edit permissions.
|
6
7
|
# @param [String, #user_key] depositor
|
7
8
|
#
|
8
9
|
def apply_depositor_metadata(depositor)
|
9
|
-
prop_ds = self.datastreams["properties"]
|
10
|
-
rights_ds = self.datastreams["rightsMetadata"]
|
11
|
-
|
12
10
|
depositor_id = depositor.respond_to?(:user_key) ? depositor.user_key : depositor
|
13
|
-
|
14
|
-
if
|
15
|
-
|
11
|
+
|
12
|
+
if respond_to? :depositor
|
13
|
+
self.depositor = depositor_id
|
16
14
|
end
|
17
|
-
|
15
|
+
self.edit_users += [depositor_id]
|
18
16
|
return true
|
19
17
|
end
|
20
18
|
|
21
|
-
# Puts the contents of file (posted blob) into a datastream and sets the title and label
|
19
|
+
# Puts the contents of file (posted blob) into a datastream and sets the title and label
|
22
20
|
# Sets asset label and title to filename if they're empty
|
23
21
|
#
|
24
22
|
# @param [#read] file the IO object that is the blob
|
25
23
|
# @param [String] file the IO object that is the blob
|
26
|
-
def add_file(file, dsid, file_name)
|
27
|
-
|
28
|
-
|
29
|
-
options = {:label=>file_name, :mimeType=>mime_type}
|
24
|
+
def add_file(file, dsid, file_name, mime_type=nil)
|
25
|
+
mime_type ||= best_mime_for_filename(file_name)
|
26
|
+
options = {label: file_name, mime_type: mime_type, original_name: file_name}
|
30
27
|
options[:dsid] = dsid if dsid
|
31
28
|
add_file_datastream(file, options)
|
32
|
-
set_title_and_label( file_name, :
|
29
|
+
set_title_and_label( file_name, only_if_blank: true )
|
30
|
+
end
|
31
|
+
|
32
|
+
def best_mime_for_filename(file_name)
|
33
|
+
mime_types = MIME::Types.of(file_name)
|
34
|
+
mime_types.empty? ? "application/octet-stream" : mime_types.first.content_type
|
33
35
|
end
|
34
36
|
|
35
37
|
|
36
|
-
|
37
38
|
# Set the title and label on the current object
|
38
39
|
#
|
39
40
|
# @param [String] new_title
|
@@ -52,18 +53,17 @@ module Hydra::ModelMethods
|
|
52
53
|
set_title( new_title )
|
53
54
|
end
|
54
55
|
end
|
55
|
-
|
56
|
+
|
56
57
|
# Set the title and label on the current object
|
57
58
|
#
|
58
59
|
# @param [String] new_title
|
59
60
|
# @param [Hash] opts (optional) hash of configuration options
|
60
61
|
def set_title(new_title, opts={})
|
61
|
-
if
|
62
|
-
|
63
|
-
|
64
|
-
desc_metadata_ds.title_values = new_title
|
62
|
+
if attached_files.has_key?("descMetadata")
|
63
|
+
if descMetadata.respond_to?(:title_values)
|
64
|
+
descMetadata.title_values = new_title
|
65
65
|
else
|
66
|
-
|
66
|
+
descMetadata.title = new_title
|
67
67
|
end
|
68
68
|
end
|
69
69
|
end
|
data/hydra-core.gemspec
CHANGED
@@ -17,13 +17,13 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.version = version
|
18
18
|
gem.license = "APACHE2"
|
19
19
|
|
20
|
-
gem.required_ruby_version = '>=
|
20
|
+
gem.required_ruby_version = '>= 1.9.3'
|
21
21
|
|
22
22
|
|
23
|
-
gem.add_dependency "rails", '
|
23
|
+
gem.add_dependency "rails", '>= 3.2.3', '< 5'
|
24
24
|
gem.add_dependency 'block_helpers'
|
25
25
|
gem.add_dependency 'hydra-access-controls', version
|
26
|
-
gem.add_dependency 'jettywrapper', "
|
26
|
+
gem.add_dependency 'jettywrapper', ">=1.4.1"
|
27
27
|
|
28
28
|
gem.add_development_dependency 'sqlite3'
|
29
29
|
gem.add_development_dependency 'yard'
|
@@ -8,11 +8,10 @@ class CatalogController < ApplicationController
|
|
8
8
|
# These before_filters apply the hydra access controls
|
9
9
|
before_filter :enforce_show_permissions, :only=>:show
|
10
10
|
# This applies appropriate access controls to all solr queries
|
11
|
-
CatalogController.
|
11
|
+
CatalogController.solr_search_params_logic += [:add_access_controls_to_solr_params]
|
12
12
|
|
13
13
|
|
14
14
|
configure_blacklight do |config|
|
15
|
-
config.search_builder_class = Hydra::SearchBuilder
|
16
15
|
config.default_solr_params = {
|
17
16
|
:qt => 'search',
|
18
17
|
:rows => 10
|
@@ -6,15 +6,15 @@ Hydra.configure do |config|
|
|
6
6
|
# You only need to change these values if you've indexed permissions by some means other than the Hydra's built-in tooling.
|
7
7
|
# If you change these, you must also update the permissions request handler in your solrconfig.xml to return those values
|
8
8
|
#
|
9
|
-
# config.permissions.discover.group = ActiveFedora::
|
10
|
-
# config.permissions.discover.individual = ActiveFedora::
|
11
|
-
# config.permissions.read.group = ActiveFedora::
|
12
|
-
# config.permissions.read.individual = ActiveFedora::
|
13
|
-
# config.permissions.edit.group = ActiveFedora::
|
14
|
-
# config.permissions.edit.individual = ActiveFedora::
|
9
|
+
# config.permissions.discover.group = ActiveFedora::SolrQueryBuilder.solr_name("discover_access_group", :symbol)
|
10
|
+
# config.permissions.discover.individual = ActiveFedora::SolrQueryBuilder.solr_name("discover_access_person", :symbol)
|
11
|
+
# config.permissions.read.group = ActiveFedora::SolrQueryBuilder.solr_name("read_access_group", :symbol)
|
12
|
+
# config.permissions.read.individual = ActiveFedora::SolrQueryBuilder.solr_name("read_access_person", :symbol)
|
13
|
+
# config.permissions.edit.group = ActiveFedora::SolrQueryBuilder.solr_name("edit_access_group", :symbol)
|
14
|
+
# config.permissions.edit.individual = ActiveFedora::SolrQueryBuilder.solr_name("edit_access_person", :symbol)
|
15
15
|
#
|
16
|
-
# config.permissions.embargo.release_date = ActiveFedora::
|
17
|
-
# config.permissions.lease.expiration_date = ActiveFedora::
|
16
|
+
# config.permissions.embargo.release_date = ActiveFedora::SolrQueryBuilder.solr_name("embargo_release_date", :stored_sortable, type: :date)
|
17
|
+
# config.permissions.lease.expiration_date = ActiveFedora::SolrQueryBuilder.solr_name("lease_expiration_date", :stored_sortable, type: :date)
|
18
18
|
#
|
19
19
|
#
|
20
20
|
# specify the user model
|
data/lib/hydra-core.rb
CHANGED
@@ -2,6 +2,10 @@ require 'hydra-access-controls'
|
|
2
2
|
require 'deprecation'
|
3
3
|
|
4
4
|
module HydraHead
|
5
|
+
extend Deprecation
|
5
6
|
require 'hydra-head/engine' if defined?(Rails)
|
7
|
+
def self.add_routes(router, options = {})
|
8
|
+
Deprecation.warn HydraHead, "add_routes has been removed." # remove this warning in hydra-head 8
|
9
|
+
end
|
6
10
|
end
|
7
11
|
|
data/lib/hydra-head/version.rb
CHANGED
@@ -10,14 +10,6 @@ describe CatalogController do
|
|
10
10
|
expect(controller).to be_an_instance_of CatalogController
|
11
11
|
end
|
12
12
|
|
13
|
-
describe "configuration" do
|
14
|
-
let(:config) { CatalogController.blacklight_config }
|
15
|
-
describe "search_builder_class" do
|
16
|
-
subject {config.search_builder_class }
|
17
|
-
it { is_expected.to eq Hydra::SearchBuilder }
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
13
|
describe "Paths Generated by Custom Routes:" do
|
22
14
|
# paths generated by custom routes
|
23
15
|
it "should map {:controller=>'catalog', :action=>'index'} to GET /catalog" do
|
@@ -56,6 +48,12 @@ describe CatalogController do
|
|
56
48
|
end
|
57
49
|
|
58
50
|
describe "filters" do
|
51
|
+
describe "index" do
|
52
|
+
it "should trigger enforce_index_permissions" do
|
53
|
+
expect(controller).to receive(:add_access_controls_to_solr_params)
|
54
|
+
get :index
|
55
|
+
end
|
56
|
+
end
|
59
57
|
describe "show" do
|
60
58
|
it "should trigger enforce_show_permissions" do
|
61
59
|
allow(controller).to receive(:current_user).and_return(nil)
|
@@ -18,26 +18,30 @@ describe DownloadsController do
|
|
18
18
|
describe "with a file" do
|
19
19
|
before do
|
20
20
|
class ContentHolder < ActiveFedora::Base
|
21
|
+
include Hydra::ModelMethods
|
21
22
|
include Hydra::AccessControls::Permissions
|
22
|
-
|
23
|
+
contains 'thumbnail'
|
23
24
|
end
|
24
25
|
@user = User.new.tap {|u| u.email = 'email@example.com'; u.password = 'password'; u.save}
|
25
|
-
@obj = ContentHolder.new
|
26
|
-
@obj.label = "world.png"
|
27
|
-
@obj.add_file_datastream('fizz', :dsid=>'buzz', :mimeType => 'image/png')
|
28
|
-
@obj.add_file_datastream('foobarfoobarfoobar', :dsid=>'content', :mimeType => 'image/png')
|
29
|
-
@obj.add_file_datastream("It's a stream", :dsid=>'descMetadata', :mimeType => 'text/plain')
|
30
|
-
@obj.read_users = [@user.user_key]
|
31
|
-
@obj.save!
|
32
26
|
end
|
27
|
+
let(:obj) do
|
28
|
+
ContentHolder.new.tap do |obj|
|
29
|
+
obj.add_file_datastream('fizz', dsid: 'buzz', mime_type: 'image/png', original_name: 'buzz.png')
|
30
|
+
obj.add_file_datastream('foobarfoobarfoobar', dsid: 'content', mime_type: 'image/png', original_name: 'world.png')
|
31
|
+
obj.add_file_datastream("It's a stream", dsid: 'descMetadata', mime_type: 'text/plain', original_name: 'metadata.xml')
|
32
|
+
obj.read_users = [@user.user_key]
|
33
|
+
obj.save!
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
33
37
|
after do
|
34
|
-
|
38
|
+
obj.destroy
|
35
39
|
Object.send(:remove_const, :ContentHolder)
|
36
40
|
end
|
37
41
|
context "when not logged in" do
|
38
42
|
context "when a specific datastream is requested" do
|
39
43
|
it "should redirect to the root path and display an error" do
|
40
|
-
get
|
44
|
+
get :show, id: obj, datastream_id: "descMetadata"
|
41
45
|
expect(response).to redirect_to new_user_session_path
|
42
46
|
expect(flash[:alert]).to eq "You are not authorized to access this page."
|
43
47
|
end
|
@@ -50,7 +54,7 @@ describe DownloadsController do
|
|
50
54
|
end
|
51
55
|
context "when a specific datastream is requested" do
|
52
56
|
it "should redirect to the root path and display an error" do
|
53
|
-
get
|
57
|
+
get :show, id: obj, datastream_id: "descMetadata"
|
54
58
|
expect(response).to redirect_to root_path
|
55
59
|
expect(flash[:alert]).to eq "You are not authorized to access this page."
|
56
60
|
end
|
@@ -65,16 +69,16 @@ describe DownloadsController do
|
|
65
69
|
describe "#show" do
|
66
70
|
it "should default to returning default download configured by object" do
|
67
71
|
allow(ContentHolder).to receive(:default_content_ds).and_return('buzz')
|
68
|
-
get
|
69
|
-
expect(response).to
|
72
|
+
get :show, id: obj
|
73
|
+
expect(response).to be_successful
|
70
74
|
expect(response.headers['Content-Type']).to eq "image/png"
|
71
|
-
expect(response.headers["Content-Disposition"]).to eq "inline; filename=\"
|
75
|
+
expect(response.headers["Content-Disposition"]).to eq "inline; filename=\"buzz.png\""
|
72
76
|
expect(response.body).to eq 'fizz'
|
73
77
|
end
|
74
78
|
it "should default to returning default download configured by controller" do
|
75
79
|
expect(DownloadsController.default_content_dsid).to eq "content"
|
76
|
-
get
|
77
|
-
expect(response).to
|
80
|
+
get :show, id: obj
|
81
|
+
expect(response).to be_successful
|
78
82
|
expect(response.headers['Content-Type']).to eq "image/png"
|
79
83
|
expect(response.headers["Content-Disposition"]).to eq "inline; filename=\"world.png\""
|
80
84
|
expect(response.body).to eq 'foobarfoobarfoobar'
|
@@ -83,63 +87,53 @@ describe DownloadsController do
|
|
83
87
|
context "when a specific datastream is requested" do
|
84
88
|
context "and it doesn't exist" do
|
85
89
|
it "should return :not_found when the datastream doesn't exist" do
|
86
|
-
get
|
90
|
+
get :show, id: obj, datastream_id: "thumbnail"
|
87
91
|
expect(response).to be_not_found
|
88
92
|
end
|
89
93
|
end
|
90
94
|
context "and it exists" do
|
91
95
|
it "should return it" do
|
92
|
-
get
|
93
|
-
expect(response).to
|
96
|
+
get :show, id: obj, datastream_id: "descMetadata"
|
97
|
+
expect(response).to be_successful
|
94
98
|
expect(response.headers['Content-Type']).to eq "text/plain"
|
95
|
-
expect(response.headers["Content-Disposition"]).to eq "inline; filename=\"
|
99
|
+
expect(response.headers["Content-Disposition"]).to eq "inline; filename=\"metadata.xml\""
|
96
100
|
expect(response.body).to eq "It's a stream"
|
97
101
|
end
|
98
102
|
end
|
99
103
|
end
|
100
104
|
it "should support setting disposition to inline" do
|
101
|
-
get
|
102
|
-
expect(response).to
|
105
|
+
get :show, id: obj, :disposition => "inline"
|
106
|
+
expect(response).to be_successful
|
103
107
|
expect(response.headers['Content-Type']).to eq "image/png"
|
104
108
|
expect(response.headers["Content-Disposition"]).to eq "inline; filename=\"world.png\""
|
105
109
|
expect(response.body).to eq 'foobarfoobarfoobar'
|
106
110
|
end
|
107
111
|
it "should allow you to specify filename for download" do
|
108
|
-
get
|
109
|
-
expect(response).to
|
112
|
+
get :show, id: obj, "filename" => "my%20dog.png"
|
113
|
+
expect(response).to be_successful
|
110
114
|
expect(response.headers['Content-Type']).to eq "image/png"
|
111
115
|
expect(response.headers["Content-Disposition"]).to eq "inline; filename=\"my%20dog.png\""
|
112
116
|
expect(response.body).to eq 'foobarfoobarfoobar'
|
113
117
|
end
|
114
118
|
end
|
115
119
|
describe "stream" do
|
120
|
+
let(:parent) { ActiveFedora::Base.new(id: '1234') }
|
121
|
+
|
116
122
|
before do
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
allow(stub_repo).to receive(:datastream_dissemination).and_yield(stub_response)
|
121
|
-
stub_ds = ActiveFedora::Datastream.new
|
122
|
-
allow(stub_ds).to receive(:repository).and_return(stub_repo)
|
123
|
-
allow(stub_ds).to receive(:mimeType).and_return('video/webm')
|
124
|
-
allow(stub_ds).to receive(:dsSize).and_return(16)
|
125
|
-
allow(stub_ds).to receive(:dsid).and_return('webm')
|
126
|
-
allow(stub_ds).to receive(:new?).and_return(false)
|
127
|
-
allow(stub_ds).to receive(:pid).and_return('changeme:test')
|
128
|
-
stub_file = double('stub object', datastreams: {'webm' => stub_ds}, pid:'changeme:test', label: "MyVideo.webm")
|
129
|
-
expect(ActiveFedora::Base).to receive(:load_instance_from_solr).with('changeme:test').and_return(stub_file)
|
130
|
-
allow(controller).to receive(:authorize!).with(:download, stub_ds).and_return(true)
|
131
|
-
allow(controller).to receive(:log_download)
|
123
|
+
parent.add_file_datastream('one1two2threfour', dsid: 'webm', mime_type: 'video/webm', original_name: 'MyVideo.webm')
|
124
|
+
parent.save!
|
125
|
+
expect(controller).to receive(:authorize!).with(:download, instance_of(ActiveFedora::File)).and_return(true)
|
132
126
|
end
|
133
127
|
it "head request" do
|
134
128
|
request.env["HTTP_RANGE"] = 'bytes=0-15'
|
135
|
-
head :show, id:
|
129
|
+
head :show, id: parent, datastream_id: 'webm'
|
136
130
|
expect(response.headers['Content-Length']).to eq 16
|
137
131
|
expect(response.headers['Accept-Ranges']).to eq 'bytes'
|
138
132
|
expect(response.headers['Content-Type']).to eq 'video/webm'
|
139
133
|
end
|
140
134
|
it "should send the whole thing" do
|
141
135
|
request.env["HTTP_RANGE"] = 'bytes=0-15'
|
142
|
-
get :show, id: '
|
136
|
+
get :show, id: '1234', datastream_id: 'webm'
|
143
137
|
expect(response.body).to eq 'one1two2threfour'
|
144
138
|
expect(response.headers["Content-Range"]).to eq 'bytes 0-15/16'
|
145
139
|
expect(response.headers["Content-Length"]).to eq '16'
|
@@ -149,20 +143,20 @@ describe DownloadsController do
|
|
149
143
|
expect(response.status).to eq 206
|
150
144
|
end
|
151
145
|
it "should send the whole thing when the range is open ended" do
|
152
|
-
request.env["
|
153
|
-
get :show, id: '
|
146
|
+
request.env["HTTP_RANGE"] = 'bytes=0-'
|
147
|
+
get :show, id: '1234', datastream_id: 'webm'
|
154
148
|
expect(response.body).to eq 'one1two2threfour'
|
155
149
|
end
|
156
150
|
it "should get a range not starting at the beginning" do
|
157
151
|
request.env["HTTP_RANGE"] = 'bytes=3-15'
|
158
|
-
get :show, id: '
|
152
|
+
get :show, id: '1234', datastream_id: 'webm'
|
159
153
|
expect(response.body).to eq '1two2threfour'
|
160
154
|
expect(response.headers["Content-Range"]).to eq 'bytes 3-15/16'
|
161
155
|
expect(response.headers["Content-Length"]).to eq '13'
|
162
156
|
end
|
163
157
|
it "should get a range not ending at the end" do
|
164
158
|
request.env["HTTP_RANGE"] = 'bytes=4-11'
|
165
|
-
get :show, id: '
|
159
|
+
get :show, id: '1234', datastream_id: 'webm'
|
166
160
|
expect(response.body).to eq 'two2thre'
|
167
161
|
expect(response.headers["Content-Range"]).to eq 'bytes 4-11/16'
|
168
162
|
expect(response.headers["Content-Length"]).to eq '8'
|
@@ -181,10 +175,9 @@ describe DownloadsController do
|
|
181
175
|
end
|
182
176
|
it "should use the custom param value to retrieve the asset" do
|
183
177
|
allow(controller).to receive(:asset_param_key).and_return(:object_id)
|
184
|
-
get
|
178
|
+
get :show, object_id: obj
|
185
179
|
expect(response).to be_successful
|
186
180
|
end
|
187
181
|
end
|
188
|
-
|
189
182
|
end
|
190
183
|
end
|