fletcherm-culerity 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +6 -0
- data/CHANGES.md +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +102 -0
- data/Rakefile +47 -0
- data/VERSION.yml +5 -0
- data/culerity.gemspec +165 -0
- data/features/fixtures/jquery +4376 -0
- data/features/fixtures/sample_feature +14 -0
- data/features/installing_culerity.feature +36 -0
- data/features/running_cucumber_without_explicitly_running_external_services.feature +23 -0
- data/features/step_definitions/common_steps.rb +175 -0
- data/features/step_definitions/culerity_setup_steps.rb +7 -0
- data/features/step_definitions/jruby_steps.rb +11 -0
- data/features/step_definitions/rails_setup_steps.rb +36 -0
- data/features/support/common.rb +32 -0
- data/features/support/env.rb +24 -0
- data/features/support/matchers.rb +11 -0
- data/init.rb +1 -0
- data/lib/culerity.rb +44 -0
- data/lib/culerity/celerity_server.rb +81 -0
- data/lib/culerity/jruby_runner.rb +13 -0
- data/lib/culerity/remote_browser_proxy.rb +58 -0
- data/lib/culerity/remote_object_proxy.rb +76 -0
- data/rails/init.rb +1 -0
- data/rails_generators/culerity/culerity_generator.rb +28 -0
- data/rails_generators/culerity/templates/config/environments/culerity_continuousintegration.rb +28 -0
- data/rails_generators/culerity/templates/config/environments/culerity_development.rb +17 -0
- data/rails_generators/culerity/templates/features/step_definitions/culerity_steps.rb +109 -0
- data/rails_generators/culerity/templates/features/support/env.rb +9 -0
- data/rails_generators/culerity/templates/lib/tasks/culerity.rake +38 -0
- data/rails_generators/culerity/templates/public/javascripts/culerity.js +27 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/spec/celerity_server_spec.rb +106 -0
- data/spec/culerity_spec.rb +33 -0
- data/spec/jruby_runner_spec.rb +12 -0
- data/spec/remote_browser_proxy_spec.rb +62 -0
- data/spec/remote_object_proxy_spec.rb +63 -0
- data/spec/spec_helper.rb +3 -0
- data/vendor/gems/celerity-0.7.6/HISTORY +111 -0
- data/vendor/gems/celerity-0.7.6/LICENSE +621 -0
- data/vendor/gems/celerity-0.7.6/README.rdoc +80 -0
- data/vendor/gems/celerity-0.7.6/Rakefile +11 -0
- data/vendor/gems/celerity-0.7.6/VERSION.yml +5 -0
- data/vendor/gems/celerity-0.7.6/celerity.gemspec +120 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity.rb +77 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/browser.rb +893 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/clickable_element.rb +73 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/collections.rb +156 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/container.rb +767 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/default_viewer.rb +14 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/disabled_element.rb +40 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/element.rb +298 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/element_collection.rb +107 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/element_locator.rb +159 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/button.rb +54 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/file_field.rb +29 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/form.rb +33 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/frame.rb +86 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/image.rb +89 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/label.rb +16 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/link.rb +43 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/meta.rb +14 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/non_control_elements.rb +116 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/option.rb +38 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/radio_check.rb +114 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/select_list.rb +147 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/table.rb +153 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/table_cell.rb +36 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/table_elements.rb +42 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/table_row.rb +49 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/text_field.rb +168 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/exception.rb +83 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit.rb +64 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/commons-codec-1.4.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/commons-collections-3.2.1.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/commons-httpclient-3.1.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/commons-io-1.4.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/commons-lang-2.4.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/commons-logging-1.1.1.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/cssparser-0.9.5.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/htmlunit-2.7-SNAPSHOT.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/htmlunit-core-js-2.7-SNAPSHOT.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/nekohtml-1.9.14-20091130.152932-3.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/sac-1.3.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/serializer-2.7.1.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/xalan-2.7.1.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/xercesImpl-2.9.1.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/xml-apis-1.3.04.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/identifier.rb +28 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/ignoring_web_connection.rb +15 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/input_element.rb +25 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/javascript_debugger.rb +32 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/listener.rb +143 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/resources/no_viewer.png +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/short_inspect.rb +20 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/util.rb +126 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/version.rb +3 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/viewer_connection.rb +89 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/watir_compatibility.rb +70 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/xpath_support.rb +48 -0
- data/vendor/gems/celerity-0.7.6/tasks/benchmark.rake +4 -0
- data/vendor/gems/celerity-0.7.6/tasks/check.rake +24 -0
- data/vendor/gems/celerity-0.7.6/tasks/clean.rake +3 -0
- data/vendor/gems/celerity-0.7.6/tasks/fix.rake +25 -0
- data/vendor/gems/celerity-0.7.6/tasks/jar.rake +55 -0
- data/vendor/gems/celerity-0.7.6/tasks/jeweler.rake +26 -0
- data/vendor/gems/celerity-0.7.6/tasks/rdoc.rake +4 -0
- data/vendor/gems/celerity-0.7.6/tasks/snapshot.rake +22 -0
- data/vendor/gems/celerity-0.7.6/tasks/spec.rake +26 -0
- data/vendor/gems/celerity-0.7.6/tasks/website.rake +10 -0
- data/vendor/gems/celerity-0.7.6/tasks/yard.rake +16 -0
- data/vendor/jruby/jruby-complete-1.4.0.jar +0 -0
- metadata +194 -0
@@ -0,0 +1,13 @@
|
|
1
|
+
module Culerity
|
2
|
+
class JRubyRunner
|
3
|
+
def self.cmd
|
4
|
+
jruby_complete = "#{File.dirname(__FILE__)}/../../vendor/jruby/jruby-complete-1.4.0.jar"
|
5
|
+
celerity = "#{File.dirname(__FILE__)}/../../vendor/gems/celerity-0.7.6/lib"
|
6
|
+
"java -Xmx500m -Xss1024k -jar #{jruby_complete} -I#{celerity}"
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.run(command_to_run)
|
10
|
+
`#{cmd} #{command_to_run}`
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Culerity
|
2
|
+
|
3
|
+
class RemoteBrowserProxy < RemoteObjectProxy
|
4
|
+
def initialize(io, browser_options = {})
|
5
|
+
@io = io
|
6
|
+
@remote_object_id = "celerity".inspect
|
7
|
+
@remote_object_id = new_browser(browser_options).inspect
|
8
|
+
end
|
9
|
+
|
10
|
+
#
|
11
|
+
# Calls the block until it returns true or +time_to_wait+ is reached.
|
12
|
+
# +time_to_wait+ is 30 seconds by default
|
13
|
+
#
|
14
|
+
# Returns true upon success
|
15
|
+
# Raises Timeout::Error when +time_to_wait+ is reached.
|
16
|
+
#
|
17
|
+
def wait_until time_to_wait=30, &block
|
18
|
+
Timeout.timeout(time_to_wait) do
|
19
|
+
until block.call
|
20
|
+
sleep 0.1
|
21
|
+
end
|
22
|
+
end
|
23
|
+
true
|
24
|
+
end
|
25
|
+
|
26
|
+
#
|
27
|
+
# Calls the block until it doesn't return true or +time_to_wait+ is reached.
|
28
|
+
# +time_to_wait+ is 30 seconds by default
|
29
|
+
#
|
30
|
+
# Returns true upon success
|
31
|
+
# Raises Timeout::Error when +time_to_wait+ is reached.
|
32
|
+
#
|
33
|
+
def wait_while time_to_wait=30, &block
|
34
|
+
Timeout.timeout(time_to_wait) do
|
35
|
+
while block.call
|
36
|
+
sleep 0.1
|
37
|
+
end
|
38
|
+
end
|
39
|
+
true
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
#
|
44
|
+
# Specify whether to accept or reject all confirm js dialogs
|
45
|
+
# for the code in the block that's run.
|
46
|
+
#
|
47
|
+
def confirm(bool, &block)
|
48
|
+
blk = "lambda { #{bool} }"
|
49
|
+
|
50
|
+
self.send_remote(:add_listener, :confirm) { blk }
|
51
|
+
block.call
|
52
|
+
self.send_remote(:remove_listener, :confirm) { blk }
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Culerity
|
2
|
+
|
3
|
+
class CulerityException < StandardError
|
4
|
+
def initialize(message, backtrace)
|
5
|
+
super message
|
6
|
+
#self.backtrace = backtrace
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class RemoteObjectProxy
|
11
|
+
def initialize(remote_object_id, io)
|
12
|
+
@remote_object_id = remote_object_id
|
13
|
+
@io = io
|
14
|
+
end
|
15
|
+
|
16
|
+
#
|
17
|
+
# Commonly used to get the HTML id attribute
|
18
|
+
# Use `object_id` to get the local objects' id.
|
19
|
+
#
|
20
|
+
def id
|
21
|
+
send_remote(:id)
|
22
|
+
end
|
23
|
+
|
24
|
+
def method_missing(name, *args)
|
25
|
+
send_remote(name, *args)
|
26
|
+
end
|
27
|
+
|
28
|
+
#
|
29
|
+
# Calls the passed method on the remote object with any arguments specified.
|
30
|
+
# Behaves the same as <code>Object#send</code>.
|
31
|
+
#
|
32
|
+
# If you pass it a block then it will append the block as a "lambda { … }".
|
33
|
+
# If your block returns a lambda string ("lambda { … }") then it will be passed
|
34
|
+
# straight through, otherwise it will be wrapped in a lambda string before sending.
|
35
|
+
#
|
36
|
+
def send_remote(name, *args, &blk)
|
37
|
+
input = [remote_object_id, %Q{"#{name}"}, *args.map{|a| a.inspect}]
|
38
|
+
input << block_to_string(&blk) if block_given?
|
39
|
+
@io << "[#{input.join(", ")}]\n"
|
40
|
+
process_result @io.gets.to_s.strip
|
41
|
+
end
|
42
|
+
|
43
|
+
def exit
|
44
|
+
@io << '["_exit_"]'
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def process_result(result)
|
50
|
+
res = eval result
|
51
|
+
if res.first == :return
|
52
|
+
res[1]
|
53
|
+
elsif res.first == :exception
|
54
|
+
raise CulerityException.new("#{res[1]}: #{res[2]}", res[3])
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
#
|
59
|
+
# Takes a block and either returns the result (if it returns "lambda { … }")
|
60
|
+
# or builds the lambda string with the result of the block in it.
|
61
|
+
#
|
62
|
+
# Returns a string in the format "lambda { … }"
|
63
|
+
#
|
64
|
+
def block_to_string &block
|
65
|
+
result = block.call.to_s
|
66
|
+
unless result.is_a?(String) && result[/^lambda \s* \{ .*? \}/x]
|
67
|
+
result = "lambda { #{result} }"
|
68
|
+
end
|
69
|
+
result
|
70
|
+
end
|
71
|
+
|
72
|
+
def remote_object_id
|
73
|
+
@remote_object_id
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/rails/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'culerity'
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class CulerityGenerator < Rails::Generator::Base
|
2
|
+
|
3
|
+
def manifest
|
4
|
+
record do |m|
|
5
|
+
m.directory 'features/step_definitions'
|
6
|
+
m.file 'features/step_definitions/culerity_steps.rb', 'features/step_definitions/culerity_steps.rb'
|
7
|
+
m.file 'features/support/env.rb', 'features/support/env.rb'
|
8
|
+
m.file 'config/environments/culerity_continuousintegration.rb', 'config/environments/culerity_continuousintegration.rb'
|
9
|
+
m.file 'config/environments/culerity_development.rb', 'config/environments/culerity_development.rb'
|
10
|
+
|
11
|
+
m.gsub_file 'config/database.yml', /cucumber:.*\n/, "cucumber: &CUCUMBER\n"
|
12
|
+
|
13
|
+
m.gsub_file 'config/database.yml', /\z/, "\nculerity_development:\n <<: *CUCUMBER"
|
14
|
+
m.gsub_file 'config/database.yml', /\z/, "\nculerity_continuousintegration:\n <<: *CUCUMBER"
|
15
|
+
|
16
|
+
m.file "lib/tasks/culerity.rake", "lib/tasks/culerity.rake"
|
17
|
+
|
18
|
+
m.file 'public/javascripts/culerity.js', 'public/javascripts/culerity.js'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
|
24
|
+
def banner
|
25
|
+
"Usage: #{$0} culerity"
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
data/rails_generators/culerity/templates/config/environments/culerity_continuousintegration.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# Settings specified here will take precedence over those in config/environment.rb
|
2
|
+
|
3
|
+
# The production environment is meant for finished, "live" apps.
|
4
|
+
# Code is not reloaded between requests
|
5
|
+
config.cache_classes = true
|
6
|
+
|
7
|
+
# Full error reports are disabled and caching is turned on
|
8
|
+
config.action_controller.consider_all_requests_local = false
|
9
|
+
config.action_controller.perform_caching = true
|
10
|
+
config.action_view.cache_template_loading = true
|
11
|
+
|
12
|
+
# See everything in the log (default is :info)
|
13
|
+
# config.log_level = :debug
|
14
|
+
|
15
|
+
# Use a different logger for distributed setups
|
16
|
+
# config.logger = SyslogLogger.new
|
17
|
+
|
18
|
+
# Use a different cache store in production
|
19
|
+
# config.cache_store = :mem_cache_store
|
20
|
+
|
21
|
+
# Enable serving of images, stylesheets, and javascripts from an asset server
|
22
|
+
# config.action_controller.asset_host = "http://assets.example.com"
|
23
|
+
|
24
|
+
# Disable delivery errors, bad email addresses will be ignored
|
25
|
+
# config.action_mailer.raise_delivery_errors = false
|
26
|
+
|
27
|
+
# Enable threaded mode
|
28
|
+
# config.threadsafe!
|
@@ -0,0 +1,17 @@
|
|
1
|
+
config.cache_classes = false
|
2
|
+
|
3
|
+
# Log error messages when you accidentally call methods on nil.
|
4
|
+
config.whiny_nils = true
|
5
|
+
|
6
|
+
# Show full error reports and disable caching
|
7
|
+
config.action_controller.consider_all_requests_local = true
|
8
|
+
config.action_controller.perform_caching = false
|
9
|
+
config.action_view.cache_template_loading = false
|
10
|
+
|
11
|
+
# Disable request forgery protection in test environment
|
12
|
+
config.action_controller.allow_forgery_protection = false
|
13
|
+
|
14
|
+
# Tell Action Mailer not to deliver emails to the real world.
|
15
|
+
# The :test delivery method accumulates sent emails in the
|
16
|
+
# ActionMailer::Base.deliveries array.
|
17
|
+
config.action_mailer.delivery_method = :test
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'culerity'
|
2
|
+
|
3
|
+
Before do
|
4
|
+
$rails_server ||= Culerity::run_rails(:environment => 'culerity_development', :port => 3001)
|
5
|
+
$server ||= Culerity::run_server
|
6
|
+
$browser = Culerity::RemoteBrowserProxy.new $server, {:browser => :firefox3,
|
7
|
+
:javascript_exceptions => true,
|
8
|
+
:resynchronize => true,
|
9
|
+
:status_code_exceptions => true
|
10
|
+
}
|
11
|
+
$browser.log_level = :warning
|
12
|
+
@host = 'http://localhost:3001'
|
13
|
+
end
|
14
|
+
|
15
|
+
at_exit do
|
16
|
+
$browser.exit if $browser
|
17
|
+
$server.close if $server
|
18
|
+
Process.kill(6, $rails_server.pid.to_i) if $rails_server
|
19
|
+
end
|
20
|
+
|
21
|
+
When /I follow "([^\"]*)"/ do |link|
|
22
|
+
_link = [[:text, /^#{Regexp.escape(link)}$/], [:id, link], [:title, link]].map{|args| $browser.link(*args)}.find{|__link| __link.exist?}
|
23
|
+
raise "link \"#{link}\" not found" unless _link
|
24
|
+
_link.click
|
25
|
+
assert_successful_response
|
26
|
+
end
|
27
|
+
|
28
|
+
When /I press "([^\"]*)"/ do |button|
|
29
|
+
$browser.button(:text, button).click
|
30
|
+
assert_successful_response
|
31
|
+
end
|
32
|
+
|
33
|
+
When /I fill in "([^\"]*)" with "([^\"]*)"/ do |field, value|
|
34
|
+
find_by_label_or_id(:text_field, field).set(value)
|
35
|
+
end
|
36
|
+
|
37
|
+
When /I fill in "([^\"]*)" for "([^\"]*)"/ do |value, field|
|
38
|
+
find_by_label_or_id(:text_field, field).set(value)
|
39
|
+
end
|
40
|
+
|
41
|
+
When /I check "([^\"]*)"/ do |field|
|
42
|
+
find_by_label_or_id(:check_box, field).set(true)
|
43
|
+
end
|
44
|
+
|
45
|
+
When /^I uncheck "([^\"]*)"$/ do |field|
|
46
|
+
find_by_label_or_id(:check_box, field).set(true)
|
47
|
+
end
|
48
|
+
|
49
|
+
When /I select "([^\"]*)" from "([^\"]*)"/ do |value, field|
|
50
|
+
find_by_label_or_id(:select_list, field).select value
|
51
|
+
end
|
52
|
+
|
53
|
+
When /I choose "([^\"]*)"/ do |field|
|
54
|
+
find_by_label_or_id(:radio, field).set(true)
|
55
|
+
end
|
56
|
+
|
57
|
+
When /I go to (.+)/ do |path|
|
58
|
+
$browser.goto @host + path_to(path)
|
59
|
+
assert_successful_response
|
60
|
+
end
|
61
|
+
|
62
|
+
When /^I wait for the AJAX call to finish$/ do
|
63
|
+
$browser.wait_while do
|
64
|
+
begin
|
65
|
+
count = $browser.execute_script("window.running_ajax_calls").to_i
|
66
|
+
count.to_i > 0
|
67
|
+
rescue => e
|
68
|
+
if e.message.include?('HtmlunitCorejsJavascript::Undefined')
|
69
|
+
raise "For 'I wait for the AJAX call to finish' to work please include culerity.js after including jQuery. If you don't use jQuery please rewrite culerity.js accordingly."
|
70
|
+
else
|
71
|
+
raise(e)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
Then /I should see "([^\"]*)"/ do |text|
|
78
|
+
# if we simply check for the browser.html content we don't find content that has been added dynamically, e.g. after an ajax call
|
79
|
+
div = $browser.div(:text, /#{text}/)
|
80
|
+
div.should be_exist
|
81
|
+
end
|
82
|
+
|
83
|
+
Then /I should not see "([^\"]*)"/ do |text|
|
84
|
+
div = $browser.div(:text, /#{text}/)
|
85
|
+
div.should_not be_exist
|
86
|
+
end
|
87
|
+
|
88
|
+
def find_by_label_or_id(element, attribute)
|
89
|
+
matchers = [[attribute, :id], [attribute, :name]]
|
90
|
+
matchers << [$browser.label(:text, attribute).for, :id] if $browser.label(:text, attribute).exist?
|
91
|
+
field = matchers.map{|_field, matcher| $browser.send(element, matcher, _field)}.find(&:exist?) || raise("#{element} not found using \"#{attribute}\"")
|
92
|
+
end
|
93
|
+
|
94
|
+
def assert_successful_response
|
95
|
+
status = $browser.page.web_response.status_code
|
96
|
+
if(status == 302 || status == 301)
|
97
|
+
location = $browser.page.web_response.get_response_header_value('Location')
|
98
|
+
puts "Being redirected to #{location}"
|
99
|
+
$browser.goto location
|
100
|
+
assert_successful_response
|
101
|
+
elsif status != 200
|
102
|
+
filename = "culerity-#{Time.now.to_i}.html"
|
103
|
+
File.open(RAILS_ROOT + "/tmp/#{filename}", "w") do |f|
|
104
|
+
f.write $browser.html
|
105
|
+
end
|
106
|
+
`open tmp/#{filename}`
|
107
|
+
raise "Browser returned Response Code #{$browser.page.web_response.status_code}"
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
ENV["RAILS_ENV"] ||= "culerity_development"
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../config/environment')
|
3
|
+
require 'cucumber/rails/world'
|
4
|
+
|
5
|
+
Cucumber::Rails::World.use_transactional_fixtures = false
|
6
|
+
ActionController::Base.allow_rescue = false
|
7
|
+
|
8
|
+
require 'cucumber/formatter/unicode'
|
9
|
+
require 'cucumber/rails/rspec'
|
@@ -0,0 +1,38 @@
|
|
1
|
+
namespace 'culerity' do
|
2
|
+
namespace 'rails' do
|
3
|
+
desc "Starts a rails server for cucumber/culerity tests"
|
4
|
+
task :start do
|
5
|
+
port = ENV['PORT'] || 3001
|
6
|
+
environment = ENV["RAILS_ENV"] || 'culerity_development'
|
7
|
+
pid_file = RAILS_ROOT + "/tmp/culerity_rails_server.pid"
|
8
|
+
if File.exists?(pid_file)
|
9
|
+
puts "culerity rails server already running; if not, delete tmp/culerity_rails_server.pid and try again"
|
10
|
+
exit 1
|
11
|
+
end
|
12
|
+
rails_server = IO.popen("script/server -e #{environment} -p #{port}", 'r+')
|
13
|
+
File.open(pid_file, "w") { |file| file << rails_server.pid }
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "Stops the running rails server for cucumber/culerity tests"
|
17
|
+
task :stop do
|
18
|
+
pid_file = RAILS_ROOT + "/tmp/culerity_rails_server.pid"
|
19
|
+
if File.exists?(pid_file)
|
20
|
+
pid = File.read(pid_file).to_i
|
21
|
+
Process.kill(6, pid)
|
22
|
+
File.delete(pid_file)
|
23
|
+
else
|
24
|
+
puts "No culerity rails server running. Doing nothing."
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Restarts the rails server for cucumber/culerity tests"
|
29
|
+
task :restart => [:stop, :start]
|
30
|
+
end
|
31
|
+
|
32
|
+
desc "Install required gems into jruby"
|
33
|
+
task :install do
|
34
|
+
jgem_cmd = `which jruby`.strip
|
35
|
+
raise "ERROR: You need to install jruby to use culerity and celerity." if jgem_cmd.blank?
|
36
|
+
sh "#{jgem_cmd} -S gem install celerity"
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
// this allows culerity to wait until all ajax requests have finished
|
2
|
+
jQuery(function($) {
|
3
|
+
var original_ajax = $.ajax;
|
4
|
+
var count_down = function(callback) {
|
5
|
+
return function() {
|
6
|
+
try {
|
7
|
+
if(callback) {
|
8
|
+
callback.apply(this, arguments);
|
9
|
+
};
|
10
|
+
} catch(e) {
|
11
|
+
window.running_ajax_calls -= 1;
|
12
|
+
throw(e);
|
13
|
+
}
|
14
|
+
window.running_ajax_calls -= 1;
|
15
|
+
}
|
16
|
+
};
|
17
|
+
window.running_ajax_calls = 0;
|
18
|
+
|
19
|
+
var ajax_with_count = function(options) {
|
20
|
+
window.running_ajax_calls += 1;
|
21
|
+
options.success = count_down(options.success);
|
22
|
+
options.error = count_down(options.error);
|
23
|
+
original_ajax(options);
|
24
|
+
};
|
25
|
+
|
26
|
+
$.ajax = ajax_with_count;
|
27
|
+
});
|
data/script/console
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# File: script/console
|
3
|
+
irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
|
4
|
+
|
5
|
+
libs = " -r irb/completion"
|
6
|
+
# Perhaps use a console_lib to store any extra methods I may want available in the cosole
|
7
|
+
# libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
|
8
|
+
libs << " -r #{File.dirname(__FILE__) + '/../lib/culerity.rb'}"
|
9
|
+
puts "Loading culerity gem"
|
10
|
+
exec "#{irb} #{libs} --simple-prompt"
|
data/script/destroy
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/destroy'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Destroy.new.run(ARGV)
|