steam 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +21 -0
- data/README.textile +91 -0
- data/Rakefile +23 -0
- data/TODO +7 -0
- data/lib/core_ext/ruby/array/flatten_once.rb +9 -0
- data/lib/core_ext/ruby/hash/except.rb +11 -0
- data/lib/core_ext/ruby/hash/slice.rb +14 -0
- data/lib/core_ext/ruby/kernel/silence_warnings.rb +8 -0
- data/lib/core_ext/ruby/process/daemon.rb +23 -0
- data/lib/core_ext/ruby/string/camelize.rb +5 -0
- data/lib/core_ext/ruby/string/underscore.rb +5 -0
- data/lib/steam.rb +43 -0
- data/lib/steam/browser.rb +24 -0
- data/lib/steam/browser/html_unit.rb +87 -0
- data/lib/steam/browser/html_unit/actions.rb +176 -0
- data/lib/steam/browser/html_unit/client.rb +74 -0
- data/lib/steam/browser/html_unit/connection.rb +79 -0
- data/lib/steam/browser/html_unit/drb.rb +45 -0
- data/lib/steam/browser/html_unit/matchers.rb +57 -0
- data/lib/steam/browser/html_unit/page.rb +51 -0
- data/lib/steam/browser/html_unit/web_response.rb +116 -0
- data/lib/steam/connection.rb +9 -0
- data/lib/steam/connection/mock.rb +57 -0
- data/lib/steam/connection/net_http.rb +42 -0
- data/lib/steam/connection/open_uri.rb +24 -0
- data/lib/steam/connection/rails.rb +20 -0
- data/lib/steam/connection/static.rb +33 -0
- data/lib/steam/java.rb +74 -0
- data/lib/steam/process.rb +53 -0
- data/lib/steam/request.rb +49 -0
- data/lib/steam/response.rb +13 -0
- data/lib/steam/session.rb +30 -0
- data/lib/steam/session/rails.rb +33 -0
- data/lib/steam/version.rb +3 -0
- data/test/all.rb +3 -0
- data/test/browser/html_unit/actions_test.rb +183 -0
- data/test/browser/html_unit/javascript_test.rb +60 -0
- data/test/browser/html_unit/rails_actions_test.rb +151 -0
- data/test/browser/html_unit_test.rb +97 -0
- data/test/connection/cascade_test.rb +42 -0
- data/test/connection/mock_test.rb +58 -0
- data/test/connection/rails_test.rb +16 -0
- data/test/connection/static_test.rb +14 -0
- data/test/fixtures/html_fakes.rb +191 -0
- data/test/java_test.rb +29 -0
- data/test/playground/connection.rb +19 -0
- data/test/playground/dragdrop_behavior.rb +60 -0
- data/test/playground/drb.rb +55 -0
- data/test/playground/java_signature.rb +22 -0
- data/test/playground/nokogiri.rb +15 -0
- data/test/playground/put_headers.rb +83 -0
- data/test/playground/rack.rb +11 -0
- data/test/playground/rjb_bind.rb +42 -0
- data/test/playground/stack_level_problem.rb +129 -0
- data/test/playground/thread_problem.rb +57 -0
- data/test/playground/web_response_data.rb +21 -0
- data/test/playground/webrat.rb +48 -0
- data/test/playground/xhr_accept_headers.rb +61 -0
- data/test/process_test.rb +55 -0
- data/test/session_test.rb +15 -0
- data/test/test_helper.rb +56 -0
- metadata +135 -0
@@ -0,0 +1,57 @@
|
|
1
|
+
# require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
$: << File.expand_path(File.dirname(__FILE__) + "/../../lib")
|
4
|
+
require 'steam'
|
5
|
+
include Steam
|
6
|
+
|
7
|
+
Java.import 'com.gargoylesoftware.htmlunit.WebClient'
|
8
|
+
Java.import 'com.gargoylesoftware.htmlunit.BrowserVersion'
|
9
|
+
Java.import 'com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException'
|
10
|
+
|
11
|
+
page = <<-erb
|
12
|
+
<html>
|
13
|
+
<head>
|
14
|
+
<script>
|
15
|
+
document.title = 'pre ajax call';
|
16
|
+
function some_ajax(url) {
|
17
|
+
http = new XMLHttpRequest();
|
18
|
+
http.open("GET", url, true);
|
19
|
+
http.onreadystatechange = function() {
|
20
|
+
document.title = document.title + ' ' + http.readyState
|
21
|
+
if(http.readyState == 4) document.title = http.responseText
|
22
|
+
}
|
23
|
+
http.send(null);
|
24
|
+
}
|
25
|
+
some_ajax('/ajax/1');
|
26
|
+
// some_ajax('/ajax/2');
|
27
|
+
</script>
|
28
|
+
</head>
|
29
|
+
</html>
|
30
|
+
erb
|
31
|
+
|
32
|
+
client = Java::WebClient.new(Java::BrowserVersion.FIREFOX_3)
|
33
|
+
client.setCssEnabled(true)
|
34
|
+
client.setJavaScriptEnabled(true)
|
35
|
+
|
36
|
+
mock = Connection::Mock.new
|
37
|
+
mock.mock :get, 'http://localhost:3000/', page
|
38
|
+
mock.mock :get, 'http://localhost:3000/ajax/1', 'post ajax call 1!', 'Content-Type' => 'application/javascript'
|
39
|
+
# mock.mock :get, 'http://localhost:3000/ajax/2', 'post ajax call 2!', 'Content-Type' => 'application/javascript'
|
40
|
+
|
41
|
+
connection = Browser::HtmlUnit::Connection.new(mock)
|
42
|
+
client.setWebConnection(Rjb::bind(connection, 'com.gargoylesoftware.htmlunit.WebConnection'))
|
43
|
+
|
44
|
+
page = client.getPage('http://localhost:3000/')
|
45
|
+
puts page.asXml
|
46
|
+
puts page.getTitleText
|
47
|
+
|
48
|
+
# mock = Connection::Mock.new
|
49
|
+
# mock.mock :get, 'http://localhost:3000/', page
|
50
|
+
# mock.mock :get, 'http://localhost:3000/ajax', 'post ajax call!', 'Content-Type' => 'application/javascript'
|
51
|
+
#
|
52
|
+
# browser = Browser::HtmlUnit.new(mock)
|
53
|
+
# # client.setWebConnection(Rjb::bind(connection, 'com.gargoylesoftware.htmlunit.WebConnection'))
|
54
|
+
#
|
55
|
+
# response = browser.request('http://localhost:3000/').last
|
56
|
+
# puts browser.page.asXml
|
57
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rjb'
|
3
|
+
|
4
|
+
class_path = Dir[File.expand_path(File.dirname(__FILE__) + '/../../lib/htmlunit') + '/*.jar'].join(':')
|
5
|
+
Rjb::load(class_path)
|
6
|
+
|
7
|
+
|
8
|
+
# klass = Rjb::import('java.lang.String')
|
9
|
+
Arrays = Rjb::import('java.util.Arrays')
|
10
|
+
WebResponseData = Rjb::import('com.gargoylesoftware.htmlunit.WebResponseData')
|
11
|
+
|
12
|
+
# WebResponseData.getConstructors.each do |method|
|
13
|
+
# params = method.getParameterTypes.map { |type| type.getName }.join(', ')
|
14
|
+
# puts "#{method.getName}(#{params})"
|
15
|
+
# end
|
16
|
+
|
17
|
+
headers = Arrays.asList([])
|
18
|
+
|
19
|
+
# com.gargoylesoftware.htmlunit.WebResponseData([B, int, java.lang.String, java.util.List)
|
20
|
+
signature = '[B;I;Ljava.lang.String;Ljava.util.List;'
|
21
|
+
WebResponseData.new_with_sig(signature, 'foo'.split(/./), 1, "", headers)
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'webrat'
|
3
|
+
|
4
|
+
|
5
|
+
class Browser
|
6
|
+
include Webrat::Locators
|
7
|
+
|
8
|
+
class Cache
|
9
|
+
def elements
|
10
|
+
@elements ||= {}
|
11
|
+
end
|
12
|
+
|
13
|
+
def clear
|
14
|
+
@elements.clear
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
@cache = Cache.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def find_link(text_or_title_or_id)
|
23
|
+
element = LinkLocator.new(@cache, dom, text_or_title_or_id).locate!
|
24
|
+
end
|
25
|
+
|
26
|
+
def dom
|
27
|
+
Webrat::XML.xml_document(html)
|
28
|
+
end
|
29
|
+
|
30
|
+
def html
|
31
|
+
<<-html
|
32
|
+
<html>
|
33
|
+
<head>
|
34
|
+
</head>
|
35
|
+
<body>
|
36
|
+
<a href="/">Home</a>
|
37
|
+
<p>Welcome!</p>
|
38
|
+
<p>Click here to <a href="/foo">foo</a>.</p>
|
39
|
+
</body>
|
40
|
+
</html>
|
41
|
+
html
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
browser = Browser.new
|
46
|
+
# p Webrat::XML.xpath_to(browser.find_link_element('foo'))
|
47
|
+
p browser.find_link('foo').path
|
48
|
+
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rjb'
|
3
|
+
|
4
|
+
class_path = Dir[File.expand_path(File.dirname(__FILE__) + '/../../lib/htmlunit') + '/*.jar'].join(':')
|
5
|
+
|
6
|
+
Rjb::load(class_path)
|
7
|
+
|
8
|
+
Url = Rjb::import('java.net.URL')
|
9
|
+
WebClient = Rjb::import('com.gargoylesoftware.htmlunit.WebClient')
|
10
|
+
HtmlUnitMockWebConnection = Rjb::import('com.gargoylesoftware.htmlunit.MockWebConnection')
|
11
|
+
|
12
|
+
class MockConnection
|
13
|
+
attr_reader :connection
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@connection = HtmlUnitMockWebConnection.new
|
17
|
+
end
|
18
|
+
|
19
|
+
def method_missing(method, *args)
|
20
|
+
p [method, args.first.toString]
|
21
|
+
@connection.send(method, *args)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
connection = MockConnection.new
|
26
|
+
# connection = HtmlUnitMockWebConnection.new
|
27
|
+
|
28
|
+
content = <<-html
|
29
|
+
<html>
|
30
|
+
<head>
|
31
|
+
<script>
|
32
|
+
document.title = 'pre ajax call';
|
33
|
+
function some_ajax(url) {
|
34
|
+
xhr = new XMLHttpRequest();
|
35
|
+
xhr.open("GET", url, true);
|
36
|
+
xhr.setRequestHeader("Accept", "application/json, text/javascript, */*");
|
37
|
+
xhr.onreadystatechange = function() {
|
38
|
+
document.title = document.title + ' ' + xhr.readyState
|
39
|
+
if(xhr.readyState == 4) document.title = xhr.responseText
|
40
|
+
}
|
41
|
+
xhr.send(null);
|
42
|
+
}
|
43
|
+
some_ajax('/ajax/1');
|
44
|
+
</script>
|
45
|
+
</head>
|
46
|
+
</html>
|
47
|
+
html
|
48
|
+
url = Url.new('http://localhost:3000/foo')
|
49
|
+
connection.setResponse(url, content, 'text/html')
|
50
|
+
|
51
|
+
content = 'document.title = "FOO";'
|
52
|
+
url = Url.new('http://localhost:3000/ajax/1')
|
53
|
+
connection.setResponse(url, content, 'application/javascript')
|
54
|
+
|
55
|
+
client = WebClient.new
|
56
|
+
client.setCssEnabled(true)
|
57
|
+
client.setJavaScriptEnabled(true)
|
58
|
+
client.setWebConnection(Rjb::bind(connection, 'com.gargoylesoftware.htmlunit.WebConnection'))
|
59
|
+
# client.setWebConnection(connection)
|
60
|
+
page = client.getPage('http://localhost:3000/foo')
|
61
|
+
# puts page.asXml
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
class ProcessTest < Test::Unit::TestCase
|
4
|
+
include Steam
|
5
|
+
|
6
|
+
def setup
|
7
|
+
delete_pid
|
8
|
+
end
|
9
|
+
|
10
|
+
def teardown
|
11
|
+
delete_pid
|
12
|
+
end
|
13
|
+
|
14
|
+
def write_pid(pid)
|
15
|
+
File.open('/tmp/steam.pid', 'w') { |f| f.write(pid) }
|
16
|
+
end
|
17
|
+
|
18
|
+
def delete_pid
|
19
|
+
File.delete('/tmp/steam.pid') rescue Errno::ENOENT
|
20
|
+
end
|
21
|
+
|
22
|
+
test "new instance recalls an existing pid" do
|
23
|
+
write_pid(1234)
|
24
|
+
assert_equal 1234, Process.new.pid
|
25
|
+
end
|
26
|
+
|
27
|
+
test "pid? returns true if pid was recalled" do
|
28
|
+
write_pid(1234)
|
29
|
+
assert_equal true, Process.new.pid?
|
30
|
+
end
|
31
|
+
|
32
|
+
test "pid? returns false if pid could not be recalled" do
|
33
|
+
assert_equal false, Process.new.pid?
|
34
|
+
end
|
35
|
+
|
36
|
+
test "running? returns true if pid refers to an existing process" do
|
37
|
+
write_pid(::Process.pid)
|
38
|
+
assert_equal true, Process.new.running?
|
39
|
+
end
|
40
|
+
|
41
|
+
test "running? returns false if pid does not refer to an existing process" do
|
42
|
+
write_pid(1073741823)
|
43
|
+
assert_equal false, Process.new.running?
|
44
|
+
end
|
45
|
+
|
46
|
+
# # WTF the child process actually writes to /tmp/out.txt but File.read('/tmp/out.txt')
|
47
|
+
# # returns an empty string
|
48
|
+
# test "fork forks the process, reopens given streams and yields the given block" do
|
49
|
+
# File.delete('/tmp/out.txt') rescue Errno::ENOENT
|
50
|
+
# io = File.open('/tmp/out.txt', 'w+')
|
51
|
+
# io.sync = true
|
52
|
+
# Process.new.fork(:out => io) { puts 'foo' }
|
53
|
+
# assert_equal 'foo', File.open('/tmp/out.txt', 'r') { |f| f.read }
|
54
|
+
# end
|
55
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/test_helper')
|
2
|
+
|
3
|
+
class SessionTest < Test::Unit::TestCase
|
4
|
+
include Steam
|
5
|
+
|
6
|
+
def setup
|
7
|
+
connection = Connection::Mock.new
|
8
|
+
browser = Browser::HtmlUnit.new(connection)
|
9
|
+
@session = Session.new(browser)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_session_responds_to_browser_methods
|
13
|
+
assert @session.respond_to?(:call)
|
14
|
+
end
|
15
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'mocha'
|
3
|
+
require 'erb'
|
4
|
+
|
5
|
+
TEST_ROOT = File.expand_path("../", __FILE__)
|
6
|
+
|
7
|
+
$: << File.expand_path("../lib", TEST_ROOT)
|
8
|
+
$: << TEST_ROOT
|
9
|
+
|
10
|
+
FIXTURES_PATH = File.expand_path("../fixtures", __FILE__)
|
11
|
+
|
12
|
+
require 'steam'
|
13
|
+
|
14
|
+
# Steam::Java.import('com.gargoylesoftware.htmlunit.StringWebResponse')
|
15
|
+
# Steam::Java.import('com.gargoylesoftware.htmlunit.WebClient')
|
16
|
+
# Steam::Java.import('com.gargoylesoftware.htmlunit.TopLevelWindow')
|
17
|
+
# Steam::Java.import('com.gargoylesoftware.htmlunit.DefaultPageCreator')
|
18
|
+
|
19
|
+
module TestMethod
|
20
|
+
def self.included(base)
|
21
|
+
base.class_eval do
|
22
|
+
def test(name, &block)
|
23
|
+
test_name = "test_#{name.gsub(/\s+/,'_')}".to_sym
|
24
|
+
defined = instance_method(test_name) rescue false
|
25
|
+
raise "#{test_name} is already defined in #{self}" if defined
|
26
|
+
if block_given?
|
27
|
+
define_method(test_name, &block)
|
28
|
+
else
|
29
|
+
define_method(test_name) do
|
30
|
+
flunk "No implementation provided for #{name}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class Module
|
39
|
+
include TestMethod
|
40
|
+
end
|
41
|
+
|
42
|
+
class Test::Unit::TestCase
|
43
|
+
include TestMethod
|
44
|
+
|
45
|
+
def perform(method, url, response)
|
46
|
+
@app.mock(method, url, response)
|
47
|
+
@status, @headers, @response = @browser.call(Steam::Request.env_for(url))
|
48
|
+
end
|
49
|
+
|
50
|
+
def assert_response_contains(text, options = {})
|
51
|
+
tag_name = options[:in] || 'body'
|
52
|
+
response = yield
|
53
|
+
assert_equal 200, response.status
|
54
|
+
assert_match %r(<#{tag_name}>\s*#{text}\s*<\/#{tag_name}>), response.body
|
55
|
+
end
|
56
|
+
end
|
metadata
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: steam
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sven Fuchs
|
8
|
+
- Clemens Kofler
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2010-02-21 00:00:00 +01:00
|
14
|
+
default_executable:
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: rjb
|
18
|
+
type: :runtime
|
19
|
+
version_requirement:
|
20
|
+
version_requirements: !ruby/object:Gem::Requirement
|
21
|
+
requirements:
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 1.2.0
|
25
|
+
version:
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: locator
|
28
|
+
type: :runtime
|
29
|
+
version_requirement:
|
30
|
+
version_requirements: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 0.0.4
|
35
|
+
version:
|
36
|
+
description: Steam is a headless integration testing tool driving HtmlUnit to enable testing JavaScript-driven web sites.
|
37
|
+
email: svenfuchs@artweb-design.de
|
38
|
+
executables: []
|
39
|
+
|
40
|
+
extensions: []
|
41
|
+
|
42
|
+
extra_rdoc_files:
|
43
|
+
- README.textile
|
44
|
+
- TODO
|
45
|
+
files:
|
46
|
+
- MIT-LICENSE
|
47
|
+
- README.textile
|
48
|
+
- Rakefile
|
49
|
+
- TODO
|
50
|
+
- lib/core_ext/ruby/array/flatten_once.rb
|
51
|
+
- lib/core_ext/ruby/hash/except.rb
|
52
|
+
- lib/core_ext/ruby/hash/slice.rb
|
53
|
+
- lib/core_ext/ruby/kernel/silence_warnings.rb
|
54
|
+
- lib/core_ext/ruby/process/daemon.rb
|
55
|
+
- lib/core_ext/ruby/string/camelize.rb
|
56
|
+
- lib/core_ext/ruby/string/underscore.rb
|
57
|
+
- lib/steam.rb
|
58
|
+
- lib/steam/browser.rb
|
59
|
+
- lib/steam/browser/html_unit.rb
|
60
|
+
- lib/steam/browser/html_unit/actions.rb
|
61
|
+
- lib/steam/browser/html_unit/client.rb
|
62
|
+
- lib/steam/browser/html_unit/connection.rb
|
63
|
+
- lib/steam/browser/html_unit/drb.rb
|
64
|
+
- lib/steam/browser/html_unit/matchers.rb
|
65
|
+
- lib/steam/browser/html_unit/page.rb
|
66
|
+
- lib/steam/browser/html_unit/web_response.rb
|
67
|
+
- lib/steam/connection.rb
|
68
|
+
- lib/steam/connection/mock.rb
|
69
|
+
- lib/steam/connection/net_http.rb
|
70
|
+
- lib/steam/connection/open_uri.rb
|
71
|
+
- lib/steam/connection/rails.rb
|
72
|
+
- lib/steam/connection/static.rb
|
73
|
+
- lib/steam/java.rb
|
74
|
+
- lib/steam/process.rb
|
75
|
+
- lib/steam/request.rb
|
76
|
+
- lib/steam/response.rb
|
77
|
+
- lib/steam/session.rb
|
78
|
+
- lib/steam/session/rails.rb
|
79
|
+
- lib/steam/version.rb
|
80
|
+
has_rdoc: true
|
81
|
+
homepage: http://github.com/svenfuchs/steam
|
82
|
+
licenses: []
|
83
|
+
|
84
|
+
post_install_message:
|
85
|
+
rdoc_options:
|
86
|
+
- --charset=UTF-8
|
87
|
+
require_paths:
|
88
|
+
- lib
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: "0"
|
94
|
+
version:
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: "0"
|
100
|
+
version:
|
101
|
+
requirements: []
|
102
|
+
|
103
|
+
rubyforge_project:
|
104
|
+
rubygems_version: 1.3.5
|
105
|
+
signing_key:
|
106
|
+
specification_version: 3
|
107
|
+
summary: "Headless integration testing w/ HtmlUnit: enables testing JavaScript-driven web sites"
|
108
|
+
test_files:
|
109
|
+
- test/all.rb
|
110
|
+
- test/browser/html_unit/actions_test.rb
|
111
|
+
- test/browser/html_unit/javascript_test.rb
|
112
|
+
- test/browser/html_unit/rails_actions_test.rb
|
113
|
+
- test/browser/html_unit_test.rb
|
114
|
+
- test/connection/cascade_test.rb
|
115
|
+
- test/connection/mock_test.rb
|
116
|
+
- test/connection/rails_test.rb
|
117
|
+
- test/connection/static_test.rb
|
118
|
+
- test/fixtures/html_fakes.rb
|
119
|
+
- test/java_test.rb
|
120
|
+
- test/playground/connection.rb
|
121
|
+
- test/playground/dragdrop_behavior.rb
|
122
|
+
- test/playground/drb.rb
|
123
|
+
- test/playground/java_signature.rb
|
124
|
+
- test/playground/nokogiri.rb
|
125
|
+
- test/playground/put_headers.rb
|
126
|
+
- test/playground/rack.rb
|
127
|
+
- test/playground/rjb_bind.rb
|
128
|
+
- test/playground/stack_level_problem.rb
|
129
|
+
- test/playground/thread_problem.rb
|
130
|
+
- test/playground/web_response_data.rb
|
131
|
+
- test/playground/webrat.rb
|
132
|
+
- test/playground/xhr_accept_headers.rb
|
133
|
+
- test/process_test.rb
|
134
|
+
- test/session_test.rb
|
135
|
+
- test/test_helper.rb
|