evergreen 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +51 -13
- data/lib/evergreen.rb +5 -0
- data/lib/evergreen/application.rb +2 -0
- data/lib/evergreen/spec.rb +2 -5
- data/lib/evergreen/suite.rb +2 -2
- data/lib/evergreen/template.rb +4 -0
- data/lib/evergreen/version.rb +1 -1
- data/lib/evergreen/views/spec.erb +12 -10
- data/spec/evergreen_spec.rb +6 -1
- data/spec/runner_spec.rb +1 -1
- data/spec/spec_helper.rb +8 -2
- data/spec/suite1/spec/javascripts/libs/lucid_spec.js +0 -0
- data/spec/suite1/spec/javascripts/models/game_spec.js +0 -0
- data/spec/suite1/spec/javascripts/templates/escape.html +1 -0
- data/spec/suite1/spec/javascripts/templates/script_tags.html +3 -0
- data/spec/suite1/spec/javascripts/templates_spec.js +8 -0
- data/spec/suite_spec.rb +2 -2
- data/spec/template_spec.rb +10 -0
- metadata +54 -25
data/README.rdoc
CHANGED
@@ -2,13 +2,19 @@
|
|
2
2
|
|
3
3
|
"Because green is the new Blue(Ridge)"
|
4
4
|
|
5
|
-
Evergreen is a tool to run javascript unit tests for client side JavaScript. It
|
5
|
+
Evergreen is a tool to run javascript unit tests for client side JavaScript. It
|
6
|
+
combines a server which allows you to serve up and run your specs in a browser,
|
7
|
+
as well as a runner which uses Capybara and any of its drivers to run your
|
8
|
+
specs. Evergreen uses the Jasmine unit testing framework for JavaScript.
|
6
9
|
|
7
10
|
http://github.com/jnicklas/evergreen
|
8
11
|
|
9
12
|
== Philosophy
|
10
13
|
|
11
|
-
Evergreen is a unit testing tool. Its purpose is to test JavaScript in
|
14
|
+
Evergreen is a unit testing tool. Its purpose is to test JavaScript in
|
15
|
+
isolation from your application. If you need a tool that tests how your
|
16
|
+
JavaScript integrates with your application you should use an integration
|
17
|
+
testing framework, such as {Capybara}[http://github.com/jnicklas/capybara].
|
12
18
|
|
13
19
|
== Installation
|
14
20
|
|
@@ -18,7 +24,9 @@ Install as a Ruby gem:
|
|
18
24
|
|
19
25
|
== Usage
|
20
26
|
|
21
|
-
Evergreen assumes a file and directory structure, place all your javascript
|
27
|
+
Evergreen assumes a file and directory structure, place all your javascript
|
28
|
+
code inside ./public and all spec files inside ./spec/javascripts. All spec
|
29
|
+
files should end in _spec.js. For example:
|
22
30
|
|
23
31
|
public/widget.js
|
24
32
|
spec/javascripts/widget_spec.js
|
@@ -31,7 +39,8 @@ You can require files from the public directory inside your spec file:
|
|
31
39
|
...
|
32
40
|
});
|
33
41
|
|
34
|
-
You can now look at your spec files inside a browser by starting up the
|
42
|
+
You can now look at your spec files inside a browser by starting up the
|
43
|
+
Evergreen server:
|
35
44
|
|
36
45
|
evergreen serve
|
37
46
|
|
@@ -45,7 +54,8 @@ Add Evergreen to your Gemfile:
|
|
45
54
|
|
46
55
|
gem 'evergreen', :require => 'evergreen/rails'
|
47
56
|
|
48
|
-
Start your rails application and navigate to /evergreen. You should now see a
|
57
|
+
Start your rails application and navigate to /evergreen. You should now see a
|
58
|
+
list of all spec files, click on one to run it.
|
49
59
|
|
50
60
|
There's a rake task provided for you that you can use to run your specs:
|
51
61
|
|
@@ -57,11 +67,15 @@ Add the following line to your Rakefile:
|
|
57
67
|
|
58
68
|
require 'evergreen/tasks'
|
59
69
|
|
60
|
-
This will give you the `spec:javascripts` rake task. Note that mounting is not
|
70
|
+
This will give you the `spec:javascripts` rake task. Note that mounting is not
|
71
|
+
possible under Rails 2 and that `require 'evergreen/rails'` will fail.
|
61
72
|
|
62
73
|
== Configuration
|
63
74
|
|
64
|
-
By default, Evergreen uses Selenium to run your specs and assumes a certain
|
75
|
+
By default, Evergreen uses Selenium to run your specs and assumes a certain
|
76
|
+
directory structure. If this standard is fine for you, then you don't need to
|
77
|
+
do anything else. If you need to configure Evergreen to suit your needs,
|
78
|
+
Evergreen will automatically look for and load the following files:
|
65
79
|
|
66
80
|
config/evergreen.rb
|
67
81
|
.evergreen
|
@@ -80,7 +94,12 @@ The content of these files could look like this:
|
|
80
94
|
|
81
95
|
== Transactions
|
82
96
|
|
83
|
-
One problem often faced when writing unit tests for client side code is that
|
97
|
+
One problem often faced when writing unit tests for client side code is that
|
98
|
+
changes to the page are not reverted for the next example, so that successive
|
99
|
+
examples become dependent on each other. Evergreen adds a special div to your
|
100
|
+
page with an id of test. This div is automatically emptied before each example.
|
101
|
+
You should avoid appending markup to the page body and instead append it to
|
102
|
+
this test div:
|
84
103
|
|
85
104
|
describe('transactions', function() {
|
86
105
|
it("should add stuff in one test...", function() {
|
@@ -95,12 +114,14 @@ One problem often faced when writing unit tests for client side code is that cha
|
|
95
114
|
|
96
115
|
== Templates
|
97
116
|
|
98
|
-
Even more powerful than that, Evergreen allows you to create HTML templates to
|
117
|
+
Even more powerful than that, Evergreen allows you to create HTML templates to
|
118
|
+
go along with your specs. Put the templates in their own folder like this:
|
99
119
|
|
100
120
|
spec/javascripts/templates/one_template.html
|
101
121
|
spec/javascripts/templates/another_template.html
|
102
122
|
|
103
|
-
You can then load the template into the test div, by calling the template
|
123
|
+
You can then load the template into the test div, by calling the template
|
124
|
+
function in your specs:
|
104
125
|
|
105
126
|
describe('transactions', function() {
|
106
127
|
template('one_template.html')
|
@@ -116,19 +137,36 @@ If you add a spec_helper file like so:
|
|
116
137
|
|
117
138
|
spec/javascripts/spec_helper.js
|
118
139
|
|
119
|
-
It will automatically be loaded. This is a great place for adding custom
|
140
|
+
It will automatically be loaded. This is a great place for adding custom
|
141
|
+
matchers and the like.
|
120
142
|
|
121
143
|
== CoffeeScript
|
122
144
|
|
123
|
-
Evergreen supports specs written in
|
145
|
+
Evergreen supports specs written in
|
146
|
+
{CoffeeScript}[http://github.com/jashkenas/coffee-script]. Just name your spec
|
147
|
+
file _spec.coffee and it will automatically be translated for you.
|
124
148
|
|
125
|
-
You can also add a CoffeeScript spec helper, but remember that CoffeeScript
|
149
|
+
You can also add a CoffeeScript spec helper, but remember that CoffeeScript
|
150
|
+
encloses individual files in a closure, if you need something you define in the
|
151
|
+
spec helper to be available in your spec files, attach it to the window object:
|
126
152
|
|
127
153
|
# spec/javascripts/spec_helper.coffee
|
128
154
|
|
129
155
|
MyThing: "foo" # local to spec helper
|
130
156
|
window.MyThing: "foo" # global
|
131
157
|
|
158
|
+
== Development
|
159
|
+
|
160
|
+
If you plan to work on Evergreen, you need to checkout the Jasmine gem, which
|
161
|
+
is added as a git submodule. Run the following command:
|
162
|
+
|
163
|
+
git submodule update --init
|
164
|
+
|
165
|
+
If you're using a version of Evergreen from git with bundler, you need to tell
|
166
|
+
bundler to use submodules, this can be achieved with the following command:
|
167
|
+
|
168
|
+
gem 'evergreen', :submodules => true, :git => 'git://github.com/jnicklas/evergreen.git'
|
169
|
+
|
132
170
|
== License:
|
133
171
|
|
134
172
|
(The MIT License)
|
data/lib/evergreen.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
module Evergreen
|
2
2
|
def self.application(suite)
|
3
3
|
Rack::Builder.new do
|
4
|
+
instance_eval(&Evergreen.extensions) if Evergreen.extensions
|
5
|
+
|
4
6
|
map "/jasmine" do
|
5
7
|
use Rack::Static, :urls => ["/"], :root => File.expand_path('../jasmine/lib', File.dirname(__FILE__))
|
6
8
|
run lambda { |env| [404, {}, "No such file"]}
|
data/lib/evergreen/spec.rb
CHANGED
@@ -2,8 +2,6 @@ require 'open3'
|
|
2
2
|
|
3
3
|
module Evergreen
|
4
4
|
class Spec
|
5
|
-
class CoffeeScriptError < StandardError; end
|
6
|
-
|
7
5
|
attr_reader :name, :suite
|
8
6
|
|
9
7
|
def initialize(suite, name)
|
@@ -21,9 +19,8 @@ module Evergreen
|
|
21
19
|
|
22
20
|
def read
|
23
21
|
if full_path =~ /\.coffee$/
|
24
|
-
|
25
|
-
|
26
|
-
stdout
|
22
|
+
require 'coffee-script'
|
23
|
+
CoffeeScript.compile(File.read(full_path))
|
27
24
|
else
|
28
25
|
File.read(full_path)
|
29
26
|
end
|
data/lib/evergreen/suite.rb
CHANGED
@@ -30,8 +30,8 @@ module Evergreen
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def specs
|
33
|
-
Dir.glob(File.join(root, Evergreen.spec_dir, '
|
34
|
-
Spec.new(self, File.
|
33
|
+
Dir.glob(File.join(root, Evergreen.spec_dir, '**/*_spec.{js,coffee}')).map do |path|
|
34
|
+
Spec.new(self, path.gsub(File.join(root, Evergreen.spec_dir, ''), ''))
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
data/lib/evergreen/template.rb
CHANGED
data/lib/evergreen/version.rb
CHANGED
@@ -25,14 +25,16 @@
|
|
25
25
|
<div id="test"></div>
|
26
26
|
|
27
27
|
<script type="text/javascript">
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
28
|
+
// <![CDATA[
|
29
|
+
(function() {
|
30
|
+
Evergreen.driver = <%= Evergreen.driver.to_json %>;
|
31
|
+
<% @suite.templates.each do |template| %>
|
32
|
+
Evergreen.templates[<%= template.name.to_json %>] = <%= template.escaped_contents %>;
|
33
|
+
<% end %>
|
34
|
+
var jasmineEnv = jasmine.getEnv();
|
35
|
+
jasmineEnv.addReporter(new jasmine.TrivialReporter());
|
36
|
+
jasmineEnv.addReporter(new Evergreen.ReflectiveReporter());
|
37
|
+
jasmineEnv.execute();
|
38
|
+
})();
|
39
|
+
// ]]>
|
38
40
|
</script>
|
data/spec/evergreen_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Evergreen, ".application" do
|
4
|
-
include Capybara
|
4
|
+
include Capybara::DSL
|
5
5
|
|
6
6
|
it "should show a successful test run" do
|
7
7
|
visit("/")
|
@@ -21,4 +21,9 @@ describe Evergreen, ".application" do
|
|
21
21
|
page.should have_content("2 specs, 1 failure")
|
22
22
|
page.should have_content("Expected 'bar' to equal 'noooooo'.")
|
23
23
|
end
|
24
|
+
|
25
|
+
it "should add extensions to Evergreen" do
|
26
|
+
visit('/awesome')
|
27
|
+
page.should have_content('Totally awesome')
|
28
|
+
end
|
24
29
|
end
|
data/spec/runner_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -5,9 +5,15 @@ require 'evergreen'
|
|
5
5
|
require 'rspec'
|
6
6
|
|
7
7
|
require 'capybara/dsl'
|
8
|
-
require 'capybara
|
8
|
+
require 'capybara-webkit'
|
9
9
|
|
10
|
-
TEST_DRIVER = :
|
10
|
+
TEST_DRIVER = :webkit
|
11
|
+
|
12
|
+
Evergreen.extensions do
|
13
|
+
map "/awesome" do
|
14
|
+
run lambda { |env| [200, {'Content-Type' => 'text/html'}, "<html><body>Totally awesome</body></html>"]}
|
15
|
+
end
|
16
|
+
end
|
11
17
|
|
12
18
|
Capybara.app = Evergreen::Suite.new(File.expand_path('suite1', File.dirname(__FILE__))).application
|
13
19
|
Capybara.default_driver = TEST_DRIVER
|
File without changes
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
<script>var foo = 0;</script>
|
@@ -33,6 +33,14 @@ describe('templates', function() {
|
|
33
33
|
});
|
34
34
|
});
|
35
35
|
|
36
|
+
describe('with template with script tags', function() {
|
37
|
+
template('script_tags.html')
|
38
|
+
|
39
|
+
it("should append the template to the test div", function() {
|
40
|
+
expect($('#test h1#script-tags').length).toEqual(1);
|
41
|
+
});
|
42
|
+
});
|
43
|
+
|
36
44
|
});
|
37
45
|
|
38
46
|
describe('stylesheet', function() {
|
data/spec/suite_spec.rb
CHANGED
@@ -13,8 +13,8 @@ describe Evergreen::Suite do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
describe '#specs' do
|
16
|
-
it "should find all specs in the given root directory" do
|
17
|
-
subject.specs.map(&:name).should include('testing_spec.js', 'foo_spec.js', 'bar_spec.js', '
|
16
|
+
it "should find all specs recursively in the given root directory" do
|
17
|
+
subject.specs.map(&:name).should include('testing_spec.js', 'foo_spec.js', 'bar_spec.js', 'libs/lucid_spec.js', 'models/game_spec.js')
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
data/spec/template_spec.rb
CHANGED
@@ -20,3 +20,13 @@ describe Evergreen::Template do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
end
|
23
|
+
|
24
|
+
describe Evergreen::Template, "escaping" do
|
25
|
+
let(:root) { File.expand_path('suite1', File.dirname(__FILE__)) }
|
26
|
+
let(:suite) { Evergreen::Suite.new(root) }
|
27
|
+
subject { Evergreen::Template.new(suite, 'escape.html') }
|
28
|
+
|
29
|
+
it "escapes contents" do
|
30
|
+
subject.escaped_contents.strip.should == %{"<scr" + "ipt>var foo = 0;</scr" + "ipt>\\n"}
|
31
|
+
end
|
32
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: evergreen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 13
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 4
|
9
|
-
-
|
10
|
-
version: 0.4.
|
9
|
+
- 1
|
10
|
+
version: 0.4.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jonas Nicklas
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-06-22 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -28,10 +28,9 @@ dependencies:
|
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
hash: 15
|
30
30
|
segments:
|
31
|
+
- 1
|
31
32
|
- 0
|
32
|
-
|
33
|
-
- 0
|
34
|
-
version: 0.4.0
|
33
|
+
version: "1.0"
|
35
34
|
type: :runtime
|
36
35
|
version_requirements: *id001
|
37
36
|
- !ruby/object:Gem::Dependency
|
@@ -42,12 +41,10 @@ dependencies:
|
|
42
41
|
requirements:
|
43
42
|
- - ">="
|
44
43
|
- !ruby/object:Gem::Version
|
45
|
-
hash:
|
44
|
+
hash: 3
|
46
45
|
segments:
|
47
46
|
- 0
|
48
|
-
|
49
|
-
- 5
|
50
|
-
version: 0.3.5
|
47
|
+
version: "0"
|
51
48
|
type: :runtime
|
52
49
|
version_requirements: *id002
|
53
50
|
- !ruby/object:Gem::Dependency
|
@@ -56,7 +53,7 @@ dependencies:
|
|
56
53
|
requirement: &id003 !ruby/object:Gem::Requirement
|
57
54
|
none: false
|
58
55
|
requirements:
|
59
|
-
- -
|
56
|
+
- - ~>
|
60
57
|
- !ruby/object:Gem::Version
|
61
58
|
hash: 13
|
62
59
|
segments:
|
@@ -73,18 +70,30 @@ dependencies:
|
|
73
70
|
requirements:
|
74
71
|
- - ">="
|
75
72
|
- !ruby/object:Gem::Version
|
76
|
-
hash:
|
73
|
+
hash: 3
|
77
74
|
segments:
|
78
|
-
- 1
|
79
75
|
- 0
|
80
|
-
|
81
|
-
version: 1.0.0
|
76
|
+
version: "0"
|
82
77
|
type: :runtime
|
83
78
|
version_requirements: *id004
|
84
79
|
- !ruby/object:Gem::Dependency
|
85
|
-
name:
|
80
|
+
name: coffee-script
|
86
81
|
prerelease: false
|
87
82
|
requirement: &id005 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
hash: 3
|
88
|
+
segments:
|
89
|
+
- 0
|
90
|
+
version: "0"
|
91
|
+
type: :runtime
|
92
|
+
version_requirements: *id005
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: rspec
|
95
|
+
prerelease: false
|
96
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
88
97
|
none: false
|
89
98
|
requirements:
|
90
99
|
- - ~>
|
@@ -95,23 +104,39 @@ dependencies:
|
|
95
104
|
- 0
|
96
105
|
version: "2.0"
|
97
106
|
type: :development
|
98
|
-
version_requirements: *
|
107
|
+
version_requirements: *id006
|
99
108
|
- !ruby/object:Gem::Dependency
|
100
|
-
name: capybara-
|
109
|
+
name: capybara-webkit
|
101
110
|
prerelease: false
|
102
|
-
requirement: &
|
111
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
103
112
|
none: false
|
104
113
|
requirements:
|
105
|
-
- -
|
114
|
+
- - ">="
|
106
115
|
- !ruby/object:Gem::Version
|
107
|
-
hash:
|
116
|
+
hash: -1848230056
|
108
117
|
segments:
|
118
|
+
- 1
|
109
119
|
- 0
|
110
|
-
- 4
|
111
120
|
- 0
|
112
|
-
|
121
|
+
- beta4
|
122
|
+
version: 1.0.0.beta4
|
113
123
|
type: :development
|
114
|
-
version_requirements: *
|
124
|
+
version_requirements: *id007
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: therubyracer
|
127
|
+
prerelease: false
|
128
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ~>
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
hash: 25
|
134
|
+
segments:
|
135
|
+
- 0
|
136
|
+
- 9
|
137
|
+
version: "0.9"
|
138
|
+
type: :development
|
139
|
+
version_requirements: *id008
|
115
140
|
description: Run Jasmine JavaScript unit tests, integrate them into Ruby applications.
|
116
141
|
email:
|
117
142
|
- jonas.nicklas@gmail.com
|
@@ -225,11 +250,15 @@ files:
|
|
225
250
|
- spec/suite1/spec/javascripts/failing_spec.js
|
226
251
|
- spec/suite1/spec/javascripts/foo_spec.js
|
227
252
|
- spec/suite1/spec/javascripts/invalid_coffee_spec.coffee
|
253
|
+
- spec/suite1/spec/javascripts/libs/lucid_spec.js
|
254
|
+
- spec/suite1/spec/javascripts/models/game_spec.js
|
228
255
|
- spec/suite1/spec/javascripts/slow_spec.coffee
|
229
256
|
- spec/suite1/spec/javascripts/spec_helper.coffee
|
230
257
|
- spec/suite1/spec/javascripts/spec_helper.js
|
231
258
|
- spec/suite1/spec/javascripts/templates/another_template.html
|
259
|
+
- spec/suite1/spec/javascripts/templates/escape.html
|
232
260
|
- spec/suite1/spec/javascripts/templates/one_template.html
|
261
|
+
- spec/suite1/spec/javascripts/templates/script_tags.html
|
233
262
|
- spec/suite1/spec/javascripts/templates_spec.js
|
234
263
|
- spec/suite1/spec/javascripts/testing_spec.js
|
235
264
|
- spec/suite1/spec/javascripts/transactions_spec.js
|