steam 0.0.2 → 0.0.3
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/README.textile +7 -0
- data/lib/steam.rb +25 -4
- data/lib/steam/browser.rb +3 -2
- data/lib/steam/browser/html_unit.rb +10 -6
- data/lib/steam/browser/html_unit/actions.rb +4 -1
- data/lib/steam/browser/html_unit/client.rb +4 -1
- data/lib/steam/session.rb +4 -0
- data/lib/steam/version.rb +1 -1
- data/test/browser/html_unit/actions_test.rb +15 -15
- data/test/browser/html_unit/javascript_test.rb +2 -2
- data/test/browser/html_unit/rails_actions_test.rb +5 -6
- data/test/browser/html_unit_test.rb +27 -26
- data/test/example/webrat_compat_steps_test.rb +307 -0
- data/test/playground/dragdrop_behavior.rb +2 -2
- data/test/playground/drb.rb +2 -2
- data/test/playground/thread_problem.rb +1 -1
- data/test/process_test.rb +3 -3
- data/test/session_test.rb +31 -6
- data/test/test_helper.rb +25 -1
- metadata +3 -3
- data/lib/steam/browser/html_unit/matchers.rb +0 -57
data/README.textile
CHANGED
data/lib/steam.rb
CHANGED
@@ -9,6 +9,12 @@ module Steam
|
|
9
9
|
autoload :Response, 'steam/response'
|
10
10
|
autoload :Session, 'steam/session'
|
11
11
|
|
12
|
+
class ElementNotFound < StandardError
|
13
|
+
def initialize(*args)
|
14
|
+
super "could not find element: #{args.map { |arg| arg.inspect }.join(', ') }"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
12
18
|
class << self
|
13
19
|
def config
|
14
20
|
@@config ||= {
|
@@ -33,11 +39,26 @@ module Steam
|
|
33
39
|
}
|
34
40
|
}
|
35
41
|
end
|
36
|
-
end
|
37
42
|
|
38
|
-
|
39
|
-
|
40
|
-
|
43
|
+
def save_and_open(url, response)
|
44
|
+
filename = "/tmp/steam/#{url.gsub(/[^\w\-\/]/, '_')}.html"
|
45
|
+
body = rewrite_assets(url, response.body)
|
46
|
+
FileUtils.mkdir_p(File.dirname(filename))
|
47
|
+
File.open(filename, "w") { |f| f.write body }
|
48
|
+
open_in_browser(filename)
|
49
|
+
end
|
50
|
+
|
51
|
+
def open_in_browser(filename)
|
52
|
+
require "launchy"
|
53
|
+
Launchy::Browser.run(filename)
|
54
|
+
rescue LoadError
|
55
|
+
warn "Sorry, you need to install launchy to open pages: `gem install launchy`"
|
56
|
+
end
|
57
|
+
|
58
|
+
def rewrite_assets(url, html)
|
59
|
+
url = url.gsub(URI.parse(url).path, '')
|
60
|
+
pattern = %r(<script [^>]*src=['"]+([^'"]*)|<link[^>]* href=['"]?([^'"]+))
|
61
|
+
html.gsub(pattern) { |path| path.gsub($1 || $2, "#{url}#{$1 || $2}") }
|
41
62
|
end
|
42
63
|
end
|
43
64
|
end
|
data/lib/steam/browser.rb
CHANGED
@@ -2,17 +2,18 @@
|
|
2
2
|
# Webdriver might be an interesting alternative.
|
3
3
|
|
4
4
|
require 'core_ext/ruby/string/camelize'
|
5
|
+
require 'locator'
|
5
6
|
|
6
7
|
module Steam
|
7
8
|
module Browser
|
8
9
|
autoload :HtmlUnit, 'steam/browser/html_unit'
|
9
|
-
|
10
|
+
|
10
11
|
class << self
|
11
12
|
def create(*args)
|
12
13
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
13
14
|
type = args.shift if args.first.is_a?(Symbol)
|
14
15
|
connection = args.pop
|
15
|
-
|
16
|
+
|
16
17
|
type ||= :html_unit
|
17
18
|
type = const_get(type.to_s.camelize)
|
18
19
|
type = type.const_get('Drb') if options[:daemon]
|
@@ -17,27 +17,31 @@ module Steam
|
|
17
17
|
autoload :Page, 'steam/browser/html_unit/page'
|
18
18
|
autoload :WebResponse, 'steam/browser/html_unit/web_response'
|
19
19
|
|
20
|
-
include Actions
|
20
|
+
include Actions
|
21
21
|
|
22
|
-
attr_accessor :client, :page, :
|
22
|
+
attr_accessor :client, :page, :request, :response
|
23
23
|
|
24
24
|
def initialize(*args)
|
25
25
|
@client = Client.new(*args)
|
26
26
|
end
|
27
27
|
|
28
|
+
def connection
|
29
|
+
client.connection
|
30
|
+
end
|
31
|
+
|
28
32
|
def close
|
29
33
|
@client.closeAllWindows
|
30
34
|
end
|
31
35
|
|
32
|
-
def
|
36
|
+
def get(url)
|
33
37
|
call Request.env_for(url)
|
34
38
|
end
|
35
|
-
alias :visit :
|
39
|
+
alias :visit :get
|
36
40
|
|
37
41
|
def call(env)
|
38
42
|
respond_to do
|
39
43
|
@request = Rack::Request.new(env)
|
40
|
-
client.
|
44
|
+
client.get(@request.url)
|
41
45
|
end.to_a
|
42
46
|
end
|
43
47
|
|
@@ -60,7 +64,7 @@ module Steam
|
|
60
64
|
end
|
61
65
|
|
62
66
|
def within(*args, &block)
|
63
|
-
Locator.within(*args, &block)
|
67
|
+
Locator.within(response.body, *args, &block)
|
64
68
|
end
|
65
69
|
|
66
70
|
protected
|
@@ -59,7 +59,10 @@ module Steam
|
|
59
59
|
|
60
60
|
# TODO implement a way to supply content_type
|
61
61
|
def attach_file(element, path, options = {})
|
62
|
-
|
62
|
+
respond_to do
|
63
|
+
element = locate_in_browser(:file, element, options)
|
64
|
+
element.setValueAttribute(path)
|
65
|
+
end
|
63
66
|
end
|
64
67
|
|
65
68
|
def submit_form(element, options = {})
|
@@ -19,7 +19,10 @@ module Steam
|
|
19
19
|
def notify(message, origin); end
|
20
20
|
end
|
21
21
|
|
22
|
+
attr_reader :connection
|
23
|
+
|
22
24
|
def initialize(connection = nil, options = {})
|
25
|
+
@connection = connection
|
23
26
|
options = Steam.config[:html_unit].merge(options)
|
24
27
|
|
25
28
|
@java = WebClient.new(BrowserVersion.send(options[:browser_version]))
|
@@ -46,7 +49,7 @@ module Steam
|
|
46
49
|
end
|
47
50
|
end
|
48
51
|
|
49
|
-
def
|
52
|
+
def get(*args)
|
50
53
|
@java.getPage(*args) # TODO use WebRequestSettings
|
51
54
|
end
|
52
55
|
|
data/lib/steam/session.rb
CHANGED
@@ -8,6 +8,10 @@ module Steam
|
|
8
8
|
class Session
|
9
9
|
autoload :Rails, 'steam/session/rails'
|
10
10
|
|
11
|
+
include Locator::Matcher
|
12
|
+
include Test::Unit::Assertions if defined?(Test::Unit)
|
13
|
+
# TODO include Rspec::Something if defined?(Rspec)
|
14
|
+
|
11
15
|
attr_accessor :browser
|
12
16
|
|
13
17
|
def initialize(browser = nil)
|
data/lib/steam/version.rb
CHANGED
@@ -5,16 +5,16 @@ class HtmlUnitActionsTest < Test::Unit::TestCase
|
|
5
5
|
include Steam, HtmlFakes
|
6
6
|
|
7
7
|
def setup
|
8
|
-
|
8
|
+
mock = Steam::Connection::Mock.new
|
9
9
|
static = Steam::Connection::Static.new(:root => FIXTURES_PATH)
|
10
|
-
@browser = Steam::Browser::HtmlUnit.new(Rack::Cascade.new([static,
|
10
|
+
@browser = Steam::Browser::HtmlUnit.new(Rack::Cascade.new([static, mock]))
|
11
11
|
end
|
12
12
|
|
13
13
|
test "click_on clicks on an element" do
|
14
14
|
perform :get, 'http://localhost:3000/', html
|
15
15
|
|
16
16
|
assert_response_contains('LINK') do
|
17
|
-
|
17
|
+
mock :get, 'http://localhost:3000/link', 'LINK'
|
18
18
|
@browser.click_on('link')
|
19
19
|
end
|
20
20
|
end
|
@@ -23,7 +23,7 @@ class HtmlUnitActionsTest < Test::Unit::TestCase
|
|
23
23
|
perform :get, 'http://localhost:3000/', html(:fields => :text)
|
24
24
|
|
25
25
|
assert_response_contains('FORM') do
|
26
|
-
|
26
|
+
mock :get, 'http://localhost:3000/form?field=', 'FORM'
|
27
27
|
@browser.click_on(:button, 'button')
|
28
28
|
end
|
29
29
|
end
|
@@ -32,7 +32,7 @@ class HtmlUnitActionsTest < Test::Unit::TestCase
|
|
32
32
|
perform :get, 'http://localhost:3000/', html
|
33
33
|
|
34
34
|
assert_response_contains('LINK') do
|
35
|
-
|
35
|
+
mock :get, 'http://localhost:3000/link', 'LINK'
|
36
36
|
@browser.click_link('link')
|
37
37
|
end
|
38
38
|
end
|
@@ -41,7 +41,7 @@ class HtmlUnitActionsTest < Test::Unit::TestCase
|
|
41
41
|
perform :get, 'http://localhost:3000/', html(:fields => :text)
|
42
42
|
|
43
43
|
assert_response_contains('FORM') do
|
44
|
-
|
44
|
+
mock :get, 'http://localhost:3000/form?field=', 'FORM'
|
45
45
|
@browser.click_button('button')
|
46
46
|
end
|
47
47
|
end
|
@@ -50,7 +50,7 @@ class HtmlUnitActionsTest < Test::Unit::TestCase
|
|
50
50
|
perform :get, 'http://localhost:3000/', html(:fields => :text)
|
51
51
|
|
52
52
|
assert_response_contains('FIELD') do
|
53
|
-
|
53
|
+
mock :get, 'http://localhost:3000/form?field=text', 'FIELD'
|
54
54
|
@browser.fill_in('field', :with => 'text')
|
55
55
|
@browser.click_button('button')
|
56
56
|
end
|
@@ -60,7 +60,7 @@ class HtmlUnitActionsTest < Test::Unit::TestCase
|
|
60
60
|
perform :get, 'http://localhost:3000/', html(:fields => :textarea)
|
61
61
|
|
62
62
|
assert_response_contains('TEXTAREA') do
|
63
|
-
|
63
|
+
mock :get, 'http://localhost:3000/form?textarea=text', 'TEXTAREA'
|
64
64
|
@browser.fill_in('textarea', :with => 'text')
|
65
65
|
@browser.click_button('button')
|
66
66
|
end
|
@@ -70,7 +70,7 @@ class HtmlUnitActionsTest < Test::Unit::TestCase
|
|
70
70
|
perform :get, 'http://localhost:3000/', html(:fields => :checkbox)
|
71
71
|
|
72
72
|
assert_response_contains('CHECKED') do
|
73
|
-
|
73
|
+
mock :get, 'http://localhost:3000/form?checkbox=1', 'CHECKED'
|
74
74
|
@browser.check('checkbox')
|
75
75
|
@browser.click_button('button')
|
76
76
|
end
|
@@ -80,7 +80,7 @@ class HtmlUnitActionsTest < Test::Unit::TestCase
|
|
80
80
|
perform :get, 'http://localhost:3000/', html(:fields => :checkbox)
|
81
81
|
|
82
82
|
assert_response_contains('FORM') do
|
83
|
-
|
83
|
+
mock :get, 'http://localhost:3000/form', 'FORM'
|
84
84
|
@browser.check('checkbox')
|
85
85
|
@browser.uncheck('checkbox')
|
86
86
|
@browser.click_button('button')
|
@@ -91,7 +91,7 @@ class HtmlUnitActionsTest < Test::Unit::TestCase
|
|
91
91
|
perform :get, 'http://localhost:3000/', html(:fields => :radio)
|
92
92
|
|
93
93
|
assert_response_contains('RADIO') do
|
94
|
-
|
94
|
+
mock :get, 'http://localhost:3000/form?radio=radio', 'RADIO'
|
95
95
|
@browser.choose('radio')
|
96
96
|
@browser.click_button('button')
|
97
97
|
end
|
@@ -101,7 +101,7 @@ class HtmlUnitActionsTest < Test::Unit::TestCase
|
|
101
101
|
perform :get, 'http://localhost:3000/', html(:fields => :select)
|
102
102
|
|
103
103
|
assert_response_contains('SELECT') do
|
104
|
-
|
104
|
+
mock :get, 'http://localhost:3000/form?select=foo', 'SELECT'
|
105
105
|
@browser.select('foo', :from => 'select')
|
106
106
|
@browser.click_button('button')
|
107
107
|
end
|
@@ -111,7 +111,7 @@ class HtmlUnitActionsTest < Test::Unit::TestCase
|
|
111
111
|
perform :get, 'http://localhost:3000/', html(:fields => :hidden)
|
112
112
|
|
113
113
|
assert_response_contains('SELECT') do
|
114
|
-
|
114
|
+
mock :get, 'http://localhost:3000/form?hidden=foo', 'SELECT'
|
115
115
|
@browser.set_hidden_field('hidden', :to => 'foo')
|
116
116
|
@browser.click_button('button')
|
117
117
|
end
|
@@ -121,7 +121,7 @@ class HtmlUnitActionsTest < Test::Unit::TestCase
|
|
121
121
|
perform :get, 'http://localhost:3000/', html(:fields => :file)
|
122
122
|
|
123
123
|
assert_response_contains('FILE') do
|
124
|
-
|
124
|
+
mock :get, 'http://localhost:3000/form?file=rails.png', 'FILE'
|
125
125
|
@browser.attach_file('file', "#{TEST_ROOT}/fixtures/rails.png")
|
126
126
|
@browser.click_button('button')
|
127
127
|
end
|
@@ -131,7 +131,7 @@ class HtmlUnitActionsTest < Test::Unit::TestCase
|
|
131
131
|
perform :get, 'http://localhost:3000/', html(:fields => :text)
|
132
132
|
|
133
133
|
assert_response_contains('FORM') do
|
134
|
-
|
134
|
+
mock :get, 'http://localhost:3000/form?field=', 'FORM'
|
135
135
|
@browser.submit_form('form')
|
136
136
|
end
|
137
137
|
end
|
@@ -5,9 +5,9 @@ class HtmlUnitJavascriptTest < Test::Unit::TestCase
|
|
5
5
|
include Steam, HtmlFakes
|
6
6
|
|
7
7
|
def setup
|
8
|
-
@
|
8
|
+
@connection = Steam::Connection::Mock.new
|
9
9
|
static = Steam::Connection::Static.new(:root => FIXTURES_PATH)
|
10
|
-
@browser = Steam::Browser::HtmlUnit.new(Rack::Cascade.new([static, @
|
10
|
+
@browser = Steam::Browser::HtmlUnit.new(Rack::Cascade.new([static, @connection]))
|
11
11
|
end
|
12
12
|
|
13
13
|
test "jquery: div:not([id]) selector" do
|
@@ -5,13 +5,12 @@ class HtmlUnitRailsActionsTest < Test::Unit::TestCase
|
|
5
5
|
include Steam, HtmlFakes
|
6
6
|
|
7
7
|
def setup
|
8
|
-
|
9
|
-
|
10
|
-
@browser = Steam::Browser::HtmlUnit.new(Rack::Cascade.new([static, @app]))
|
8
|
+
connection = Steam::Connection::Mock.new
|
9
|
+
@browser = Steam::Browser::HtmlUnit.new(connection)
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
mock :get, "http://localhost:3000/form?event_date(1i)=2009&event_date(2i)=11&event_date(3i)=7", 'DATE'
|
12
|
+
mock :get, "http://localhost:3000/form?event_datetime(1i)=2009&event_datetime(2i)=11&event_datetime(3i)=7&event_datetime(4i)=19&event_datetime(5i)=0", 'DATETIME'
|
13
|
+
mock :get, "http://localhost:3000/form?event_time(4i)=19&event_time(5i)=0", 'TIME'
|
15
14
|
end
|
16
15
|
|
17
16
|
def test_select_date
|
@@ -3,61 +3,62 @@ require 'fixtures/html_fakes'
|
|
3
3
|
require 'locator'
|
4
4
|
|
5
5
|
module HtmlUnitTests
|
6
|
+
include Steam
|
7
|
+
|
6
8
|
def init
|
7
|
-
@
|
8
|
-
|
9
|
-
@browser = Steam::Browser::HtmlUnit.new(Rack::Cascade.new([static, @app]))
|
9
|
+
@connection = Connection::Mock.new
|
10
|
+
@browser = Browser::HtmlUnit.new(@connection)
|
10
11
|
perform(:get, 'http://localhost:3000/', '<div id="foo"><div id="bar"><a id="buz" href="">bar!</a></div></div>')
|
11
12
|
end
|
12
|
-
|
13
|
+
|
13
14
|
def locate(*args, &block)
|
14
15
|
@browser.locate(*args, &block)
|
15
16
|
end
|
16
|
-
|
17
|
+
|
17
18
|
def within(*args, &block)
|
18
19
|
@browser.within(*args, &block)
|
19
20
|
end
|
20
|
-
|
21
|
+
|
21
22
|
test 'locate with node type' do
|
22
23
|
element = locate(:a)
|
23
24
|
assert_equal 'a', element.name
|
24
25
|
end
|
25
|
-
|
26
|
+
|
26
27
|
test 'locate with attributes' do
|
27
28
|
element = locate(:id => 'buz')
|
28
29
|
assert_equal 'a', element.name
|
29
30
|
end
|
30
|
-
|
31
|
+
|
31
32
|
test 'locate with search text' do
|
32
33
|
element = locate(:a, 'bar!')
|
33
34
|
assert_equal 'a', element.name
|
34
35
|
end
|
35
|
-
|
36
|
+
|
36
37
|
test 'locate with xpath' do
|
37
38
|
element = locate(:xpath => '//div/div/a')
|
38
39
|
assert_equal 'a', element.name
|
39
40
|
end
|
40
|
-
|
41
|
+
|
41
42
|
test 'locate with css' do
|
42
43
|
element = locate(:css => '#foo #bar a')
|
43
44
|
assert_equal 'a', element.name
|
44
45
|
end
|
45
|
-
|
46
|
+
|
46
47
|
test 'within with node type' do
|
47
48
|
element = within(:div) { within(:div) { locate(:a) } }
|
48
49
|
assert_equal 'a', element.name
|
49
50
|
end
|
50
|
-
|
51
|
+
|
51
52
|
test 'within with attributes' do
|
52
53
|
element = within(:id => 'foo') { within(:id => 'bar') { locate(:a) } }
|
53
54
|
assert_equal 'a', element.name
|
54
55
|
end
|
55
|
-
|
56
|
+
|
56
57
|
test 'within with xpath' do
|
57
58
|
element = within('//div/div') { locate(:a) }
|
58
59
|
assert_equal 'a', element.name
|
59
60
|
end
|
60
|
-
|
61
|
+
|
61
62
|
test 'within with css' do
|
62
63
|
element = within('#foo #bar') { locate(:a) }
|
63
64
|
assert_equal 'a', element.name
|
@@ -82,16 +83,16 @@ class HtmlUnitWithNokogiriAdapterTest < Test::Unit::TestCase
|
|
82
83
|
end
|
83
84
|
end
|
84
85
|
|
85
|
-
class HtmlUnitWithHtmlUnitAdapterTest < Test::Unit::TestCase
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
end
|
86
|
+
# class HtmlUnitWithHtmlUnitAdapterTest < Test::Unit::TestCase
|
87
|
+
# include Steam, HtmlUnitTests
|
88
|
+
#
|
89
|
+
# def setup
|
90
|
+
# @old_adapter, Locator::Dom.adapter = Locator::Dom.adapter, Locator::Dom::Htmlunit
|
91
|
+
# init
|
92
|
+
# end
|
93
|
+
#
|
94
|
+
# def teardown
|
95
|
+
# Locator::Dom.adapter = @old_adapter
|
96
|
+
# end
|
97
|
+
# end
|
97
98
|
|
@@ -0,0 +1,307 @@
|
|
1
|
+
require File.expand_path('../../test_helper', __FILE__)
|
2
|
+
# $: << File.expand_path("../../../lib", __FILE__)
|
3
|
+
|
4
|
+
require 'cucumber'
|
5
|
+
require 'steam'
|
6
|
+
|
7
|
+
module PathTo
|
8
|
+
def path_to(page_name)
|
9
|
+
"http://localhost:3000/#{page_name}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
include PathTo
|
13
|
+
|
14
|
+
connection = Steam::Connection::Mock.new
|
15
|
+
$browser = Steam::Browser.create(connection)
|
16
|
+
|
17
|
+
$step_mother = Cucumber::StepMother.new
|
18
|
+
$step_mother.log = Logger.new(File.open('/dev/null', 'w'))
|
19
|
+
steps_file = File.expand_path('../../../example/cucumber/webrat_compatible_steps.rb', __FILE__)
|
20
|
+
$step_mother.load_code_file(steps_file)
|
21
|
+
|
22
|
+
ruby = $step_mother.load_programming_language('rb')
|
23
|
+
ruby.build_rb_world_factory([PathTo], lambda { Steam::Session.new($browser) })
|
24
|
+
ruby.send(:create_world)
|
25
|
+
ruby.send(:extend_world)
|
26
|
+
|
27
|
+
class WebratCompatStepsTest < Test::Unit::TestCase
|
28
|
+
def setup
|
29
|
+
@browser = $browser
|
30
|
+
end
|
31
|
+
|
32
|
+
def invoke(step)
|
33
|
+
$step_mother.invoke(step)
|
34
|
+
end
|
35
|
+
|
36
|
+
def response
|
37
|
+
$browser.response
|
38
|
+
end
|
39
|
+
|
40
|
+
def title
|
41
|
+
$browser.page.getTitleText
|
42
|
+
end
|
43
|
+
|
44
|
+
def locate(*args)
|
45
|
+
$browser.locate(*args)
|
46
|
+
end
|
47
|
+
|
48
|
+
test 'I go to page' do
|
49
|
+
mock :get, path_to('foo'), 'FOO'
|
50
|
+
invoke 'I go to foo'
|
51
|
+
assert_match 'FOO', response.body
|
52
|
+
end
|
53
|
+
|
54
|
+
test 'I press "button"' do
|
55
|
+
perform :get, path_to('foo'), %(<input type="button" id="button" onclick="document.title='OK'">)
|
56
|
+
invoke 'I press "button"'
|
57
|
+
assert_match 'OK', title
|
58
|
+
end
|
59
|
+
|
60
|
+
test 'I click on "button"' do
|
61
|
+
perform :get, path_to('foo'), %(<input type="button" id="button" onclick="document.title='OK'">)
|
62
|
+
invoke 'I click on "button"'
|
63
|
+
assert_match 'OK', title
|
64
|
+
end
|
65
|
+
|
66
|
+
test 'I follow "link"' do
|
67
|
+
perform :get, path_to('foo'), %(<a href="javascript:document.title='OK'">link</a>)
|
68
|
+
invoke 'I follow "link"'
|
69
|
+
assert_match 'OK', title
|
70
|
+
end
|
71
|
+
|
72
|
+
test 'I follow "link" within "foo"' do
|
73
|
+
perform :get, path_to('foo'), %(<a>link</a><div id="foo"><a href="javascript:document.title='OK'">link</a></div>)
|
74
|
+
invoke 'I follow "link" within "#foo"'
|
75
|
+
assert_match 'OK', title
|
76
|
+
end
|
77
|
+
|
78
|
+
test 'I fill in "foo" with "OK"' do
|
79
|
+
perform :get, path_to('foo'), %(<input type="text" name="foo" value="bar">)
|
80
|
+
invoke 'I fill in "foo" with "OK"'
|
81
|
+
assert_match 'OK', locate(:input).attribute('value')
|
82
|
+
end
|
83
|
+
|
84
|
+
test 'I fill in "foo" for "OK"' do
|
85
|
+
perform :get, path_to('foo'), %(<input type="text" name="foo" value="bar">)
|
86
|
+
invoke 'I fill in "OK" for "foo"'
|
87
|
+
assert_match 'OK', locate(:input).attribute('value')
|
88
|
+
end
|
89
|
+
|
90
|
+
# TODO
|
91
|
+
# When /^(?:|I )fill in the following:$/ do |fields|
|
92
|
+
# fields.rows_hash.each do |name, value|
|
93
|
+
# When %{I fill in "#{name}" with "#{value}"}
|
94
|
+
# end
|
95
|
+
# end
|
96
|
+
|
97
|
+
test 'I select "OK" from "foo"' do
|
98
|
+
perform :get, path_to('foo'), %(<select name="foo"><option>bar</option><option>OK</option></select>)
|
99
|
+
invoke 'I select "OK" from "foo"'
|
100
|
+
assert_equal 'OK', locate(:select).value
|
101
|
+
end
|
102
|
+
|
103
|
+
# TODO
|
104
|
+
# # When I select "December 25, 2008 10:00" as the date and time
|
105
|
+
# When /^(?:|I )select "([^\"]*)" as the date and time$/ do |time|
|
106
|
+
# select_datetime(time)
|
107
|
+
# end
|
108
|
+
#
|
109
|
+
# When /^(?:|I )select "([^\"]*)" as the "([^\"]*)" date and time$/ do |datetime, select|
|
110
|
+
# select_datetime(datetime, :from => select)
|
111
|
+
# end
|
112
|
+
#
|
113
|
+
# # Note: Rail's default time helper provides 24-hour time-- not 12 hour time. Webrat
|
114
|
+
# # will convert the 2:20PM to 14:20 and then select it.
|
115
|
+
# When /^(?:|I )select "([^\"]*)" as the time$/ do |time|
|
116
|
+
# select_time(time)
|
117
|
+
# end
|
118
|
+
#
|
119
|
+
# # When I select "7:30AM" as the "Gym" time
|
120
|
+
# When /^(?:|I )select "([^\"]*)" as the "([^\"]*)" time$/ do |time, time_label|
|
121
|
+
# select_time(time, :from => time_label)
|
122
|
+
# end
|
123
|
+
#
|
124
|
+
# # When I select "February 20, 1981" as the date
|
125
|
+
# When /^(?:|I )select "([^\"]*)" as the date$/ do |date|
|
126
|
+
# # reformat_date!(date)
|
127
|
+
# select_date(date)
|
128
|
+
# end
|
129
|
+
#
|
130
|
+
# # When I select "April 26, 1982" as the "Date of Birth" date
|
131
|
+
# When /^(?:|I )select "([^\"]*)" as the "([^\"]*)" date$/ do |date, date_label|
|
132
|
+
# # reformat_date!(date)
|
133
|
+
# select_date(date, :from => date_label)
|
134
|
+
# end
|
135
|
+
|
136
|
+
test 'I check "foo"' do
|
137
|
+
perform :get, path_to('foo'), %(<input type="checkbox" name="foo">)
|
138
|
+
invoke 'I check "foo"'
|
139
|
+
assert_equal 'checked', locate(:input, :type => 'checkbox').checked
|
140
|
+
end
|
141
|
+
|
142
|
+
test 'I uncheck "foo"' do
|
143
|
+
perform :get, path_to('foo'), %(<input type="checkbox" name="foo" checked="checked">)
|
144
|
+
invoke 'I uncheck "foo"'
|
145
|
+
assert_nil locate(:check_box).checked
|
146
|
+
end
|
147
|
+
|
148
|
+
test 'I choose "foo"' do
|
149
|
+
perform :get, path_to('foo'), %(<input type="radio" name="foo">)
|
150
|
+
invoke 'I choose "foo"'
|
151
|
+
assert_equal 'checked', locate(:radio_button).checked
|
152
|
+
end
|
153
|
+
|
154
|
+
test 'I attach the file at "path" to "foo"' do
|
155
|
+
perform :get, path_to('foo'), %(<input type="file" name="foo">)
|
156
|
+
invoke 'I attach the file at "path" to "foo"'
|
157
|
+
assert_equal 'path', locate(:file).value
|
158
|
+
end
|
159
|
+
|
160
|
+
# I should see
|
161
|
+
|
162
|
+
test 'I should see "foo" (passes)' do
|
163
|
+
perform :get, path_to('foo'), %(foo)
|
164
|
+
assert_passes { invoke 'I should see "foo"' }
|
165
|
+
end
|
166
|
+
|
167
|
+
test 'I should see "foo" (fails)' do
|
168
|
+
perform :get, path_to('foo'), %(bar)
|
169
|
+
assert_fails { invoke 'I should see "foo"' }
|
170
|
+
end
|
171
|
+
|
172
|
+
test 'I should see /foo/ (passes)' do
|
173
|
+
perform :get, path_to('foo'), %(foo)
|
174
|
+
assert_passes { invoke 'I should see /foo/' }
|
175
|
+
end
|
176
|
+
|
177
|
+
test 'I should see /foo/ (fails)' do
|
178
|
+
perform :get, path_to('foo'), %(bar)
|
179
|
+
assert_fails { invoke 'I should see /foo/' }
|
180
|
+
end
|
181
|
+
|
182
|
+
# I should not see
|
183
|
+
|
184
|
+
test 'I should not see "foo" (passes)' do
|
185
|
+
perform :get, path_to('foo'), %(bar)
|
186
|
+
assert_passes { invoke 'I should not see "foo"' }
|
187
|
+
end
|
188
|
+
|
189
|
+
test 'I should not see "foo" (fails)' do
|
190
|
+
perform :get, path_to('foo'), %(foo)
|
191
|
+
assert_fails { invoke 'I should not see "foo"' }
|
192
|
+
end
|
193
|
+
|
194
|
+
test 'I should not see /foo/ (passes)' do
|
195
|
+
perform :get, path_to('foo'), %(bar)
|
196
|
+
assert_passes { invoke 'I should not see /foo/' }
|
197
|
+
end
|
198
|
+
|
199
|
+
test 'I should not see /foo/ (fails)' do
|
200
|
+
perform :get, path_to('foo'), %(foo)
|
201
|
+
assert_fails { invoke 'I should not see /foo/' }
|
202
|
+
end
|
203
|
+
|
204
|
+
# I should see within
|
205
|
+
|
206
|
+
test 'I should see "bar" within "foo" (passes)' do
|
207
|
+
perform :get, path_to('foo'), %(<div id="foo"><span>bar</span></div>)
|
208
|
+
assert_passes { invoke 'I should see "bar" within "#foo"' }
|
209
|
+
end
|
210
|
+
|
211
|
+
test 'I should see "bar" within "foo" (fails)' do
|
212
|
+
perform :get, path_to('foo'), %(<div id="foo"></div><span>bar</span>)
|
213
|
+
assert_fails { invoke 'I should see "bar" within "#foo"' }
|
214
|
+
end
|
215
|
+
|
216
|
+
test 'I should see /bar/ within "foo" (passes)' do
|
217
|
+
perform :get, path_to('foo'), %(<div id="foo"><span>foobar</span></div>)
|
218
|
+
assert_passes { invoke 'I should see /bar/ within "#foo"' }
|
219
|
+
end
|
220
|
+
|
221
|
+
test 'I should see /bar/ within "foo" (fails)' do
|
222
|
+
perform :get, path_to('foo'), %(<div id="foo"></div><span>foobar</span>)
|
223
|
+
assert_fails { invoke 'I should see /bar/ within "#foo"' }
|
224
|
+
end
|
225
|
+
|
226
|
+
# I should not see within
|
227
|
+
|
228
|
+
test 'I should not see "bar" within "foo" (passes)' do
|
229
|
+
perform :get, path_to('foo'), %(<div id="foo"></div><span>bar</span>)
|
230
|
+
assert_passes { invoke 'I should not see "bar" within "#foo"' }
|
231
|
+
end
|
232
|
+
|
233
|
+
test 'I should not see "bar" within "foo" (fails)' do
|
234
|
+
perform :get, path_to('foo'), %(<div id="foo"><span>bar</span></div>)
|
235
|
+
assert_fails { invoke 'I should not see "bar" within "#foo"' }
|
236
|
+
end
|
237
|
+
|
238
|
+
test 'I should not see /bar/ within "foo" (passes)' do
|
239
|
+
perform :get, path_to('foo'), %(<div id="foo"></div><span>bar</span>)
|
240
|
+
assert_passes { invoke 'I should not see /bar/ within "#foo"' }
|
241
|
+
end
|
242
|
+
|
243
|
+
test 'I should not see /bar/ within "foo" (fails)' do
|
244
|
+
perform :get, path_to('foo'), %(<div id="foo"><span>foobar</span></div>)
|
245
|
+
assert_fails { invoke 'I should not see /bar/ within "#foo"' }
|
246
|
+
end
|
247
|
+
|
248
|
+
# field should contain
|
249
|
+
|
250
|
+
test 'the "foo" field should contain "bar" (passes)' do
|
251
|
+
perform :get, path_to('foo'), %(<input type="text" name="foo" value="bar">)
|
252
|
+
assert_passes { invoke 'the "foo" field should contain "bar"' }
|
253
|
+
end
|
254
|
+
|
255
|
+
test 'the "foo" field should contain "bar" (fails)' do
|
256
|
+
perform :get, path_to('foo'), %(<input type="text" name="foo" value="foo">)
|
257
|
+
assert_fails { invoke 'the "foo" field should contain "bar"' }
|
258
|
+
end
|
259
|
+
|
260
|
+
# field should not contain
|
261
|
+
|
262
|
+
test 'the "foo" field should not contain "bar" (passes)' do
|
263
|
+
perform :get, path_to('foo'), %(<input type="text" name="foo" value="foo">)
|
264
|
+
assert_passes { invoke 'the "foo" field should not contain "bar"' }
|
265
|
+
end
|
266
|
+
|
267
|
+
test 'the "foo" field should not contain "bar" (fails)' do
|
268
|
+
perform :get, path_to('foo'), %(<input type="text" name="foo" value="bar">)
|
269
|
+
assert_fails { invoke 'the "foo" field should not contain "bar"' }
|
270
|
+
end
|
271
|
+
|
272
|
+
# checkbox should be checked
|
273
|
+
|
274
|
+
test 'the "foo" checkbox should be checked (passes)' do
|
275
|
+
perform :get, path_to('foo'), %(<input type="checkbox" name="foo" checked="checked">)
|
276
|
+
assert_passes { invoke 'the "foo" checkbox should be checked' }
|
277
|
+
end
|
278
|
+
|
279
|
+
test 'the "foo" checkbox should be checked (fails)' do
|
280
|
+
perform :get, path_to('foo'), %(<input type="checkbox" name="foo">)
|
281
|
+
assert_fails { invoke 'the "foo" checkbox should be checked' }
|
282
|
+
end
|
283
|
+
|
284
|
+
# checkbox should not be checked
|
285
|
+
|
286
|
+
test 'the "foo" checkbox should not be checked (passes)' do
|
287
|
+
perform :get, path_to('foo'), %(<input type="checkbox" name="foo">)
|
288
|
+
assert_passes { invoke 'the "foo" checkbox should not be checked' }
|
289
|
+
end
|
290
|
+
|
291
|
+
test 'the "foo" checkbox should not be checked (fails)' do
|
292
|
+
perform :get, path_to('foo'), %(<input type="checkbox" name="foo" checked="checked">)
|
293
|
+
assert_fails { invoke 'the "foo" checkbox should not be checked' }
|
294
|
+
end
|
295
|
+
|
296
|
+
# I should be on
|
297
|
+
|
298
|
+
test 'I should be on foo (passes)' do
|
299
|
+
perform :get, path_to('foo'), ''
|
300
|
+
assert_passes { invoke 'I should be on foo' }
|
301
|
+
end
|
302
|
+
|
303
|
+
test 'I should be on foo (fails)' do
|
304
|
+
perform :get, path_to('bar'), ''
|
305
|
+
assert_fails { invoke 'I should be on foo' }
|
306
|
+
end
|
307
|
+
end
|
@@ -6,10 +6,10 @@ include Steam
|
|
6
6
|
|
7
7
|
Steam.config[:html_unit][:java_path] = File.expand_path("../../lib/htmlunit-2.7/", __FILE__)
|
8
8
|
|
9
|
-
@
|
9
|
+
@connection = Connection::Mock.new
|
10
10
|
root = File.expand_path("../fixtures/public", __FILE__)
|
11
11
|
static = Connection::Static.new(:root => root, :urls => %w(/ /javascripts /stylesheets))
|
12
|
-
@browser = Browser::HtmlUnit.new(Rack::Cascade.new([static, @
|
12
|
+
@browser = Browser::HtmlUnit.new(Rack::Cascade.new([static, @connection]))
|
13
13
|
|
14
14
|
def drag_to(target)
|
15
15
|
@browser.page.executeJavaScript('$("#log").text("")')
|
data/test/playground/drb.rb
CHANGED
@@ -37,14 +37,14 @@ connection = nil
|
|
37
37
|
url = 'http://localhost:3000'
|
38
38
|
|
39
39
|
def request_without_drb(browser, url)
|
40
|
-
browser.
|
40
|
+
browser.get(url)
|
41
41
|
browser.response
|
42
42
|
end
|
43
43
|
|
44
44
|
def request_with_drb(browser, url)
|
45
45
|
DRb.start_service(Steam.config[:drb_uri], browser)
|
46
46
|
drb = DRbObject.new(nil, Steam.config[:drb_uri])
|
47
|
-
drb.
|
47
|
+
drb.get(url)
|
48
48
|
drb.response
|
49
49
|
end
|
50
50
|
|
@@ -52,6 +52,6 @@ puts page.getTitleText
|
|
52
52
|
# browser = Browser::HtmlUnit.new(mock)
|
53
53
|
# # client.setWebConnection(Rjb::bind(connection, 'com.gargoylesoftware.htmlunit.WebConnection'))
|
54
54
|
#
|
55
|
-
# response = browser.
|
55
|
+
# response = browser.get('http://localhost:3000/').last
|
56
56
|
# puts browser.page.asXml
|
57
57
|
|
data/test/process_test.rb
CHANGED
@@ -20,12 +20,12 @@ class ProcessTest < Test::Unit::TestCase
|
|
20
20
|
end
|
21
21
|
|
22
22
|
test "new instance recalls an existing pid" do
|
23
|
-
write_pid(
|
24
|
-
assert_equal
|
23
|
+
write_pid(::Process.pid)
|
24
|
+
assert_equal ::Process.pid, Process.new.pid
|
25
25
|
end
|
26
26
|
|
27
27
|
test "pid? returns true if pid was recalled" do
|
28
|
-
write_pid(
|
28
|
+
write_pid(::Process.pid)
|
29
29
|
assert_equal true, Process.new.pid?
|
30
30
|
end
|
31
31
|
|
data/test/session_test.rb
CHANGED
@@ -1,15 +1,40 @@
|
|
1
|
-
require File.expand_path(
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
2
|
|
3
3
|
class SessionTest < Test::Unit::TestCase
|
4
4
|
include Steam
|
5
5
|
|
6
6
|
def setup
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
@browser = Browser::HtmlUnit.new(Connection::Mock.new)
|
8
|
+
@session = Session.new(@browser)
|
9
|
+
|
10
|
+
perform(:get, 'http://localhost:3000/', '<div id="foo"><div id="bar"><a id="buz" href="">bar!</a></div></div>')
|
11
|
+
end
|
12
|
+
|
13
|
+
test 'session responds to browser methods' do
|
14
|
+
assert @session.respond_to?(:response)
|
15
|
+
end
|
16
|
+
|
17
|
+
test 'assert_contain' do
|
18
|
+
@session.assert_contain(@session.response.body, 'bar!')
|
19
|
+
end
|
20
|
+
|
21
|
+
test 'assert_not_contain' do
|
22
|
+
@session.assert_not_contain(@session.response.body, 'bar!!')
|
23
|
+
end
|
24
|
+
|
25
|
+
test 'assert_have_tag' do
|
26
|
+
@session.assert_have_tag(@session.response.body, :a, 'bar!', :id => 'buz')
|
27
|
+
end
|
28
|
+
|
29
|
+
test 'assert_have_no_tag' do
|
30
|
+
@session.assert_have_no_tag(@session.response.body, :a, 'bar!', :class => 'buz')
|
31
|
+
end
|
32
|
+
|
33
|
+
test 'assert_have_xpath' do
|
34
|
+
@session.assert_have_xpath(@session.response.body, '//div/a[@id="buz"]')
|
10
35
|
end
|
11
36
|
|
12
|
-
|
13
|
-
|
37
|
+
test 'assert_have_no_xpath' do
|
38
|
+
@session.assert_have_no_xpath(@session.response.body, '//div/a[@class="buz"]')
|
14
39
|
end
|
15
40
|
end
|
data/test/test_helper.rb
CHANGED
@@ -42,8 +42,14 @@ end
|
|
42
42
|
class Test::Unit::TestCase
|
43
43
|
include TestMethod
|
44
44
|
|
45
|
+
def mock(method, url, response)
|
46
|
+
connection = @browser.connection
|
47
|
+
connection = connection.apps.last if connection.is_a?(Rack::Cascade)
|
48
|
+
connection.mock(method, url, response)
|
49
|
+
end
|
50
|
+
|
45
51
|
def perform(method, url, response)
|
46
|
-
|
52
|
+
mock(method, url, response)
|
47
53
|
@status, @headers, @response = @browser.call(Steam::Request.env_for(url))
|
48
54
|
end
|
49
55
|
|
@@ -53,4 +59,22 @@ class Test::Unit::TestCase
|
|
53
59
|
assert_equal 200, response.status
|
54
60
|
assert_match %r(<#{tag_name}>\s*#{text}\s*<\/#{tag_name}>), response.body
|
55
61
|
end
|
62
|
+
|
63
|
+
def assert_passes
|
64
|
+
begin
|
65
|
+
yield
|
66
|
+
rescue Test::Unit::AssertionFailedError => e
|
67
|
+
ensure
|
68
|
+
assert_nil e
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def assert_fails
|
73
|
+
begin
|
74
|
+
yield
|
75
|
+
rescue Test::Unit::AssertionFailedError => e
|
76
|
+
ensure
|
77
|
+
assert_not_nil e
|
78
|
+
end
|
79
|
+
end
|
56
80
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: steam
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sven Fuchs
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2010-02-
|
13
|
+
date: 2010-02-28 00:00:00 +01:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -61,7 +61,6 @@ files:
|
|
61
61
|
- lib/steam/browser/html_unit/client.rb
|
62
62
|
- lib/steam/browser/html_unit/connection.rb
|
63
63
|
- lib/steam/browser/html_unit/drb.rb
|
64
|
-
- lib/steam/browser/html_unit/matchers.rb
|
65
64
|
- lib/steam/browser/html_unit/page.rb
|
66
65
|
- lib/steam/browser/html_unit/web_response.rb
|
67
66
|
- lib/steam/connection.rb
|
@@ -115,6 +114,7 @@ test_files:
|
|
115
114
|
- test/connection/mock_test.rb
|
116
115
|
- test/connection/rails_test.rb
|
117
116
|
- test/connection/static_test.rb
|
117
|
+
- test/example/webrat_compat_steps_test.rb
|
118
118
|
- test/fixtures/html_fakes.rb
|
119
119
|
- test/java_test.rb
|
120
120
|
- test/playground/connection.rb
|
@@ -1,57 +0,0 @@
|
|
1
|
-
# module Steam
|
2
|
-
# module HtmlUnit
|
3
|
-
# module Matchers
|
4
|
-
# class HasContent #:nodoc:
|
5
|
-
# def initialize(content)
|
6
|
-
# @content = content
|
7
|
-
# end
|
8
|
-
#
|
9
|
-
# def matches?(target)
|
10
|
-
# @target = target
|
11
|
-
# !!@target.locate_element(@content)
|
12
|
-
# end
|
13
|
-
#
|
14
|
-
# def failure_message
|
15
|
-
# "expected the following element's content to #{content_message}:\n#{squeeze_space(@target.page.body)}"
|
16
|
-
# end
|
17
|
-
#
|
18
|
-
# def negative_failure_message
|
19
|
-
# "expected the following element's content to not #{content_message}:\n#{squeeze_space(@target.page.body)}"
|
20
|
-
# end
|
21
|
-
#
|
22
|
-
# def squeeze_space(inner_text)
|
23
|
-
# (inner_text || '').gsub(/^\s*$/, "").squeeze("\n")
|
24
|
-
# end
|
25
|
-
#
|
26
|
-
# def content_message
|
27
|
-
# case @content
|
28
|
-
# when String
|
29
|
-
# "include \"#{@content}\""
|
30
|
-
# when Regexp
|
31
|
-
# "match #{@content.inspect}"
|
32
|
-
# end
|
33
|
-
# end
|
34
|
-
# end
|
35
|
-
#
|
36
|
-
# # Matches the contents of an HTML document with
|
37
|
-
# # whatever string is supplied
|
38
|
-
# def contain(content)
|
39
|
-
# HasContent.new(content)
|
40
|
-
# end
|
41
|
-
#
|
42
|
-
# # Asserts that the body of the response contain
|
43
|
-
# # the supplied string or regexp
|
44
|
-
# def assert_contain(content)
|
45
|
-
# hc = HasContent.new(content)
|
46
|
-
# assert hc.matches?(response.body), hc.failure_message
|
47
|
-
# end
|
48
|
-
#
|
49
|
-
# # Asserts that the body of the response
|
50
|
-
# # does not contain the supplied string or regepx
|
51
|
-
# def assert_not_contain(content)
|
52
|
-
# hc = HasContent.new(content)
|
53
|
-
# assert !hc.matches?(response.body), hc.negative_failure_message
|
54
|
-
# end
|
55
|
-
# end
|
56
|
-
# end
|
57
|
-
# end
|