capybara-envjs 0.1.6 → 0.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.
@@ -1,3 +1,10 @@
1
+ === 0.4.0 / 2010-10-24
2
+
3
+ * Bring up to date with capy 0.4.0
4
+ * Convert from hoe to bundler
5
+ * make app_host/default_host dynamic
6
+ * clean request parameters on redirect
7
+
1
8
  === 0.1.6 / 2010-07-05
2
9
 
3
10
  * scope select to node
@@ -22,18 +22,9 @@ if false # for testing ... but seems okay
22
22
  end
23
23
 
24
24
  class Capybara::Driver::Envjs < Capybara::Driver::Base
25
- class Node < Capybara::Node
25
+ class Node < Capybara::Driver::Node
26
26
  def text
27
- node.innerText
28
- end
29
-
30
- def [](name)
31
- value = if name.to_sym == :class
32
- node.className
33
- else
34
- node.getAttribute(name.to_s)
35
- end
36
- return value if value and not value.to_s.empty?
27
+ native.innerText
37
28
  end
38
29
 
39
30
  def [](name)
@@ -41,86 +32,73 @@ class Capybara::Driver::Envjs < Capybara::Driver::Base
41
32
  attr_name == "class" and attr_name = "className"
42
33
  case
43
34
  when 'select' == tag_name && 'value' == attr_name
44
- if node['multiple']
45
- all_unfiltered(".//option[@selected='selected']").map { |option| option.node.innerText }
35
+ if native['multiple']
36
+ find(".//option[@selected='selected']").map { |option| option.native[:value] || option.native.innerText }
46
37
  else
47
- node.value
38
+ native.value
48
39
  end
49
- # when 'input' == tag_name && 'checkbox' == type && 'checked' == attr_name
50
- # node[attr_name] == 'checked' ? true : false
51
40
  else
52
- node[attr_name]
41
+ native[attr_name]
53
42
  end
54
43
  end
55
44
 
56
45
  def value
57
46
  if tag_name == 'textarea'
58
- node.innerText
47
+ native.innerText
59
48
  else
60
- super
49
+ self[:value]
61
50
  end
62
51
  end
63
52
 
64
53
  def set(value)
65
- case node.tagName
54
+ case native.tagName
66
55
  when "TEXTAREA"
67
- node.innerText = value
56
+ native.innerText = value
68
57
  else
69
- case node.getAttribute("type")
58
+ case native.getAttribute("type")
70
59
  when "checkbox", "radio"
71
- node.click if node.checked != value
72
- else; node.setAttribute("value",value)
60
+ native.click if native.checked != value
61
+ else; native.setAttribute("value",value)
73
62
  end
74
63
  end
75
64
  end
76
65
 
77
- def select(option)
78
- escaped = Capybara::XPath.escape(option)
79
- option_node = all_unfiltered(".//option[text()=#{escaped}]").first || all_unfiltered(".//option[contains(.,#{escaped})]").first
80
- option_node.node.selected = true
81
- rescue Exception => e
82
- options = all_unfiltered(".//option").map { |o| "'#{o.text}'" }.join(', ')
83
- raise Capybara::OptionNotFound, "No such option '#{option}' in this select box. Available options: #{options}"
66
+ def select_option
67
+ native.selected = true
84
68
  end
85
69
 
86
- def unselect(option)
87
- if !node['multiple']
88
- raise Capybara::UnselectNotAllowed, "Cannot unselect option '#{option}' from single select box."
89
- end
90
-
91
- begin
92
- escaped = Capybara::XPath.escape(option)
93
- option_node = (all_unfiltered(".//option[text()=#{escaped}]") || all_unfiltered(".//option[contains(.,#{escaped})]")).first
94
- option_node.node.selected = false
95
- rescue Exception => e
96
- options = all_unfiltered(".//option").map { |o| "'#{o.text}'" }.join(', ')
97
- raise Capybara::OptionNotFound, "No such option '#{option}' in this select box. Available options: #{options}"
70
+ def unselect_option
71
+ if !select_node['multiple']
72
+ raise Capybara::UnselectNotAllowed, "Cannot unselect option from single select box."
98
73
  end
