remotipart 1.4.2 → 1.4.3

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.
Files changed (68) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +35 -0
  3. data/Appraisals +25 -0
  4. data/Gemfile +13 -0
  5. data/History.rdoc +5 -0
  6. data/README.rdoc +2 -0
  7. data/Rakefile +5 -7
  8. data/gemfiles/rails_3.2.gemfile +26 -0
  9. data/gemfiles/rails_4.2.gemfile +24 -0
  10. data/gemfiles/rails_5.2.gemfile +24 -0
  11. data/gemfiles/rails_6.0.gemfile +24 -0
  12. data/lib/remotipart/rails/version.rb +2 -2
  13. data/lib/remotipart/render_overrides.rb +2 -2
  14. data/lib/remotipart/view_helper.rb +0 -9
  15. data/remotipart.gemspec +76 -4
  16. data/spec/dummy_app/.gitignore +17 -0
  17. data/spec/dummy_app/Rakefile +7 -0
  18. data/spec/dummy_app/app/assets/images/rails.png +0 -0
  19. data/spec/dummy_app/app/assets/javascripts/application.js.erb +8 -0
  20. data/spec/dummy_app/app/assets/javascripts/comments.js +28 -0
  21. data/spec/dummy_app/app/assets/stylesheets/application.css +6 -0
  22. data/spec/dummy_app/app/assets/stylesheets/scaffold.css +65 -0
  23. data/spec/dummy_app/app/controllers/application_controller.rb +3 -0
  24. data/spec/dummy_app/app/controllers/comments_controller.rb +72 -0
  25. data/spec/dummy_app/app/helpers/application_helper.rb +2 -0
  26. data/spec/dummy_app/app/helpers/comments_helper.rb +2 -0
  27. data/spec/dummy_app/app/models/comment.rb +7 -0
  28. data/spec/dummy_app/app/views/comments/_comment.html.erb +9 -0
  29. data/spec/dummy_app/app/views/comments/_form.html.erb +40 -0
  30. data/spec/dummy_app/app/views/comments/_new_comment_links.html.erb +5 -0
  31. data/spec/dummy_app/app/views/comments/create.html.erb +7 -0
  32. data/spec/dummy_app/app/views/comments/create.js.erb +20 -0
  33. data/spec/dummy_app/app/views/comments/destroy.js.erb +1 -0
  34. data/spec/dummy_app/app/views/comments/edit.html.erb +6 -0
  35. data/spec/dummy_app/app/views/comments/escape_test.html.erb +1 -0
  36. data/spec/dummy_app/app/views/comments/index.html.erb +19 -0
  37. data/spec/dummy_app/app/views/comments/new.html.erb +7 -0
  38. data/spec/dummy_app/app/views/comments/show.html.erb +15 -0
  39. data/spec/dummy_app/app/views/layouts/application.html.erb +14 -0
  40. data/spec/dummy_app/bin/bundle +3 -0
  41. data/spec/dummy_app/bin/rails +4 -0
  42. data/spec/dummy_app/bin/rake +4 -0
  43. data/spec/dummy_app/bin/setup +34 -0
  44. data/spec/dummy_app/bin/update +29 -0
  45. data/spec/dummy_app/config.ru +4 -0
  46. data/spec/dummy_app/config/application.rb +18 -0
  47. data/spec/dummy_app/config/boot.rb +3 -0
  48. data/spec/dummy_app/config/database.yml +7 -0
  49. data/spec/dummy_app/config/environment.rb +5 -0
  50. data/spec/dummy_app/config/environments/development.rb +54 -0
  51. data/spec/dummy_app/config/environments/test.rb +53 -0
  52. data/spec/dummy_app/config/initializers/secret_token.rb +3 -0
  53. data/spec/dummy_app/config/routes.rb +6 -0
  54. data/spec/dummy_app/config/secrets.yml +5 -0
  55. data/spec/dummy_app/db/migrate/20110209210252_create_comments.rb +14 -0
  56. data/spec/dummy_app/db/migrate/20110209210315_add_attachment_to_comment.rb +15 -0
  57. data/spec/dummy_app/db/migrate/20110714205346_add_other_attachment_to_comment.rb +8 -0
  58. data/spec/dummy_app/db/schema.rb +31 -0
  59. data/spec/dummy_app/db/seeds.rb +7 -0
  60. data/spec/features/comments_spec.rb +414 -0
  61. data/spec/fixtures/hi.txt +1 -0
  62. data/spec/fixtures/qr.jpg +0 -0
  63. data/spec/spec_helper.rb +40 -0
  64. data/spec/support/arel_helper.rb +15 -0
  65. data/spec/support/connection_helper.rb +12 -0
  66. data/spec/support/integration_helper.rb +28 -0
  67. data/vendor/assets/javascripts/jquery.iframe-transport.js +3 -1
  68. metadata +130 -3
