assert2 0.4.7 → 0.4.8
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.
- data/lib/assert2/rjs.rb +131 -0
- data/lib/assert2/xhtml.rb +19 -16
- metadata +3 -2
data/lib/assert2/rjs.rb
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
require 'rkelly/visitors' # ERGO advise AP these requirers are broke!
|
2
|
+
require 'rkelly/visitable'
|
3
|
+
require 'rkelly/nodes/node'
|
4
|
+
require 'rkelly/nodes/postfix_node'
|
5
|
+
require 'rkelly'
|
6
|
+
require 'assert2/xhtml'
|
7
|
+
|
8
|
+
module Test; module Unit; module Assertions
|
9
|
+
|
10
|
+
class AssertRjs
|
11
|
+
def initialize(js, command, scope)
|
12
|
+
@js, @command, @scope = js, command, scope
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_reader :command, :js, :scope
|
16
|
+
|
17
|
+
def match(kode)
|
18
|
+
RKelly.parse(js).pointcut(kode).
|
19
|
+
matches.each do |updater|
|
20
|
+
updater.grep(RKelly::Nodes::ArgumentsNode).each do |thang|
|
21
|
+
yield thang
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# TODO implement assert_no_rjs by upgrading scope to UnScope
|
27
|
+
|
28
|
+
def complain(about)
|
29
|
+
"#{ command } #{ about }\n#{ js }"
|
30
|
+
end
|
31
|
+
|
32
|
+
def flunk(about)
|
33
|
+
scope.flunk(complain(about))
|
34
|
+
end
|
35
|
+
|
36
|
+
def match_or_flunk(why)
|
37
|
+
@matcher = @matcher.to_s if @matcher.kind_of?(Symbol)
|
38
|
+
scope.assert_match @matcher, @text, complain(why)
|
39
|
+
end
|
40
|
+
|
41
|
+
def pwn_call *args, &block # TODO use or reject the block
|
42
|
+
target, matchers_backup = args[0], args[1..-1]
|
43
|
+
|
44
|
+
match "#{target}()" do |thang|
|
45
|
+
matchers = matchers_backup.dup
|
46
|
+
|
47
|
+
thang.value.each do |arg|
|
48
|
+
@text = eval(arg.value)
|
49
|
+
@matcher = matchers.first # or return @text
|
50
|
+
@matcher.to_s == @text or /#{ @matcher }/ =~ @text or break
|
51
|
+
matchers.shift
|
52
|
+
end
|
53
|
+
|
54
|
+
matchers.empty? and
|
55
|
+
matchers_backup.length == thang.value.length and
|
56
|
+
return @text
|
57
|
+
end
|
58
|
+
|
59
|
+
matchers = matchers_backup.inspect
|
60
|
+
|
61
|
+
scope.flunk("#{ command } to #{ target } with arguments #{
|
62
|
+
matchers } not found in #{ js }")
|
63
|
+
end
|
64
|
+
|
65
|
+
class ALERT < AssertRjs
|
66
|
+
def pwn *args, &block
|
67
|
+
@command = :call
|
68
|
+
pwn_call :alert, *args, &block
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
class REMOVE < AssertRjs
|
73
|
+
def pwn *args, &block
|
74
|
+
@command = :call
|
75
|
+
pwn_call 'Element.remove', *args, &block
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class CALL < AssertRjs
|
80
|
+
def pwn *args, &block # TODO use or reject the block
|
81
|
+
pwn_call *args, &block
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
class REPLACE_HTML < AssertRjs
|
86
|
+
def pwn *args, &block
|
87
|
+
target, @matcher = args
|
88
|
+
@matcher ||= //
|
89
|
+
|
90
|
+
match concept do |thang|
|
91
|
+
div_id, html = thang.value
|
92
|
+
|
93
|
+
if target and html
|
94
|
+
div_id = eval(div_id.value)
|
95
|
+
html = html.value.gsub('\u003C', '<').
|
96
|
+
gsub('\u003E', '>') # ERGO give a crap about encoding!
|
97
|
+
html = eval(html)
|
98
|
+
|
99
|
+
if div_id == target.to_s
|
100
|
+
cornplaint = complain("for ID #{ target } has incorrect payload, in")
|
101
|
+
scope.assert_match @matcher, html, cornplaint if @matcher
|
102
|
+
scope.assert_xhtml html, cornplaint, &block if block
|
103
|
+
return html
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
flunk "for ID #{ target } not found in"
|
109
|
+
end
|
110
|
+
def concept; 'Element.update()'; end
|
111
|
+
end
|
112
|
+
|
113
|
+
class REPLACE < REPLACE_HTML
|
114
|
+
def concept; 'Element.replace()'; end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def assert_rjs_(command, *args, &block)
|
119
|
+
klass = command.to_s.upcase
|
120
|
+
klass = eval("AssertRjs::#{klass}") rescue
|
121
|
+
flunk("#{command} not implemented!")
|
122
|
+
asserter = klass.new(@response.body, command, self)
|
123
|
+
return asserter.pwn(*args, &block)
|
124
|
+
end
|
125
|
+
|
126
|
+
# command == :replace_html or # TODO put me inside the method_missing!
|
127
|
+
# flunk("assert_rjs's alpha version only respects :replace_html")
|
128
|
+
# TODO also crack out the args correctly and gripe if they wrong
|
129
|
+
# TODO TDD the @matcher can be a string or regexp
|
130
|
+
|
131
|
+
end; end; end
|
data/lib/assert2/xhtml.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
=begin
|
2
|
-
One Yury Kotlyarov recently this Rails project as a question:
|
2
|
+
One Yury Kotlyarov recently posted this Rails project as a question:
|
3
3
|
|
4
4
|
http://github.com/yura/howto-rspec-custom-matchers/tree/master
|
5
5
|
|
@@ -71,13 +71,14 @@ class BeHtmlWith
|
|
71
71
|
attr_accessor :builder,
|
72
72
|
:doc,
|
73
73
|
:failure_message,
|
74
|
+
:message,
|
74
75
|
:scope
|
75
76
|
attr_reader :references
|
76
77
|
attr_writer :reference,
|
77
78
|
:sample
|
78
79
|
|
79
80
|
def matches?(stwing, &block)
|
80
|
-
@block
|
81
|
+
@block ||= block # ERGO test that ||= - preferrably with a real RSpec suite!
|
81
82
|
|
82
83
|
@scope.wrap_expectation self do
|
83
84
|
@doc = Nokogiri::HTML(stwing)
|
@@ -159,7 +160,6 @@ class BeHtmlWith
|
|
159
160
|
match_attributes and match_text
|
160
161
|
end
|
161
162
|
|
162
|
-
# TODO document without! and xpath! in the diagnostic
|
163
163
|
# TODO uh, indenting mebbe?
|
164
164
|
|
165
165
|
def match_attributes
|
@@ -235,7 +235,7 @@ class BeHtmlWith
|
|
235
235
|
|
236
236
|
def get_texts(element)
|
237
237
|
element.children.grep(Nokogiri::XML::Text).
|
238
|
-
map{|x|
|
238
|
+
map{|x|x.to_s.strip}.select{|x|x.any?}
|
239
239
|
end
|
240
240
|
|
241
241
|
def collect_best_sample(samples)
|
@@ -252,10 +252,12 @@ class BeHtmlWith
|
|
252
252
|
|
253
253
|
def complain( refered = @builder.doc,
|
254
254
|
sample = @best_sample || @doc.root )
|
255
|
-
|
256
|
-
|
255
|
+
# ERGO use to_xml? or what?
|
256
|
+
@failure_message = "#{message}\n".lstrip +
|
257
|
+
"\nCould not find this reference...\n\n" +
|
258
|
+
refered.to_xhtml.sub(/^\<\!DOCTYPE.*/, '') +
|
257
259
|
"\n\n...in this sample...\n\n" +
|
258
|
-
sample.
|
260
|
+
sample.to_xml
|
259
261
|
end
|
260
262
|
|
261
263
|
def build_deep_xpath_too(element)
|
@@ -297,13 +299,21 @@ module Test; module Unit; module Assertions
|
|
297
299
|
|
298
300
|
def wrap_expectation whatever; yield; end unless defined? wrap_expectation
|
299
301
|
|
300
|
-
def assert_xhtml(
|
302
|
+
def assert_xhtml(*args, &block) # ERGO merge
|
303
|
+
xhtml, message = args
|
304
|
+
|
305
|
+
if @response and message.nil?
|
306
|
+
message = xhtml
|
307
|
+
xhtml = @response.body
|
308
|
+
end
|
309
|
+
|
301
310
|
if block
|
302
311
|
matcher = BeHtmlWith.new(self, &block)
|
312
|
+
matcher.message = message
|
303
313
|
matcher.matches?(xhtml, &block)
|
304
314
|
message = matcher.failure_message
|
305
315
|
flunk message if message.to_s != ''
|
306
|
-
#
|
316
|
+
# return matcher.builder.doc.to_html # TODO return something reasonable
|
307
317
|
else
|
308
318
|
_assert_xml(xhtml)
|
309
319
|
return @xdoc
|
@@ -322,13 +332,6 @@ class Nokogiri::XML::Node
|
|
322
332
|
def content= string
|
323
333
|
self.native_content = encode_special_chars(string.to_s)
|
324
334
|
end
|
325
|
-
end
|
326
|
-
|
327
|
-
class Nokogiri::XML::Builder
|
328
|
-
def text(string)
|
329
|
-
node = Nokogiri::XML::Text.new(string.to_s, @doc)
|
330
|
-
insert(node)
|
331
|
-
end
|
332
335
|
end # ERGO retire these monkey patches as Nokogiri catches up
|
333
336
|
|
334
337
|
class Nokogiri::XML::Node
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: assert2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Phlip
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-04-05 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -24,6 +24,7 @@ extra_rdoc_files: []
|
|
24
24
|
files:
|
25
25
|
- lib/assert2
|
26
26
|
- lib/assert2/xhtml.rb~
|
27
|
+
- lib/assert2/rjs.rb
|
27
28
|
- lib/assert2/flunk.rb
|
28
29
|
- lib/assert2/rubynode_reflector.rb~
|
29
30
|
- lib/assert2/xpath.rb~
|