74
+ native.removeAttribute('selected')
99
75
  end
100
76
 
101
77
  def click
102
- _event(self,"MouseEvent",'click',true,true)
78
+ _event(self,"MouseEvents",'click',true,true, :button => 1)
103
79
  end
104
80
 
105
81
  def drag_to(element)
106
- _event(self,"MouseEvent",'mousedown',true,true)
107
- _event(element,"MouseEvent",'mousemove',true,true)
108
- _event(element,"MouseEvent",'mouseup',true,true)
82
+ # distance stuff is arbitrary at this point, to make jquery.ui happy ...
83
+ _event(self,"MouseEvents",'mousedown',true,true, :button => 1, :pageX => 0, :pageY => 0)
84
+ _event(element,"MouseEvents",'mousemove',true,true, :button => 1, :pageX => 1, :pageY => 1)
85
+ _event(element,"MouseEvents",'mousemove',true,true, :button => 1, :pageX => 0, :pageY => 0)
86
+ _event(element,"MouseEvents",'mouseup',true,true, :button => 1, :pageX => 0, :pageY => 0)
109
87
  end
110
88
 
111
89
  def tag_name
112
- node.tagName.downcase
90
+ native.tagName.downcase
113
91
  end
114
92
 
115
93
  def visible?
116
- all_unfiltered("./ancestor-or-self::*[contains(@style, 'display:none') or contains(@style, 'display: none')]").empty?
94
+ find("./ancestor-or-self::*[contains(@style, 'display:none') or contains(@style, 'display: none')]").empty?
117
95
  end
118
96
 
119
- def all_unfiltered selector
97
+ def find(locator)
120
98
  window = @driver.browser["window"]
121
99
  null = @driver.browser["null"]
122
100
  type = window["XPathResult"]["ANY_TYPE"]
123
- result_set = window.document.evaluate selector, node, null, type, null
101
+ result_set = window.document.evaluate(locator, native, null, type, null)
124
102
  nodes = []
125
103
  while n = result_set.iterateNext()
126
104
  nodes << Node.new(@driver, n)
@@ -135,28 +113,42 @@ class Capybara::Driver::Envjs < Capybara::Driver::Base
135
113
 
136
114
  private
137
115
 
138
- def _event(target,cls,type,bubbles,cancelable)
139
- e = @driver.browser["document"].createEvent(cls);
116
+ # a reference to the select node if this is an option node
117
+ def select_node
118
+ find('./ancestor::select').first
119
+ end
120
+
121
+ def _event(target,cls,type,bubbles,cancelable,attributes = {})
122
+ e = @driver.browser["document"].createEvent(false && cls || ""); # disabled for now
140
123
  e.initEvent(type,bubbles,cancelable);
141
- target.node.dispatchEvent(e);
124
+ attributes.each do |k,v|
125
+ e[k.to_s] = v
126
+ end
127
+ target.native.dispatchEvent(e);
142
128
  end
143
129
 
144
130
  end
145
131
 
146
132
  attr_reader :app
147
- attr_reader :app_host
148
133
 
149
134
  def rack_test?
150
- @rack_test
135
+ # p "rt?", app_host, default_url, (app_host == default_url)
136
+ app_host == default_url
151
137
  end
152
138
 
153
- def initialize(app)
139
+ def default_host
140
+ (Capybara.default_host || "www.example.com")
141
+ end
154
142
 
155
- default_host = @default_host = (Capybara.default_host || "www.example.com")
156
- @default_url = "http://"+@default_host
157
- @app_host = (ENV["CAPYBARA_APP_HOST"] || Capybara.app_host || @default_url)
143
+ def default_url
144
+ "http://"+default_host
145
+ end
146
+
147
+ def app_host
148
+ (ENV["CAPYBARA_APP_HOST"] || Capybara.app_host || default_url)
149
+ end
158
150
 
