jquery-rails 3.0.4 → 4.4.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/.travis.yml +32 -0
- data/CHANGELOG.md +99 -2
- data/CONTRIBUTING.md +103 -7
- data/Gemfile +18 -0
- data/{LICENSE → MIT-LICENSE} +2 -2
- data/README.md +34 -39
- data/Rakefile +39 -1
- data/VERSIONS.md +63 -39
- data/jquery-rails.gemspec +7 -5
- data/lib/jquery/assert_select.rb +141 -89
- data/lib/jquery/rails/version.rb +5 -3
- data/lib/jquery/rails.rb +1 -3
- data/test/assert_select_jquery_test.rb +91 -0
- data/test/test_helper.rb +6 -0
- data/vendor/assets/javascripts/jquery.js +7550 -6331
- data/vendor/assets/javascripts/jquery.min.js +5 -6
- data/vendor/assets/javascripts/jquery.min.map +1 -1
- data/vendor/assets/javascripts/jquery2.js +9814 -0
- data/vendor/assets/javascripts/jquery2.min.js +4 -0
- data/vendor/assets/javascripts/jquery2.min.map +1 -0
- data/vendor/assets/javascripts/jquery3.js +10872 -0
- data/vendor/assets/javascripts/jquery3.min.js +2 -0
- data/vendor/assets/javascripts/jquery3.min.map +1 -0
- data/vendor/assets/javascripts/jquery_ujs.js +256 -95
- metadata +62 -34
- data/lib/generators/jquery/install/install_generator.rb +0 -50
- data/lib/jquery/rails/railtie.rb +0 -18
data/lib/jquery/assert_select.rb
CHANGED
@@ -1,99 +1,151 @@
|
|
1
|
-
|
2
|
-
module Assertions
|
3
|
-
module SelectorAssertions
|
4
|
-
# Selects content from a JQuery response. Patterned loosely on
|
5
|
-
# assert_select_rjs.
|
6
|
-
#
|
7
|
-
# === Narrowing down
|
8
|
-
#
|
9
|
-
# With no arguments, asserts that one or more method calls are made.
|
10
|
-
#
|
11
|
-
# Use the +method+ argument to narrow down the assertion to only
|
12
|
-
# statements that call that specific method.
|
13
|
-
#
|
14
|
-
# Use the +opt+ argument to narrow down the assertion to only statements
|
15
|
-
# that pass +opt+ as the first argument.
|
16
|
-
#
|
17
|
-
# Use the +id+ argument to narrow down the assertion to only statements
|
18
|
-
# that invoke methods on the result of using that identifier as a
|
19
|
-
# selector.
|
20
|
-
#
|
21
|
-
# === Using blocks
|
22
|
-
#
|
23
|
-
# Without a block, +assert_select_jquery_ merely asserts that the
|
24
|
-
# response contains one or more statements that match the conditions
|
25
|
-
# specified above
|
26
|
-
#
|
27
|
-
# With a block +assert_select_jquery_ also asserts that the method call
|
28
|
-
# passes a javascript escaped string containing HTML. All such HTML
|
29
|
-
# fragments are selected and passed to the block. Nested assertions are
|
30
|
-
# supported.
|
31
|
-
#
|
32
|
-
# === Examples
|
33
|
-
#
|
34
|
-
# # asserts that the #notice element is hidden
|
35
|
-
# assert_select :hide, '#notice'
|
36
|
-
#
|
37
|
-
# # asserts that the #cart element is shown with a blind parameter
|
38
|
-
# assert_select :show, :blind, '#cart'
|
39
|
-
#
|
40
|
-
# # asserts that #cart content contains a #current_item
|
41
|
-
# assert_select :html, '#cart' do
|
42
|
-
# assert_select '#current_item'
|
43
|
-
# end
|
44
|
-
|
45
|
-
PATTERN_HTML = "\"((\\\\\"|[^\"])*)\""
|
46
|
-
PATTERN_UNICODE_ESCAPED_CHAR = /\\u([0-9a-zA-Z]{4})/
|
47
|
-
|
48
|
-
def assert_select_jquery(*args, &block)
|
49
|
-
jquery_method = args.first.is_a?(Symbol) ? args.shift : nil
|
50
|
-
jquery_opt = args.first.is_a?(Symbol) ? args.shift : nil
|
51
|
-
id = args.first.is_a?(String) ? args.shift : nil
|
52
|
-
|
53
|
-
pattern = "\\.#{jquery_method || '\\w+'}\\("
|
54
|
-
pattern = "#{pattern}['\"]#{jquery_opt}['\"],?\\s*" if jquery_opt
|
55
|
-
pattern = "#{pattern}#{PATTERN_HTML}"
|
56
|
-
pattern = "(?:jQuery|\\$)\\(['\"]#{id}['\"]\\)#{pattern}" if id
|
57
|
-
|
58
|
-
fragments = []
|
59
|
-
response.body.scan(Regexp.new(pattern)).each do |match|
|
60
|
-
doc = HTML::Document.new(unescape_js(match.first))
|
61
|
-
doc.root.children.each do |child|
|
62
|
-
fragments.push child if child.tag?
|
63
|
-
end
|
64
|
-
end
|
1
|
+
require 'rails/dom/testing/assertions/selector_assertions'
|
65
2
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
3
|
+
module Rails::Dom::Testing::Assertions::SelectorAssertions
|
4
|
+
# Selects content from a JQuery response. Patterned loosely on
|
5
|
+
# assert_select_rjs.
|
6
|
+
#
|
7
|
+
# === Narrowing down
|
8
|
+
#
|
9
|
+
# With no arguments, asserts that one or more method calls are made.
|
10
|
+
#
|
11
|
+
# Use the +method+ argument to narrow down the assertion to only
|
12
|
+
# statements that call that specific method.
|
13
|
+
#
|
14
|
+
# Use the +opt+ argument to narrow down the assertion to only statements
|
15
|
+
# that pass +opt+ as the first argument.
|
16
|
+
#
|
17
|
+
# Use the +id+ argument to narrow down the assertion to only statements
|
18
|
+
# that invoke methods on the result of using that identifier as a
|
19
|
+
# selector.
|
20
|
+
#
|
21
|
+
# === Using blocks
|
22
|
+
#
|
23
|
+
# Without a block, +assert_select_jquery_ merely asserts that the
|
24
|
+
# response contains one or more statements that match the conditions
|
25
|
+
# specified above
|
26
|
+
#
|
27
|
+
# With a block +assert_select_jquery_ also asserts that the method call
|
28
|
+
# passes a javascript escaped string containing HTML. All such HTML
|
29
|
+
# fragments are selected and passed to the block. Nested assertions are
|
30
|
+
# supported.
|
31
|
+
#
|
32
|
+
# === Examples
|
33
|
+
#
|
34
|
+
# # asserts that the #notice element is hidden
|
35
|
+
# assert_select :hide, '#notice'
|
36
|
+
#
|
37
|
+
# # asserts that the #cart element is shown with a blind parameter
|
38
|
+
# assert_select :show, :blind, '#cart'
|
39
|
+
#
|
40
|
+
# # asserts that #cart content contains a #current_item
|
41
|
+
# assert_select :html, '#cart' do
|
42
|
+
# assert_select '#current_item'
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
# # asserts that #product append to a #product_list
|
46
|
+
# assert_select_jquery :appendTo, '#product_list' do
|
47
|
+
# assert_select '.product'
|
48
|
+
# end
|
49
|
+
|
50
|
+
PATTERN_HTML = "['\"]((\\\\\"|\\\\'|[^\"'])*)['\"]"
|
51
|
+
PATTERN_UNICODE_ESCAPED_CHAR = /\\u([0-9a-zA-Z]{4})/
|
52
|
+
SKELETAL_PATTERN = "(?:jQuery|\\$)\\(%s\\)\\.%s\\(%s\\)[;]?"
|
53
|
+
|
54
|
+
def assert_select_jquery(*args, &block)
|
55
|
+
jquery_method = args.first.is_a?(Symbol) ? args.shift : nil
|
56
|
+
jquery_opt = args.first.is_a?(Symbol) ? args.shift : nil
|
57
|
+
id = args.first.is_a?(String) ? escape_id(args.shift) : nil
|
58
|
+
|
59
|
+
target_pattern = "['\"]#{id || '.*'}['\"]"
|
60
|
+
method_pattern = "#{jquery_method || '\\w+'}"
|
61
|
+
argument_pattern = jquery_opt ? "['\"]#{jquery_opt}['\"].*" : PATTERN_HTML
|
62
|
+
|
63
|
+
# $("#id").show('blind', 1000);
|
64
|
+
# $("#id").html("<div>something</div>");
|
65
|
+
# $("#id").replaceWith("<div>something</div>");
|
66
|
+
target_as_receiver_pattern = SKELETAL_PATTERN % [target_pattern, method_pattern, argument_pattern]
|
67
|
+
|
68
|
+
# $("<div>something</div>").appendTo("#id");
|
69
|
+
# $("<div>something</div>").prependTo("#id");
|
70
|
+
target_as_argument_pattern = SKELETAL_PATTERN % [argument_pattern, method_pattern, target_pattern]
|
71
|
+
|
72
|
+
# $("#id").remove();
|
73
|
+
# $("#id").hide();
|
74
|
+
argumentless_pattern = SKELETAL_PATTERN % [target_pattern, method_pattern, '']
|
75
|
+
|
76
|
+
patterns = [target_as_receiver_pattern, target_as_argument_pattern]
|
77
|
+
patterns << argumentless_pattern unless jquery_opt
|
78
|
+
|
79
|
+
matched_pattern = nil
|
80
|
+
patterns.each do |pattern|
|
81
|
+
if response.body.match(Regexp.new(pattern))
|
82
|
+
matched_pattern = pattern
|
83
|
+
break
|
84
|
+
end
|
85
|
+
end
|
70
86
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
87
|
+
unless matched_pattern
|
88
|
+
opts = [jquery_method, jquery_opt, id].compact
|
89
|
+
flunk "No JQuery call matches #{opts.inspect}"
|
90
|
+
end
|
91
|
+
|
92
|
+
if block_given?
|
93
|
+
@selected ||= nil
|
94
|
+
fragments = Nokogiri::HTML::Document.new.fragment
|
95
|
+
|
96
|
+
if matched_pattern
|
97
|
+
response.body.scan(Regexp.new(matched_pattern)).each do |match|
|
98
|
+
flunk 'This function can\'t have HTML argument' if match.is_a?(String)
|
99
|
+
|
100
|
+
doc = Nokogiri::HTML::DocumentFragment.parse(unescape_js(match.first))
|
101
|
+
doc.children.each do |child|
|
102
|
+
fragments << child if child.element?
|
77
103
|
end
|
78
104
|
end
|
79
105
|
end
|
80
106
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
unescaped= js_string.gsub('\"', '"')
|
87
|
-
unescaped.gsub!('\\\'', "'")
|
88
|
-
unescaped.gsub!(/\\\//, '/')
|
89
|
-
unescaped.gsub!('\n', "\n")
|
90
|
-
unescaped.gsub!('\076', '>')
|
91
|
-
unescaped.gsub!('\074', '<')
|
92
|
-
# js encodes non-ascii characters.
|
93
|
-
unescaped.gsub!(PATTERN_UNICODE_ESCAPED_CHAR) {|u| [$1.hex].pack('U*')}
|
94
|
-
unescaped
|
107
|
+
begin
|
108
|
+
in_scope, @selected = @selected, fragments
|
109
|
+
yield
|
110
|
+
ensure
|
111
|
+
@selected = in_scope
|
95
112
|
end
|
96
|
-
|
97
113
|
end
|
98
114
|
end
|
115
|
+
|
116
|
+
private
|
117
|
+
|
118
|
+
# Unescapes a JS string.
|
119
|
+
def unescape_js(js_string)
|
120
|
+
# js encodes double quotes and line breaks.
|
121
|
+
unescaped= js_string.gsub('\"', '"')
|
122
|
+
unescaped.gsub!('\\\'', "'")
|
123
|
+
unescaped.gsub!(/\\\//, '/')
|
124
|
+
unescaped.gsub!('\n', "\n")
|
125
|
+
unescaped.gsub!('\076', '>')
|
126
|
+
unescaped.gsub!('\074', '<')
|
127
|
+
unescaped.gsub!(/\\\$/, '$')
|
128
|
+
unescaped.gsub!(/\\`/, '`')
|
129
|
+
# js encodes non-ascii characters.
|
130
|
+
unescaped.gsub!(PATTERN_UNICODE_ESCAPED_CHAR) {|u| [$1.hex].pack('U*')}
|
131
|
+
unescaped
|
132
|
+
end
|
133
|
+
|
134
|
+
def escape_id(selector)
|
135
|
+
return unless selector
|
136
|
+
|
137
|
+
id = selector.gsub('[', '\[')
|
138
|
+
id.gsub!(']', '\]')
|
139
|
+
id.gsub!('*', '\*')
|
140
|
+
id.gsub!('(', '\(')
|
141
|
+
id.gsub!(')', '\)')
|
142
|
+
id.gsub!('.', '\.')
|
143
|
+
id.gsub!('|', '\|')
|
144
|
+
id.gsub!('^', '\^')
|
145
|
+
id.gsub!('$', '\$')
|
146
|
+
id.gsub!('+', "\\\\+")
|
147
|
+
id.gsub!(',', '\,')
|
148
|
+
|
149
|
+
id
|
150
|
+
end
|
99
151
|
end
|
data/lib/jquery/rails/version.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
module Jquery
|
2
2
|
module Rails
|
3
|
-
VERSION = "
|
4
|
-
JQUERY_VERSION = "1.
|
5
|
-
|
3
|
+
VERSION = "4.4.0"
|
4
|
+
JQUERY_VERSION = "1.12.4"
|
5
|
+
JQUERY_2_VERSION = "2.2.4"
|
6
|
+
JQUERY_3_VERSION = "3.5.1"
|
7
|
+
JQUERY_UJS_VERSION = "1.2.2"
|
6
8
|
end
|
7
9
|
end
|
data/lib/jquery/rails.rb
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
require 'jquery/assert_select' if ::Rails.env.test?
|
2
|
-
require 'jquery/rails/engine'
|
3
|
-
require 'jquery/rails/railtie'
|
2
|
+
require 'jquery/rails/engine'
|
4
3
|
require 'jquery/rails/version'
|
5
4
|
|
6
5
|
module Jquery
|
7
6
|
module Rails
|
8
|
-
PROTOTYPE_JS = %w{prototype effects dragdrop controls}
|
9
7
|
end
|
10
8
|
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
require_relative 'test_helper'
|
3
|
+
require_relative '../lib/jquery/assert_select'
|
4
|
+
|
5
|
+
class AssertSelectJQueryTest < ActiveSupport::TestCase
|
6
|
+
include Rails::Dom::Testing::Assertions::SelectorAssertions
|
7
|
+
attr_reader :response
|
8
|
+
|
9
|
+
JAVASCRIPT_TEST_OUTPUT = <<-JS
|
10
|
+
$("#card").show("blind", 1000);
|
11
|
+
$("#id").html('<div><p>something</p></div>');
|
12
|
+
$('#card').html('<div><p>something else</p></div>');
|
13
|
+
jQuery("#id").replaceWith("<div><p>something</p></div>");
|
14
|
+
$("<div><p>something</p></div>").appendTo("#id");
|
15
|
+
$("<div><p>something else</p></div>").appendTo("#id");
|
16
|
+
jQuery("<div><p>something</p></div>").prependTo("#id");
|
17
|
+
$('#id').remove();
|
18
|
+
jQuery("#id").hide();
|
19
|
+
$("[data-placeholder~=name]").remove();
|
20
|
+
$("#cart tr:not(.total_line) > *").remove();
|
21
|
+
$("[href|=\"val\"][href$=\"val\"][href^=\"val\"]").remove();
|
22
|
+
$("tr + td, li").remove();
|
23
|
+
|
24
|
+
// without semicolon
|
25
|
+
$("#browser_cart").hide("blind", 1000)
|
26
|
+
|
27
|
+
$('#item').html('<div><span>\\`Total\\`: \\$12.34</span></div>');
|
28
|
+
JS
|
29
|
+
|
30
|
+
setup do
|
31
|
+
@response = OpenStruct.new(content_type: 'text/javascript', body: JAVASCRIPT_TEST_OUTPUT)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_target_as_receiver
|
35
|
+
assert_nothing_raised do
|
36
|
+
assert_select_jquery :show, :blind, '#card'
|
37
|
+
assert_select_jquery :hide, :blind, '#browser_cart'
|
38
|
+
assert_select_jquery :html, '#id' do
|
39
|
+
assert_select 'p', 'something'
|
40
|
+
end
|
41
|
+
assert_select_jquery :replaceWith, '#id' do
|
42
|
+
assert_select 'p', 'something'
|
43
|
+
end
|
44
|
+
assert_select_jquery :remove, "[data-placeholder~=name]"
|
45
|
+
assert_select_jquery :remove, "#cart tr:not(.total_line) > *"
|
46
|
+
assert_select_jquery :remove, "[href|=\"val\"][href$=\"val\"][href^=\"val\"]"
|
47
|
+
assert_select_jquery :remove, "tr + td, li"
|
48
|
+
|
49
|
+
assert_select_jquery :html, '#item' do
|
50
|
+
assert_select 'span', '`Total`: $12.34'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
assert_raise Minitest::Assertion, "No JQuery call matches [:show, :some_wrong]" do
|
55
|
+
assert_select_jquery :show, :some_wrong
|
56
|
+
end
|
57
|
+
|
58
|
+
assert_raise Minitest::Assertion, "<something else> was expected but was <something>" do
|
59
|
+
assert_select_jquery :html, '#id' do
|
60
|
+
assert_select 'p', 'something else'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_target_as_argument
|
66
|
+
assert_nothing_raised do
|
67
|
+
assert_select_jquery :appendTo, '#id' do
|
68
|
+
assert_select 'p', 'something'
|
69
|
+
assert_select 'p', 'something else'
|
70
|
+
end
|
71
|
+
assert_select_jquery :prependTo, '#id' do
|
72
|
+
assert_select 'p', 'something'
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
assert_raise Minitest::Assertion, 'No JQuery call matches [:prependTo, "#wrong_id"]' do
|
77
|
+
assert_select_jquery :prependTo, '#wrong_id'
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_argumentless
|
82
|
+
assert_nothing_raised do
|
83
|
+
assert_select_jquery :remove
|
84
|
+
assert_select_jquery :hide
|
85
|
+
end
|
86
|
+
|
87
|
+
assert_raise Minitest::Assertion, 'No JQuery call matches [:wrong_function]' do
|
88
|
+
assert_select_jquery :wrong_function
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|