fletcherm-culerity 0.2.5
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/.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)
|