159
- @rack_test = @app_host == @default_url
151
+ def initialize(app)
160
152
 
161
153
  if rack_test?
162
154
  require 'rack/test'
@@ -165,6 +157,7 @@ class Capybara::Driver::Envjs < Capybara::Driver::Base
165
157
  alias_method :response, :last_response
166
158
  alias_method :request, :last_request
167
159
  define_method :build_rack_mock_session do
160
+ # p default_host
168
161
  Rack::MockSession.new(app, default_host)
169
162
  end
170
163
  end
@@ -195,22 +188,26 @@ class Capybara::Driver::Envjs < Capybara::Driver::Base
195
188
  browser.master["connection"] = @connection = proc do |*args|
196
189
  xhr, responseHandler, data = *args
197
190
  url = xhr.url
198
- params = data || {}
191
+ params = data || ""
199
192
  method = xhr["method"].downcase.to_sym
200
193
  e = env;
201
194
  if method == :post or method == :put
202
195
  e.merge! "CONTENT_TYPE" => xhr.headers["Content-Type"]
203
196
  end
197
+ e.merge! "HTTP_ACCEPT" => xhr.headers["Accept"] if xhr.headers["Accept"]
204
198
  if e["CONTENT_TYPE"] =~ %r{^multipart/form-data;}
205
199
  e["CONTENT_LENGTH"] ||= params.length
206
200
  end
207
201
  times = 0
208
202
  begin
203
+ # p url, app_host
209
204
  if url.index(app_host) == 0
210
205
  url.slice! 0..(app_host.length-1)
211
206
  end
212
- # puts "send #{method} #{url} #{params}"
207
+ # p url
208
+ # puts "send #{method} #{url} #{params} #{e}"
213
209
  send method, url, params, e
210
+ # p "after" #, response
214
211
  while response.status == 302 || response.status == 301
215
212
  if (times += 1) > 5
216
213
  raise Capybara::InfiniteRedirectError, "redirected more than 5 times, check for infinite redirects."
@@ -222,7 +219,7 @@ class Capybara::Driver::Envjs < Capybara::Driver::Base
222
219
  url.slice! 0..(app_host.length-1)
223
220
  end
224
221
  # puts "redirect #{method} #{url} #{params}"
225
- send method, url, params, e
222
+ send method, url, params, env
226
223
  end
227
224
  rescue Exception => e
228
225
  # print "got #{e} #{response.inspect}\n"
@@ -251,13 +248,14 @@ class Capybara::Driver::Envjs < Capybara::Driver::Base
251
248
  as_url = URI.parse path
252
249
  base = URI.parse app_host
253
250
  path = (base + as_url).to_s
251
+ # p path
254
252
  browser["window"].location.href = path
255
253
  end
256
254
 
257
255
  def current_url
258
256
  browser["window"].location.href
259
257
  end
260
-
258
+
261
259
  def source
262
260
  browser["window"].document.__original_text__
263
261
  end
@@ -266,7 +264,7 @@ class Capybara::Driver::Envjs < Capybara::Driver::Base
266
264
  browser["window"].document.xml
267
265
  end
268
266
 
269
- def cleanup!
267
+ def reset!
270
268
  clear_cookies
271
269
  end
272
270
 
@@ -323,7 +321,7 @@ class Capybara::Driver::Envjs < Capybara::Driver::Base
323
321
  @_browser = Johnson::Runtime.new :size => Integer(ENV["JOHNSON_HEAP_SIZE"] || 0x4000000)
324
322
  @_browser.extend Envjs::Runtime
325
323
  end
326
-
324
+
327
325
  @_browser
328
326
  end
329
327
 
@@ -344,3 +342,7 @@ private
344
342
  end
345
343
 
346
344
  end
