teaspoon 1.0.2 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +38 -2
- data/README.md +25 -0
- data/app/assets/javascripts/teaspoon/fixture.coffee +12 -4
- data/app/assets/javascripts/teaspoon/mixins/_namespace.coffee +1 -0
- data/app/assets/javascripts/teaspoon/mixins/filter_url.coffee +6 -0
- data/app/assets/javascripts/teaspoon/reporters/console.coffee +36 -23
- data/app/assets/javascripts/teaspoon/reporters/html.coffee +12 -14
- data/app/assets/javascripts/teaspoon/reporters/html/spec_view.coffee +44 -8
- data/app/assets/javascripts/teaspoon/spec.coffee +2 -0
- data/app/assets/javascripts/teaspoon/suite.coffee +2 -0
- data/app/assets/javascripts/teaspoon/teaspoon.coffee +5 -1
- data/app/assets/javascripts/teaspoon/utility.coffee +7 -0
- data/app/assets/stylesheets/teaspoon.css +0 -14
- data/lib/generators/teaspoon/install/templates/env_comments.rb.tt +3 -0
- data/lib/tasks/teaspoon.rake +2 -0
- data/lib/teaspoon-devkit.rb +15 -3
- data/lib/teaspoon/configuration.rb +2 -2
- data/lib/teaspoon/coverage.rb +1 -1
- data/lib/teaspoon/deprecated.rb +5 -0
- data/lib/teaspoon/driver/capybara_webkit.rb +6 -2
- data/lib/teaspoon/driver/phantomjs.rb +4 -0
- data/lib/teaspoon/environment.rb +9 -2
- data/lib/teaspoon/formatter/base.rb +10 -1
- data/lib/teaspoon/suite.rb +4 -2
- data/lib/teaspoon/version.rb +1 -1
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d648d120a3291ff212bf062258587a21f1ac8108
|
4
|
+
data.tar.gz: 82a0bc09c853b64f7af62d41e83eab9f29bb9245
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d40d4cda9de76dd8c641af719e3c86b8c37b40b554c18415cbb583757552d6a6fda5fdb89a5e906638fab73c52aec66ff25677c43d78a120687bdbef51b4259
|
7
|
+
data.tar.gz: ed02beab78edf289befa77c321f46469dc1a777877c598b70def697dea0a033e782b21f88ce4fa5e25124293a41746506085b1127b5cca32fb4518371541b159
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,30 @@
|
|
1
1
|
### Unreleased
|
2
2
|
|
3
|
+
#### Bug Fixes
|
4
|
+
|
5
|
+
|
6
|
+
### 1.1.0
|
7
|
+
|
8
|
+
#### Enhancements
|
9
|
+
|
10
|
+
* Support invalid HTML in fixtures (#387)
|
11
|
+
* Configurable JavaScript extensions via suite.js_extensions (#418)
|
12
|
+
* Fail build when Phantomjs fails (b34c4)
|
13
|
+
* Add new versions of test frameworks to the latest minor versions
|
14
|
+
|
15
|
+
#### Bug Fixes
|
16
|
+
|
17
|
+
* Retain file filter when navigating to specs (#327)
|
18
|
+
* Provide details when Istanbul fails (#368)
|
19
|
+
* Fix support for barebones Rails app (#372)
|
20
|
+
* Fix pending count and nested styles (#373)
|
21
|
+
* Fix total count in Jasmine 2 (#378)
|
22
|
+
* Deprecate and fix suite.use_framework= (#394)
|
23
|
+
* Fix capybara-webkit synchronization (#403)
|
24
|
+
* Fix reporting in IE8 (97cf6)
|
25
|
+
* Fix Jasmine's "fit" (f5e2a)
|
26
|
+
|
27
|
+
|
3
28
|
### 1.0.2 (5/5/15)
|
4
29
|
|
5
30
|
#### Bug Fixes
|
@@ -20,8 +45,19 @@
|
|
20
45
|
#### Upgrade Steps
|
21
46
|
|
22
47
|
- **Update your Gemfile**<br>
|
23
|
-
Change your Gemfile to use
|
24
|
-
eg:
|
48
|
+
Change your Gemfile to use `teaspoon-jasmine` instead of `teaspoon`, if you're using Jasmine. If you're using Mocha, this would be `teaspoon-mocha`. Use `teaspoon-qunit` for QUnit.<br>
|
49
|
+
eg: For Jasmine:
|
50
|
+
```ruby
|
51
|
+
gem 'teaspoon-jasmine'
|
52
|
+
```
|
53
|
+
For Mocha:
|
54
|
+
```ruby
|
55
|
+
gem 'teaspoon-mocha'
|
56
|
+
```
|
57
|
+
For QUnit:
|
58
|
+
```ruby
|
59
|
+
gem 'teaspoon-qunit'
|
60
|
+
```
|
25
61
|
|
26
62
|
If you had Teaspoon locked at a specific version, kill the version. You'll now need to reference the version of the framework, instead of the version of Teaspoon.<br>
|
27
63
|
eg: If your Gemfile has `gem 'teaspoon', '0.9.1'` and you're using Mocha, you'll want your Gemfile to reference the latest version of Mocha: `gem 'teaspoon-mocha', '2.2.4'`. The teaspoon-mocha gem contains previous versions of Mocha, so even if you're not using version 2.2.4 of Mocha in your `teaspoon_env.rb`, still reference the latest version in your Gemfile and the older version should still work.
|
data/README.md
CHANGED
@@ -329,6 +329,31 @@ All files | 93.75 | 75 | 94.12 | 93.65 |
|
|
329
329
|
--------------------+-----------+-----------+-----------+-----------+
|
330
330
|
```
|
331
331
|
|
332
|
+
### Caveats
|
333
|
+
|
334
|
+
In order to provide accurate coverage and best performance, it is recommended that you require the implementation file directly from the spec file. For example:
|
335
|
+
|
336
|
+
```js
|
337
|
+
//= require "my_class"
|
338
|
+
describe("MyClass", function() { ... });
|
339
|
+
```
|
340
|
+
|
341
|
+
It is **not** recommended that you require the entirety of your assets from within your spec helper:
|
342
|
+
|
343
|
+
***spec_helper.js***
|
344
|
+
```js
|
345
|
+
//= require "application"
|
346
|
+
```
|
347
|
+
|
348
|
+
If you must require `application` from your spec helper and you have `expand_assets` configuration set to `false`, you'll need to exclude the spec helper from ignored coverage files:
|
349
|
+
|
350
|
+
***teaspoon_env.rb***
|
351
|
+
```ruby
|
352
|
+
config.coverage do |coverage|
|
353
|
+
coverage.ignore = coverage.ignore.reject { |matcher| matcher.match('/spec_helper.') }
|
354
|
+
end
|
355
|
+
```
|
356
|
+
|
332
357
|
### Thresholds
|
333
358
|
|
334
359
|
Teaspoon allows defining coverage threshold requirements. If a threshold is not met, it will cause a test run failure.
|
@@ -63,18 +63,22 @@ class Teaspoon.Fixture
|
|
63
63
|
|
64
64
|
putContent = (content) =>
|
65
65
|
cleanup()
|
66
|
-
|
67
|
-
window.fixture.el.innerHTML = content
|
66
|
+
addContent(content)
|
68
67
|
|
69
68
|
|
70
69
|
addContent = (content) =>
|
71
70
|
create() unless window.fixture.el
|
72
|
-
|
71
|
+
|
72
|
+
if jQueryAvailable()
|
73
|
+
parsed = $($.parseHTML(content, document, true))
|
74
|
+
window.fixture.el.appendChild(parsed[i]) for i in [0...parsed.length]
|
75
|
+
else
|
76
|
+
window.fixture.el.innerHTML += content
|
73
77
|
|
74
78
|
|
75
79
|
create = =>
|
76
80
|
window.fixture.el = document.createElement("div")
|
77
|
-
window.fixture.$el = $(window.fixture.el) if
|
81
|
+
window.fixture.$el = $(window.fixture.el) if jQueryAvailable()
|
78
82
|
window.fixture.el.id = "teaspoon-fixtures"
|
79
83
|
document.body?.appendChild(window.fixture.el)
|
80
84
|
|
@@ -98,3 +102,7 @@ class Teaspoon.Fixture
|
|
98
102
|
xhr.onreadystatechange = callback
|
99
103
|
xhr.open("GET", "#{Teaspoon.root}/fixtures/#{url}", false)
|
100
104
|
xhr.send()
|
105
|
+
|
106
|
+
|
107
|
+
jQueryAvailable = ->
|
108
|
+
typeof(window.$) == 'function'
|
@@ -0,0 +1 @@
|
|
1
|
+
Teaspoon.Mixins ||= {}
|
@@ -41,44 +41,57 @@ class Teaspoon.Reporters.Console
|
|
41
41
|
|
42
42
|
reportSpecResults: (@spec) ->
|
43
43
|
result = @spec.result()
|
44
|
-
|
44
|
+
|
45
|
+
if result.status == "pending"
|
46
|
+
@trackPending(@spec)
|
47
|
+
else if result.status == "failed"
|
48
|
+
@trackFailed(@spec)
|
49
|
+
else if result.skipped
|
50
|
+
@trackDisabled(@spec)
|
51
|
+
else
|
52
|
+
@trackPassed(@spec)
|
53
|
+
|
54
|
+
|
55
|
+
trackPending: (spec) ->
|
45
56
|
@reportSuites()
|
46
|
-
|
47
|
-
when "pending" then @trackPending()
|
48
|
-
when "failed" then @trackFailure()
|
49
|
-
else
|
50
|
-
@log
|
51
|
-
type: "spec"
|
52
|
-
suite: @spec.suiteName
|
53
|
-
label: @spec.description
|
54
|
-
status: result.status
|
55
|
-
skipped: result.skipped
|
56
|
-
|
57
|
-
|
58
|
-
trackPending: ->
|
59
|
-
result = @spec.result()
|
57
|
+
result = spec.result()
|
60
58
|
@log
|
61
59
|
type: "spec"
|
62
|
-
suite:
|
63
|
-
label:
|
60
|
+
suite: spec.suiteName
|
61
|
+
label: spec.description
|
64
62
|
status: result.status
|
65
63
|
skipped: result.skipped
|
66
64
|
|
67
65
|
|
68
|
-
|
69
|
-
|
70
|
-
|
66
|
+
trackFailed: (spec) ->
|
67
|
+
@reportSuites()
|
68
|
+
result = spec.result()
|
69
|
+
for error in spec.errors()
|
71
70
|
@log
|
72
71
|
type: "spec"
|
73
|
-
suite:
|
74
|
-
label:
|
72
|
+
suite: spec.suiteName
|
73
|
+
label: spec.description
|
75
74
|
status: result.status
|
76
75
|
skipped: result.skipped
|
77
|
-
link:
|
76
|
+
link: spec.fullDescription
|
78
77
|
message: error.message
|
79
78
|
trace: error.stack || error.message || "Stack Trace Unavailable"
|
80
79
|
|
81
80
|
|
81
|
+
trackDisabled: (spec) -> # noop
|
82
|
+
|
83
|
+
|
84
|
+
trackPassed: (spec, result) ->
|
85
|
+
@reportSuites()
|
86
|
+
result = spec.result()
|
87
|
+
@log
|
88
|
+
type: "spec"
|
89
|
+
suite: spec.suiteName
|
90
|
+
label: spec.description
|
91
|
+
status: result.status
|
92
|
+
skipped: result.skipped
|
93
|
+
|
94
|
+
|
82
95
|
log: (obj = {}) ->
|
83
96
|
obj["_teaspoon"] = true
|
84
97
|
Teaspoon.log(JSON.stringify(obj))
|
@@ -43,8 +43,8 @@ class Teaspoon.Reporters.HTML extends Teaspoon.Reporters.BaseView
|
|
43
43
|
@setStatus("passed") unless @total.failures
|
44
44
|
@setText("stats-passes", @total.passes)
|
45
45
|
@setText("stats-failures", @total.failures)
|
46
|
-
if @total.run < @total.exist
|
47
|
-
@total.skipped = @total.exist - @total.run
|
46
|
+
if @total.run < @total.exist # For frameworks that don't "run" skipped specs
|
47
|
+
@total.skipped = @total.exist - @total.run + @total.skipped
|
48
48
|
@total.run = @total.exist
|
49
49
|
@setText("stats-skipped", @total.skipped)
|
50
50
|
@updateProgress()
|
@@ -65,6 +65,7 @@ class Teaspoon.Reporters.HTML extends Teaspoon.Reporters.BaseView
|
|
65
65
|
@total.run += 1
|
66
66
|
@updateProgress()
|
67
67
|
@updateStatus(spec)
|
68
|
+
delete @reportView
|
68
69
|
|
69
70
|
|
70
71
|
buildLayout: ->
|
@@ -106,25 +107,22 @@ class Teaspoon.Reporters.HTML extends Teaspoon.Reporters.BaseView
|
|
106
107
|
|
107
108
|
|
108
109
|
updateStatus: (spec) ->
|
110
|
+
elapsed = new Teaspoon.Date().getTime() - @specStart
|
111
|
+
@reportView?.updateState(spec, elapsed)
|
112
|
+
|
109
113
|
result = spec.result()
|
110
114
|
|
111
|
-
if result.
|
115
|
+
if result.status == "pending"
|
112
116
|
@updateStat("skipped", @total.skipped += 1)
|
113
|
-
|
114
|
-
|
115
|
-
elapsed = new Teaspoon.Date().getTime() - @specStart
|
116
|
-
|
117
|
-
if result.status == "passed"
|
118
|
-
@updateStat("passes", @total.passes += 1)
|
119
|
-
@reportView?.updateState("passed", elapsed)
|
120
|
-
else if result.status == "pending"
|
121
|
-
@reportView?.updateState("pending", elapsed)
|
122
|
-
else
|
117
|
+
else if result.status == "failed"
|
123
118
|
@updateStat("failures", @total.failures += 1)
|
124
|
-
@reportView?.updateState("failed", elapsed)
|
125
119
|
unless @config["build-full-report"]
|
126
120
|
new (Teaspoon.resolveClass("Reporters.HTML.FailureView"))(spec).appendTo(@findEl("report-failures"))
|
127
121
|
@setStatus("failed")
|
122
|
+
else if result.skipped
|
123
|
+
@updateStat("skipped", @total.skipped += 1)
|
124
|
+
else
|
125
|
+
@updateStat("passes", @total.passes += 1)
|
128
126
|
|
129
127
|
|
130
128
|
updateProgress: ->
|
@@ -22,6 +22,7 @@ class Teaspoon.Reporters.HTML.SpecView extends Teaspoon.Reporters.BaseView
|
|
22
22
|
|
23
23
|
buildParent: ->
|
24
24
|
parent = @spec.parent
|
25
|
+
return @reporter unless parent
|
25
26
|
if parent.viewId
|
26
27
|
@views.suites[parent.viewId]
|
27
28
|
else
|
@@ -38,11 +39,46 @@ class Teaspoon.Reporters.HTML.SpecView extends Teaspoon.Reporters.BaseView
|
|
38
39
|
@append(div)
|
39
40
|
|
40
41
|
|
41
|
-
updateState: (
|
42
|
-
result =
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
42
|
+
updateState: (spec, elapsed) ->
|
43
|
+
result = spec.result()
|
44
|
+
@clearClasses()
|
45
|
+
|
46
|
+
if result.status == "pending"
|
47
|
+
@updatePending(spec, elapsed)
|
48
|
+
else if result.status == "failed"
|
49
|
+
@updateFailed(spec, elapsed)
|
50
|
+
else if result.skipped
|
51
|
+
@updateDisabled(spec, elapsed)
|
52
|
+
else
|
53
|
+
@updatePassed(spec, elapsed)
|
54
|
+
|
55
|
+
|
56
|
+
updatePassed: (spec, elapsed) ->
|
57
|
+
@addStatusClass("passed")
|
58
|
+
@addClass("slow") if elapsed > Teaspoon.slow
|
59
|
+
@el.innerHTML += "<span>#{elapsed}ms</span>"
|
60
|
+
|
61
|
+
|
62
|
+
updateFailed: (spec, elapsed) ->
|
63
|
+
@addStatusClass("failed")
|
64
|
+
@buildErrors()
|
65
|
+
@parentView.updateState?("failed")
|
66
|
+
|
67
|
+
|
68
|
+
updatePending: (spec, elapsed) ->
|
69
|
+
@addStatusClass("pending")
|
70
|
+
|
71
|
+
|
72
|
+
updateDisabled: (spec, elapsed) -> # noop
|
73
|
+
|
74
|
+
|
75
|
+
clearClasses: ->
|
76
|
+
@el.className = ""
|
77
|
+
|
78
|
+
|
79
|
+
addStatusClass: (status) ->
|
80
|
+
@addClass("state-#{status}")
|
81
|
+
|
82
|
+
|
83
|
+
addClass: (name) ->
|
84
|
+
@el.className += " #{name}"
|
@@ -1,7 +1,11 @@
|
|
1
1
|
#= require_self
|
2
|
+
#= require_tree ./mixins
|
3
|
+
#= require teaspoon/utility
|
2
4
|
#= require teaspoon/runner
|
3
5
|
#= require teaspoon/fixture
|
4
6
|
#= require teaspoon/hook
|
7
|
+
#= require teaspoon/spec
|
8
|
+
#= require teaspoon/suite
|
5
9
|
#= require teaspoon/reporters/html
|
6
10
|
#= require teaspoon/reporters/console
|
7
11
|
|
@@ -53,7 +57,7 @@ class @Teaspoon
|
|
53
57
|
|
54
58
|
@log: ->
|
55
59
|
Teaspoon.messages.push(arguments[0])
|
56
|
-
try console
|
60
|
+
try console?.log?(arguments...)
|
57
61
|
catch e
|
58
62
|
throw new Error("Unable to use console.log for logging")
|
59
63
|
|
@@ -117,13 +117,7 @@ html[xmlns] #teaspoon-interface .teaspoon-clearfix {
|
|
117
117
|
width: 87px;
|
118
118
|
height: 34px;
|
119
119
|
-webkit-transform: rotate(-18deg);
|
120
|
-
-moz-transform: rotate(-18deg);
|
121
120
|
transform: rotate(-18deg);
|
122
|
-
background: -moz-linear-gradient(top, rgba(255, 255, 255,0) 0%, rgba(255, 255, 255, 0.3) 100%);
|
123
|
-
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(100%, rgba(255, 255, 255, 0.3)));
|
124
|
-
background: -webkit-linear-gradient(top, rgba(255,255,255,0) 0%, rgba(255, 255, 255, 0.3) 100%);
|
125
|
-
background: -o-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.3) 100%);
|
126
|
-
background: -ms-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.3) 100%);
|
127
121
|
background: linear-gradient(to bottom, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.3) 100%);
|
128
122
|
content: "\00a0";
|
129
123
|
}
|
@@ -176,21 +170,13 @@ html[xmlns] #teaspoon-interface .teaspoon-clearfix {
|
|
176
170
|
outline: none;
|
177
171
|
border-radius: 0.4em;
|
178
172
|
background-color: #fff;
|
179
|
-
background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.2), rgba(0, 0, 0, 0.05));
|
180
|
-
background-image: -moz-linear-gradient(rgba(255, 255, 255, 0.2), rgba(0, 0, 0, 0.05));
|
181
|
-
background-image: -o-linear-gradient(rgba(255, 255, 255, 0.2), rgba(0, 0, 0, 0.05));
|
182
|
-
background-image: -ms-linear-gradient(rgba(255, 255, 255, 0.2), rgba(0, 0, 0, 0.05));
|
183
173
|
background-image: linear-gradient(rgba(255, 255, 255, 0.2), rgba(0, 0, 0, 0.05));
|
184
|
-
-webkit-box-shadow: inset 0 1px 4px rgba(255, 255, 255, 0.5);
|
185
|
-
-moz-box-shadow: inset 0 1px 4px rgba(255, 255, 255, 0.5);
|
186
174
|
box-shadow: inset 0 1px 4px rgba(255, 255, 255, 0.5);
|
187
175
|
text-align: center;
|
188
176
|
cursor: pointer;
|
189
177
|
}
|
190
178
|
#teaspoon-controls button:active,
|
191
179
|
#teaspoon-controls button.active {
|
192
|
-
-webkit-box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.3);
|
193
|
-
-moz-box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.3);
|
194
180
|
box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.3);
|
195
181
|
background: #D9D9D9;
|
196
182
|
outline: 0;
|
@@ -68,6 +68,9 @@ Teaspoon.configure do |config|
|
|
68
68
|
# into a single file. Similar to Rails' asset `debug: true` and `config.assets.debug = true` options. By default,
|
69
69
|
# Teaspoon expands all assets to provide more valuable stack traces that reference individual source files.
|
70
70
|
#suite.expand_assets = true
|
71
|
+
|
72
|
+
# Non-.js file extensions Teaspoon should consider JavaScript files
|
73
|
+
#suite.js_extensions = [/(\.js)?.coffee/, /(\.js)?.es6/, ".es6.js"]
|
71
74
|
end
|
72
75
|
|
73
76
|
# Example suite. Since we're just filtering to files already within the root test/javascripts, these files will also
|
data/lib/tasks/teaspoon.rake
CHANGED
data/lib/teaspoon-devkit.rb
CHANGED
@@ -28,6 +28,7 @@ module Teaspoon
|
|
28
28
|
framework_name = options[:framework_name]
|
29
29
|
framework_const = options[:framework_const]
|
30
30
|
framework_root = options[:framework_root]
|
31
|
+
framework_env = options[:framework_env]
|
31
32
|
compile_assets = options[:compile_assets]
|
32
33
|
|
33
34
|
namespace :teaspoon do
|
@@ -36,9 +37,20 @@ module Teaspoon
|
|
36
37
|
RSpec::Core::RakeTask.new(:spec) do |t|
|
37
38
|
t.pattern = File.expand_path("spec/**/*_spec.rb", framework_root)
|
38
39
|
end
|
39
|
-
end
|
40
40
|
|
41
|
-
|
41
|
+
desc "Run the #{framework_name} javascript tests"
|
42
|
+
task :jsspec do
|
43
|
+
rails_env = File.expand_path("spec/dummy/config/environment.rb", DEV_PATH)
|
44
|
+
cmd = "rake teaspoon TEASPOON_DEVELOPMENT=true TEASPOON_RAILS_ENV=#{rails_env} TEASPOON_ENV=#{framework_env}"
|
45
|
+
|
46
|
+
# we shell out to another command so that it creates a pristine runtime environment
|
47
|
+
IO.popen(cmd).each do |line|
|
48
|
+
STDOUT.print(line)
|
49
|
+
end.close
|
50
|
+
|
51
|
+
exit(1) unless $?.success?
|
52
|
+
end
|
53
|
+
|
42
54
|
desc "Builds Teaspoon #{framework_name} into the distribution ready bundle"
|
43
55
|
task build: "#{framework}:build:javascripts"
|
44
56
|
|
@@ -61,7 +73,7 @@ module Teaspoon
|
|
61
73
|
Rake::Task["default"].prerequisites.clear
|
62
74
|
Rake::Task["default"].clear
|
63
75
|
|
64
|
-
task default: "teaspoon:#{framework}:spec"
|
76
|
+
task default: ["teaspoon:#{framework}:spec", "teaspoon:#{framework}:jsspec"]
|
65
77
|
end
|
66
78
|
end
|
67
79
|
end
|
@@ -62,7 +62,7 @@ module Teaspoon
|
|
62
62
|
class Suite
|
63
63
|
attr_accessor :matcher, :helper, :javascripts, :stylesheets,
|
64
64
|
:boot_partial, :body_partial,
|
65
|
-
:hooks, :expand_assets
|
65
|
+
:hooks, :expand_assets, :js_extensions
|
66
66
|
|
67
67
|
def initialize(name = nil)
|
68
68
|
@matcher = "{spec/javascripts,app/assets}/**/*_spec.{js,js.coffee,coffee}"
|
@@ -75,6 +75,7 @@ module Teaspoon
|
|
75
75
|
|
76
76
|
@hooks = Hash.new { |h, k| h[k] = [] }
|
77
77
|
@expand_assets = true
|
78
|
+
@js_extensions = [/(\.js)?\.coffee/, /(\.js)?\.es6/, ".es6.js"]
|
78
79
|
|
79
80
|
default = Teaspoon.configuration.suite_configs["default"]
|
80
81
|
instance_eval(&default[:block]) if default
|
@@ -93,7 +94,6 @@ module Teaspoon
|
|
93
94
|
|
94
95
|
raise Teaspoon::UnknownFrameworkVersion.new(name: name, version: version)
|
95
96
|
end
|
96
|
-
alias_method :use_framework=, :use_framework
|
97
97
|
|
98
98
|
def hook(group = :default, &block)
|
99
99
|
@hooks[group.to_s] << block
|
data/lib/teaspoon/coverage.rb
CHANGED
@@ -56,7 +56,7 @@ module Teaspoon
|
|
56
56
|
output_path = File.join(@config.output_path, @suite_name)
|
57
57
|
result = %x{#{@executable} report --include=#{input.shellescape} --dir #{output_path} #{format} 2>&1}
|
58
58
|
return result.gsub("Done", "").gsub("Using reporter [#{format}]", "").strip if $?.exitstatus == 0
|
59
|
-
raise Teaspoon::DependencyError.new("Unable to generate #{format} coverage report
|
59
|
+
raise Teaspoon::DependencyError.new("Unable to generate #{format} coverage report:\n#{result}")
|
60
60
|
end
|
61
61
|
|
62
62
|
def threshold_args
|
data/lib/teaspoon/deprecated.rb
CHANGED
@@ -83,6 +83,11 @@ teaspoon coverage directive has changed and is now more flexible, define coverag
|
|
83
83
|
[]
|
84
84
|
end
|
85
85
|
alias_method :no_coverage=, :no_coverage
|
86
|
+
|
87
|
+
def use_framework=(name, _version = nil)
|
88
|
+
Teaspoon.dep("suite.use_framework= is deprecated, use suite.use_framework instead.")
|
89
|
+
use_framework(*name)
|
90
|
+
end
|
86
91
|
end
|
87
92
|
end
|
88
93
|
end
|
@@ -11,18 +11,22 @@ require "teaspoon/driver/base"
|
|
11
11
|
module Teaspoon
|
12
12
|
module Driver
|
13
13
|
class CapybaraWebkit < Base
|
14
|
+
class TeaspoonNotFinishedError < StandardError; end
|
14
15
|
def initialize(_options = nil)
|
15
16
|
end
|
16
17
|
|
17
18
|
def run_specs(runner, url)
|
18
19
|
session.visit(url)
|
19
20
|
|
20
|
-
|
21
|
+
timeout = Teaspoon.configuration.driver_timeout.to_i
|
22
|
+
session.document.synchronize(timeout, errors: [TeaspoonNotFinishedError]) do
|
21
23
|
done = session.evaluate_script("window.Teaspoon && window.Teaspoon.finished")
|
22
24
|
(session.evaluate_script("window.Teaspoon && window.Teaspoon.getMessages()") || []).each do |line|
|
23
25
|
runner.process("#{line}\n")
|
24
26
|
end
|
25
|
-
done
|
27
|
+
unless done
|
28
|
+
raise TeaspoonNotFinishedError
|
29
|
+
end
|
26
30
|
end
|
27
31
|
end
|
28
32
|
|
@@ -33,6 +33,10 @@ module Teaspoon
|
|
33
33
|
|
34
34
|
def run(*args, &block)
|
35
35
|
IO.popen([executable, *args].join(" ")) { |io| io.each(&block) }
|
36
|
+
|
37
|
+
unless $?.success?
|
38
|
+
raise Teaspoon::DependencyError.new("Failed to use phantomjs, which exited with status code: #{$?.exitstatus}")
|
39
|
+
end
|
36
40
|
end
|
37
41
|
|
38
42
|
def driver_options(url)
|
data/lib/teaspoon/environment.rb
CHANGED
@@ -28,7 +28,7 @@ module Teaspoon
|
|
28
28
|
|
29
29
|
def self.find_env(override = nil)
|
30
30
|
override ||= ENV["TEASPOON_ENV"]
|
31
|
-
env_files = override ? [override] : standard_environments
|
31
|
+
env_files = override && !override.empty? ? [override] : standard_environments
|
32
32
|
|
33
33
|
env_files.each do |filename|
|
34
34
|
file = File.expand_path(filename, Dir.pwd)
|
@@ -53,7 +53,14 @@ module Teaspoon
|
|
53
53
|
|
54
54
|
def self.load_rails
|
55
55
|
rails_env = ENV["TEASPOON_RAILS_ENV"] || File.expand_path("config/environment", Dir.pwd)
|
56
|
-
|
56
|
+
|
57
|
+
# Try to load rails, assume teaspoon_env will do it if the expected
|
58
|
+
# environment isn't found.
|
59
|
+
if File.exists?(rails_env)
|
60
|
+
require rails_env
|
61
|
+
else
|
62
|
+
require_environment
|
63
|
+
end
|
57
64
|
end
|
58
65
|
end
|
59
66
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Teaspoon
|
2
2
|
module Formatter
|
3
3
|
class Base
|
4
|
+
RESERVED_PARAMS = ["body", "instrument"]
|
5
|
+
|
4
6
|
attr_accessor :total_count, :run_count, :passes, :pendings, :failures, :errors
|
5
7
|
|
6
8
|
def initialize(suite_name = :default, output_file = nil)
|
@@ -142,7 +144,14 @@ module Teaspoon
|
|
142
144
|
end
|
143
145
|
|
144
146
|
def filename(file)
|
145
|
-
|
147
|
+
uri = URI(file)
|
148
|
+
params = uri.query.split("&").reject do |param|
|
149
|
+
RESERVED_PARAMS.include?(param.split("=").first)
|
150
|
+
end
|
151
|
+
|
152
|
+
filename = uri.path.sub(%r(^/assets/), "")
|
153
|
+
filename += "?#{params.join("&")}" if params.any?
|
154
|
+
filename
|
146
155
|
end
|
147
156
|
end
|
148
157
|
end
|
data/lib/teaspoon/suite.rb
CHANGED
@@ -94,8 +94,10 @@ module Teaspoon
|
|
94
94
|
normalize_js_extension(filename)
|
95
95
|
end
|
96
96
|
|
97
|
-
def normalize_js_extension(
|
98
|
-
|
97
|
+
def normalize_js_extension(original_filename)
|
98
|
+
config.js_extensions.inject(original_filename.gsub(".erb", "")) do |filename, extension|
|
99
|
+
filename.gsub(Regexp.new(extension.to_s + "$"), ".js")
|
100
|
+
end
|
99
101
|
end
|
100
102
|
|
101
103
|
def glob
|
data/lib/teaspoon/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: teaspoon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jejacks0n
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2015-
|
14
|
+
date: 2015-10-09 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: railties
|
@@ -52,6 +52,8 @@ files:
|
|
52
52
|
- app/assets/javascripts/teaspoon/error.coffee
|
53
53
|
- app/assets/javascripts/teaspoon/fixture.coffee
|
54
54
|
- app/assets/javascripts/teaspoon/hook.coffee
|
55
|
+
- app/assets/javascripts/teaspoon/mixins/_namespace.coffee
|
56
|
+
- app/assets/javascripts/teaspoon/mixins/filter_url.coffee
|
55
57
|
- app/assets/javascripts/teaspoon/reporters/console.coffee
|
56
58
|
- app/assets/javascripts/teaspoon/reporters/html.coffee
|
57
59
|
- app/assets/javascripts/teaspoon/reporters/html/base_view.coffee
|
@@ -63,7 +65,10 @@ files:
|
|
63
65
|
- app/assets/javascripts/teaspoon/reporters/html/suite_view.coffee
|
64
66
|
- app/assets/javascripts/teaspoon/reporters/html/template.coffee
|
65
67
|
- app/assets/javascripts/teaspoon/runner.coffee
|
68
|
+
- app/assets/javascripts/teaspoon/spec.coffee
|
69
|
+
- app/assets/javascripts/teaspoon/suite.coffee
|
66
70
|
- app/assets/javascripts/teaspoon/teaspoon.coffee
|
71
|
+
- app/assets/javascripts/teaspoon/utility.coffee
|
67
72
|
- app/assets/stylesheets/teaspoon.css
|
68
73
|
- app/controllers/teaspoon/suite_controller.rb
|
69
74
|
- app/views/teaspoon/suite/_body.html.erb
|
@@ -144,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
144
149
|
version: '0'
|
145
150
|
requirements: []
|
146
151
|
rubyforge_project:
|
147
|
-
rubygems_version: 2.4.
|
152
|
+
rubygems_version: 2.4.6
|
148
153
|
signing_key:
|
149
154
|
specification_version: 4
|
150
155
|
summary: 'Teaspoon: A Javascript test runner built on top of Rails'
|