konacha 1.5.1 → 2.0.0.beta1
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/History.md +7 -0
- data/README.md +71 -57
- data/app/assets/javascripts/konacha/iframe.js +40 -0
- data/app/assets/javascripts/konacha/parent.js +14 -0
- data/app/assets/javascripts/konacha/runner.js +45 -0
- data/app/assets/stylesheets/konacha.css +75 -0
- data/app/controllers/konacha/specs_controller.rb +6 -1
- data/app/models/konacha/spec.rb +1 -1
- data/app/views/konacha/specs/iframe.html.erb +18 -0
- data/app/views/konacha/specs/parent.html.erb +16 -0
- data/config/routes.rb +4 -2
- data/images/frame-select.png +0 -0
- data/konacha.gemspec +1 -1
- data/lib/konacha/engine.rb +1 -0
- data/lib/konacha/runner.rb +22 -57
- data/spec/controllers/specs_controller_spec.rb +4 -4
- data/spec/dummy/config/application.rb +1 -0
- data/spec/dummy/spec/isolated/errors/failing_iframe_spec.js.coffee +1 -0
- data/spec/dummy/spec/javascripts/{test_element_spec.js.coffee → body_spec.js.coffee} +4 -7
- data/spec/dummy/spec/javascripts/isolation/a_spec.js +6 -0
- data/spec/dummy/spec/javascripts/isolation/b_spec.js +6 -0
- data/spec/dummy/spec/javascripts/templating_spec.js +4 -4
- data/spec/dummy/spec/javascripts/ui_spec.js +7 -0
- data/spec/error_handling_spec.rb +33 -0
- data/spec/models/spec_spec.rb +1 -1
- data/spec/spec_helper.rb +5 -0
- data/spec/views/specs/{specs.html.erb_spec.rb → iframe.html.erb_spec.rb} +12 -8
- data/vendor/assets/javascripts/mocha.js +297 -114
- metadata +195 -180
- data/app/views/konacha/specs/specs.html.erb +0 -16
- data/lib/assets/javascripts/konacha.js +0 -20
- data/lib/assets/javascripts/konacha/runner.js +0 -50
- data/lib/assets/javascripts/konacha/server.js +0 -6
- data/lib/assets/stylesheets/konacha.css +0 -5
- data/spec/dummy/spec/javascripts/konacha_config.js +0 -2
- data/spec/dummy/spec/javascripts/konacha_config_spec.js +0 -9
data/History.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
# master
|
2
|
+
|
3
|
+
* Run tests in an iframe, with `<body id="konacha">`
|
4
|
+
* Removed support for konacha_config.js and Konacha.mochaOptions in favor of
|
5
|
+
Mocha's own configuration methods. See the README for update instructions.
|
6
|
+
* Update mocha (1.5.0)
|
7
|
+
|
1
8
|
# 1.x-stable
|
2
9
|
|
3
10
|
# 1.5.1
|
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
[](https://gemnasium.com/jfirebaugh/konacha)
|
5
5
|
|
6
6
|
Konacha is a Rails engine that allows you to test your JavaScript with the
|
7
|
-
[
|
7
|
+
[Mocha](http://visionmedia.github.com/mocha/) test framework and [chai](http://chaijs.com/)
|
8
8
|
assertion library.
|
9
9
|
|
10
10
|
[![Konacha][2]][1]
|
@@ -68,6 +68,9 @@ describe "Array#sum", ->
|
|
68
68
|
[1,2,3].sum().should.equal(6)
|
69
69
|
```
|
70
70
|
|
71
|
+
Your tests are run inside an iframe. You have the entire `<body>` element to
|
72
|
+
yourself, and it is automatically reset between tests.
|
73
|
+
|
71
74
|
## Running (Rake Tasks)
|
72
75
|
|
73
76
|
### In the Browser
|
@@ -85,7 +88,13 @@ to a subdirectory to run a subset of specs (e.g.
|
|
85
88
|
`http://localhost:3500/models`).
|
86
89
|
|
87
90
|
This is the recommended mode for development, since you can simply hit refresh
|
88
|
-
to reload all your test and asset files.
|
91
|
+
to reload all your test and asset files. To debug tests, use the `debugger`
|
92
|
+
statement anywhere in a test to halt execution.
|
93
|
+
|
94
|
+
To run code in the JavaScript console, be sure to select the desired iframe
|
95
|
+
first, so your code runs in the correct context.
|
96
|
+
|
97
|
+

|
89
98
|
|
90
99
|
### Command-Line Runner
|
91
100
|
|
@@ -95,7 +104,7 @@ To run your tests from the command line, type:
|
|
95
104
|
$ bundle exec rake konacha:run
|
96
105
|
```
|
97
106
|
|
98
|
-
To run individual specs, pass a comma
|
107
|
+
To run individual specs, pass a comma separated list of spec file names via
|
99
108
|
the `SPEC` environment variable.
|
100
109
|
|
101
110
|
```
|
@@ -107,7 +116,7 @@ $ bundle exec rake konacha:run SPEC=foo_spec,bar_spec,etc_spec
|
|
107
116
|
|
108
117
|
Since Konacha integrates with the asset pipeline, using setup helpers in your specs is
|
109
118
|
easy. Just create a `spec_helper.js` or `spec_helper.js.coffee` file in `specs/javascripts`
|
110
|
-
and require it in your tests
|
119
|
+
and require it in your tests:
|
111
120
|
|
112
121
|
```javascript
|
113
122
|
//= require spec_helper
|
@@ -121,14 +130,27 @@ describe("Array#sum", function() {
|
|
121
130
|
The `spec_helper` is a good place to set Mocha and Chai options as well, for instance:
|
122
131
|
|
123
132
|
```javascript
|
133
|
+
// set the Mocha test interface
|
134
|
+
// see http://visionmedia.github.com/mocha/#interfaces
|
135
|
+
mocha.ui('bdd');
|
136
|
+
|
137
|
+
// ignore the following globals during leak detection
|
138
|
+
mocha.globals(['YUI']);
|
139
|
+
|
140
|
+
// or, ignore all leaks
|
141
|
+
mocha.ignoreLeaks();
|
142
|
+
|
143
|
+
// set slow test timeout in ms
|
144
|
+
mocha.timeout(5);
|
145
|
+
|
124
146
|
// Show stack trace on failing assertion.
|
125
147
|
chai.Assertion.includeStack = true;
|
126
148
|
```
|
127
149
|
|
128
150
|
## Directives and Asset Bundling
|
129
151
|
|
130
|
-
We suggest that you explicitly require just the assets necessary for each spec.
|
131
|
-
|
152
|
+
We suggest that you explicitly require just the assets necessary for each spec.
|
153
|
+
Konacha runs each spec file in isolation, and requiring things explicitly will help
|
132
154
|
ensure your scripts don't accumulate hidden dependencies and tight coupling.
|
133
155
|
|
134
156
|
However, you are free to ignore this advice and require the entire application.js asset
|
@@ -143,42 +165,20 @@ Konacha can be configured in an initializer, e.g. `config/initializers/konacha.r
|
|
143
165
|
|
144
166
|
```ruby
|
145
167
|
Konacha.configure do |config|
|
146
|
-
config.spec_dir
|
147
|
-
config.driver
|
168
|
+
config.spec_dir = "spec/javascripts"
|
169
|
+
config.driver = :selenium
|
170
|
+
config.stylesheets = %w(application)
|
148
171
|
end if defined?(Konacha)
|
149
172
|
```
|
150
173
|
|
151
174
|
The `defined?` check is necessary to avoid a dependency on Konacha in the production
|
152
175
|
environment.
|
153
176
|
|
154
|
-
The `spec_dir` option tells Konacha where to find JavaScript specs. `driver`
|
155
|
-
Capybara driver used for the `run` task (try `:webkit`, after
|
156
|
-
[capybara-webkit](https://github.com/thoughtbot/capybara-webkit)).
|
157
|
-
|
158
|
-
The values above are the defaults.
|
159
|
-
|
160
|
-
### Mocha Configuration
|
161
|
-
|
162
|
-
You can customize the Mocha options passed into `mocha.setup(..)` by creating a file
|
163
|
-
named `konacha_config.js` or `konacha_config.js.coffee` in `spec/javascripts` and
|
164
|
-
setting properties of `Konacha.mochaOptions`:
|
165
|
-
|
166
|
-
```javascript
|
167
|
-
// set the Mocha test interface
|
168
|
-
// see http://visionmedia.github.com/mocha/#interfaces
|
169
|
-
Konacha.mochaOptions.ui = 'bdd';
|
170
|
-
|
171
|
-
// ignore the following globals during leak detection
|
172
|
-
Konacha.mochaOptions.globals = ['YUI'];
|
173
|
-
|
174
|
-
// or, ignore all leaks
|
175
|
-
Konacha.mochaOptions.ignoreLeaks = true;
|
176
|
-
|
177
|
-
// set slow test timeout in ms
|
178
|
-
Konacha.mochaOptions.timeout = 5;
|
179
|
-
```
|
180
|
-
|
181
|
-
The `ui` and `reporter` Mocha options are set by Konacha and must not be modified.
|
177
|
+
The `spec_dir` option tells Konacha where to find JavaScript specs. `driver`
|
178
|
+
names a Capybara driver used for the `run` task (try `:webkit`, after
|
179
|
+
installing [capybara-webkit](https://github.com/thoughtbot/capybara-webkit)).
|
180
|
+
The `stylesheets` option sets the stylesheets to be linked from the `<head>`
|
181
|
+
of the test runner iframe. The values above are the defaults.
|
182
182
|
|
183
183
|
## Test Interface and Assertions
|
184
184
|
|
@@ -194,30 +194,12 @@ If you use jQuery, you may want to check out [chai-jquery](https://github.com/jf
|
|
194
194
|
for some jQuery-specific assertions. You can add it painlessly with the
|
195
195
|
[chai-jquery-rails](https://github.com/wordofchristian/chai-jquery-rails) gem.
|
196
196
|
|
197
|
-
## Transactions
|
198
|
-
|
199
|
-
One problem often faced when writing unit tests for client side code is that changes
|
200
|
-
to the page are not reverted for the next example, so that successive examples become
|
201
|
-
dependent on each other. Konacha adds a special div to your page with an id of `konacha`.
|
202
|
-
This div is automatically emptied before each example. You should avoid appending markup
|
203
|
-
to the page body and instead append it to the `#konacha` div:
|
204
|
-
|
205
|
-
```coffeescript
|
206
|
-
describe "transactions", ->
|
207
|
-
it "should add stuff in one test...", ->
|
208
|
-
$('#konacha').append('<h1 id="added">New Stuff</h1>')
|
209
|
-
$('#konacha h1#added').length.should.equal(1)
|
210
|
-
|
211
|
-
it "... should have been removed before the next starts", ->
|
212
|
-
$('#konacha h1#added').length.should.equal(0)
|
213
|
-
```
|
214
|
-
|
215
197
|
## Templates / Fixtures
|
216
198
|
|
217
199
|
Konacha has no template (a.k.a. HTML fixture) support of its own. Instead, we suggest you use
|
218
200
|
Sprocket's built in support for JavaScript template (`.jst`) files. Add a `spec/javascripts/templates`
|
219
201
|
directory, place template files there (using any JS template language supported by Sprockets),
|
220
|
-
require them in your spec or spec_helper, and render them into the
|
202
|
+
require them in your spec or spec_helper, and render them into the `<body>`.
|
221
203
|
|
222
204
|
For example, in `spec/javascripts/templates/hello.jst.ejs`:
|
223
205
|
|
@@ -238,12 +220,44 @@ And your spec:
|
|
238
220
|
|
239
221
|
describe("templating", function() {
|
240
222
|
it("is built in to Sprockets", function() {
|
241
|
-
$('
|
242
|
-
$('
|
223
|
+
$('body').html(JST['templates/hello']());
|
224
|
+
$('body h1').text().should.equal('Hello Konacha!');
|
243
225
|
});
|
244
226
|
});
|
245
227
|
```
|
246
228
|
|
229
|
+
## Upgrading from Konacha 1.x
|
230
|
+
|
231
|
+
### Iframe
|
232
|
+
|
233
|
+
As of Konacha 2.0, each test file is run inside an isolated iframe. For
|
234
|
+
compatibility with Konacha 1.x, the iframe's `<body>` element will have
|
235
|
+
`id="konacha"` set on it. If your specs are already self-contained, you may be
|
236
|
+
able to upgrade without any changes to your test code.
|
237
|
+
|
238
|
+
### Options
|
239
|
+
|
240
|
+
In Konacha 1.x you would set `Konacha.mochaOptions` in `konacha_config.js`:
|
241
|
+
|
242
|
+
```javascript
|
243
|
+
// Old syntax
|
244
|
+
Konacha.mochaOptions.ignoreLeaks = true;
|
245
|
+
```
|
246
|
+
|
247
|
+
The `konacha_config.js` file is no longer used by Konacha 2.0. Instead, call
|
248
|
+
Mocha's own methods in [`spec_helper.js`](#spec-helper):
|
249
|
+
|
250
|
+
```javascript
|
251
|
+
// New syntax
|
252
|
+
mocha.ignoreLeaks();
|
253
|
+
```
|
254
|
+
|
255
|
+
### Global `mocha`
|
256
|
+
|
257
|
+
Konacha 2.0 ships with an upgraded Mocha. Some objects that were previously
|
258
|
+
available on the global `mocha` object might now be located on `Mocha`. If you
|
259
|
+
get an error message to this effect, adjust your code accordingly.
|
260
|
+
|
247
261
|
## Contributing
|
248
262
|
|
249
263
|
```bash
|
@@ -0,0 +1,40 @@
|
|
1
|
+
window.mocha = parent.mocha;
|
2
|
+
window.Mocha = parent.Mocha;
|
3
|
+
|
4
|
+
window.Konacha = {
|
5
|
+
reset: function() {
|
6
|
+
document.body = document.createElement('body');
|
7
|
+
document.body.id = 'konacha';
|
8
|
+
}
|
9
|
+
};
|
10
|
+
|
11
|
+
var suite = Mocha.Suite.create(mocha.suite);
|
12
|
+
|
13
|
+
mocha.ui = function (name) {
|
14
|
+
this._ui = Mocha.interfaces[name];
|
15
|
+
if (!this._ui) throw new Error('invalid interface "' + name + '"');
|
16
|
+
this._ui = this._ui(suite);
|
17
|
+
suite.emit('pre-require', window, null, this);
|
18
|
+
return this;
|
19
|
+
};
|
20
|
+
|
21
|
+
mocha.ui('bdd');
|
22
|
+
|
23
|
+
suite.beforeAll(function () {
|
24
|
+
var contexts = parent.document.getElementsByClassName("test-context");
|
25
|
+
for (var i = 0; i < contexts.length; ++i) {
|
26
|
+
if (contexts[i].contentWindow == window) {
|
27
|
+
contexts[i].style.display = "block";
|
28
|
+
} else {
|
29
|
+
contexts[i].style.display = null;
|
30
|
+
}
|
31
|
+
}
|
32
|
+
});
|
33
|
+
|
34
|
+
suite.beforeEach(function () {
|
35
|
+
Konacha.reset();
|
36
|
+
});
|
37
|
+
|
38
|
+
var expect = chai.expect,
|
39
|
+
should = chai.should(),
|
40
|
+
assert = chai.assert;
|
@@ -0,0 +1,14 @@
|
|
1
|
+
window.onload = function () {
|
2
|
+
var iframes = document.getElementsByTagName('iframe');
|
3
|
+
for (var i = 0; i < iframes.length; ++i) {
|
4
|
+
if (!iframes[i].contentWindow.mocha) {
|
5
|
+
(function (path) {
|
6
|
+
mocha.suite.addTest(new Mocha.Test(path, function () {
|
7
|
+
throw new Error("Failed to load " + path + ". Perhaps it failed to compile?");
|
8
|
+
}));
|
9
|
+
})(iframes[i].getAttribute("data-path"));
|
10
|
+
}
|
11
|
+
}
|
12
|
+
|
13
|
+
mocha.run();
|
14
|
+
};
|
@@ -0,0 +1,45 @@
|
|
1
|
+
Konacha = {
|
2
|
+
dots: "",
|
3
|
+
getResults: function() {
|
4
|
+
return JSON.stringify(Konacha.results);
|
5
|
+
}
|
6
|
+
};
|
7
|
+
|
8
|
+
mocha.reporter(function(runner) {
|
9
|
+
Mocha.reporters.Base.call(this, runner);
|
10
|
+
|
11
|
+
runner.on('start', function() {
|
12
|
+
Konacha.results = [];
|
13
|
+
});
|
14
|
+
|
15
|
+
runner.on('pass', function(test) {
|
16
|
+
Konacha.dots += ".";
|
17
|
+
Konacha.results.push({
|
18
|
+
name:test.title,
|
19
|
+
passed:true
|
20
|
+
});
|
21
|
+
});
|
22
|
+
|
23
|
+
runner.on('fail', function(test) {
|
24
|
+
Konacha.dots += "F";
|
25
|
+
Konacha.results.push({
|
26
|
+
name:test.title,
|
27
|
+
passed:false,
|
28
|
+
message:test.err.message,
|
29
|
+
trace:test.err.stack
|
30
|
+
});
|
31
|
+
});
|
32
|
+
|
33
|
+
runner.on('pending', function(test) {
|
34
|
+
Konacha.dots += "P";
|
35
|
+
Konacha.results.push({
|
36
|
+
name:test.title,
|
37
|
+
passed:false,
|
38
|
+
pending:true
|
39
|
+
});
|
40
|
+
});
|
41
|
+
|
42
|
+
runner.on('end', function() {
|
43
|
+
Konacha.done = true;
|
44
|
+
});
|
45
|
+
});
|
@@ -0,0 +1,75 @@
|
|
1
|
+
/*
|
2
|
+
*= require mocha
|
3
|
+
*/
|
4
|
+
|
5
|
+
body {
|
6
|
+
padding: 60px 0;
|
7
|
+
}
|
8
|
+
|
9
|
+
.test-context {
|
10
|
+
-webkit-transform-origin: right top;
|
11
|
+
-moz-transform-origin: right top;
|
12
|
+
-ms-transform-origin: right top;
|
13
|
+
-o-transform-origin: right top;
|
14
|
+
transform-origin: right top;
|
15
|
+
|
16
|
+
width: 1000px;
|
17
|
+
height: 700px;
|
18
|
+
|
19
|
+
position: fixed;
|
20
|
+
top: 80px;
|
21
|
+
right: 25px;
|
22
|
+
|
23
|
+
/* inset */
|
24
|
+
border-top: 2px solid #c8c8c8;
|
25
|
+
border-bottom: 2px solid #eee;
|
26
|
+
border-left: 2px solid #ddd;
|
27
|
+
border-right: 2px solid #ddd;
|
28
|
+
|
29
|
+
/* opaque */
|
30
|
+
z-index: 1;
|
31
|
+
background-color: white;
|
32
|
+
|
33
|
+
/* dynamically shown */
|
34
|
+
display: none;
|
35
|
+
}
|
36
|
+
|
37
|
+
@media (max-width: 1860px) {
|
38
|
+
.test-context {
|
39
|
+
-webkit-transform: scale(0.6666666666);
|
40
|
+
-moz-transform: scale(0.6666666666);
|
41
|
+
-ms-transform: scale(0.6666666666);
|
42
|
+
-o-transform: scale(0.6666666666);
|
43
|
+
transform: scale(0.6666666666);
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
@media (max-width: 1550px) {
|
48
|
+
.test-context {
|
49
|
+
-webkit-transform: scale(0.5);
|
50
|
+
-moz-transform: scale(0.5);
|
51
|
+
-ms-transform: scale(0.5);
|
52
|
+
-o-transform: scale(0.5);
|
53
|
+
transform: scale(0.5);
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
@media (max-width: 1230px) {
|
58
|
+
.test-context {
|
59
|
+
-webkit-transform: scale(0.3333333333);
|
60
|
+
-moz-transform: scale(0.3333333333);
|
61
|
+
-ms-transform: scale(0.3333333333);
|
62
|
+
-o-transform: scale(0.3333333333);
|
63
|
+
transform: scale(0.3333333333);
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
67
|
+
@media (max-width: 1050px) {
|
68
|
+
.test-context {
|
69
|
+
-webkit-transform: scale(0.2);
|
70
|
+
-moz-transform: scale(0.2);
|
71
|
+
-ms-transform: scale(0.2);
|
72
|
+
-o-transform: scale(0.2);
|
73
|
+
transform: scale(0.2);
|
74
|
+
}
|
75
|
+
}
|
@@ -4,8 +4,13 @@ module Konacha
|
|
4
4
|
render :text => "Not found", :status => 404
|
5
5
|
end
|
6
6
|
|
7
|
-
def
|
7
|
+
def parent
|
8
8
|
@specs = Konacha::Spec.find(params[:path] || "")
|
9
9
|
end
|
10
|
+
|
11
|
+
def iframe
|
12
|
+
@specs = Konacha::Spec.find(params[:path])
|
13
|
+
@stylesheets = Konacha::Engine.config.konacha.stylesheets
|
14
|
+
end
|
10
15
|
end
|
11
16
|
end
|
data/app/models/konacha/spec.rb
CHANGED
@@ -0,0 +1,18 @@
|
|
1
|
+
<!doctype html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
|
5
|
+
<title>Konacha Tests</title>
|
6
|
+
|
7
|
+
<% @stylesheets.each do |file| %>
|
8
|
+
<%# Use :debug => false for stylesheets to improve page load performance. %>
|
9
|
+
<%= stylesheet_link_tag file, :debug => false %>
|
10
|
+
<% end %>
|
11
|
+
|
12
|
+
<%= javascript_include_tag "chai", "konacha/iframe", :debug => false %>
|
13
|
+
|
14
|
+
<%= spec_include_tag *@specs %>
|
15
|
+
</head>
|
16
|
+
<body>
|
17
|
+
</body>
|
18
|
+
</html>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<!doctype html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
|
5
|
+
<title>Konacha Tests</title>
|
6
|
+
<%= stylesheet_link_tag "konacha", :debug => false %>
|
7
|
+
<%= javascript_include_tag "mocha", "konacha/parent", :debug => false %>
|
8
|
+
<%= javascript_include_tag("konacha/runner", :debug => false) if Konacha.mode == :runner %>
|
9
|
+
</head>
|
10
|
+
<body>
|
11
|
+
<% @specs.each do |spec| %>
|
12
|
+
<%= content_tag :iframe, '', :src => spec.url, :class => 'test-context', "data-path" => spec.path %>
|
13
|
+
<% end %>
|
14
|
+
<div id="mocha"></div>
|
15
|
+
</body>
|
16
|
+
</html>
|