345
+
346
+ Capybara.register_driver :envjs do |app|
347
+ Capybara::Driver::Envjs.new(app)
348
+ end
@@ -0,0 +1,5 @@
1
+ module Capybara
2
+ module Envjs
3
+ VERSION = "0.4.0"
4
+ end
5
+ end
@@ -1,4 +1,5 @@
1
1
  require 'rubygems'
2
+ require 'bundler/setup'
2
3
  require 'capybara/envjs'
3
4
 
4
5
  spec_dir = nil
@@ -10,3 +11,7 @@ $:.detect do |dir|
10
11
  end
11
12
 
12
13
  require File.join(spec_dir,"spec_helper")
14
+
15
+ RSpec.configure do |c|
16
+ # c.filter_run :focus => true
17
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capybara-envjs
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 15
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 1
9
- - 6
10
- version: 0.1.6
8
+ - 4
9
+ - 0
10
+ version: 0.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Steven Parkes
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-05 00:00:00 -07:00
18
+ date: 2010-10-24 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -24,14 +24,14 @@ dependencies:
24
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - ">="
27
+ - - ~>
28
28
  - !ruby/object:Gem::Version
29
- hash: 1
29
+ hash: 15
30
30
  segments:
31
31
  - 0
32
- - 3
33
- - 9
34
- version: 0.3.9
32
+ - 4
33
+ - 0
34
+ version: 0.4.0
35
35
  type: :runtime
36
36
  version_requirements: *id001
37
37
  - !ruby/object:Gem::Dependency
@@ -51,19 +51,18 @@ dependencies:
51
51
  type: :runtime
52
52
  version_requirements: *id002
53
53
  - !ruby/object:Gem::Dependency
54
- name: rack-test
54
+ name: bundler
55
55
  prerelease: false
56
56
  requirement: &id003 !ruby/object:Gem::Requirement
57
57
  none: false
58
58
  requirements:
59
- - - ">="
59
+ - - ~>
60
60
  - !ruby/object:Gem::Version
61
- hash: 3
61
+ hash: 15
62
62
  segments:
63
+ - 1
63
64
  - 0
64
- - 5
65
- - 4
66
- version: 0.5.4
65
+ version: "1.0"
67
66
  type: :development
68
67
  version_requirements: *id003
69
68
  - !ruby/object:Gem::Dependency
@@ -72,36 +71,47 @@ dependencies:
72
71
  requirement: &id004 !ruby/object:Gem::Requirement
73
72
  none: false
74
73
  requirements:
75
- - - ">="
74
+ - - ~>
76
75
  - !ruby/object:Gem::Version
77
- hash: 27
76
+ hash: 3
78
77
  segments:
79
- - 1
80
- - 3
78
+ - 2
81
79
  - 0
82
- version: 1.3.0
80
+ version: "2.0"
83
81
  type: :development
84
82
  version_requirements: *id004
85
83
  - !ruby/object:Gem::Dependency
86
- name: hoe
84
+ name: rack-test
87
85
  prerelease: false
88
86
  requirement: &id005 !ruby/object:Gem::Requirement
89
87
  none: false
90
88
  requirements:
91
89
  - - ">="
92
90
  - !ruby/object:Gem::Version
93
- hash: 21
91
+ hash: 3
94
92
  segments:
95
- - 2
96
- - 6
97
- - 1
98
- version: 2.6.1
93
+ - 0
94
+ - 5
95
+ - 4
96
+ version: 0.5.4
99
97
  type: :development
100
98
  version_requirements: *id005
