dbhero 1.0.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 +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +21 -0
- data/app/assets/javascripts/dbhero/application.js +45 -0
- data/app/assets/javascripts/dbhero/dataclips.js +42 -0
- data/app/assets/stylesheets/dbhero/application.css.scss +88 -0
- data/app/controllers/dbhero/application_controller.rb +30 -0
- data/app/controllers/dbhero/dataclips_controller.rb +84 -0
- data/app/helpers/dbhero/application_helper.rb +4 -0
- data/app/helpers/dbhero/dataclips_helper.rb +4 -0
- data/app/models/dbhero/dataclip.rb +50 -0
- data/app/views/dbhero/dataclips/_clip_table.html.slim +38 -0
- data/app/views/dbhero/dataclips/_form.html.slim +32 -0
- data/app/views/dbhero/dataclips/edit.html.slim +6 -0
- data/app/views/dbhero/dataclips/index.html.slim +25 -0
- data/app/views/dbhero/dataclips/new.html.slim +2 -0
- data/app/views/dbhero/dataclips/show.html.slim +18 -0
- data/app/views/layouts/dbhero/application.html.slim +24 -0
- data/config/routes.rb +6 -0
- data/lib/dbhero.rb +7 -0
- data/lib/dbhero/configuration.rb +39 -0
- data/lib/dbhero/engine.rb +9 -0
- data/lib/dbhero/gdrive_exporter.rb +56 -0
- data/lib/dbhero/router_constraint.rb +43 -0
- data/lib/dbhero/version.rb +3 -0
- data/lib/generators/dbhero/install/install_generator.rb +29 -0
- data/lib/generators/dbhero/install/templates/dbhero.rb +26 -0
- data/lib/generators/dbhero/install/templates/migrations/create_dbhero_dataclips.rb +17 -0
- data/lib/tasks/dbhero_tasks.rake +4 -0
- data/spec/controllers/dbhero/dataclips_controller_spec.rb +293 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +27 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +85 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +78 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/assets.rb +8 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/dbhero.rb +26 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +4 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/db/migrate/20150323172444_create_dbhero_dataclips.rb +17 -0
- data/spec/dummy/db/schema.rb +32 -0
- data/spec/dummy/log/development.log +27 -0
- data/spec/dummy/log/test.log +3758 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/factories.rb +8 -0
- data/spec/models/dbhero/dataclip_spec.rb +119 -0
- data/spec/rails_helper.rb +57 -0
- data/spec/spec_helper.rb +90 -0
- metadata +312 -0
@@ -0,0 +1,32 @@
|
|
1
|
+
= javascript_include_tag "https://cdnjs.cloudflare.com/ajax/libs/ace/1.1.8/ace.js"
|
2
|
+
= form_for @dataclip do |f|
|
3
|
+
- if @dataclip.errors.any?
|
4
|
+
.section
|
5
|
+
.card-panel.deep-orange.darken-4
|
6
|
+
.card-content.white-text
|
7
|
+
ul
|
8
|
+
- @dataclip.errors.full_messages.each do |message|
|
9
|
+
li
|
10
|
+
i class='mdi-alert-error left'
|
11
|
+
= message
|
12
|
+
|
13
|
+
.row.style-text-field
|
14
|
+
.input-field
|
15
|
+
= f.text_area :description, class: "materialize-textarea", placeholder: "describe this clip, first line should be title..."
|
16
|
+
.row
|
17
|
+
.input-field
|
18
|
+
= f.text_area :raw_query, class: 'editor-style z-depth-1'
|
19
|
+
.row
|
20
|
+
.col.s5
|
21
|
+
.input-field
|
22
|
+
.switch
|
23
|
+
label
|
24
|
+
i style="margin-top: -20px; float: left" class="small mdi-action-lock-open tooltipped" data-position="right" data-delay="50" data-tooltip="Everyone with the public link can see the results"
|
25
|
+
= f.check_box :private
|
26
|
+
span.lever style='float: left;'
|
27
|
+
i style="margin-top: -20px; float: left" class="small mdi-action-lock-outline tooltipped" data-position="right" data-delay="50" data-tooltip="Only users that same role as you can see the clip"
|
28
|
+
.col.s7.right-align
|
29
|
+
.input-field
|
30
|
+
button class="btn waves-effect waves-light blue darken-3" type="submit" name="action"
|
31
|
+
| Save
|
32
|
+
i class="mdi-action-done-all left"
|
@@ -0,0 +1,25 @@
|
|
1
|
+
.container
|
2
|
+
.section
|
3
|
+
.row.style-text-field
|
4
|
+
.input-field.col.s12
|
5
|
+
= form_tag dataclips_path, method: :get do
|
6
|
+
input#icon_prefix.validate name='search' type="text" value=params[:search] /
|
7
|
+
label for="icon_prefix"
|
8
|
+
| search on all clips
|
9
|
+
i.mdi-action-search.prefix
|
10
|
+
|
11
|
+
.row
|
12
|
+
.col.s2.center-align.right
|
13
|
+
span style='font-size: 16px; color: #9e9e9e;' updated at
|
14
|
+
.col.s12
|
15
|
+
ul.collection.z-depth-1
|
16
|
+
- @dataclips.each do |dataclip|
|
17
|
+
li.collection-item
|
18
|
+
.row style='margin-bottom: 0;'
|
19
|
+
.col.s12
|
20
|
+
= link_to dataclip.title, edit_dataclip_path(dataclip)
|
21
|
+
- if dataclip.user
|
22
|
+
span style='font-size: 13px; font-weight: light; color: #607d8b;'
|
23
|
+
| by #{dataclip.user}
|
24
|
+
span.right style='font-size: 12px; font-weight: bold; color: #607d8b;'= distance_of_time_in_words(dataclip.updated_at, DateTime.now)
|
25
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
.section.bottom-bord.grey.lighten-4
|
2
|
+
.container
|
3
|
+
.row
|
4
|
+
.col.s12.center-align
|
5
|
+
h5.clip-title=simple_format(@dataclip.title)
|
6
|
+
p=simple_format(@dataclip.description_without_title)
|
7
|
+
|
8
|
+
|
9
|
+
.container
|
10
|
+
- if params[:gdrive_file_url].present?
|
11
|
+
.card-panel.teal.up.green.lighten-1
|
12
|
+
.card-content.white-text.center-align style='text-transform: uppercase;'
|
13
|
+
| DATACLIP EXPORTED!
|
14
|
+
strong
|
15
|
+
= link_to 'CLICK HERE TO VIEW IT', params[:gdrive_file_url], style: 'color: #33691e;'
|
16
|
+
|
17
|
+
|
18
|
+
== render 'clip_table'
|
@@ -0,0 +1,24 @@
|
|
1
|
+
doctype html
|
2
|
+
html.grey.lighten-3
|
3
|
+
head
|
4
|
+
title DBHero
|
5
|
+
= stylesheet_link_tag "dbhero/application", "https://cdnjs.cloudflare.com/ajax/libs/materialize/0.95.3/css/materialize.min.css", media: "all"
|
6
|
+
= javascript_include_tag "dbhero/application", "https://cdnjs.cloudflare.com/ajax/libs/materialize/0.95.3/js/materialize.min.js"
|
7
|
+
= csrf_meta_tags
|
8
|
+
body
|
9
|
+
- unless action_name == 'show'
|
10
|
+
header.grey.lighten-5
|
11
|
+
.row
|
12
|
+
.col.s2
|
13
|
+
= link_to dataclips_path do
|
14
|
+
h1
|
15
|
+
| db
|
16
|
+
strong hero
|
17
|
+
.col.s10.right-align
|
18
|
+
.btn-group
|
19
|
+
= link_to 'clips', dataclips_path, class: 'btn blue darken-1 waves-effect waves-light'
|
20
|
+
|
|
21
|
+
= link_to 'new clip', new_dataclip_path, class: 'btn blue darken-1 waves-effect waves-light'
|
22
|
+
|
23
|
+
= yield
|
24
|
+
|
data/config/routes.rb
ADDED
data/lib/dbhero.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
module Dbhero
|
2
|
+
module Configuration
|
3
|
+
VALID_CONFIG_KEYS = [:authenticate, :current_user_method, :custom_user_auth_condition,
|
4
|
+
:user_representation, :google_api_id, :google_api_secret].freeze
|
5
|
+
|
6
|
+
DEFAULT_AUTHENTICATE = true
|
7
|
+
DEFAULT_CURRENT_USER_METHOD = :current_user
|
8
|
+
DEFAULT_GOOGLE_API_ID = ''
|
9
|
+
DEFAULT_GOOGLE_API_SECRET = ''
|
10
|
+
DEFAULT_USER_PRESENTATION = :email
|
11
|
+
DEFAULT_CUSTOM_USER_AUTH_CONDITION = nil
|
12
|
+
|
13
|
+
attr_accessor *VALID_CONFIG_KEYS
|
14
|
+
|
15
|
+
def self.extended(base)
|
16
|
+
base.reset
|
17
|
+
end
|
18
|
+
|
19
|
+
def configure
|
20
|
+
yield self if block_given?
|
21
|
+
end
|
22
|
+
|
23
|
+
def options
|
24
|
+
Hash[ * VALID_CONFIG_KEYS.map { |key| [key, send(key)] }.flatten ]
|
25
|
+
end
|
26
|
+
|
27
|
+
def reset
|
28
|
+
self.authenticate = DEFAULT_AUTHENTICATE
|
29
|
+
self.current_user_method = DEFAULT_CURRENT_USER_METHOD
|
30
|
+
self.user_representation = DEFAULT_USER_PRESENTATION
|
31
|
+
self.google_api_id = DEFAULT_GOOGLE_API_ID
|
32
|
+
self.google_api_secret = DEFAULT_GOOGLE_API_SECRET
|
33
|
+
self.custom_user_auth_condition = DEFAULT_CUSTOM_USER_AUTH_CONDITION
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Dbhero
|
2
|
+
class GdriveExporter
|
3
|
+
attr_accessor :options
|
4
|
+
attr_reader :client, :auth, :session,
|
5
|
+
:dataclip, :uploaded_file, :exported_file_url
|
6
|
+
|
7
|
+
def initialize options = {}
|
8
|
+
@client ||= ::Google::APIClient.new
|
9
|
+
@options = options
|
10
|
+
|
11
|
+
@auth = @client.authorization
|
12
|
+
@auth.client_id = Dbhero.google_api_id
|
13
|
+
@auth.client_secret = Dbhero.google_api_secret
|
14
|
+
@auth.scope =
|
15
|
+
"https://www.googleapis.com/auth/drive " +
|
16
|
+
"https://spreadsheets.google.com/feeds/"
|
17
|
+
|
18
|
+
@auth.redirect_uri = options[:redirect_uri]
|
19
|
+
end
|
20
|
+
|
21
|
+
def fetch_access_token! code
|
22
|
+
@auth.code = code
|
23
|
+
@auth.fetch_access_token!
|
24
|
+
@session ||= GoogleDrive.login_with_oauth(@auth.access_token)
|
25
|
+
end
|
26
|
+
|
27
|
+
def export_clip_by_token token
|
28
|
+
@dataclip ||= Dataclip.find_by token: token
|
29
|
+
raise 'unable to find dataclip' unless @dataclip
|
30
|
+
|
31
|
+
exported_file = find_or_create_spreadsheet!
|
32
|
+
@exported_file_url = exported_file.human_url
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def find_or_create_spreadsheet!
|
38
|
+
file_title = "DBHero - #{@dataclip.title}"
|
39
|
+
|
40
|
+
spreadsheet = @session.spreadsheet_by_title(file_title)
|
41
|
+
|
42
|
+
worksheet = (spreadsheet || upload_from_string(file_title)).worksheets[0]
|
43
|
+
worksheet[1,1] = "=importData('#{@options[:import_data_url]}')"
|
44
|
+
worksheet.save
|
45
|
+
|
46
|
+
spreadsheet || @uploaded_file
|
47
|
+
end
|
48
|
+
|
49
|
+
def upload_from_string file_title
|
50
|
+
@uploaded_file ||= @session.upload_from_string(
|
51
|
+
@dataclip.csv_string,
|
52
|
+
file_title,
|
53
|
+
content_type: 'text/csv')
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Dbhero
|
2
|
+
class RouterConstraint
|
3
|
+
@@routes = Dbhero::Engine.routes
|
4
|
+
|
5
|
+
def self.matches? request, options = {}
|
6
|
+
_ = new(request, options)
|
7
|
+
_.match?
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(request, options)
|
11
|
+
@request = request
|
12
|
+
@options = options
|
13
|
+
@devise_mapping = options[:devise_mapping] || :user
|
14
|
+
@devise_auth = options[:devise_auth] || false
|
15
|
+
@enable_public_clip = options[:enable_public_clip] || false
|
16
|
+
end
|
17
|
+
|
18
|
+
def match?
|
19
|
+
return ((@enable_public_clip && check_if_is_public_dataclip) ||
|
20
|
+
(@devise_auth && authenticate_warden && check_custom_condition))
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def check_if_is_public_dataclip
|
26
|
+
if @request.path.match(/\/dataclips\/([\w\-]{36}+)(\.[\w]{1,6})?$/)
|
27
|
+
return Dbhero::Dataclip.where(token: $1).exists?
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def authenticate_warden
|
32
|
+
@request.env['warden'].send(:authenticate!, scope: @devise_mapping)
|
33
|
+
end
|
34
|
+
|
35
|
+
def check_custom_condition
|
36
|
+
auth_condition.is_a?(Proc) && auth_condition.call( @request.env['warden'].user(@devise_mapping) )
|
37
|
+
end
|
38
|
+
|
39
|
+
def auth_condition
|
40
|
+
@options[:custom_auth_condition]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Dbhero
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < ::Rails::Generators::Base
|
4
|
+
include Rails::Generators::Migration
|
5
|
+
|
6
|
+
desc "Installs DBHero and generate migrations"
|
7
|
+
source_root File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
|
8
|
+
|
9
|
+
def copy_initializer
|
10
|
+
template 'dbhero.rb', 'config/initializers/dbhero.rb'
|
11
|
+
end
|
12
|
+
|
13
|
+
def create_migrations
|
14
|
+
migration_template "migrations/create_dbhero_dataclips.rb", "db/migrate/create_dbhero_dataclips.rb"
|
15
|
+
end
|
16
|
+
|
17
|
+
# for migration generation
|
18
|
+
def self.next_migration_number(path)
|
19
|
+
unless @prev_migration_nr
|
20
|
+
@prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
|
21
|
+
else
|
22
|
+
@prev_migration_nr += 1
|
23
|
+
end
|
24
|
+
@prev_migration_nr.to_s
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
Dbhero.configure do |config|
|
2
|
+
# if you are using devise you can keep the "authenticate_user!"
|
3
|
+
config.authenticate = true
|
4
|
+
|
5
|
+
# Method to get the current user authenticated on your app
|
6
|
+
# if you are using devise you can keep the "current_user"
|
7
|
+
config.current_user_method = :current_user
|
8
|
+
|
9
|
+
# uncomment to use custom user auth
|
10
|
+
# config.custom_user_auth_condition = lambda do |user|
|
11
|
+
# user.admin?
|
12
|
+
# end
|
13
|
+
|
14
|
+
# String representation for user
|
15
|
+
# when creating a dataclip just save on user field
|
16
|
+
config.user_representation = :email
|
17
|
+
|
18
|
+
# Google drive integration, uncomment to use ;)
|
19
|
+
# you can get you google api credentials here:
|
20
|
+
# https://developers.google.com/drive/web/auth/web-server
|
21
|
+
#
|
22
|
+
# config.google_api_id = 'GOOGLE_API_ID'
|
23
|
+
# config.google_api_secret = 'GOOGLE_API_SECRET'
|
24
|
+
end
|
25
|
+
|
26
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class CreateDbheroDataclips < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :dbhero_dataclips do |t|
|
4
|
+
t.text :description, null: false
|
5
|
+
t.text :raw_query, null: false
|
6
|
+
t.text :token, null: false
|
7
|
+
t.text :user
|
8
|
+
t.boolean :private, default: false, null: false
|
9
|
+
|
10
|
+
t.timestamps null: false
|
11
|
+
end
|
12
|
+
|
13
|
+
add_index :dbhero_dataclips, :token, unique: true
|
14
|
+
add_index :dbhero_dataclips, :user
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,293 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
RSpec.shared_examples "user not authenticated" do
|
4
|
+
let(:method_name) { :get }
|
5
|
+
let(:options) { nil }
|
6
|
+
|
7
|
+
before do
|
8
|
+
allow(Dbhero).to receive(:authenticate).and_return(true)
|
9
|
+
allow(controller).to receive(:_current_user).and_return(nil)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should raise forbidden error" do
|
13
|
+
expect {
|
14
|
+
send(method_name, *options)
|
15
|
+
}.to raise_error(ActionController::RoutingError, 'Forbidden')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
RSpec.shared_examples "user authenticated" do
|
20
|
+
let(:method_name) { :get }
|
21
|
+
let(:options) { nil }
|
22
|
+
let(:expect_method) { :be_success }
|
23
|
+
|
24
|
+
before do
|
25
|
+
current_user = double()
|
26
|
+
allow(current_user).to receive(:email).and_return('foo@bar.com')
|
27
|
+
allow(controller).to receive(:_current_user).and_return(current_user)
|
28
|
+
allow(Dbhero).to receive(:authenticate).and_return(true)
|
29
|
+
|
30
|
+
send(method_name, *options)
|
31
|
+
end
|
32
|
+
|
33
|
+
it("response should be success") { expect(response).to send(expect_method) }
|
34
|
+
end
|
35
|
+
|
36
|
+
RSpec.shared_examples "user authenticated match for custom role" do
|
37
|
+
let(:method_name) { :get }
|
38
|
+
let(:options) { nil }
|
39
|
+
let(:expect_method) { :be_success }
|
40
|
+
|
41
|
+
before do
|
42
|
+
current_user = double()
|
43
|
+
allow(current_user).to receive(:email).and_return('foo@bar.com')
|
44
|
+
allow(current_user).to receive(:admin?).and_return(true)
|
45
|
+
allow(controller).to receive(:_current_user).and_return(current_user)
|
46
|
+
allow(Dbhero).to receive(:authenticate).and_return(true)
|
47
|
+
allow(Dbhero).to receive(:custom_user_auth_condition).and_return(->(u){u.admin?})
|
48
|
+
|
49
|
+
send(method_name, *options)
|
50
|
+
end
|
51
|
+
|
52
|
+
it("response should be success") { expect(response).to send(expect_method) }
|
53
|
+
end
|
54
|
+
|
55
|
+
RSpec.shared_examples "user authenticated don't match for custom role" do
|
56
|
+
let(:method_name) { :get }
|
57
|
+
let(:options) { nil }
|
58
|
+
|
59
|
+
before do
|
60
|
+
current_user = double()
|
61
|
+
allow(current_user).to receive(:email).and_return('foo@bar.com')
|
62
|
+
allow(current_user).to receive(:admin?).and_return(false)
|
63
|
+
allow(controller).to receive(:_current_user).and_return(current_user)
|
64
|
+
allow(Dbhero).to receive(:authenticate).and_return(true)
|
65
|
+
allow(Dbhero).to receive(:custom_user_auth_condition).and_return(->(u){u.admin?})
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should raise forbidden error" do
|
69
|
+
expect {
|
70
|
+
send(method_name, *options)
|
71
|
+
}.to raise_error(ActionController::RoutingError, 'Forbidden')
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
RSpec.shared_examples "disabled auth" do
|
76
|
+
let(:method_name) { :get }
|
77
|
+
let(:options) { nil }
|
78
|
+
let(:expect_method) { :be_success }
|
79
|
+
|
80
|
+
before do
|
81
|
+
allow(Dbhero).to receive(:authenticate).and_return(false)
|
82
|
+
allow(controller).to receive(:_current_user).and_return(nil)
|
83
|
+
send(method_name, *options)
|
84
|
+
end
|
85
|
+
|
86
|
+
it("response should be success") { expect(response).to send(expect_method) }
|
87
|
+
end
|
88
|
+
|
89
|
+
RSpec.describe Dbhero::DataclipsController, type: :controller do
|
90
|
+
routes { Dbhero::Engine.routes }
|
91
|
+
|
92
|
+
describe "GET index" do
|
93
|
+
describe "with enabled auth" do
|
94
|
+
it_should_behave_like "user not authenticated" do
|
95
|
+
let(:options) { :index }
|
96
|
+
end
|
97
|
+
|
98
|
+
it_should_behave_like "user authenticated" do
|
99
|
+
let(:options) { :index }
|
100
|
+
end
|
101
|
+
|
102
|
+
it_should_behave_like "user authenticated match for custom role" do
|
103
|
+
let(:options) { :index }
|
104
|
+
end
|
105
|
+
|
106
|
+
it_should_behave_like "user authenticated don't match for custom role" do
|
107
|
+
let(:options) { :index }
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe "with disabled auth" do
|
112
|
+
it_should_behave_like "disabled auth" do
|
113
|
+
let(:options) { :index }
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe "GET new" do
|
119
|
+
describe "with enabled auth" do
|
120
|
+
it_should_behave_like "user not authenticated" do
|
121
|
+
let(:options) { :new }
|
122
|
+
end
|
123
|
+
|
124
|
+
it_should_behave_like "user authenticated" do
|
125
|
+
let(:options) { :new }
|
126
|
+
end
|
127
|
+
|
128
|
+
it_should_behave_like "user authenticated match for custom role" do
|
129
|
+
let(:options) { :new }
|
130
|
+
end
|
131
|
+
|
132
|
+
it_should_behave_like "user authenticated don't match for custom role" do
|
133
|
+
let(:options) { :new }
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
describe "with disabled auth" do
|
138
|
+
it_should_behave_like "disabled auth" do
|
139
|
+
let(:options) { :new }
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe "POST create" do
|
145
|
+
describe "with enabled auth" do
|
146
|
+
it_should_behave_like "user not authenticated" do
|
147
|
+
let(:method_name) { :post }
|
148
|
+
let(:options) { [:create, { dataclip: { description: "foo bar", raw_query: "select 'foo' as bar" } }] }
|
149
|
+
end
|
150
|
+
|
151
|
+
it_should_behave_like "user authenticated" do
|
152
|
+
let(:method_name) { :post }
|
153
|
+
let(:options) { [:create, { dataclip: { description: "foo bar", raw_query: "select 'foo' as bar" } }] }
|
154
|
+
let(:expect_method) { :be_redirect }
|
155
|
+
|
156
|
+
it { expect(Dbhero::Dataclip.find_by(description: 'foo bar')).not_to be_nil }
|
157
|
+
end
|
158
|
+
|
159
|
+
it_should_behave_like "user authenticated match for custom role" do
|
160
|
+
let(:method_name) { :post }
|
161
|
+
let(:options) { [:create, { dataclip: { description: "foo bar", raw_query: "select 'foo' as bar" } }] }
|
162
|
+
let(:expect_method) { :be_redirect }
|
163
|
+
|
164
|
+
it "find dataclip" do
|
165
|
+
clip = Dbhero::Dataclip.find_by(description: 'foo bar')
|
166
|
+
|
167
|
+
expect(clip.user).to eq(controller._current_user.email)
|
168
|
+
expect(clip.description).to eq("foo bar")
|
169
|
+
expect(clip.raw_query).to eq("select 'foo' as bar")
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
it_should_behave_like "user authenticated don't match for custom role" do
|
174
|
+
let(:method_name) { :post }
|
175
|
+
let(:options) { [:create, { dataclip: { description: "foo bar", raw_query: "select 'foo' as bar" } }] }
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
describe "with disabled auth" do
|
180
|
+
it_should_behave_like "disabled auth" do
|
181
|
+
let(:method_name) { :post }
|
182
|
+
let(:options) { [:create, { dataclip: { description: "foo bar disabled", raw_query: "select 'foo' as bar" } }] }
|
183
|
+
let(:expect_method) { :be_redirect }
|
184
|
+
|
185
|
+
it "find dataclip" do
|
186
|
+
clip = Dbhero::Dataclip.find_by(description: 'foo bar disabled')
|
187
|
+
|
188
|
+
expect(clip.user).to be_nil
|
189
|
+
expect(clip.description).to eq("foo bar disabled")
|
190
|
+
expect(clip.raw_query).to eq("select 'foo' as bar")
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
|
197
|
+
describe "GET edit" do
|
198
|
+
describe "with enabled auth" do
|
199
|
+
it_should_behave_like "user not authenticated" do
|
200
|
+
let(:dataclip) { create(:dataclip) }
|
201
|
+
let(:options) { [:edit, { id: dataclip.token}] }
|
202
|
+
end
|
203
|
+
|
204
|
+
it_should_behave_like "user authenticated" do
|
205
|
+
let(:dataclip) { create(:dataclip) }
|
206
|
+
let(:options) { [:edit, { id: dataclip.token}] }
|
207
|
+
end
|
208
|
+
|
209
|
+
it_should_behave_like "user authenticated match for custom role" do
|
210
|
+
let(:dataclip) { create(:dataclip) }
|
211
|
+
let(:options) { [:edit, { id: dataclip.token}] }
|
212
|
+
end
|
213
|
+
|
214
|
+
it_should_behave_like "user authenticated don't match for custom role" do
|
215
|
+
let(:dataclip) { create(:dataclip) }
|
216
|
+
let(:options) { [:edit, { id: dataclip.token}] }
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
describe "with disabled auth" do
|
221
|
+
it_should_behave_like "disabled auth" do
|
222
|
+
let(:dataclip) { create(:dataclip) }
|
223
|
+
let(:options) { [:edit, { id: dataclip.token}] }
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
describe "PUT update" do
|
229
|
+
describe "with enabled auth" do
|
230
|
+
it_should_behave_like "user not authenticated" do
|
231
|
+
let(:method_name) { :post }
|
232
|
+
let(:options) { [:create, { dataclip: { description: "foo bar", raw_query: "select 'foo' as bar" } }] }
|
233
|
+
end
|
234
|
+
|
235
|
+
it_should_behave_like "user authenticated" do
|
236
|
+
let(:method_name) { :put }
|
237
|
+
let(:dataclip) { create(:dataclip, {description: "foo bar", raw_query: "select 'foo' as bar"}) }
|
238
|
+
let(:options) { [:update, id: dataclip.token, dataclip: { description: "updated" } ] }
|
239
|
+
let(:expect_method) { :be_redirect }
|
240
|
+
|
241
|
+
it "find dataclip" do
|
242
|
+
clip = Dbhero::Dataclip.find_by(description: 'updated')
|
243
|
+
|
244
|
+
expect(clip.description).to eq("updated")
|
245
|
+
expect(clip.raw_query).to eq("select 'foo' as bar")
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
it_should_behave_like "user authenticated match for custom role" do
|
250
|
+
let(:method_name) { :put }
|
251
|
+
let(:dataclip) { create(:dataclip, {description: "foo bar", raw_query: "select 'foo' as bar"}) }
|
252
|
+
let(:options) { [:update, id: dataclip.token, dataclip: { description: "updated" }] }
|
253
|
+
let(:expect_method) { :be_redirect }
|
254
|
+
|
255
|
+
it "find dataclip" do
|
256
|
+
clip = Dbhero::Dataclip.find_by(description: 'updated')
|
257
|
+
|
258
|
+
expect(clip.description).to eq("updated")
|
259
|
+
expect(clip.raw_query).to eq("select 'foo' as bar")
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
it_should_behave_like "user authenticated don't match for custom role" do
|
264
|
+
let(:method_name) { :put }
|
265
|
+
let(:dataclip) { create(:dataclip, {description: "foo bar", raw_query: "select 'foo' as bar"}) }
|
266
|
+
let(:options) { [:update, id: dataclip.token, dataclip: { description: "updated" }] }
|
267
|
+
let(:expect_method) { :be_redirect }
|
268
|
+
|
269
|
+
it "not update dataclip" do
|
270
|
+
clip = Dbhero::Dataclip.find dataclip.id
|
271
|
+
|
272
|
+
expect(clip.description).to eq("foo bar")
|
273
|
+
end
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
describe "with disabled auth" do
|
278
|
+
it_should_behave_like "disabled auth" do
|
279
|
+
let(:method_name) { :put }
|
280
|
+
let(:dataclip) { create(:dataclip, {description: "foo bar", raw_query: "select 'foo' as bar"}) }
|
281
|
+
let(:options) { [:update, id: dataclip.token, dataclip: { description: "updated" }] }
|
282
|
+
let(:expect_method) { :be_redirect }
|
283
|
+
|
284
|
+
it "find dataclip" do
|
285
|
+
clip = Dbhero::Dataclip.find_by(description: 'updated')
|
286
|
+
|
287
|
+
expect(clip.description).to eq("updated")
|
288
|
+
expect(clip.raw_query).to eq("select 'foo' as bar")
|
289
|
+
end
|
290
|
+
end
|
291
|
+
end
|
292
|
+
end
|
293
|
+
end
|