capybara-envjs 0.1.6 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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