101
- description: |-
102
- capybara-envjs is a {Capybara}[http://github.com/jnicklas/capybara] driver for the envjs gem ({GitHub}[http://github.com/smparkes/env-js],
103
- {rubygems.org}[http://rubygems.org/gems/envjs]).
104
- It is similar to Capybara's rack-test driver in that it runs tests against your rack application directly but fully supports javascript in your application.
99
+ - !ruby/object:Gem::Dependency
100
+ name: sinatra
101
+ prerelease: false
102
+ requirement: &id006 !ruby/object:Gem::Requirement
103
+ none: false
104
+ requirements:
105
+ - - ~>
106
+ - !ruby/object:Gem::Version
107
+ hash: 15
108
+ segments:
109
+ - 1
110
+ - 0
111
+ version: "1.0"
112
+ type: :development
113
+ version_requirements: *id006
114
+ description: capybara-envjs is a Capybara driver for the envjs gem. It is similar to Capybara's rack-test driver in that it runs tests against your rack application directly but fully supports javascript in your application.
105
115
  email:
106
116
  - smparkes@smparkes.net
107
117
  executables: []
@@ -109,22 +119,17 @@ executables: []
109
119
  extensions: []
110
120
 
111
121
  extra_rdoc_files:
112
- - History.txt
113
- - Manifest.txt
114
- - CHANGELOG.rdoc
115
122
  - README.rdoc
116
123
  files:
117
- - CHANGELOG.rdoc
118
- - History.txt
119
- - Manifest.txt
120
- - README.rdoc
121
- - Rakefile
122
124
  - lib/capybara/driver/envjs_driver.rb
123
- - lib/capybara/envjs.rb
124
125
  - lib/capybara/envjs/cucumber.rb
126
+ - lib/capybara/envjs/version.rb
127
+ - lib/capybara/envjs.rb
125
128
  - spec/driver/envjs_driver_spec.rb
126
129
  - spec/session/envjs_session_spec.rb
127
130
  - spec/spec_helper.rb
131
+ - README.rdoc
132
+ - CHANGELOG.rdoc
128
133
  has_rdoc: true
129
134
  homepage: http://github.com/smparkes/capybara-envjs
130
135
  licenses: []
@@ -159,6 +164,6 @@ rubyforge_project: capybara-envjs
159
164
  rubygems_version: 1.3.7
160
165
  signing_key:
161
166
  specification_version: 3
162
- summary: capybara-envjs is a {Capybara}[http://github.com/jnicklas/capybara] driver for the envjs gem ({GitHub}[http://github.com/smparkes/env-js], {rubygems.org}[http://rubygems.org/gems/envjs])
167
+ summary: Capybara driver for envjs
163
168
  test_files: []
164
169
 
@@ -1,5 +0,0 @@
1
- === 0.1.0 20010-02-25
2
-
3
- * 1 major enhancement:
4
- * Initial release
5
-
@@ -1,11 +0,0 @@
1
- CHANGELOG.rdoc
2
- History.txt
3
- Manifest.txt
4
- README.rdoc
5
- Rakefile
6
- lib/capybara/driver/envjs_driver.rb
7
- lib/capybara/envjs.rb
8
- lib/capybara/envjs/cucumber.rb
9
- spec/driver/envjs_driver_spec.rb
10
- spec/session/envjs_session_spec.rb
11
- spec/spec_helper.rb
data/Rakefile DELETED
@@ -1,28 +0,0 @@
1
- # -*- Mode: Ruby -*-
2
-
3
- require 'rubygems'
4
-
5
- gem 'hoe', '>= 2.5'
6
- require 'hoe'
7
-
8
- Hoe.plugin
9
- Hoe.plugin :debugging, :doofus, :git
10
- Hoe.plugins.delete :rubyforge
11
-
12
- Hoe.spec 'capybara-envjs' do
13
- developer 'Steven Parkes', 'smparkes@smparkes.net'
14
- self.version = "0.1.6"
15
-
16
- self.readme_file = 'README.rdoc'
17
- self.extra_rdoc_files = Dir['*.rdoc']
18
-
19
- self.extra_deps = [
20
- ['capybara', '>= 0.3.9'],
21
- ['envjs', '>= 0.3.7']
22
- ]
23
-
24
- self.extra_dev_deps = [
25
- ['rack-test', '>= 0.5.4'],
26
- ['rspec', '>= 1.3.0']
27
- ]
28
- end