@@ -0,0 +1,4 @@
1
+ # This file is used by Rack-based servers to start the application.
2
+
3
+ require ::File.expand_path('../config/environment', __FILE__)
4
+ run DummyApp::Application
@@ -0,0 +1,18 @@
1
+ require File.expand_path('../boot', __FILE__)
2
+
3
+ require 'rails/all'
4
+
5
+ # Require the gems listed in Gemfile, including any gems
6
+ # you've limited to :test, :development, or :production.
7
+ Bundler.require(*Rails.groups)
8
+
9
+ module DummyApp
10
+ class Application < Rails::Application
11
+ # Settings in config/environments/* take precedence over those specified here.
12
+ # Application configuration should go into files in config/initializers
13
+ config.assets.paths << Rails.root.join("..", "..", "vendor", "assets", "javascripts")
14
+ config.active_record.raise_in_transactional_callbacks = true if Rails::VERSION::MAJOR == 4 && Rails::VERSION::MINOR == 2
15
+ config.active_record.time_zone_aware_types = [:datetime, :time] if Rails::VERSION::MAJOR >= 5
16
+ config.active_record.sqlite3.represent_boolean_as_integer = true if config.active_record.sqlite3.respond_to?(:represent_boolean_as_integer=) && Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR == 2
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../gemfiles/rails_5.2.gemfile', __FILE__)
2
+
3
+ require 'bundler/setup' # Set up gems listed in the Gemfile.
@@ -0,0 +1,7 @@
1
+ development:
2
+ adapter: sqlite3
3
+ database: db/development.sqlite3
4
+
5
+ test:
6
+ adapter: sqlite3
7
+ database: ":memory:"
@@ -0,0 +1,5 @@
1
+ # Load the Rails application.
2
+ require File.expand_path('../application', __FILE__)
3
+
4
+ # Initialize the Rails application.
5
+ DummyApp::Application.initialize!
@@ -0,0 +1,54 @@
1
+ DummyApp::Application.configure do
2
+ # Settings specified here will take precedence over those in config/application.rb.
3
+
4
+ # In the development environment your application's code is reloaded on
5
+ # every request. This slows down response time but is perfect for development
6
+ # since you don't have to restart the web server when you make code changes.
7
+ config.cache_classes = false
8
+
9
+ # Do not eager load code on boot.
10
+ config.eager_load = false
11
+
12
+ # Show full error reports.
13
+ config.consider_all_requests_local = true
14
+
15
+ # Enable/disable caching. By default caching is disabled.
16
+ if Rails.root.join('tmp/caching-dev.txt').exist?
17
+ config.action_controller.perform_caching = true
18
+ config.cache_store = :memory_store
19
+ config.public_file_server.headers = {'Cache-Control' => 'public, max-age=172800'}
20
+ else
21
+ config.action_controller.perform_caching = false
22
+ config.cache_store = :null_store
23
+ end
24
+
25
+ # Don't care if the mailer can't send.
26
+ config.action_mailer.raise_delivery_errors = false
27
+
28
+ # Print deprecation notices to the Rails logger.
29
+ config.active_support.deprecation = :log
30
+
31
+ # Raise an error on page load if there are pending migrations.
32
+ config.active_record.migration_error = :page_load
33
+
34
+ # Debug mode disables concatenation and preprocessing of assets.
35
+ # This option may cause significant delays in view rendering with a large
36
+ # number of complex assets.
37
+ config.assets.debug = true
38
+
39
+ # Asset digests allow you to set far-future HTTP expiration dates on all assets,
40
+ # yet still be able to expire them through the digest params.
41
+ config.assets.digest = true
42
+
43
+ # Adds additional error checking when serving assets at runtime.
44
+ # Checks for improperly declared sprockets dependencies.
45
+ # Raises helpful error messages.
46
+ config.assets.raise_runtime_errors = true
47
+
48
+ # Raises error for missing translations
49
+ # config.action_view.raise_on_missing_translations = true
50
+
51
+ # Use an evented file watcher to asynchronously detect changes in source code,
52
+ # routes, locales, etc. This feature depends on the listen gem.
53
+ # config.file_watcher = ActiveSupport::EventedFileUpdateChecker
54
+ end
@@ -0,0 +1,53 @@
1
+ DummyApp::Application.configure do
2
+ # Settings specified here will take precedence over those in config/application.rb.
3
+
4
+ # The test environment is used exclusively to run your application's
5
+ # test suite. You never need to work with it otherwise. Remember that
6
+ # your test database is "scratch space" for the test suite and is wiped
7
+ # and recreated between test runs. Don't rely on the data there!
8
+ config.cache_classes = true
9
+
10
+ # Do not eager load code on boot. This avoids loading your whole application
11
+ # just for the purpose of running a single test. If you are using a tool that
12
+ # preloads Rails for running tests, you may have to set it to true.
13
+ config.eager_load = false
14
+
15
+ # Configure public file server for tests with Cache-Control for performance.
16
+ if config.respond_to?(:public_file_server)
17
+ config.public_file_server.enabled = true
18
+ config.public_file_server.headers = {'Cache-Control' => 'public, max-age=3600'}
19
+ else
20
+ if Rails::VERSION::MAJOR < 4
21
+ config.assets.enabled = true
22
+ config.assets.debug = true
23
+ config.serve_static_assets = true
24
+ else
25
+ config.serve_static_files = true
26
+ end
27
+ config.static_cache_control = 'public, max-age=3600'
28
+ end
29
+
30
+ # Show full error reports and disable caching.
31
+ config.consider_all_requests_local = true
32
+ config.action_controller.perform_caching = false
33
+
34
+ # Raise exceptions instead of rendering exception templates.
35
+ config.action_dispatch.show_exceptions = false
36
+
37
+ # Disable request forgery protection in test environment.
38
+ config.action_controller.allow_forgery_protection = false
39
+
40
+ # Tell Action Mailer not to deliver emails to the real world.
41
+ # The :test delivery method accumulates sent emails in the
42
+ # ActionMailer::Base.deliveries array.
43
+ config.action_mailer.delivery_method = :test
44
+
45
+ # Randomize the order test cases are executed.
46
+ config.active_support.test_order = :random
47
+
48
+ # Print deprecation notices to the stderr.
49
+ config.active_support.deprecation = :stderr
50
+
51
+ # Raises error for missing translations
52
+ # config.action_view.raise_on_missing_translations = true
53
+ end
@@ -0,0 +1,3 @@
1
+ if Rails::VERSION::MAJOR < 4
2
+ DummyApp::Application.config.secret_token = 'f2338e8b8018053b0b322cd6469d8c0ed06ab0aaf43dd30a1c33a4c55d9c0d6a1c1ad4140049019f85388db3ce1ddbeff597cf07c49c5b22242cecd146f2bd66'
3
+ end
@@ -0,0 +1,6 @@
1
+ DummyApp::Application.routes.draw do
2
+ match 'comments' => 'comments#create', :via => [:put]
3
+ match 'say' => 'comments#say', :via => [:get]
4
+ resources :comments
5
+ root :to => "comments#index"
6
+ end
@@ -0,0 +1,5 @@
1
+ development:
2
+ secret_key_base: d059ae03480564f4e9dcb7c96b901e5803037b0e09fd53e96343dff0d18dc54390a2f07b99c231eacb1d0cc6b74b90676fec4786afaf0f2e7f69b971ab2f9600
3
+
4
+ test:
5
+ secret_key_base: e5e0e4811c8cfc047799cf3e82d1626adbf02fa7a3530b4bdd39cc17e1098d328f4da6ada090ec01449b5c92662bcec92cfb13b4c3c4c4bb3fac5a303e91c356
@@ -0,0 +1,14 @@
1
+ class CreateComments < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :comments do |t|
4
+ t.string :subject
5
+ t.text :body
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+
11
+ def self.down
12
+ drop_table :comments
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ class AddAttachmentToComment < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :comments, :attachment_file_name, :string
4
+ add_column :comments, :attachment_content_type, :string
5
+ add_column :comments, :attachment_file_size, :integer
6
+ add_column :comments, :attachment_updated_at, :datetime
7
+ end
8
+
9
+ def self.down
10
+ remove_column :comments, :attachment_file_name
11
+ remove_column :comments, :attachment_content_type
12
+ remove_column :comments, :attachment_file_size
13
+ remove_column :comments, :attachment_updated_at
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ class AddOtherAttachmentToComment < ActiveRecord::Migration
2
+ def change
3
+ add_column :comments, :other_attachment_file_name, :string
4
+ add_column :comments, :other_attachment_content_type, :string
5
+ add_column :comments, :other_attachment_file_size, :integer
6
+ add_column :comments, :other_attachment_updated_at, :datetime
7
+ end
8
+ end
@@ -0,0 +1,31 @@
1
+ # encoding: UTF-8
2
+ # This file is auto-generated from the current state of the database. Instead
3
+ # of editing this file, please use the migrations feature of Active Record to
4
+ # incrementally modify your database, and then regenerate this schema definition.
5
+ #
6
+ # Note that this schema.rb definition is the authoritative source for your
7
+ # database schema. If you need to create the application database on another
8
+ # system, you should be using db:schema:load, not running all the migrations
9
+ # from scratch. The latter is a flawed and unsustainable approach (the more migrations
10
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
11
+ #
12
+ # It's strongly recommended to check this file into your version control system.
13
+
14
+ ActiveRecord::Schema.define(:version => 20110714205346) do
15
+
16
+ create_table "comments", :force => true do |t|
17
+ t.string "subject"
18
+ t.text "body"
19
+ t.datetime "created_at"
20
+ t.datetime "updated_at"
21
+ t.string "attachment_file_name"
22
+ t.string "attachment_content_type"
23
+ t.integer "attachment_file_size"
24
+ t.datetime "attachment_updated_at"
25
+ t.string "other_attachment_file_name"
26
+ t.string "other_attachment_content_type"
27
+ t.integer "other_attachment_file_size"
28
+ t.datetime "other_attachment_updated_at"
29
+ end
30
+
31
+ end
@@ -0,0 +1,7 @@
1
+ # This file should contain all the record creation needed to seed the database with its default values.
2
+ # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
3
+ #
4
+ # Examples:
5
+ #
6
+ # cities = City.create([{ :name => 'Chicago' }, { :name => 'Copenhagen' }])
7
+ # Mayor.create(:name => 'Daley', :city => cities.first)
@@ -0,0 +1,414 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'comments', type: :feature do
4
+ it 'creates a new comment', js: true do
5
+ visit root_path
6
+ click_link 'New Comment'
7
+
8
+ # New Comment link should disappear
9
+ expect(page).to have_no_link('New Comment')
10
+ # Comment form should appear
11
+ expect(page).to have_field('comment_subject')
12
+ expect(page).to have_field('comment_body')
13
+ expect(page).to have_no_field('comment_file')
14
+
15
+ # Filling in form and submitting
16
+ comment_subject = 'A new comment!'
17
+ comment_body = 'Woo, this is my comment, dude.'
18
+ fill_in 'comment_subject', with: comment_subject
19
+ fill_in 'comment_body', with: comment_body
20
+ click_button 'Create Comment'
21
+
22
+ # Comment should appear in the comments table
23
+ within '#comments' do
24
+ expect(page).to have_content(comment_subject)
25
+ expect(page).to have_content(comment_body)
26
+ end
27
+ # Form should clear
28
+ expect(page).to have_field('comment_subject', with: '')
29
+ expect(page).to have_field('comment_body', with: '')
30
+ # ...and be replaced by link again
31
+ expect(page).to have_link('Cancel')
32
+ end
33
+
34
+ it "cancels creating a comment", js: true do
35
+ visit root_path
36
+ click_link 'New Comment'
37
+
38
+ expect(page).to have_field('comment_subject')
39
+ expect(page).to have_link('Cancel')
40
+ click_link 'Cancel'
41
+
42
+ # Form should disappear
43
+ expect(page).to have_no_field('comment_subject')
44
+ expect(page).to have_link('New Comment')
45
+ end
46
+
47
+ it "deletes a comment", js: true do
48
+ Comment.create(subject: 'The Great Yogurt', body: 'The Schwarz is strong with this one.')
49
+ visit root_path
50
+
51
+ within '#comments' do
52
+ expect(page).to have_content('The Great Yogurt')
53
+ accept_js_confirm do
54
+ click_link 'Destroy'
55
+ end
56
+
57
+ expect(page).to have_no_content('The Great Yogurt')
58
+ end
59
+ end
60
+
61
+ it "uploads a file", js: true do
62
+ visit root_path
63
+ click_link 'New Comment with Attachment'
64
+
65
+ expect(page).to have_field('comment_subject')
66
+ expect(page).to have_field('comment_body')
67
+ expect(page).to have_field('comment_attachment')
68
+ expect(page).to have_field('comment_other_attachment')
69
+
70
+ comment_subject = 'Newby'
71
+ comment_body = 'Woot, a file!'
72
+ fill_in 'comment_subject', with: comment_subject
73
+ fill_in 'comment_body', with: comment_body
74
+
75
+ # Attach file
76
+ file_path = File.join(fixture_path, 'qr.jpg')
77
+ other_file_path = File.join(fixture_path, 'hi.txt')
78
+ attach_file 'comment_attachment', file_path
79
+ attach_file 'comment_other_attachment', other_file_path
80
+
81
+ page_should_not_redirect do
82
+ click_button 'Create Comment'
83
+ end
84
+
85
+ within '#comments' do
86
+ expect(page).to have_selector("td", text: comment_subject)
87
+ expect(page).to have_selector("td", text: comment_body)
88
+ expect(page).to have_selector("a", text: File.basename(file_path))
89
+ expect(page).to have_selector("a", text: File.basename(other_file_path))
90
+ end
91
+ end
92
+
93
+ it "Disables submit button while submitting", js: true do
94
+ visit root_path
95
+
96
+ click_link 'New Comment'
97
+ # Needed to make test wait for above to finish
98
+ form = find('form')
99
+
100
+ button = find_button('Create Comment')
101
+ page.execute_script(%q{$('form').append('<input name="pause" type="hidden" value=1 />');})
102
+
103
+ fill_in 'comment_subject', with: 'Hi'
104
+ fill_in 'comment_body', with: 'there'
105
+ click_button 'Create Comment'
106
+
107
+ expect(button[:disabled]).to be true
108
+ expect(button.value).to eq "Submitting..."
109
+
110
+ sleep 1.5
111
+
112
+ expect(button[:disabled]).to be false
113
+ expect(button.value).to eq "Create Comment"
114
+ end
115
+
116
+ it "triggers ajax:remotipartSubmit event hook", js: true do
117
+ visit root_path
118
+ page.execute_script("$(document).delegate('form', 'ajax:remotipartSubmit', function() { $('#comments').after('remotipart!'); });")
119
+
120
+ click_link 'New Comment with Attachment'
121
+
122
+ fill_in 'comment_subject', with: 'Hi'
123
+ fill_in 'comment_body', with: 'there'
124
+ attach_file 'comment_attachment', File.join(fixture_path, 'qr.jpg')
125
+ click_button 'Create Comment'
126
+
127
+ expect(page).to have_content('remotipart!')
128
+ end
129
+
130
+ it "allows remotipart submission to be cancelable via event hook", js: true do
131
+ visit root_path
132
+ page.execute_script("$(document).delegate('form', 'ajax:remotipartSubmit', function() { $('#comments').after('remotipart!'); return false; });")
133
+
134
+ click_link 'New Comment with Attachment'
135
+
136
+ file_path = File.join(fixture_path, 'qr.jpg')
137
+ fill_in 'comment_subject', with: 'Hi'
138
+ fill_in 'comment_body', with: 'there'
139
+ attach_file 'comment_attachment', file_path
140
+ click_button 'Create Comment'
141
+
142
+ expect(page).to have_content('remotipart!')
143
+
144
+ within '#comments' do
145
+ expect(page).to have_no_content('Hi')
146
+ expect(page).to have_no_content('there')
147
+ expect(page).to have_no_content(File.basename(file_path))
148
+ end
149
+ end
150
+
151
+ it "allows custom data-type on form", js: true do
152
+ visit root_path
153
+ page.execute_script("$(document).delegate('form', 'ajax:success', function(evt, data, status, xhr) { $('#comments').after(xhr.responseText); });")
154
+
155
+ click_link 'New Comment with Attachment'
156
+
157
+ # Needed to make test wait for above to finish
158
+ form = find('form')
159
+ page.execute_script("$('form').attr('data-type', 'html');")
160
+
161
+ file_path = File.join(fixture_path, 'qr.jpg')
162
+ fill_in 'comment_subject', with: 'Hi'
163
+ fill_in 'comment_body', with: 'there'
164
+ attach_file 'comment_attachment', file_path
165
+ click_button 'Create Comment'
166
+
167
+ expect(page).to have_content('HTML response')
168
+ end
169
+
170
+ it "allows users to use ajax response data safely", js: true do
171
+ visit root_path
172
+ page.execute_script("$(document).delegate('form', 'ajax:success', function(evt, data, status, xhr) { $('#comments').after(data); });")
173
+
174
+ click_link 'New Comment with Attachment'
175
+
176
+ # Needed to make test wait for above to finish
177
+ form = find('form')
178
+ page.execute_script("$('form').attr('data-type', 'html');")
179
+
180
+ file_path = File.join(fixture_path, 'qr.jpg')
181
+ fill_in 'comment_subject', with: 'Hi'
182
+ fill_in 'comment_body', with: 'there'
183
+ attach_file 'comment_attachment', file_path
184
+ click_button 'Create Comment'
185
+
186
+ expect(page).to have_content('HTML response')
187
+ end
188
+
189
+ it "escapes html response content properly", js: true do
190
+ visit root_path
191
+ page.execute_script("$(document).delegate('form', 'ajax:success', function(evt, data, status, xhr) { $('#comments').after(xhr.responseText); });")
192
+
193
+ click_link 'New Comment with Attachment'
194
+
195
+ # Needed to make test wait for above to finish
196
+ form = find('form')
197
+ page.execute_script("$('form').attr('data-type', 'html');")
198
+ page.execute_script("$('form').append('<input type=\"hidden\" name=\"template\" value=\"escape\" />');")
199
+
200
+ file_path = File.join(fixture_path, 'qr.jpg')
201
+ fill_in 'comment_subject', with: 'Hi'
202
+ fill_in 'comment_body', with: 'there'
203
+ attach_file 'comment_attachment', file_path
204
+ click_button 'Create Comment'
205
+
206
+ expect(find('input[name="quote"]').value).to eq '"'
207
+ end
208
+
209
+ it "returns the correct response status", js: true do
210
+ visit root_path
211
+
212
+ click_link 'New Comment with Attachment'
213
+ # Needed to make test wait for above to finish
214
+ input = find('#comment_subject')
215
+ page.execute_script("$('#comment_subject').removeAttr('required');")
216
+
217
+ file_path = File.join(fixture_path, 'qr.jpg')
218
+ fill_in 'comment_body', with: 'there'
219
+ attach_file 'comment_attachment', file_path
220
+ click_button 'Create Comment'
221
+
222
+ #within '#error_explanation' do
223
+ # expect(page).to have_content "Subject can't be blank"
224
+ #end
225
+ expect(page).to have_content "Error status code: 422"
226
+ expect(page).to have_content "Error status message: Unprocessable Entity"
227
+ end
228
+
229
+ it "passes the method as _method parameter (rails convention)", js: true do
230
+ visit root_path
231
+
232
+ click_link 'New Comment with Attachment'
233
+ sleep 0.5
234
+ page.execute_script(%q{$('form').append('<input name="_method" type="hidden" value="put" />');})
235
+
236
+ file_path = File.join(fixture_path, 'qr.jpg')
237
+ fill_in 'comment_subject', with: 'Hi'
238
+ fill_in 'comment_body', with: 'there'
239
+ attach_file 'comment_attachment', file_path
240
+ click_button 'Create Comment'
241
+
242
+ expect(page).to have_content 'PUT request!'
243
+ end
244
+
245
+ it "does not submit via remotipart unless file is present", js: true do
246
+ visit root_path
247
+ page.execute_script("$(document).delegate('form', 'ajax:remotipartSubmit', function() { $('#comments').after('remotipart!'); });")
248
+
249
+ click_link 'New Comment with Attachment'
250
+
251
+ fill_in 'comment_subject', with: 'Hi'
252
+ fill_in 'comment_body', with: 'there'
253
+ click_button 'Create Comment'
254
+
255
+ expect(page).to have_no_content('remotipart!')
256
+ end
257
+
258
+ it "fires all the ajax callbacks on the form", js: true do
259
+ visit root_path
260
+ click_link 'New Comment with Attachment'
261
+
262
+ # Needed to make test wait for above to finish
263
+ form = find('form')
264
+
265
+ page.execute_script("$('form').bind('ajax:beforeSend', function() { $('#comments').after('thebefore'); });")
266
+ page.execute_script("$(document).delegate('form', 'ajax:success', function() { $('#comments').after('success'); });")
267
+ page.execute_script("$(document).delegate('form', 'ajax:complete', function() { $('#comments').after('complete'); });")
268
+
269
+ file_path = File.join(fixture_path, 'qr.jpg')
270
+ fill_in 'comment_subject', with: 'Hi'
271
+ fill_in 'comment_body', with: 'there'
272
+ attach_file 'comment_attachment', file_path
273
+ click_button 'Create Comment'
274
+
275
+ expect(page).to have_content('before')
276
+ expect(page).to have_content('success')
277
+ expect(page).to have_content('complete')
278
+ end
279
+
280
+ it "fires the ajax callbacks for json data-type with remotipart", js: true do
281
+ visit root_path
282
+ click_link 'New Comment with Attachment'
283
+
284
+ # Needed to make test wait for above to finish
285
+ form = find('form')
286
+
287
+ page.execute_script("$('form').data('type', 'json');")
288
+
289
+ page.execute_script("$('form').bind('ajax:beforeSend', function() { $('#comments').after('thebefore'); });")
290
+ page.execute_script("$(document).delegate('form', 'ajax:success', function() { $('#comments').after('success'); });")
291
+ page.execute_script("$(document).delegate('form', 'ajax:complete', function() { $('#comments').after('complete'); });")
292
+
293
+ file_path = File.join(fixture_path, 'qr.jpg')
294
+ fill_in 'comment_subject', with: 'Hi'
295
+ fill_in 'comment_body', with: 'there'
296
+ attach_file 'comment_attachment', file_path
297
+ click_button 'Create Comment'
298
+
299
+ expect(page).to have_content('before')
300
+ expect(page).to have_content('success')
301
+ expect(page).to have_content('complete')
302
+ end
303
+
304
+ it "only fires the beforeSend hook once", js: true do
305
+ visit root_path
306
+ click_link 'New Comment with Attachment'
307
+
308
+ # Needed to make test wait for above to finish
309
+ form = find('form')
310
+
311
+ page.execute_script("$('form').bind('ajax:beforeSend', function() { $('#comments').after('<div class=\"ajax\">ajax!</div>'); });")
312
+
313
+ file_path = File.join(fixture_path, 'qr.jpg')
314
+ fill_in 'comment_subject', with: 'Hi'
315
+ fill_in 'comment_body', with: 'there'
316
+ attach_file 'comment_attachment', file_path
317
+ click_button 'Create Comment'
318
+
319
+ expect(page).to have_css("div.ajax", :count => 1)
320
+ end
321
+
322
+ it "cleans up after itself when uploading files", js: true do
323
+ visit root_path
324
+ page.execute_script("$(document).delegate('form', 'ajax:remotipartSubmit', function(evt, xhr, data) { if ($(this).data('remotipartSubmitted')) { $('#comments').after('remotipart before!'); } });")
325
+
326
+ click_link 'New Comment with Attachment'
327
+ page.execute_script("$('form').attr('data-type', 'html');")
328
+
329
+ file_path = File.join(fixture_path, 'qr.jpg')
330
+ fill_in 'comment_subject', with: 'Hi'
331
+ fill_in 'comment_body', with: 'there'
332
+ attach_file 'comment_attachment', file_path
333
+ click_button 'Create Comment'
334
+
335
+ expect(page).to have_content('remotipart before!')
336
+
337
+ page.execute_script("if (!$('form').data('remotipartSubmitted')) { $('#comments').after('no remotipart after!'); } ")
338
+ expect(page).to have_content('no remotipart after!')
339
+ end
340
+
341
+ it "submits via remotipart when a file upload is present", js: true do
342
+ visit root_path
343
+ page.execute_script("$(document).delegate('form', 'ajax:remotipartSubmit', function(evt, xhr, data) { $('#comments').after('<div class=\"remotipart\">remotipart!</div>'); });")
344
+
345
+ click_link 'New Comment with Attachment'
346
+ page.execute_script("$('form').attr('data-type', 'html');")
347
+
348
+ file_path = File.join(fixture_path, 'qr.jpg')
349
+ fill_in 'comment_subject', with: 'Hi'
350
+ fill_in 'comment_body', with: 'there'
351
+ attach_file 'comment_attachment', file_path
352
+ click_button 'Create Comment'
353
+
354
+ expect(page).to have_css("div.remotipart")
355
+ end
356
+
357
+ it "does not submit via remotipart when a file upload is not present", js: true do
358
+ visit root_path
359
+ page.execute_script("$(document).delegate('form', 'ajax:remotipartSubmit', function(evt, xhr, data) { $('#comments').after('<div class=\"remotipart\">remotipart!</div>'); });")
360
+
361
+ click_link 'New Comment with Attachment'
362
+ page.execute_script("$('form').attr('data-type', 'html');")
363
+
364
+ fill_in 'comment_subject', with: 'Hi'
365
+ fill_in 'comment_body', with: 'there'
366
+ click_button 'Create Comment'
367
+
368
+ expect(page).not_to have_css("div.remotipart")
369
+ end
370
+
371
+ it "Disables submit button while submitting with remotipart", js: true do
372
+ visit root_path
373
+
374
+ click_link 'New Comment with Attachment'
375
+
376
+ button = find_button('Create Comment')
377
+ # clicking 'Create Comment' button causes capybara evaluation freeze until request ends, so perform check by JavaScript
378
+ page.execute_script("$('form').bind('ajax:remotipartComplete', function(data) { window.commitButtonDisabled = $('input[name=\"commit\"]').is(':disabled'); window.commitButtonValue = $('input[name=\"commit\"]').val(); });")
379
+
380
+ file_path = File.join(fixture_path, 'qr.jpg')
381
+ fill_in 'comment_subject', with: 'Hi'
382
+ fill_in 'comment_body', with: 'there'
383
+ attach_file 'comment_attachment', file_path
384
+ click_button 'Create Comment'
385
+
386
+ expect(page.evaluate_script("window.commitButtonDisabled")).to be true
387
+ expect(page.evaluate_script("window.commitButtonValue")).to eq "Submitting..."
388
+
389
+ expect(button[:disabled]).to be false
390
+ expect(button.value).to eq "Create Comment"
391
+ end
392
+
393
+ it "submits the clicked button with the form like non-file remote form", js: true do
394
+ visit root_path
395
+ click_link 'New Comment with Attachment'
396
+
397
+ form = find('form')
398
+ page.execute_script("$('form').bind('ajax:remotipartSubmit', function(e, xhr, settings) { $('#comments').after('<div class=\"params\">' + $.param(settings.data) + '</div>'); });")
399
+
400
+ file_path = File.join(fixture_path, 'qr.jpg')
401
+ fill_in 'comment_subject', with: 'Hi'
402
+ fill_in 'comment_body', with: 'there'
403
+ attach_file 'comment_attachment', file_path
404
+ click_button 'Create Comment'
405
+
406
+ expect(page).to have_content('commit=')
407
+ end
408
+
409
+ it "doesn't allow XSS via script injection for text responses", js: true do
410
+ visit "/say?message=%3C/textarea%3E%3Csvg/onload=alert(domain)%3E&remotipart_submitted=x"
411
+ expect(page).to have_selector("textarea")
412
+ expect(find("textarea").value).to eq('</textarea><svg/onload=alert(domain)>')
413
+ end
414
+ end