browse-everything 0.15.1 → 0.16.0
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.
- checksums.yaml +5 -5
- data/.rubocop.yml +61 -9
- data/.rubocop_todo.yml +2 -15
- data/.travis.yml +19 -19
- data/CONTRIBUTING.md +6 -6
- data/Gemfile +12 -8
- data/README.md +30 -0
- data/Rakefile +2 -1
- data/app/assets/javascripts/browse_everything/behavior.js.coffee +5 -0
- data/app/controllers/browse_everything_controller.rb +75 -23
- data/app/helpers/browse_everything_helper.rb +2 -8
- data/app/helpers/font_awesome_version_helper.rb +9 -8
- data/app/services/browse_everything_session.rb +10 -0
- data/app/services/browse_everything_session/provider_session.rb +42 -0
- data/app/services/browser_factory.rb +25 -0
- data/app/views/browse_everything/_files.html.erb +56 -6
- data/browse-everything.gemspec +29 -25
- data/config/routes.rb +7 -2
- data/lib/browse-everything.rb +2 -0
- data/lib/browse_everything.rb +45 -12
- data/lib/browse_everything/auth/google/credentials.rb +28 -0
- data/lib/browse_everything/auth/google/request_parameters.rb +61 -0
- data/lib/browse_everything/browser.rb +11 -4
- data/lib/browse_everything/driver/authentication_factory.rb +22 -0
- data/lib/browse_everything/driver/base.rb +72 -19
- data/lib/browse_everything/driver/box.rb +46 -17
- data/lib/browse_everything/driver/dropbox.rb +36 -10
- data/lib/browse_everything/driver/file_system.rb +14 -26
- data/lib/browse_everything/driver/google_drive.rb +187 -54
- data/lib/browse_everything/driver/s3.rb +81 -75
- data/lib/browse_everything/engine.rb +3 -2
- data/lib/browse_everything/file_entry.rb +3 -1
- data/lib/browse_everything/retriever.rb +103 -31
- data/lib/browse_everything/version.rb +3 -1
- data/lib/generators/browse_everything/assets_generator.rb +3 -2
- data/lib/generators/browse_everything/config_generator.rb +11 -9
- data/lib/generators/browse_everything/install_generator.rb +3 -2
- data/lib/generators/browse_everything/templates/browse_everything_providers.yml.example +12 -11
- data/spec/controllers/browse_everything_controller_spec.rb +80 -0
- data/spec/features/select_files_spec.rb +13 -13
- data/spec/features/test_compiling_stylesheets_spec.rb +2 -0
- data/spec/fixtures/vcr_cassettes/google_drive.yml +331 -0
- data/spec/fixtures/vcr_cassettes/retriever.yml +93 -0
- data/spec/helper/browse_everything_controller_helper_spec.rb +21 -7
- data/spec/javascripts/jasmine_spec.rb +2 -0
- data/spec/javascripts/support/jasmine_helper.rb +1 -0
- data/spec/lib/browse_everything/auth/google/credentials_spec.rb +41 -0
- data/spec/{unit → lib/browse_everything}/browse_everything_helper_spec.rb +2 -0
- data/spec/lib/browse_everything/browser_spec.rb +109 -0
- data/spec/{unit → lib/browse_everything/driver}/base_spec.rb +5 -4
- data/spec/{unit → lib/browse_everything/driver}/box_spec.rb +20 -5
- data/spec/{unit → lib/browse_everything/driver}/dropbox_spec.rb +15 -18
- data/spec/{unit → lib/browse_everything/driver}/file_system_spec.rb +32 -26
- data/spec/lib/browse_everything/driver/google_drive_spec.rb +171 -0
- data/spec/{unit → lib/browse_everything/driver}/s3_spec.rb +38 -21
- data/spec/lib/browse_everything/driver_spec.rb +38 -0
- data/spec/{unit → lib/browse_everything}/file_entry_spec.rb +4 -1
- data/spec/lib/browse_everything/retriever_spec.rb +200 -0
- data/spec/lib/browse_everything_spec.rb +67 -0
- data/spec/services/browse_everything_session/provider_session_spec.rb +50 -0
- data/spec/services/browser_factory_spec.rb +40 -0
- data/spec/spec_helper.rb +39 -18
- data/spec/support/app/controllers/file_handler_controller.rb +4 -4
- data/spec/support/app/views/file_handler/main.html.erb +1 -1
- data/spec/support/capybara.rb +17 -0
- data/spec/support/rake.rb +3 -1
- data/spec/support/wait_for_ajax.rb +14 -0
- data/spec/test_app_templates/Gemfile.extra +1 -0
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +10 -4
- data/spec/views/browse_everything/{_file.html.erb_spec.rb → _files.html.erb_spec.rb} +24 -18
- data/tasks/ci.rake +2 -0
- metadata +159 -107
- data/app/views/browse_everything/_file.html.erb +0 -52
- data/app/views/browse_everything/resolve.html.erb +0 -1
- data/spec/unit/browser_spec.rb +0 -76
- data/spec/unit/retriever_spec.rb +0 -109
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe BrowseEverything do
|
4
|
+
describe '.configure' do
|
5
|
+
|
6
|
+
let(:config) do
|
7
|
+
{
|
8
|
+
dropbox: {
|
9
|
+
app_key: 'test-key',
|
10
|
+
app_secret: 'test-secret'
|
11
|
+
},
|
12
|
+
box: {
|
13
|
+
client_id: 'test-id',
|
14
|
+
client_secret: 'test-secret'
|
15
|
+
},
|
16
|
+
google_drive: {
|
17
|
+
client_id: 'test-id',
|
18
|
+
client_secret: 'test-secret'
|
19
|
+
}
|
20
|
+
}
|
21
|
+
end
|
22
|
+
before do
|
23
|
+
BrowseEverything.configure(config)
|
24
|
+
end
|
25
|
+
it 'registers the configuration for the drivers' do
|
26
|
+
expect(BrowseEverything.config).to be_a ActiveSupport::HashWithIndifferentAccess
|
27
|
+
|
28
|
+
expect(BrowseEverything.config).to include 'dropbox'
|
29
|
+
expect(BrowseEverything.config['dropbox']).to include({ 'app_key' => 'test-key' })
|
30
|
+
expect(BrowseEverything.config['dropbox']).to include({ 'app_secret' => 'test-secret' })
|
31
|
+
|
32
|
+
expect(BrowseEverything.config).to include 'box'
|
33
|
+
expect(BrowseEverything.config['box']).to include({ 'client_id' => 'test-id' })
|
34
|
+
expect(BrowseEverything.config['box']).to include({ 'client_secret' => 'test-secret' })
|
35
|
+
|
36
|
+
expect(BrowseEverything.config).to include 'google_drive'
|
37
|
+
expect(BrowseEverything.config['google_drive']).to include({ 'client_id' => 'test-id' })
|
38
|
+
expect(BrowseEverything.config['google_drive']).to include({ 'client_secret' => 'test-secret' })
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'with an entry for the drop_box provider' do
|
42
|
+
let(:config) do
|
43
|
+
{
|
44
|
+
drop_box: {
|
45
|
+
app_key: 'test-key',
|
46
|
+
app_secret: 'test-secret'
|
47
|
+
}
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'logs a deprecation warning and sets it to the dropbox key' do
|
52
|
+
expect(BrowseEverything.config).not_to include 'drop_box'
|
53
|
+
expect(BrowseEverything.config).to include 'dropbox'
|
54
|
+
expect(BrowseEverything.config['dropbox']).to include({ 'app_key' => 'test-key' })
|
55
|
+
expect(BrowseEverything.config['dropbox']).to include({ 'app_secret' => 'test-secret' })
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context 'with an unsupported or invalid configuration' do
|
61
|
+
let(:config) { 1234 }
|
62
|
+
|
63
|
+
it 'raises an initialization error' do
|
64
|
+
expect { BrowseEverything.configure(config) }.to raise_error(BrowseEverything::InitializationError, 'Unrecognized configuration: 1234')
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe BrowseEverythingSession::ProviderSession do
|
4
|
+
subject(:provider_session) { described_class.new(session: session, name: name) }
|
5
|
+
|
6
|
+
let(:session) { instance_double(ActionDispatch::Request::Session) }
|
7
|
+
let(:name) { 'test_session' }
|
8
|
+
|
9
|
+
describe '.for' do
|
10
|
+
it 'provides a new session object' do
|
11
|
+
expect(described_class.for(session: session, name: name)).to be_a described_class
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '.token' do
|
16
|
+
before do
|
17
|
+
allow(session).to receive(:[]=)
|
18
|
+
allow(session).to receive(:[]).and_return('test-token')
|
19
|
+
provider_session.token = 'test-token'
|
20
|
+
end
|
21
|
+
it 'sets and accesses the access token' do
|
22
|
+
expect(provider_session.token).to eq 'test-token'
|
23
|
+
expect(session).to have_received(:[]).with('test_session_token')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '.code' do
|
28
|
+
before do
|
29
|
+
allow(session).to receive(:[]=)
|
30
|
+
allow(session).to receive(:[]).and_return('test-code')
|
31
|
+
provider_session.code = 'test-code'
|
32
|
+
end
|
33
|
+
it 'sets and accesses the access code' do
|
34
|
+
expect(provider_session.code).to eq 'test-code'
|
35
|
+
expect(session).to have_received(:[]).with('test_session_code')
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '.data' do
|
40
|
+
before do
|
41
|
+
allow(session).to receive(:[]=)
|
42
|
+
allow(session).to receive(:[]).and_return('test' => 'data')
|
43
|
+
provider_session.data = { 'test' => 'data' }
|
44
|
+
end
|
45
|
+
it 'sets and accesses the access data' do
|
46
|
+
expect(provider_session.data).to eq('test' => 'data')
|
47
|
+
expect(session).to have_received(:[]).with('test_session_data')
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
include BrowserConfigHelper
|
4
|
+
|
5
|
+
describe BrowserFactory do
|
6
|
+
subject(:browser_factory) { described_class.new }
|
7
|
+
|
8
|
+
let(:session) { instance_double(BrowseEverythingSession::ProviderSession) }
|
9
|
+
let(:provider_session_class) { class_double(BrowseEverythingSession::ProviderSession).as_stubbed_const(transfer_nested_constants: true) }
|
10
|
+
let(:provider_session) { instance_double(BrowseEverythingSession::ProviderSession) }
|
11
|
+
let(:provider) { instance_double(BrowseEverything::Driver::Base) }
|
12
|
+
let(:browser_class) { class_double(BrowseEverything::Browser).as_stubbed_const(transfer_nested_constants: true) }
|
13
|
+
let(:browser) { instance_double(BrowseEverything::Browser) }
|
14
|
+
|
15
|
+
before do
|
16
|
+
allow(provider).to receive(:key).and_return('test-provider')
|
17
|
+
allow(provider).to receive(:token=)
|
18
|
+
allow(browser).to receive(:providers).and_return('test-provider' => provider)
|
19
|
+
allow(browser_class).to receive(:new).and_return(browser)
|
20
|
+
allow(provider_session).to receive(:token).and_return('test-token')
|
21
|
+
allow(provider_session_class).to receive(:for).and_return(provider_session)
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '.for' do
|
25
|
+
it 'retrieves a driver by name' do
|
26
|
+
expect(described_class.for(name: 'test-provider')).to eq provider
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '.build' do
|
31
|
+
before do
|
32
|
+
described_class.build(session: session, url_options: url_options)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'initializes a Browser Object and provides it with a sessionized access token' do
|
36
|
+
expect(browser_class).to have_received(:new).with(url_options)
|
37
|
+
expect(provider_session_class).to have_received(:for).with(session: session, name: 'test-provider'.to_sym)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,22 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
ENV["RAILS_ENV"] ||= 'test'
|
3
|
+
require "bundler/setup"
|
4
|
+
|
5
|
+
def coverage_needed?
|
6
|
+
ENV['COVERAGE'] || ENV['TRAVIS']
|
7
|
+
end
|
8
|
+
|
9
|
+
if coverage_needed?
|
10
|
+
require 'simplecov'
|
11
|
+
require 'coveralls'
|
12
|
+
SimpleCov.root(File.expand_path('../..', __FILE__))
|
13
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new(
|
14
|
+
[
|
15
|
+
SimpleCov::Formatter::HTMLFormatter,
|
16
|
+
Coveralls::SimpleCov::Formatter
|
17
|
+
]
|
18
|
+
)
|
19
|
+
SimpleCov.start('rails') do
|
20
|
+
add_filter '/.internal_test_app'
|
21
|
+
add_filter '/lib/browse_everything/engine.rb'
|
22
|
+
add_filter '/lib/browse_everything/version.rb'
|
23
|
+
add_filter '/lib/generators'
|
24
|
+
add_filter '/spec'
|
25
|
+
add_filter '/tasks'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
1
29
|
require 'engine_cart'
|
2
30
|
require File.expand_path('config/environment', EngineCart.destination)
|
31
|
+
EngineCart.load_application!
|
32
|
+
|
33
|
+
require 'capybara/rails'
|
34
|
+
require 'capybara/rspec'
|
3
35
|
require 'rspec'
|
4
36
|
require 'rspec/rails'
|
5
37
|
require 'rspec/its'
|
6
|
-
require 'webmock/rspec'
|
7
|
-
require 'simplecov'
|
8
38
|
require 'vcr'
|
9
|
-
require '
|
10
|
-
require 'capybara/rspec'
|
11
|
-
require 'support/rake'
|
12
|
-
require 'coveralls'
|
13
|
-
|
14
|
-
Coveralls.wear!
|
15
|
-
EngineCart.load_application!
|
39
|
+
require 'webmock/rspec'
|
16
40
|
|
17
|
-
|
18
|
-
|
19
|
-
|
41
|
+
# Requires supporting ruby files with custom matchers and macros, etc,
|
42
|
+
# in spec/support/ and its subdirectories.
|
43
|
+
Dir[Pathname.new(File.expand_path('support/**/*.rb', __dir__))].each { |f| require f }
|
20
44
|
|
21
45
|
VCR.configure do |c|
|
22
46
|
c.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
|
@@ -25,14 +49,11 @@ VCR.configure do |c|
|
|
25
49
|
c.ignore_localhost = true
|
26
50
|
end
|
27
51
|
|
28
|
-
Capybara.default_driver = :rack_test # This is a faster driver
|
29
|
-
Capybara.javascript_driver = :poltergeist # This is slower
|
30
|
-
Capybara.default_max_wait_time = ENV['TRAVIS'] ? 30 : 15
|
31
|
-
|
32
52
|
RSpec.configure do |config|
|
33
53
|
config.expect_with :rspec do |c|
|
34
|
-
c.syntax = [
|
54
|
+
c.syntax = %i[should expect]
|
35
55
|
end
|
56
|
+
config.include WaitForAjax, type: :feature
|
36
57
|
end
|
37
58
|
|
38
59
|
module BrowserConfigHelper
|
@@ -46,7 +67,7 @@ module BrowserConfigHelper
|
|
46
67
|
|
47
68
|
def stub_configuration
|
48
69
|
BrowseEverything.configure('file_system' => {
|
49
|
-
home: File.expand_path('
|
70
|
+
home: File.expand_path('fixtures/file_system', __dir__)
|
50
71
|
},
|
51
72
|
'box' => {
|
52
73
|
client_id: 'BoxClientId',
|
@@ -6,7 +6,7 @@
|
|
6
6
|
<%= form_tag('/file', id: 'main_form', method: 'post') do %>
|
7
7
|
<%= button_tag("Browse", type: 'button', class: 'btn btn-large btn-success', id: "browse-btn",
|
8
8
|
'data-toggle' => 'browse-everything', 'data-route' => browse_everything_engine.root_path,
|
9
|
-
'data-target' => '#main_form'
|
9
|
+
'data-target' => '#main_form') %>
|
10
10
|
<%= button_tag("Submit", type: 'submit', class: 'btn btn-large btn-primary', id: "submit-btn") %>
|
11
11
|
<% end %>
|
12
12
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'selenium-webdriver'
|
4
|
+
|
5
|
+
Capybara.javascript_driver = :headless_chrome
|
6
|
+
|
7
|
+
Capybara.register_driver :headless_chrome do |app|
|
8
|
+
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
|
9
|
+
chromeOptions: { args: %w[headless disable-gpu no-sandbox] }
|
10
|
+
)
|
11
|
+
|
12
|
+
Capybara::Selenium::Driver.new(app,
|
13
|
+
browser: :chrome,
|
14
|
+
desired_capabilities: capabilities)
|
15
|
+
end
|
16
|
+
|
17
|
+
Capybara.default_max_wait_time = 5
|
data/spec/support/rake.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rake'
|
2
4
|
|
3
5
|
module RakeHelper
|
@@ -29,7 +31,7 @@ module RakeHelper
|
|
29
31
|
rescue SystemExit => e
|
30
32
|
puts "error = #{e.inspect}"
|
31
33
|
end
|
32
|
-
|
34
|
+
"Output: #{out.string}\n Errors:#{err.string}"
|
33
35
|
ensure
|
34
36
|
$stdout = STDOUT
|
35
37
|
$stdout = STDERR
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module WaitForAjax
|
4
|
+
def wait_for_ajax
|
5
|
+
Timeout.timeout(Capybara.default_max_wait_time) do
|
6
|
+
loop until finished_all_ajax_requests?
|
7
|
+
end
|
8
|
+
sleep 1
|
9
|
+
end
|
10
|
+
|
11
|
+
def finished_all_ajax_requests?
|
12
|
+
page.evaluate_script('jQuery.active').zero?
|
13
|
+
end
|
14
|
+
end
|
@@ -1,7 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rails/generators'
|
2
4
|
|
3
5
|
class TestAppGenerator < Rails::Generators::Base
|
4
|
-
source_root File.expand_path('../../../../spec/
|
6
|
+
source_root File.expand_path('../../../../spec/test_app_templates/', __FILE__)
|
7
|
+
|
8
|
+
def install_engine
|
9
|
+
generate 'browse_everything:install -f'
|
10
|
+
end
|
5
11
|
|
6
12
|
def run_config_generator
|
7
13
|
generate 'browse_everything:config'
|
@@ -42,8 +48,8 @@ class TestAppGenerator < Rails::Generators::Base
|
|
42
48
|
end
|
43
49
|
|
44
50
|
def create_test_route
|
45
|
-
copy_file 'app/controllers/file_handler_controller.rb', 'app/controllers/file_handler_controller.rb'
|
46
|
-
copy_file 'app/views/file_handler/main.html.erb', 'app/views/file_handler/main.html.erb'
|
47
|
-
copy_file 'app/views/file_handler/index.html.erb', 'app/views/file_handler/index.html.erb'
|
51
|
+
copy_file '../support/app/controllers/file_handler_controller.rb', 'app/controllers/file_handler_controller.rb'
|
52
|
+
copy_file '../support/app/views/file_handler/main.html.erb', 'app/views/file_handler/main.html.erb'
|
53
|
+
copy_file '../support/app/views/file_handler/index.html.erb', 'app/views/file_handler/index.html.erb'
|
48
54
|
end
|
49
55
|
end
|
@@ -1,17 +1,20 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe 'browse_everything/_files.html.erb', type: :view do
|
2
4
|
let(:file) do
|
3
5
|
BrowseEverything::FileEntry.new(
|
4
6
|
'file_id_01234', 'my_provider:/location/pa/th/file.m4v',
|
5
|
-
'file.m4v', 1024 * 1024 * 1024, Time.
|
7
|
+
'file.m4v', 1024 * 1024 * 1024, Time.current, false
|
6
8
|
)
|
7
9
|
end
|
8
10
|
let(:container) do
|
9
11
|
BrowseEverything::FileEntry.new(
|
10
12
|
'dir_id_01234', 'my_provider:/location/pa/th/dir',
|
11
|
-
'dir', 0, Time.
|
13
|
+
'dir', 0, Time.current, true
|
12
14
|
)
|
13
15
|
end
|
14
|
-
|
16
|
+
|
17
|
+
let(:provider) { instance_double(BrowseEverything::Driver::Base) }
|
15
18
|
let(:page) { Capybara::Node::Simple.new(rendered) }
|
16
19
|
|
17
20
|
before do
|
@@ -21,15 +24,21 @@ describe 'browse_everything/_file.html.erb', type: :view do
|
|
21
24
|
allow(view).to receive(:parent).and_return('parent')
|
22
25
|
allow(view).to receive(:provider_name).and_return('my provider')
|
23
26
|
allow(provider).to receive(:config).and_return(config)
|
27
|
+
|
28
|
+
allow(view).to receive(:provider_contents).and_return provider_contents
|
24
29
|
end
|
25
30
|
|
26
31
|
describe 'a file' do
|
32
|
+
let(:config) { {} }
|
33
|
+
let(:provider_contents) { [file] }
|
34
|
+
|
27
35
|
before do
|
28
36
|
allow(view).to receive(:file).and_return(file)
|
29
37
|
render
|
30
38
|
end
|
31
|
-
context 'file not too big' do
|
39
|
+
context 'when a file is not too big' do
|
32
40
|
let(:config) { { max_upload_file_size: (5 * 1024 * 1024 * 1024) } }
|
41
|
+
|
33
42
|
it 'draws link' do
|
34
43
|
expect(page).to have_selector('a.ev-link')
|
35
44
|
end
|
@@ -39,38 +48,35 @@ describe 'browse_everything/_file.html.erb', type: :view do
|
|
39
48
|
end
|
40
49
|
end
|
41
50
|
|
42
|
-
context '
|
43
|
-
let(:config) { {} }
|
51
|
+
context 'when a maximum file size is not configured' do
|
44
52
|
it 'draws link' do
|
45
53
|
expect(page).to have_selector('a.ev-link')
|
46
54
|
end
|
47
55
|
end
|
48
56
|
|
49
|
-
context 'file too big' do
|
57
|
+
context 'when a file is too big' do
|
50
58
|
let(:config) { { max_upload_file_size: 1024 } }
|
59
|
+
|
51
60
|
it 'draws link' do
|
52
61
|
expect(page).not_to have_selector('a.ev-link')
|
53
62
|
end
|
54
63
|
end
|
55
64
|
|
56
|
-
|
57
|
-
|
58
|
-
it 'does not have a checkbox' do
|
59
|
-
expect(page).not_to have_selector('input.ev-select-all')
|
60
|
-
end
|
65
|
+
it 'does not have a checkbox' do
|
66
|
+
expect(page).not_to have_selector('input.ev-select-all')
|
61
67
|
end
|
62
68
|
end
|
63
69
|
|
64
70
|
describe 'a directory' do
|
71
|
+
let(:provider_contents) { [container] }
|
72
|
+
|
65
73
|
before do
|
66
74
|
allow(view).to receive(:file).and_return(container)
|
67
75
|
render
|
68
76
|
end
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
expect(page).to have_selector('input.ev-select-all')
|
73
|
-
end
|
77
|
+
|
78
|
+
it 'has the select-all checkbox' do
|
79
|
+
expect(page).to have_selector('input.ev-select-all')
|
74
80
|
end
|
75
81
|
end
|
76
82
|
end
|