browse-everything 0.12.0 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.engine_cart.yml +1 -0
- data/.rubocop.yml +6 -0
- data/.rubocop_todo.yml +8 -32
- data/README.md +2 -1
- data/app/assets/javascripts/browse_everything/behavior.js.coffee +20 -10
- data/app/assets/stylesheets/browse_everything/_browse_everything.scss +15 -16
- data/app/controllers/browse_everything_controller.rb +29 -29
- data/app/views/browse_everything/_files.html.erb +0 -5
- data/app/views/browse_everything/index.html.erb +3 -0
- data/browse-everything.gemspec +1 -1
- data/lib/browse_everything/browser.rb +1 -1
- data/lib/browse_everything/driver/base.rb +8 -8
- data/lib/browse_everything/driver/box.rb +81 -72
- data/lib/browse_everything/driver/dropbox.rb +35 -29
- data/lib/browse_everything/driver/file_system.rb +50 -30
- data/lib/browse_everything/driver/google_drive.rb +15 -15
- data/lib/browse_everything/driver/s3.rb +82 -27
- data/lib/browse_everything/driver/sky_drive.rb +17 -17
- data/lib/browse_everything/version.rb +1 -1
- data/lib/generators/browse_everything/templates/browse_everything_providers.yml.example +5 -4
- data/spec/fixtures/vcr_cassettes/box.yml +498 -0
- data/spec/unit/box_spec.rb +168 -0
- data/spec/unit/s3_spec.rb +62 -5
- metadata +10 -5
@@ -0,0 +1,168 @@
|
|
1
|
+
include BrowserConfigHelper
|
2
|
+
|
3
|
+
describe BrowseEverything::Driver::Box, vcr: { cassette_name: 'box', record: :none } do
|
4
|
+
before(:all) { stub_configuration }
|
5
|
+
after(:all) { unstub_configuration }
|
6
|
+
|
7
|
+
let(:browser) { BrowseEverything::Browser.new(url_options) }
|
8
|
+
let(:provider) { browser.providers['box'] }
|
9
|
+
let(:auth_params) do
|
10
|
+
{
|
11
|
+
'code' => 'CODE',
|
12
|
+
'state' => 'box'
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
# To re-record the VCR responses, you will need to substitute the 'token' and 'refresh_token' values with the
|
17
|
+
# actual tokens returned from Box.
|
18
|
+
#
|
19
|
+
# The easiest way to do this is output @token to the Rails log from the box_client method:
|
20
|
+
#
|
21
|
+
# def box_client
|
22
|
+
# Rails.logger.info(@token)
|
23
|
+
# [...]
|
24
|
+
#
|
25
|
+
# Make sure you have the internal_test_app built and have copied your client id and secret to the yaml config file.
|
26
|
+
# With the test app running, you can authenticate to your Box account to browse files, and should see the
|
27
|
+
# tokens listed in the Rails log. Once you have copied the new tokens, the spec test will run and use your tokens
|
28
|
+
# to authenticate to Box. To record the new responses replace `record: :none` with `record: :all`.
|
29
|
+
let(:token) do
|
30
|
+
{
|
31
|
+
'token' => 'TOKEN',
|
32
|
+
'refresh_token' => 'REFRESH_TOKEN'
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
subject { provider }
|
37
|
+
|
38
|
+
its(:name) { is_expected.to eq('Box') }
|
39
|
+
its(:key) { is_expected.to eq('box') }
|
40
|
+
its(:icon) { is_expected.to be_a(String) }
|
41
|
+
|
42
|
+
describe '#validate_config' do
|
43
|
+
it 'raises and error with an incomplete configuration' do
|
44
|
+
expect { BrowseEverything::Driver::Box.new({}) }.to raise_error(BrowseEverything::InitializationError)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '#auth_link' do
|
49
|
+
subject { provider.auth_link }
|
50
|
+
|
51
|
+
it { is_expected.to start_with('https://www.box.com/api/oauth2/authorize') }
|
52
|
+
it { is_expected.to include('browse%2Fconnect') }
|
53
|
+
it { is_expected.to include('response_type') }
|
54
|
+
end
|
55
|
+
|
56
|
+
describe '#authorized?' do
|
57
|
+
subject { provider.authorized? }
|
58
|
+
context 'when the access token is not registered' do
|
59
|
+
it { is_expected.to be(false) }
|
60
|
+
end
|
61
|
+
context 'when the access tokens are registered and not expired' do
|
62
|
+
before { provider.token = token.merge('expires_at' => Time.now.to_i + 360) }
|
63
|
+
it { is_expected.to be(true) }
|
64
|
+
end
|
65
|
+
context 'when the access tokens are registered but no expiration time' do
|
66
|
+
before { provider.token = token }
|
67
|
+
it { is_expected.to be(false) }
|
68
|
+
end
|
69
|
+
context 'when the access tokens are registered but expired' do
|
70
|
+
before { provider.token = token.merge('expires_at' => Time.now.to_i - 360) }
|
71
|
+
it { is_expected.to be(false) }
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe '#connect' do
|
76
|
+
it 'registers new tokens' do
|
77
|
+
expect(provider).to receive(:register_access_token).with(kind_of(OAuth2::AccessToken))
|
78
|
+
provider.connect(auth_params, 'data')
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe '#contents' do
|
83
|
+
before { provider.token = token }
|
84
|
+
|
85
|
+
context 'with files and folders in the root directory' do
|
86
|
+
let(:root_directory) { provider.contents('') }
|
87
|
+
let(:long_file) { root_directory[0] }
|
88
|
+
let(:sas_directory) { root_directory[6] }
|
89
|
+
let(:tar_file) { root_directory[10] }
|
90
|
+
|
91
|
+
describe 'the first item' do
|
92
|
+
subject { long_file }
|
93
|
+
its(:name) { is_expected.to start_with('A very looooooooooooong box folder') }
|
94
|
+
its(:location) { is_expected.to eq('box:20375782799') }
|
95
|
+
it { is_expected.to be_container }
|
96
|
+
end
|
97
|
+
|
98
|
+
describe 'the SaS - Development Team directory' do
|
99
|
+
subject { sas_directory }
|
100
|
+
its(:name) { is_expected.to eq('SaS - Development Team') }
|
101
|
+
its(:location) { is_expected.to eq('box:2459961273') }
|
102
|
+
its(:id) { is_expected.to eq('2459961273') }
|
103
|
+
it { is_expected.to be_container }
|
104
|
+
end
|
105
|
+
|
106
|
+
describe 'a file' do
|
107
|
+
subject { tar_file }
|
108
|
+
its(:name) { is_expected.to eq('failed.tar.gz') }
|
109
|
+
its(:size) { is_expected.to eq(28_650_839) }
|
110
|
+
its(:location) { is_expected.to eq('box:25581309763') }
|
111
|
+
its(:type) { is_expected.to eq('application/x-gzip') }
|
112
|
+
its(:id) { is_expected.to eq('25581309763') }
|
113
|
+
it { is_expected.not_to be_container }
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
context 'with files and folders in the SaS - Development Team directory' do
|
118
|
+
let(:sas_directory) { provider.contents('2459961273') }
|
119
|
+
let(:parent_directory) { sas_directory[0] }
|
120
|
+
let(:apps_dir) { sas_directory[1] }
|
121
|
+
let(:equipment) { sas_directory[12] }
|
122
|
+
|
123
|
+
describe 'the first item' do
|
124
|
+
subject { parent_directory }
|
125
|
+
|
126
|
+
its(:name) { is_expected.to eq('..') }
|
127
|
+
its(:location) { is_expected.to be_empty }
|
128
|
+
its(:id) { is_expected.to be_kind_of(Pathname) }
|
129
|
+
it { is_expected.to be_container }
|
130
|
+
end
|
131
|
+
describe 'the second item' do
|
132
|
+
subject { apps_dir }
|
133
|
+
|
134
|
+
its(:name) { is_expected.to eq('Apps&Int') }
|
135
|
+
its(:id) { is_expected.to eq('2459974427') }
|
136
|
+
it { is_expected.to be_container }
|
137
|
+
end
|
138
|
+
describe 'a file' do
|
139
|
+
subject { equipment }
|
140
|
+
|
141
|
+
its(:name) { is_expected.to eq('Equipment.boxnote') }
|
142
|
+
its(:size) { is_expected.to eq(10140) }
|
143
|
+
its(:location) { is_expected.to eq('box:76960974625') }
|
144
|
+
its(:type) { is_expected.to eq('application/octet-stream') }
|
145
|
+
its(:id) { is_expected.to eq('76960974625') }
|
146
|
+
it { is_expected.not_to be_container }
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
describe '#link_for' do
|
152
|
+
before { provider.token = token }
|
153
|
+
|
154
|
+
context 'with a file from the root directory' do
|
155
|
+
let(:link) { provider.link_for('25581309763') }
|
156
|
+
|
157
|
+
specify { expect(link[0]).to start_with('https://dl.boxcloud.com/d/1') }
|
158
|
+
specify { expect(link[1]).to have_key(:expires) }
|
159
|
+
end
|
160
|
+
|
161
|
+
context 'with a file from the SaS - Development Team directory' do
|
162
|
+
let(:link) { provider.link_for('76960974625') }
|
163
|
+
|
164
|
+
specify { expect(link[0]).to start_with('https://dl.boxcloud.com/d/1') }
|
165
|
+
specify { expect(link[1]).to have_key(:expires) }
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
data/spec/unit/s3_spec.rb
CHANGED
@@ -1,13 +1,43 @@
|
|
1
1
|
include BrowserConfigHelper
|
2
2
|
|
3
3
|
describe BrowseEverything::Driver::FileSystem do
|
4
|
-
before(:all)
|
5
|
-
after(:all)
|
6
|
-
let(:browser)
|
4
|
+
before(:all) { stub_configuration }
|
5
|
+
after(:all) { unstub_configuration }
|
6
|
+
let(:browser) { BrowseEverything::Browser.new(url_options) }
|
7
7
|
let(:provider) { browser.providers['s3'] }
|
8
|
+
subject { provider }
|
8
9
|
|
9
|
-
|
10
|
-
|
10
|
+
describe 'defaults' do
|
11
|
+
its(:icon) { is_expected.to eq('amazon') }
|
12
|
+
its(:itself) { is_expected.to be_authorized }
|
13
|
+
end
|
14
|
+
|
15
|
+
describe 'configuration' do
|
16
|
+
it '#validate_config' do
|
17
|
+
expect { BrowseEverything::Driver::S3.new({}) }.to raise_error(BrowseEverything::InitializationError)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'rejects app_key if app_secret is missing' do
|
21
|
+
expect { BrowseEverything::Driver::S3.new(bucket: 'bucket', app_key: 'APP_KEY') }.to raise_error(BrowseEverything::InitializationError)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'rejects app_secret if app_key is missing' do
|
25
|
+
expect { BrowseEverything::Driver::S3.new(bucket: 'bucket', app_secret: 'APP_SECRET') }.to raise_error(BrowseEverything::InitializationError)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'accepts app_key and app_secret together' do
|
29
|
+
expect { BrowseEverything::Driver::S3.new(bucket: 'bucket', app_key: 'APP_KEY', app_secret: 'APP_SECRET') }.not_to raise_error
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'rejects an invalid response type' do
|
33
|
+
expect { BrowseEverything::Driver::S3.new(bucket: 'bucket', response_type: :foo) }.to raise_error(BrowseEverything::InitializationError)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'deprecates :signed_url' do
|
37
|
+
driver = BrowseEverything::Driver::S3.new(bucket: 'bucket', signed_url: false)
|
38
|
+
expect(driver.config).not_to have_key(:signed_url)
|
39
|
+
expect(driver.config[:response_type]).to eq(:public_url)
|
40
|
+
end
|
11
41
|
end
|
12
42
|
|
13
43
|
describe '#contents' do
|
@@ -72,6 +102,33 @@ describe BrowseEverything::Driver::FileSystem do
|
|
72
102
|
its(:size) { is_expected.to eq(1_511_860) }
|
73
103
|
specify { is_expected.not_to be_container }
|
74
104
|
end
|
105
|
+
|
106
|
+
context '#link_for' do
|
107
|
+
subject { contents[2] }
|
108
|
+
before do
|
109
|
+
object = instance_double(Aws::S3::Object)
|
110
|
+
allow(object).to receive(:presigned_url).and_return('https://s3.amazonaws.com/presigned_url')
|
111
|
+
allow(object).to receive(:public_url).and_return('https://s3.amazonaws.com/public_url')
|
112
|
+
allow(object).to receive(:bucket_name).and_return('s3.bucket')
|
113
|
+
allow(object).to receive(:key).and_return('foo/quux.png')
|
114
|
+
allow(provider.bucket).to receive(:object).and_return(object)
|
115
|
+
end
|
116
|
+
|
117
|
+
it ':signed_url' do
|
118
|
+
provider.config[:response_type] = :signed_url
|
119
|
+
expect(provider.link_for('foo/quux.png')).to eq('https://s3.amazonaws.com/presigned_url')
|
120
|
+
end
|
121
|
+
|
122
|
+
it ':public_url' do
|
123
|
+
provider.config[:response_type] = :public_url
|
124
|
+
expect(provider.link_for('foo/quux.png')).to eq('https://s3.amazonaws.com/public_url')
|
125
|
+
end
|
126
|
+
|
127
|
+
it ':s3_uri' do
|
128
|
+
provider.config[:response_type] = :s3_uri
|
129
|
+
expect(provider.link_for('foo/quux.png')).to eq('s3://s3.bucket/foo/quux.png')
|
130
|
+
end
|
131
|
+
end
|
75
132
|
end
|
76
133
|
end
|
77
134
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: browse-everything
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Carolyn Cole
|
@@ -13,7 +13,7 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date: 2017-
|
16
|
+
date: 2017-04-30 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: rails
|
@@ -385,14 +385,14 @@ dependencies:
|
|
385
385
|
requirements:
|
386
386
|
- - "~>"
|
387
387
|
- !ruby/object:Gem::Version
|
388
|
-
version: '0
|
388
|
+
version: '1.0'
|
389
389
|
type: :development
|
390
390
|
prerelease: false
|
391
391
|
version_requirements: !ruby/object:Gem::Requirement
|
392
392
|
requirements:
|
393
393
|
- - "~>"
|
394
394
|
- !ruby/object:Gem::Version
|
395
|
-
version: '0
|
395
|
+
version: '1.0'
|
396
396
|
- !ruby/object:Gem::Dependency
|
397
397
|
name: capybara
|
398
398
|
requirement: !ruby/object:Gem::Requirement
|
@@ -461,6 +461,7 @@ executables: []
|
|
461
461
|
extensions: []
|
462
462
|
extra_rdoc_files: []
|
463
463
|
files:
|
464
|
+
- ".engine_cart.yml"
|
464
465
|
- ".gitignore"
|
465
466
|
- ".rspec"
|
466
467
|
- ".rubocop.yml"
|
@@ -518,6 +519,7 @@ files:
|
|
518
519
|
- spec/fixtures/file_system/dir_2/file_4.docx
|
519
520
|
- spec/fixtures/file_system/file 1.pdf
|
520
521
|
- spec/fixtures/file_system/file_1.pdf
|
522
|
+
- spec/fixtures/vcr_cassettes/box.yml
|
521
523
|
- spec/fixtures/vcr_cassettes/dropbox.yml
|
522
524
|
- spec/fixtures/vcr_cassettes/retriever.yml
|
523
525
|
- spec/helper/browse_everything_controller_helper_spec.rb
|
@@ -533,6 +535,7 @@ files:
|
|
533
535
|
- spec/support/rake.rb
|
534
536
|
- spec/test_app_templates/lib/generators/test_app_generator.rb
|
535
537
|
- spec/unit/base_spec.rb
|
538
|
+
- spec/unit/box_spec.rb
|
536
539
|
- spec/unit/browse_everything_helper_spec.rb
|
537
540
|
- spec/unit/browser_spec.rb
|
538
541
|
- spec/unit/dropbox_spec.rb
|
@@ -566,7 +569,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
566
569
|
version: '0'
|
567
570
|
requirements: []
|
568
571
|
rubyforge_project:
|
569
|
-
rubygems_version: 2.
|
572
|
+
rubygems_version: 2.5.1
|
570
573
|
signing_key:
|
571
574
|
specification_version: 4
|
572
575
|
summary: AJAX/Rails engine file browser for cloud storage services
|
@@ -578,6 +581,7 @@ test_files:
|
|
578
581
|
- spec/fixtures/file_system/dir_2/file_4.docx
|
579
582
|
- spec/fixtures/file_system/file 1.pdf
|
580
583
|
- spec/fixtures/file_system/file_1.pdf
|
584
|
+
- spec/fixtures/vcr_cassettes/box.yml
|
581
585
|
- spec/fixtures/vcr_cassettes/dropbox.yml
|
582
586
|
- spec/fixtures/vcr_cassettes/retriever.yml
|
583
587
|
- spec/helper/browse_everything_controller_helper_spec.rb
|
@@ -593,6 +597,7 @@ test_files:
|
|
593
597
|
- spec/support/rake.rb
|
594
598
|
- spec/test_app_templates/lib/generators/test_app_generator.rb
|
595
599
|
- spec/unit/base_spec.rb
|
600
|
+
- spec/unit/box_spec.rb
|
596
601
|
- spec/unit/browse_everything_helper_spec.rb
|
597
602
|
- spec/unit/browser_spec.rb
|
598
603
|
- spec/unit/dropbox_spec.rb
|