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,14 @@
|
|
1
|
+
Feature: Check that default Rails index.html shows information
|
2
|
+
In order to value
|
3
|
+
As a role
|
4
|
+
I want feature
|
5
|
+
|
6
|
+
Scenario: Check javascript runs on static file
|
7
|
+
Given I go to the homepage
|
8
|
+
Then I should not see "Rails version"
|
9
|
+
When I follow "About your application’s environment"
|
10
|
+
And I wait for the AJAX call to finish
|
11
|
+
Then I should see "No route matches"
|
12
|
+
|
13
|
+
|
14
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
Feature: Installing culerity
|
2
|
+
In order to not have to use f@#$ing selenium and receive hate into our lives
|
3
|
+
As a self-respective Rails/JavaScript developer
|
4
|
+
I want to install culerity into my Rails app
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given a Rails app
|
8
|
+
And I run executable "script/generate" with arguments "cucumber"
|
9
|
+
And I delete file "features/step_definitions/webrat_steps.rb"
|
10
|
+
And I delete file "features/support/env.rb"
|
11
|
+
And I copy the project generators into "vendor/generators"
|
12
|
+
And I invoke task "rake db:migrate"
|
13
|
+
When I run executable "script/generate" with arguments "culerity"
|
14
|
+
And I setup load path to local code
|
15
|
+
And I setup the culerity javascript helpers
|
16
|
+
|
17
|
+
Scenario: Install culerity and test the rails start + stop tasks
|
18
|
+
When I invoke task "rake culerity:rails:start"
|
19
|
+
Then file "tmp/culerity_rails_server.pid" is created
|
20
|
+
And I invoke task "rake culerity:rails:stop"
|
21
|
+
Then file "tmp/culerity_rails_server.pid" is not created
|
22
|
+
|
23
|
+
Scenario: Install culerity into a Rails app and check it works
|
24
|
+
Then file "features/step_definitions/culerity_steps.rb" is created
|
25
|
+
Then file "config/environments/culerity_development.rb" is created
|
26
|
+
Then file "config/environments/culerity_continuousintegration.rb" is created
|
27
|
+
|
28
|
+
When I run executable "cucumber" with arguments "features/"
|
29
|
+
Then I should see "0 scenarios"
|
30
|
+
And I should see "0 steps"
|
31
|
+
Given I invoke task "rake culerity:rails:start"
|
32
|
+
When I add a feature file to test Rails index.html default file
|
33
|
+
And I run executable "cucumber" with arguments "features/"
|
34
|
+
Then I should see "1 scenario"
|
35
|
+
And I should see "5 steps (5 passed)"
|
36
|
+
And I should not see "WARNING: Speed up executing by running 'rake culerity:rails:start'"
|
@@ -0,0 +1,23 @@
|
|
1
|
+
Feature: Running cucumber without explicitly running external services
|
2
|
+
In order to reduce learning cost of using culerity
|
3
|
+
As a rails developer
|
4
|
+
I want the headless browser and rails processes to launch and shutdown automatically
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given a Rails app
|
8
|
+
And I run executable "script/generate" with arguments "cucumber"
|
9
|
+
And I delete file "features/step_definitions/webrat_steps.rb"
|
10
|
+
And I delete file "features/support/env.rb"
|
11
|
+
And I copy the project generators into "vendor/generators"
|
12
|
+
And I invoke task "rake db:migrate"
|
13
|
+
When I run executable "script/generate" with arguments "culerity"
|
14
|
+
And I setup load path to local code
|
15
|
+
And I setup the culerity javascript helpers
|
16
|
+
|
17
|
+
Scenario: Successfully run scenarios without requiring celerity or rails processes running
|
18
|
+
When I add a feature file to test Rails index.html default file
|
19
|
+
And I run executable "cucumber" with arguments "features/"
|
20
|
+
Then file "tmp/culerity_rails_server.pid" is not created
|
21
|
+
And I should see "1 scenario"
|
22
|
+
And I should see "5 steps (5 passed)"
|
23
|
+
And I should see "WARNING: Speed up execution by running 'rake culerity:rails:start'"
|
@@ -0,0 +1,175 @@
|
|
1
|
+
Given /^this project is active project folder/ do
|
2
|
+
@active_project_folder = File.expand_path(File.dirname(__FILE__) + "/../..")
|
3
|
+
end
|
4
|
+
|
5
|
+
Given /^env variable \$([\w_]+) set to "(.*)"/ do |env_var, value|
|
6
|
+
ENV[env_var] = value
|
7
|
+
end
|
8
|
+
|
9
|
+
Given /I delete (folder|file) "([^\"]*)"/ do |type, folder|
|
10
|
+
in_project_folder { FileUtils.rm_rf folder }
|
11
|
+
end
|
12
|
+
|
13
|
+
When /^I invoke "(.*)" generator with arguments "(.*)"$/ do |generator, arguments|
|
14
|
+
@stdout = StringIO.new
|
15
|
+
in_project_folder do
|
16
|
+
if Object.const_defined?("APP_ROOT")
|
17
|
+
APP_ROOT.replace(FileUtils.pwd)
|
18
|
+
else
|
19
|
+
APP_ROOT = FileUtils.pwd
|
20
|
+
end
|
21
|
+
run_generator(generator, arguments.split(' '), SOURCES, :stdout => @stdout)
|
22
|
+
end
|
23
|
+
File.open(File.join(@tmp_root, "generator.out"), "w") do |f|
|
24
|
+
@stdout.rewind
|
25
|
+
f << @stdout.read
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
When /^I run executable "(.*)" with arguments "(.*)"/ do |executable, arguments|
|
30
|
+
@stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
|
31
|
+
in_project_folder do
|
32
|
+
system "#{executable} #{arguments} > #{@stdout} 2> #{@stdout}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
When /^I run project executable "(.*)" with arguments "(.*)"/ do |executable, arguments|
|
37
|
+
@stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
|
38
|
+
in_project_folder do
|
39
|
+
system "ruby #{executable} #{arguments} > #{@stdout} 2> #{@stdout}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
When /^I run local executable "(.*)" with arguments "(.*)"/ do |executable, arguments|
|
44
|
+
@stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
|
45
|
+
executable = File.expand_path(File.join(File.dirname(__FILE__), "/../../bin", executable))
|
46
|
+
in_project_folder do
|
47
|
+
system "ruby #{executable} #{arguments} > #{@stdout} 2> #{@stdout}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
When /^I invoke task "rake (.*)"/ do |task|
|
52
|
+
@stdout = File.expand_path(File.join(@tmp_root, "rake.out"))
|
53
|
+
@stderr = File.expand_path(File.join(@tmp_root, "rake.err"))
|
54
|
+
in_project_folder do
|
55
|
+
system "rake #{task} --trace > #{@stdout} 2> #{@stderr}"
|
56
|
+
end
|
57
|
+
File.read(@stderr).should_not =~ /rake aborted!/
|
58
|
+
end
|
59
|
+
|
60
|
+
Then /^folder "(.*)" (is|is not) created/ do |folder, is|
|
61
|
+
in_project_folder do
|
62
|
+
File.exists?(folder).should(is == 'is' ? be_true : be_false)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
Then /^file "(.*)" (is|is not) created/ do |file, is|
|
67
|
+
in_project_folder do
|
68
|
+
File.exists?(file).should(is == 'is' ? be_true : be_false)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
Then /^file with name matching "(.*)" is created/ do |pattern|
|
73
|
+
in_project_folder do
|
74
|
+
Dir[pattern].should_not be_empty
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
Then /^file "(.*)" contents (does|does not) match \/(.*)\// do |file, does, regex|
|
79
|
+
in_project_folder do
|
80
|
+
actual_output = File.read(file)
|
81
|
+
(does == 'does') ?
|
82
|
+
actual_output.should(match(/#{regex}/)) :
|
83
|
+
actual_output.should_not(match(/#{regex}/))
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
Then /gem file "(.*)" and generated file "(.*)" should be the same/ do |gem_file, project_file|
|
88
|
+
File.exists?(gem_file).should be_true
|
89
|
+
File.exists?(project_file).should be_true
|
90
|
+
gem_file_contents = File.read(File.dirname(__FILE__) + "/../../#{gem_file}")
|
91
|
+
project_file_contents = File.read(File.join(@active_project_folder, project_file))
|
92
|
+
project_file_contents.should == gem_file_contents
|
93
|
+
end
|
94
|
+
|
95
|
+
Then /^(does|does not) invoke generator "(.*)"$/ do |does_invoke, generator|
|
96
|
+
actual_output = File.read(@stdout)
|
97
|
+
does_invoke == "does" ?
|
98
|
+
actual_output.should(match(/dependency\s+#{generator}/)) :
|
99
|
+
actual_output.should_not(match(/dependency\s+#{generator}/))
|
100
|
+
end
|
101
|
+
|
102
|
+
Then /help options "(.*)" and "(.*)" are displayed/ do |opt1, opt2|
|
103
|
+
actual_output = File.read(@stdout)
|
104
|
+
actual_output.should match(/#{opt1}/)
|
105
|
+
actual_output.should match(/#{opt2}/)
|
106
|
+
end
|
107
|
+
|
108
|
+
Then /^I should see "([^\"]*)"$/ do |text|
|
109
|
+
actual_output = File.read(@stdout)
|
110
|
+
actual_output.should contain(text)
|
111
|
+
end
|
112
|
+
|
113
|
+
Then /^I should not see "([^\"]*)"$/ do |text|
|
114
|
+
actual_output = File.read(@stdout)
|
115
|
+
actual_output.should_not contain(text)
|
116
|
+
end
|
117
|
+
|
118
|
+
Then /^I should see$/ do |text|
|
119
|
+
actual_output = File.read(@stdout)
|
120
|
+
actual_output.should contain(text)
|
121
|
+
end
|
122
|
+
|
123
|
+
Then /^I should not see$/ do |text|
|
124
|
+
actual_output = File.read(@stdout)
|
125
|
+
actual_output.should_not contain(text)
|
126
|
+
end
|
127
|
+
|
128
|
+
Then /^I should see exactly$/ do |text|
|
129
|
+
actual_output = File.read(@stdout)
|
130
|
+
actual_output.should == text
|
131
|
+
end
|
132
|
+
|
133
|
+
Then /^I should see all (\d+) tests pass/ do |expected_test_count|
|
134
|
+
expected = %r{^#{expected_test_count} tests, \d+ assertions, 0 failures, 0 errors}
|
135
|
+
actual_output = File.read(@stdout)
|
136
|
+
actual_output.should match(expected)
|
137
|
+
end
|
138
|
+
|
139
|
+
Then /^I should see all (\d+) examples pass/ do |expected_test_count|
|
140
|
+
expected = %r{^#{expected_test_count} examples?, 0 failures}
|
141
|
+
actual_output = File.read(@stdout)
|
142
|
+
actual_output.should match(expected)
|
143
|
+
end
|
144
|
+
|
145
|
+
Then /^yaml file "(.*)" contains (\{.*\})/ do |file, yaml|
|
146
|
+
in_project_folder do
|
147
|
+
yaml = eval yaml
|
148
|
+
YAML.load(File.read(file)).should == yaml
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
Then /^Rakefile can display tasks successfully/ do
|
153
|
+
@stdout = File.expand_path(File.join(@tmp_root, "rakefile.out"))
|
154
|
+
in_project_folder do
|
155
|
+
system "rake -T > #{@stdout} 2> #{@stdout}"
|
156
|
+
end
|
157
|
+
actual_output = File.read(@stdout)
|
158
|
+
actual_output.should match(/^rake\s+\w+\s+#\s.*/)
|
159
|
+
end
|
160
|
+
|
161
|
+
Then /^task "rake (.*)" is executed successfully/ do |task|
|
162
|
+
@stdout.should_not be_nil
|
163
|
+
actual_output = File.read(@stdout)
|
164
|
+
actual_output.should_not match(/^Don't know how to build task '#{task}'/)
|
165
|
+
actual_output.should_not match(/Error/i)
|
166
|
+
end
|
167
|
+
|
168
|
+
Then /^gem spec key "(.*)" contains \/(.*)\// do |key, regex|
|
169
|
+
in_project_folder do
|
170
|
+
gem_file = Dir["pkg/*.gem"].first
|
171
|
+
gem_spec = Gem::Specification.from_yaml(`gem spec #{gem_file}`)
|
172
|
+
spec_value = gem_spec.send(key.to_sym)
|
173
|
+
spec_value.to_s.should match(/#{regex}/)
|
174
|
+
end
|
175
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Given /^I have jruby installed$/ do
|
2
|
+
@jruby_cmd = `which jruby`.strip
|
3
|
+
raise "Need to setup @jruby_cmd to test jruby environment" if @jruby_cmd.blank?
|
4
|
+
end
|
5
|
+
|
6
|
+
Then /^the gem "([^\"]*)" is installed into jruby environment$/ do |gem_name|
|
7
|
+
raise "Need to setup @jruby_cmd to test jruby environment" if @jruby_cmd.blank?
|
8
|
+
gem_list = `#{@jruby_cmd} -S gem list #{gem_name}`
|
9
|
+
gem_list.should =~ /#{gem_name}/
|
10
|
+
end
|
11
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
Given /^a Rails app$/ do
|
2
|
+
FileUtils.chdir(@tmp_root) do
|
3
|
+
`rails my_project`
|
4
|
+
end
|
5
|
+
@active_project_folder = File.expand_path(File.join(@tmp_root, "my_project"))
|
6
|
+
end
|
7
|
+
|
8
|
+
Given /^I copy the project generators into "([^\"]*)"$/ do |target_folder|
|
9
|
+
in_project_folder do
|
10
|
+
FileUtils.mkdir_p(target_folder)
|
11
|
+
end
|
12
|
+
`cp -rf #{File.dirname(__FILE__) + "/../../rails_generators/*"} #{File.join(@active_project_folder, target_folder)}`
|
13
|
+
end
|
14
|
+
|
15
|
+
When /^I add a feature file to test Rails index.html default file$/ do
|
16
|
+
sample_feature = File.expand_path(File.dirname(__FILE__) + "/../fixtures/sample_feature")
|
17
|
+
in_project_folder do
|
18
|
+
`cp -rf #{sample_feature} features/sample.feature`
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
When /^I setup the culerity javascript helpers$/ do
|
23
|
+
`cp #{File.dirname(__FILE__) + "/../fixtures/jquery"} #{File.join(@active_project_folder, 'public', 'javascripts', 'jquery.js')}`
|
24
|
+
in_project_folder do
|
25
|
+
_index = File.read('public/index.html')
|
26
|
+
File.open('public/index.html', 'w') do |f|
|
27
|
+
f << _index.sub('</head>', '<script type="text/javascript" src="javascripts/jquery.js"></script><script type="text/javascript" src="javascripts/culerity.js"></script><script type="text/javascript">jQuery.noConflict();</script></head>')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
After do
|
33
|
+
in_project_folder do
|
34
|
+
Given 'I invoke task "rake culerity:rails:stop"'
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module CommonHelpers
|
2
|
+
def in_tmp_folder(&block)
|
3
|
+
FileUtils.chdir(@tmp_root, &block)
|
4
|
+
end
|
5
|
+
|
6
|
+
def in_project_folder(&block)
|
7
|
+
project_folder = @active_project_folder || @tmp_root
|
8
|
+
FileUtils.chdir(project_folder, &block)
|
9
|
+
end
|
10
|
+
|
11
|
+
def in_home_folder(&block)
|
12
|
+
FileUtils.chdir(@home_path, &block)
|
13
|
+
end
|
14
|
+
|
15
|
+
def force_local_lib_override(options = {})
|
16
|
+
target_path = options[:target_path] || options[:target_file] || options[:target] || 'Rakefile'
|
17
|
+
in_project_folder do
|
18
|
+
contents = File.read(target_path)
|
19
|
+
File.open(target_path, "w+") do |f|
|
20
|
+
f << "$:.unshift('#{@lib_path}')\n"
|
21
|
+
f << contents
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def setup_active_project_folder project_name
|
27
|
+
@active_project_folder = File.join(@tmp_root, project_name)
|
28
|
+
@project_name = project_name
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
World(CommonHelpers)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../../lib/culerity"
|
2
|
+
|
3
|
+
gem 'cucumber'
|
4
|
+
require 'cucumber'
|
5
|
+
gem 'rspec'
|
6
|
+
require 'spec'
|
7
|
+
|
8
|
+
Before do
|
9
|
+
@tmp_root = File.dirname(__FILE__) + "/../../tmp"
|
10
|
+
@home_path = File.expand_path(File.join(@tmp_root, "home"))
|
11
|
+
@lib_path = File.expand_path(File.dirname(__FILE__) + "/../../lib")
|
12
|
+
FileUtils.rm_rf @tmp_root
|
13
|
+
FileUtils.mkdir_p @home_path
|
14
|
+
ENV['HOME'] = @home_path
|
15
|
+
end
|
16
|
+
|
17
|
+
require 'rubigen'
|
18
|
+
require 'rubigen/helpers/generator_test_helper'
|
19
|
+
include RubiGen::GeneratorTestHelper
|
20
|
+
require 'rails_generator'
|
21
|
+
|
22
|
+
SOURCES = Dir[File.dirname(__FILE__) + "/../../generators"].map do |f|
|
23
|
+
RubiGen::PathSource.new(:test, File.expand_path(f))
|
24
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Matchers
|
2
|
+
def contain(expected)
|
3
|
+
simple_matcher("contain #{expected.inspect}") do |given, matcher|
|
4
|
+
matcher.failure_message = "expected #{given.inspect} to contain #{expected.inspect}"
|
5
|
+
matcher.negative_failure_message = "expected #{given.inspect} not to contain #{expected.inspect}"
|
6
|
+
given.index expected
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
World(Matchers)
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'rails/init'
|
data/lib/culerity.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/culerity/remote_object_proxy'
|
2
|
+
require File.dirname(__FILE__) + '/culerity/remote_browser_proxy'
|
3
|
+
require File.dirname(__FILE__) + '/culerity/jruby_runner'
|
4
|
+
|
5
|
+
Symbol.class_eval do
|
6
|
+
def to_proc
|
7
|
+
Proc.new{|object| object.send(self)}
|
8
|
+
end
|
9
|
+
end unless :symbol.respond_to?(:to_proc)
|
10
|
+
|
11
|
+
module Culerity
|
12
|
+
|
13
|
+
module ServerCommands
|
14
|
+
def exit_server
|
15
|
+
self << '["_exit_"]'
|
16
|
+
Process.kill(6, self.pid.to_i)
|
17
|
+
end
|
18
|
+
|
19
|
+
def close_browsers
|
20
|
+
self.puts '["_close_browsers_"]'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.run_server
|
25
|
+
IO.popen("#{Culerity::JRubyRunner.cmd} #{__FILE__}", 'r+').extend(ServerCommands)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.run_rails(options = {})
|
29
|
+
if defined?(Rails) && !File.exists?("tmp/culerity_rails_server.pid")
|
30
|
+
puts "WARNING: Speed up execution by running 'rake culerity:rails:start'"
|
31
|
+
port = options[:port] || 3001
|
32
|
+
environment = options[:environment] || 'culerity_development'
|
33
|
+
rails_server = IO.popen("script/server -e #{environment} -p #{port}", 'r+')
|
34
|
+
sleep 5
|
35
|
+
rails_server
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
if __FILE__ == $0
|
41
|
+
require File.dirname(__FILE__) + '/culerity/celerity_server'
|
42
|
+
Culerity::CelerityServer.new STDIN, STDOUT
|
43
|
+
end
|
44
|
+
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'celerity'
|
3
|
+
|
4
|
+
|
5
|
+
module Culerity
|
6
|
+
class CelerityServer
|
7
|
+
|
8
|
+
def initialize(_in, _out)
|
9
|
+
@proxies = {}
|
10
|
+
@browsers = []
|
11
|
+
|
12
|
+
while(true)
|
13
|
+
call = eval _in.gets.to_s.strip
|
14
|
+
return if call == ["_exit_"]
|
15
|
+
next(close_browsers) if call == ["_close_browsers_"]
|
16
|
+
unless call.nil?
|
17
|
+
begin
|
18
|
+
# check if last arg is a block
|
19
|
+
if call.last.is_a?(Proc)
|
20
|
+
# pass as &call[-1]
|
21
|
+
result = target(call.first).send call[1], *call[2..-2], &call[-1]
|
22
|
+
else
|
23
|
+
# just call with args as normal
|
24
|
+
result = target(call.first).send call[1], *call[2..-1]
|
25
|
+
end
|
26
|
+
_out << "[:return, #{proxify result}]\n"
|
27
|
+
rescue => e
|
28
|
+
_out << "[:exception, \"#{e.class.name}\", #{e.message.inspect}, #{e.backtrace.inspect}]\n"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def configure_browser(options)
|
39
|
+
@browser_options = options
|
40
|
+
end
|
41
|
+
|
42
|
+
def new_browser(options, number = nil)
|
43
|
+
number ||= @browsers.size
|
44
|
+
@browsers[number] = Celerity::Browser.new(options || @browser_options || {})
|
45
|
+
"browser#{number}"
|
46
|
+
end
|
47
|
+
|
48
|
+
def close_browsers
|
49
|
+
@browsers.each { |browser| browser.close }
|
50
|
+
@browsers = []
|
51
|
+
end
|
52
|
+
|
53
|
+
def browser(number)
|
54
|
+
unless @browsers[number]
|
55
|
+
new_browser(nil, number)
|
56
|
+
end
|
57
|
+
@browsers[number]
|
58
|
+
end
|
59
|
+
|
60
|
+
def target(object_id)
|
61
|
+
if object_id =~ /browser(\d+)/
|
62
|
+
browser($1.to_i)
|
63
|
+
elsif object_id == 'celerity'
|
64
|
+
self
|
65
|
+
else
|
66
|
+
@proxies[object_id]
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def proxify(result)
|
71
|
+
if result.is_a?(Array)
|
72
|
+
"[" + result.map {|x| proxify(x) }.join(", ") + "]"
|
73
|
+
elsif [String, TrueClass, FalseClass, Fixnum, Float, NilClass].include?(result.class)
|
74
|
+
result.inspect
|
75
|
+
else
|
76
|
+
@proxies[result.object_id] = result
|
77
|
+
"Culerity::RemoteObjectProxy.new(#{result.object_id}, @io)"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|