assert2 0.4.7 → 0.4.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/lib/assert2/rjs.rb +131 -0
  2. data/lib/assert2/xhtml.rb +19 -16
  3. metadata +3 -2
@@ -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 = 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| x.to_s.strip}.select{|x|x.any?}
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
- @failure_message = "\nCould not find this reference...\n\n" +
256
- refered.to_html.sub(/^\<\!DOCTYPE.*/, '') +
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.to_html
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(xhtml = @response.body, &block) # ERGO merge
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
- # return matcher.builder.doc.to_html # TODO return something reasonable
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.7
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-03-28 00:00:00 -07:00
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~