torquespec 0.3.3 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +4 -0
- data/README.org +65 -11
- data/lib/torquespec/daemon.rb +7 -4
- data/lib/torquespec/torquespec.rb +1 -1
- data/lib/torquespec/version.rb +1 -1
- data/spec/nested_remote_spec.rb +56 -0
- metadata +4 -2
data/Gemfile
CHANGED
data/README.org
CHANGED
@@ -84,7 +84,8 @@
|
|
84
84
|
TorqueSpec supports "in container" testing via the
|
85
85
|
=remote_describe= method. It behaves exactly like the RSpec
|
86
86
|
=describe= method, but the resulting =ExampleGroup= will be run
|
87
|
-
inside the TorqueBox server
|
87
|
+
inside the TorqueBox server, which is /remote/ relative to the
|
88
|
+
/local/ RSpec process.
|
88
89
|
|
89
90
|
If your spec calls =remote_describe=, TorqueSpec will deploy a
|
90
91
|
small daemon with your application. This daemon will act as an
|
@@ -100,6 +101,7 @@
|
|
100
101
|
available to the process that needs them.
|
101
102
|
|
102
103
|
: require 'torquespec'
|
104
|
+
: require 'torquebox-core'
|
103
105
|
:
|
104
106
|
: TorqueSpec.local {
|
105
107
|
: require 'capybara'
|
@@ -120,6 +122,7 @@
|
|
120
122
|
: end
|
121
123
|
:
|
122
124
|
: remote_describe "remote test" do
|
125
|
+
: include TorqueBox::Injectors
|
123
126
|
: deploy(app)
|
124
127
|
:
|
125
128
|
: it "should work" do
|
@@ -129,16 +132,67 @@
|
|
129
132
|
: end
|
130
133
|
|
131
134
|
The above spec shows two example groups, one local and one remote.
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
135
|
+
There are a few things to note:
|
136
|
+
- This spec will be processed by both the local test runner and
|
137
|
+
the remote daemon.
|
138
|
+
- The local example needs the =visit()= method and =page=
|
139
|
+
objects from =capybara= so its require statemtent is guarded
|
140
|
+
in a =TorqueSpec.local= block, which won't be run remotely,
|
141
|
+
since the =capybara= won't be available in the daemon's
|
142
|
+
runtime. Similarly, put statements that should *only* run
|
143
|
+
remotely in a =TorqueSpec.remote= block.
|
144
|
+
- TorqueBox injection is supported in remote examples as long as
|
145
|
+
=TorqueBox::Injectors= is included in their group.
|
146
|
+
- Because the =remote_describe= block is evaluated locally (but
|
147
|
+
not executed), we must require 'torquebox-core' to refer to
|
148
|
+
=TorqueBox::Injectors= both locally and remotely, even though
|
149
|
+
the injection will only be performed remotely.
|
150
|
+
|
151
|
+
*** Nesting Example Groups
|
152
|
+
|
153
|
+
The above example is not very efficient because the same
|
154
|
+
application is being deployed twice: once for the local =describe=
|
155
|
+
and again for the =remote_describe=. We can do better by taking
|
156
|
+
advantage of RSpec's support for nested groups:
|
157
|
+
|
158
|
+
: describe "outside the container" do
|
159
|
+
:
|
160
|
+
: before(:each) do
|
161
|
+
: puts "runs both locally and remotely"
|
162
|
+
: end
|
163
|
+
:
|
164
|
+
: deploy <<-END.gsub(/^ {4}/,'')
|
165
|
+
: application:
|
166
|
+
: root: #{File.dirname(__FILE__)}/../app
|
167
|
+
: END
|
168
|
+
:
|
169
|
+
: it "should handle web requests" do
|
170
|
+
: visit "/"
|
171
|
+
: end
|
172
|
+
:
|
173
|
+
: remote_describe "inside the container" do
|
174
|
+
:
|
175
|
+
: before(:each) do
|
176
|
+
: puts "runs only remotely"
|
177
|
+
: end
|
178
|
+
:
|
179
|
+
: it "should handle injection" do
|
180
|
+
: inject( 'service-registry' ).should_not be_nil
|
181
|
+
: end
|
182
|
+
:
|
183
|
+
: end
|
184
|
+
:
|
185
|
+
: end
|
186
|
+
|
187
|
+
Example groups may be arbitrarily nested, but remember that *ALL*
|
188
|
+
subgroups of a =remote_describe= will be executed remotely by the
|
189
|
+
TorqueSpec daemon.
|
190
|
+
|
191
|
+
Also note that =before= and =after= blocks should work as you
|
192
|
+
expect, but the fact that the parent's =before= block in the above
|
193
|
+
example will run remotely might mean you'll need to guard certain
|
194
|
+
statements in either a =TorqueSpec.local= or =TorqueSpec.remote=
|
195
|
+
block.
|
142
196
|
|
143
197
|
** Configuration
|
144
198
|
|
data/lib/torquespec/daemon.rb
CHANGED
@@ -34,9 +34,12 @@ module TorqueSpec
|
|
34
34
|
DRb.stop_service
|
35
35
|
end
|
36
36
|
|
37
|
-
def run(
|
38
|
-
puts "daemon: run #{
|
39
|
-
|
37
|
+
def run(alien, reporter)
|
38
|
+
puts "daemon: run #{alien}"
|
39
|
+
simple_name = alien.name.split("::").last
|
40
|
+
example_group = @world.example_groups.inject([]) {|all,g| all + g.descendants}.find do |group|
|
41
|
+
group.name.split("::").last == simple_name && group.description == alien.description
|
42
|
+
end
|
40
43
|
example_group.run( reporter )
|
41
44
|
end
|
42
45
|
|
@@ -60,7 +63,7 @@ module TorqueSpec
|
|
60
63
|
daemon = DRbObject.new_with_uri("druby://127.0.0.1:#{TorqueSpec.drb_port}")
|
61
64
|
attempts = 10
|
62
65
|
begin
|
63
|
-
daemon.run(
|
66
|
+
daemon.run( self, reporter )
|
64
67
|
rescue DRb::DRbConnError
|
65
68
|
# Overcome DRb.start_service() race condition
|
66
69
|
raise unless (attempts-=1) > 0
|
@@ -12,7 +12,7 @@ module TorqueSpec
|
|
12
12
|
@deploy_paths = descriptors.map do |descriptor|
|
13
13
|
DeploymentDescriptor.new(descriptor,
|
14
14
|
"#{self.display_name}#{i&&i-=1}",
|
15
|
-
|
15
|
+
descendants.any? {|x| x.is_a?(TorqueSpec::Daemon::Client)}
|
16
16
|
).path
|
17
17
|
end
|
18
18
|
end
|
data/lib/torquespec/version.rb
CHANGED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'torquespec'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'torquebox-core'
|
4
|
+
|
5
|
+
require 'jruby'
|
6
|
+
JRuby.objectspace = true
|
7
|
+
|
8
|
+
describe "out of the container" do
|
9
|
+
|
10
|
+
deploy <<-END.gsub(/^ {4}/,'')
|
11
|
+
application:
|
12
|
+
root: #{File.dirname(__FILE__)}/../apps/simple
|
13
|
+
END
|
14
|
+
|
15
|
+
it "should still greet the world" do
|
16
|
+
response = open("http://localhost:8080") {|f| f.read}
|
17
|
+
response.strip.should == "Hello World!"
|
18
|
+
end
|
19
|
+
|
20
|
+
def blocks
|
21
|
+
@blocks ||= []
|
22
|
+
end
|
23
|
+
|
24
|
+
before(:each) do
|
25
|
+
blocks.push :anything
|
26
|
+
end
|
27
|
+
|
28
|
+
after(:each) do
|
29
|
+
blocks.pop
|
30
|
+
blocks.should be_empty
|
31
|
+
end
|
32
|
+
|
33
|
+
remote_describe "in container of the same deployed app" do
|
34
|
+
include TorqueBox::Injectors
|
35
|
+
|
36
|
+
before(:each) do
|
37
|
+
blocks.push :anything
|
38
|
+
end
|
39
|
+
|
40
|
+
after(:each) do
|
41
|
+
blocks.pop
|
42
|
+
blocks.size.should == 1
|
43
|
+
end
|
44
|
+
|
45
|
+
it "remote? should work" do
|
46
|
+
TorqueSpec.remote{true}.should be_true
|
47
|
+
TorqueSpec.local{true}.should be_false
|
48
|
+
end
|
49
|
+
|
50
|
+
it "injection should work" do
|
51
|
+
inject( 'service-registry' ).should_not be_nil
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: torquespec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.3.
|
5
|
+
version: 0.3.4
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jim Crossley
|
@@ -11,7 +11,7 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2011-06-
|
14
|
+
date: 2011-06-15 00:00:00 -04:00
|
15
15
|
default_executable:
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
@@ -66,6 +66,7 @@ files:
|
|
66
66
|
- spec/empty_spec.rb
|
67
67
|
- spec/guard_spec.rb
|
68
68
|
- spec/hello_world_spec.rb
|
69
|
+
- spec/nested_remote_spec.rb
|
69
70
|
- spec/remote_spec.rb
|
70
71
|
- torquespec.gemspec
|
71
72
|
has_rdoc: true
|
@@ -100,4 +101,5 @@ test_files:
|
|
100
101
|
- spec/empty_spec.rb
|
101
102
|
- spec/guard_spec.rb
|
102
103
|
- spec/hello_world_spec.rb
|
104
|
+
- spec/nested_remote_spec.rb
|
103
105
|
- spec/remote_spec.rb
|