teaspoon-qunit 1.18.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/teaspoon-qunit.rb +4 -0
- data/lib/teaspoon/qunit/assets/qunit/1.12.0.js +2212 -0
- data/lib/teaspoon/qunit/assets/qunit/1.13.0.js +2210 -0
- data/lib/teaspoon/qunit/assets/qunit/1.14.0.js +2288 -0
- data/lib/teaspoon/qunit/assets/qunit/1.15.0.js +2495 -0
- data/lib/teaspoon/qunit/assets/qunit/1.16.0.js +2819 -0
- data/lib/teaspoon/qunit/assets/qunit/1.17.1.js +2875 -0
- data/lib/teaspoon/qunit/assets/qunit/1.18.0.js +3828 -0
- data/lib/teaspoon/qunit/assets/qunit/MIT.LICENSE +21 -0
- data/lib/teaspoon/qunit/assets/teaspoon-qunit.js +1529 -0
- data/lib/teaspoon/qunit/assets/teaspoon/qunit.coffee +19 -0
- data/lib/teaspoon/qunit/assets/teaspoon/qunit/initialize.coffee +11 -0
- data/lib/teaspoon/qunit/assets/teaspoon/qunit/reporters/html.coffee +20 -0
- data/lib/teaspoon/qunit/assets/teaspoon/qunit/reporters/html/failure_view.coffee +10 -0
- data/lib/teaspoon/qunit/assets/teaspoon/qunit/reporters/html/spec_view.coffee +21 -0
- data/lib/teaspoon/qunit/assets/teaspoon/qunit/reporters/html/suite_view.coffee +8 -0
- data/lib/teaspoon/qunit/assets/teaspoon/qunit/responder.coffee +48 -0
- data/lib/teaspoon/qunit/assets/teaspoon/qunit/runner.coffee +12 -0
- data/lib/teaspoon/qunit/assets/teaspoon/qunit/spec.coffee +45 -0
- data/lib/teaspoon/qunit/assets/teaspoon/qunit/suite.coffee +16 -0
- data/lib/teaspoon/qunit/framework.rb +36 -0
- data/lib/teaspoon/qunit/templates/test_helper.coffee +29 -0
- data/lib/teaspoon/qunit/templates/test_helper.js +30 -0
- data/lib/teaspoon/qunit/version.rb +5 -0
- data/spec/console_spec.rb +75 -0
- data/spec/installation_spec.rb +35 -0
- data/spec/integration_spec.rb +73 -0
- data/spec/spec_helper.rb +11 -0
- data/test/javascripts/integration/_implementation.coffee +1 -0
- data/test/javascripts/integration/first_integration.coffee +14 -0
- data/test/javascripts/integration/second_integration.coffee +6 -0
- data/test/javascripts/integration/test_helper.coffee +9 -0
- data/test/javascripts/qunit/fixture_test.coffee +10 -0
- data/test/javascripts/qunit/reporters/console_test.coffee +3 -0
- data/test/javascripts/qunit/reporters/html/failure_view_test.coffee +3 -0
- data/test/javascripts/qunit/reporters/html/spec_view_test.coffee +3 -0
- data/test/javascripts/qunit/reporters/html/suite_view_test.coffee +3 -0
- data/test/javascripts/qunit/reporters/html_test.coffee +3 -0
- data/test/javascripts/qunit/responder_test.coffee +153 -0
- data/test/javascripts/qunit/runner_test.coffee +24 -0
- data/test/javascripts/qunit/spec_test.coffee +53 -0
- data/test/javascripts/qunit/suite_test.coffee +10 -0
- data/test/javascripts/test_helper.coffee +4 -0
- data/test/teaspoon_env.rb +12 -0
- metadata +124 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
#= require teaspoon/teaspoon
|
2
|
+
#= require_self
|
3
|
+
#= require_tree ./qunit
|
4
|
+
|
5
|
+
unless QUnit?
|
6
|
+
throw new Teaspoon.Error('QUnit not found -- use `suite.use_framework :qunit` and adjust or remove the `suite.javascripts` directive.')
|
7
|
+
|
8
|
+
@Teaspoon ?= {}
|
9
|
+
@Teaspoon.Qunit = {
|
10
|
+
version: ->
|
11
|
+
versions = @rawVersion().split('.')
|
12
|
+
{major: versions[0], minor: versions[1], patch: versions[2]}
|
13
|
+
|
14
|
+
|
15
|
+
rawVersion: ->
|
16
|
+
QUnit.version || _qunit_version
|
17
|
+
}
|
18
|
+
@Teaspoon.Qunit.Reporters ?= {}
|
19
|
+
@Teaspoon.Qunit.Reporters.HTML ?= {}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Teaspoon.setFramework(Teaspoon.Qunit)
|
2
|
+
|
3
|
+
# set the environment
|
4
|
+
QUnit.config.autostart = false
|
5
|
+
QUnit.config.altertitle = false
|
6
|
+
QUnit.config.filter = Teaspoon.Runner.prototype.getParams()["grep"]
|
7
|
+
|
8
|
+
originalReset = QUnit.reset
|
9
|
+
QUnit.reset = ->
|
10
|
+
originalReset()
|
11
|
+
Teaspoon.Fixture.cleanup()
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#= require teaspoon/reporters/html
|
2
|
+
|
3
|
+
class Teaspoon.Qunit.Reporters.HTML extends Teaspoon.Reporters.HTML
|
4
|
+
|
5
|
+
reportRunnerResults: (runner) ->
|
6
|
+
version = Teaspoon.Qunit.version()
|
7
|
+
if version.major = 1 && version.minor < 16
|
8
|
+
# QUnit <= 1.15 doesn't provide the total until all tests are finished
|
9
|
+
# The .begin hook is broken
|
10
|
+
@total.exist = @total.run = runner.total
|
11
|
+
super
|
12
|
+
|
13
|
+
|
14
|
+
readConfig: ->
|
15
|
+
super
|
16
|
+
QUnit.config.notrycatch = @config["use-catch"]
|
17
|
+
|
18
|
+
|
19
|
+
envInfo: ->
|
20
|
+
"qunit #{Teaspoon.Qunit.rawVersion() || "[unknown version]"}"
|
@@ -0,0 +1,10 @@
|
|
1
|
+
#= require teaspoon/reporters/html/failure_view
|
2
|
+
|
3
|
+
class Teaspoon.Qunit.Reporters.HTML.FailureView extends Teaspoon.Reporters.HTML.FailureView
|
4
|
+
|
5
|
+
build: ->
|
6
|
+
super("spec")
|
7
|
+
html = """<h1 class="teaspoon-clearfix"><a href="#{@spec.link}">#{@htmlSafe(@spec.fullDescription)}</a></h1>"""
|
8
|
+
for error in @spec.errors()
|
9
|
+
html += """<div><strong>#{error.message}</strong><br/>#{@htmlSafe(error.stack || "Stack trace unavailable")}</div>"""
|
10
|
+
@el.innerHTML = html
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#= require teaspoon/reporters/html/spec_view
|
2
|
+
|
3
|
+
class Teaspoon.Qunit.Reporters.HTML.SpecView extends Teaspoon.Reporters.HTML.SpecView
|
4
|
+
|
5
|
+
buildErrors: ->
|
6
|
+
div = @createEl("div")
|
7
|
+
html = ""
|
8
|
+
for error in @spec.errors()
|
9
|
+
html += """<strong>#{error.message}</strong><br/>#{@htmlSafe(error.stack || "Stack trace unavailable")}<br/>"""
|
10
|
+
div.innerHTML = html
|
11
|
+
@append(div)
|
12
|
+
|
13
|
+
|
14
|
+
buildParent: ->
|
15
|
+
parent = @spec.parent
|
16
|
+
return @reporter unless parent
|
17
|
+
if @views.suites[parent.description]
|
18
|
+
@views.suites[parent.description]
|
19
|
+
else
|
20
|
+
view = new Teaspoon.Qunit.Reporters.HTML.SuiteView(parent, @reporter)
|
21
|
+
@views.suites[parent.description] = view
|
@@ -0,0 +1,48 @@
|
|
1
|
+
class Teaspoon.Qunit.Responder
|
2
|
+
|
3
|
+
constructor: (qunit, @reporter) ->
|
4
|
+
version = Teaspoon.Qunit.version()
|
5
|
+
if version.major = 1 && version.minor > 15
|
6
|
+
qunit.begin(@runnerStarted)
|
7
|
+
else
|
8
|
+
# QUnit's .begin hook was broken
|
9
|
+
@reporter.reportRunnerStarting(total: null)
|
10
|
+
|
11
|
+
qunit.done(@runnerDone)
|
12
|
+
qunit.moduleStart(@suiteStarted)
|
13
|
+
qunit.moduleDone(@suiteDone)
|
14
|
+
qunit.testDone(@specDone)
|
15
|
+
qunit.log(@assertionDone)
|
16
|
+
|
17
|
+
@assertions = []
|
18
|
+
|
19
|
+
|
20
|
+
runnerStarted: (runner) =>
|
21
|
+
@reporter.reportRunnerStarting(total: runner.totalTests)
|
22
|
+
|
23
|
+
|
24
|
+
runnerDone: (runner) =>
|
25
|
+
@reporter.reportRunnerResults(runner)
|
26
|
+
|
27
|
+
|
28
|
+
suiteStarted: (suite) =>
|
29
|
+
@reporter.reportSuiteStarting(new Teaspoon.Qunit.Suite(suite))
|
30
|
+
|
31
|
+
|
32
|
+
suiteDone: (suite) =>
|
33
|
+
@reporter.reportSuiteResults(new Teaspoon.Qunit.Suite(suite))
|
34
|
+
|
35
|
+
|
36
|
+
specDone: (spec) =>
|
37
|
+
spec.assertions = @assertions
|
38
|
+
@assertions = []
|
39
|
+
|
40
|
+
# QUnit doesn't have details about the spec until it's finished. So we
|
41
|
+
# wait until it's finished to report that it started.
|
42
|
+
spec = new Teaspoon.Qunit.Spec(spec)
|
43
|
+
@reporter.reportSpecStarting(spec)
|
44
|
+
@reporter.reportSpecResults(spec)
|
45
|
+
|
46
|
+
|
47
|
+
assertionDone: (assertion) =>
|
48
|
+
@assertions.push(assertion)
|
@@ -0,0 +1,45 @@
|
|
1
|
+
class Teaspoon.Qunit.Spec
|
2
|
+
|
3
|
+
constructor: (@spec) ->
|
4
|
+
@fullDescription = "#{@spec.module} #{@spec.name}"
|
5
|
+
@description = "#{@spec.name} (#{@spec.failed}, #{@spec.passed}, #{@spec.total})"
|
6
|
+
@link = "?grep=#{encodeURIComponent("#{@spec.module}: #{@spec.name}")}"
|
7
|
+
@parent = if @spec.module then new Teaspoon.Qunit.Suite({description: @spec.module}) else null
|
8
|
+
@suiteName = @spec.module
|
9
|
+
@viewId = @spec.viewId
|
10
|
+
@pending = false
|
11
|
+
|
12
|
+
|
13
|
+
errors: ->
|
14
|
+
return [] unless @spec.failed
|
15
|
+
for item in @spec.assertions
|
16
|
+
continue if item.result
|
17
|
+
@provideFallbackMessage(item)
|
18
|
+
{message: item.message, stack: item.source}
|
19
|
+
|
20
|
+
|
21
|
+
getParents: ->
|
22
|
+
return [] unless @parent
|
23
|
+
[@parent]
|
24
|
+
|
25
|
+
|
26
|
+
result: ->
|
27
|
+
status = "failed"
|
28
|
+
status = "passed" if @spec.failed == 0
|
29
|
+
status: status
|
30
|
+
skipped: false
|
31
|
+
|
32
|
+
|
33
|
+
provideFallbackMessage: (item) ->
|
34
|
+
return if item.message
|
35
|
+
|
36
|
+
if item.actual && item.expected
|
37
|
+
item.message ||= "Expected #{JSON.stringify(item.actual)} to equal #{JSON.stringify(item.expected)}"
|
38
|
+
else
|
39
|
+
item.message = 'failed'
|
40
|
+
|
41
|
+
|
42
|
+
# Shim since core still initializes this class, but the argument
|
43
|
+
# is the real spec object passed in from the responder.
|
44
|
+
class Teaspoon.Spec
|
45
|
+
constructor: (spec) -> return spec
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Teaspoon.Qunit.Suite
|
2
|
+
|
3
|
+
constructor: (@suite) ->
|
4
|
+
# In QUnit 1.14, moduleStart uses @suite.name,
|
5
|
+
# moduleDone uses @suite.description
|
6
|
+
@fullDescription = @suite.description || @suite.name
|
7
|
+
@description = @suite.description || @suite.name
|
8
|
+
@link = "?grep=#{encodeURIComponent(@fullDescription)}"
|
9
|
+
@parent = null
|
10
|
+
|
11
|
+
|
12
|
+
# Shim since HTML.SuiteView still initializes the base class.
|
13
|
+
# TODO: inject instance into SuiteView
|
14
|
+
class Teaspoon.Suite
|
15
|
+
constructor: (suite) ->
|
16
|
+
return new Teaspoon.Qunit.Suite(suite)
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require "teaspoon/framework/base"
|
2
|
+
|
3
|
+
module Teaspoon
|
4
|
+
module Qunit
|
5
|
+
class Framework < Teaspoon::Framework::Base
|
6
|
+
# specify the framework name
|
7
|
+
framework_name :qunit
|
8
|
+
|
9
|
+
# register standard versions
|
10
|
+
versions = ["1.12.0", "1.13.0", "1.14.0", "1.15.0", "1.16.0", "1.17.1", "1.18.0"]
|
11
|
+
|
12
|
+
versions.each do |version|
|
13
|
+
register_version version, "qunit/#{version}.js",
|
14
|
+
dependencies: ["teaspoon-qunit.js"],
|
15
|
+
dev_deps: ["teaspoon/qunit.js"]
|
16
|
+
end
|
17
|
+
|
18
|
+
# add asset paths
|
19
|
+
add_asset_path File.expand_path("../../../teaspoon/qunit/assets", __FILE__)
|
20
|
+
|
21
|
+
# add custom install templates
|
22
|
+
add_template_path File.expand_path("../../../teaspoon/qunit/templates", __FILE__)
|
23
|
+
|
24
|
+
# specify where to install, and add installation steps.
|
25
|
+
install_to "test" do
|
26
|
+
ext = options[:coffee] ? ".coffee" : ".js"
|
27
|
+
copy_file "test_helper#{ext}", "test/javascripts/test_helper#{ext}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.modify_config(config)
|
31
|
+
config.matcher = "{test/javascripts,app/assets}/**/*_test.{js,js.coffee,coffee}"
|
32
|
+
config.helper = "test_helper"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# Teaspoon includes some support files, but you can use anything from your own support path too.
|
2
|
+
# require support/sinon
|
3
|
+
# require support/your-support-file
|
4
|
+
#
|
5
|
+
# PhantomJS (Teaspoons default driver) doesn't have support for Function.prototype.bind, which has caused confusion.
|
6
|
+
# Use this polyfill to avoid the confusion.
|
7
|
+
#= require support/bind-poly
|
8
|
+
#
|
9
|
+
# You can require your own javascript files here. By default this will include everything in application, however you
|
10
|
+
# may get better load performance if you require the specific files that are being used in the test that tests them.
|
11
|
+
#= require application
|
12
|
+
#
|
13
|
+
# Deferring execution
|
14
|
+
# If you're using CommonJS, RequireJS or some other asynchronous library you can defer execution. Call
|
15
|
+
# Teaspoon.execute() after everything has been loaded. Simple example of a timeout:
|
16
|
+
#
|
17
|
+
# Teaspoon.defer = true
|
18
|
+
# setTimeout(Teaspoon.execute, 1000)
|
19
|
+
#
|
20
|
+
# Matching files
|
21
|
+
# By default Teaspoon will look for files that match _test.{js,js.coffee,.coffee}. Add a filename_test.js file in your
|
22
|
+
# test path and it'll be included in the default suite automatically. If you want to customize suites, check out the
|
23
|
+
# configuration in teaspoon_env.rb
|
24
|
+
#
|
25
|
+
# Manifest
|
26
|
+
# If you'd rather require your test files manually (to control order for instance) you can disable the suite matcher in
|
27
|
+
# the configuration and use this file as a manifest.
|
28
|
+
#
|
29
|
+
# For more information: http://github.com/modeset/teaspoon
|
@@ -0,0 +1,30 @@
|
|
1
|
+
// Teaspoon includes some support files, but you can use anything from your own support path too.
|
2
|
+
// require support/sinon
|
3
|
+
// require support/your-support-file
|
4
|
+
//
|
5
|
+
// PhantomJS (Teaspoons default driver) doesn't have support for Function.prototype.bind, which has caused confusion.
|
6
|
+
// Use this polyfill to avoid the confusion.
|
7
|
+
//= require support/bind-poly
|
8
|
+
//
|
9
|
+
// You can require your own javascript files here. By default this will include everything in application, however you
|
10
|
+
// may get better load performance if you require the specific files that are being used in the test that tests them.
|
11
|
+
//= require application
|
12
|
+
//
|
13
|
+
// Deferring execution
|
14
|
+
// If you're using CommonJS, RequireJS or some other asynchronous library you can defer execution. Call
|
15
|
+
// Teaspoon.execute() after everything has been loaded. Simple example of a timeout:
|
16
|
+
//
|
17
|
+
// Teaspoon.defer = true
|
18
|
+
// setTimeout(Teaspoon.execute, 1000)
|
19
|
+
//
|
20
|
+
// Matching files
|
21
|
+
// By default Teaspoon will look for files that match _test.{js,js.coffee,.coffee}. Add a filename_test.js file in your
|
22
|
+
// test path and it'll be included in the default suite automatically. If you want to customize suites, check out the
|
23
|
+
// configuration in teaspoon_env.rb
|
24
|
+
//
|
25
|
+
// Manifest
|
26
|
+
// If you'd rather require your test files manually (to control order for instance) you can disable the suite matcher in
|
27
|
+
// the configuration and use this file as a manifest.
|
28
|
+
//
|
29
|
+
// For more information: http://github.com/modeset/teaspoon
|
30
|
+
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require_relative "./spec_helper"
|
2
|
+
|
3
|
+
feature "Running in the console", shell: true do
|
4
|
+
let(:expected_loading_output) do
|
5
|
+
<<-OUTPUT.strip_heredoc
|
6
|
+
Starting the Teaspoon server...
|
7
|
+
Teaspoon running default suite at http://127.0.0.1:31337/teaspoon/default
|
8
|
+
OUTPUT
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:expected_testing_output) do
|
12
|
+
<<-OUTPUT.strip_heredoc
|
13
|
+
FFFit can log to the console
|
14
|
+
..
|
15
|
+
|
16
|
+
Failures:
|
17
|
+
|
18
|
+
1) global failure (1, 0, 1)
|
19
|
+
Failure/Error: TypeError: undefined is not a constructor (evaluating 'foo()')
|
20
|
+
|
21
|
+
2) Integration tests allows failing specs (1, 0, 1)
|
22
|
+
Failure/Error: fails correctly
|
23
|
+
|
24
|
+
3) Integration tests allows erroring specs (1, 0, 1)
|
25
|
+
Failure/Error: errors correctly
|
26
|
+
|
27
|
+
Finished in 0.31337 seconds
|
28
|
+
5 examples, 3 failures
|
29
|
+
|
30
|
+
Failed examples:
|
31
|
+
|
32
|
+
teaspoon -s default --filter=" global failure"
|
33
|
+
teaspoon -s default --filter="Integration tests allows failing specs"
|
34
|
+
teaspoon -s default --filter="Integration tests allows erroring specs"
|
35
|
+
OUTPUT
|
36
|
+
end
|
37
|
+
|
38
|
+
let(:version) do
|
39
|
+
Teaspoon::Framework.fetch(:qunit).versions.last
|
40
|
+
end
|
41
|
+
|
42
|
+
before do
|
43
|
+
teaspoon_test_app("gem 'teaspoon-qunit', path: '#{Teaspoon::DEV_PATH}'")
|
44
|
+
install_teaspoon("--coffee --version=#{version}")
|
45
|
+
copy_integration_files("test", File.expand_path("../../test", __FILE__), "test")
|
46
|
+
end
|
47
|
+
|
48
|
+
it "runs successfully using the CLI" do
|
49
|
+
run_teaspoon("--no-color")
|
50
|
+
|
51
|
+
expect(teaspoon_output).to include(expected_loading_output)
|
52
|
+
expect(teaspoon_output).to include(expected_testing_output)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "runs successfully using the rake task" do
|
56
|
+
rake_teaspoon("COLOR=false")
|
57
|
+
|
58
|
+
expect(teaspoon_output).to include(expected_loading_output)
|
59
|
+
expect(teaspoon_output).to include(expected_testing_output)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "can display coverage information" do
|
63
|
+
pending("needs istanbul to be installed") unless Teaspoon::Instrumentation.executable
|
64
|
+
run_teaspoon("--coverage=default")
|
65
|
+
|
66
|
+
expect(teaspoon_output).to include(<<-COVERAGE.strip_heredoc)
|
67
|
+
=============================== Coverage summary ===============================
|
68
|
+
Statements : 75% ( 3/4 )
|
69
|
+
Branches : 100% ( 0/0 )
|
70
|
+
Functions : 50% ( 1/2 )
|
71
|
+
Lines : 75% ( 3/4 )
|
72
|
+
================================================================================
|
73
|
+
COVERAGE
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require_relative "./spec_helper"
|
2
|
+
|
3
|
+
feature "Installation", shell: true do
|
4
|
+
before do
|
5
|
+
teaspoon_test_app("gem 'teaspoon-qunit', path: '#{Teaspoon::DEV_PATH}'")
|
6
|
+
end
|
7
|
+
|
8
|
+
it "installs the expected files" do
|
9
|
+
install_teaspoon
|
10
|
+
|
11
|
+
expect(all_output).to include(<<-OUTPUT)
|
12
|
+
create test/teaspoon_env.rb
|
13
|
+
create test/javascripts/support
|
14
|
+
create test/javascripts/fixtures
|
15
|
+
create test/javascripts/test_helper.js
|
16
|
+
OUTPUT
|
17
|
+
|
18
|
+
check_file_content("test/teaspoon_env.rb", /suite\.use_framework :qunit, "\d+\.\d+\.\d+"/)
|
19
|
+
check_file_content("test/javascripts/test_helper.js", Regexp.new("require support/your-support-file"))
|
20
|
+
end
|
21
|
+
|
22
|
+
it "can install coffeescript and the teaspoon_env without comments" do
|
23
|
+
install_teaspoon("--coffee --no-comments")
|
24
|
+
|
25
|
+
expect(all_output).to include(<<-OUTPUT)
|
26
|
+
create test/teaspoon_env.rb
|
27
|
+
create test/javascripts/support
|
28
|
+
create test/javascripts/fixtures
|
29
|
+
create test/javascripts/test_helper.coffee
|
30
|
+
OUTPUT
|
31
|
+
|
32
|
+
check_file_content("test/teaspoon_env.rb", /suite\.use_framework :qunit, "\d+\.\d+\.\d+"/)
|
33
|
+
check_file_content("test/javascripts/test_helper.coffee", Regexp.new("require support/your-support-file"))
|
34
|
+
end
|
35
|
+
end
|