teaspoon 0.7.9 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +382 -260
- data/app/assets/javascripts/teaspoon-angular.js +108 -26241
- data/app/assets/javascripts/teaspoon-jasmine.js +103 -2642
- data/app/assets/javascripts/teaspoon-mocha.js +109 -5416
- data/app/assets/javascripts/teaspoon-qunit.js +107 -2255
- data/app/assets/javascripts/teaspoon-teaspoon.js +0 -1
- data/app/assets/javascripts/teaspoon/angular.coffee +3 -1
- data/app/assets/javascripts/teaspoon/base/hook.coffee +21 -0
- data/app/assets/javascripts/teaspoon/base/reporters/html.coffee +26 -14
- data/app/assets/javascripts/teaspoon/base/reporters/html/progress_view.coffee +1 -1
- data/app/assets/javascripts/teaspoon/base/reporters/html/template.coffee +3 -3
- data/app/assets/javascripts/teaspoon/base/teaspoon.coffee +10 -1
- data/app/assets/javascripts/teaspoon/jasmine.coffee +3 -1
- data/app/assets/javascripts/teaspoon/mocha.coffee +3 -1
- data/app/assets/javascripts/teaspoon/mocha/reporters/html.coffee +1 -1
- data/app/assets/javascripts/teaspoon/qunit.coffee +3 -1
- data/app/assets/javascripts/teaspoon/qunit/reporters/html.coffee +1 -1
- data/app/assets/javascripts/teaspoon/teaspoon.coffee +0 -1
- data/app/assets/stylesheets/teaspoon.css +12 -8
- data/app/controllers/teaspoon/suite_controller.rb +32 -0
- data/app/views/teaspoon/suite/_body.html.erb +0 -0
- data/app/views/teaspoon/suite/_boot.html.erb +4 -0
- data/app/views/teaspoon/suite/_boot_require_js.html.erb +19 -0
- data/app/views/teaspoon/{spec/suites.html.erb → suite/index.html.erb} +6 -7
- data/app/views/teaspoon/suite/show.html.erb +19 -0
- data/bin/teaspoon +1 -1
- data/config/routes.rb +14 -4
- data/lib/generators/teaspoon/install/POST_INSTALL +2 -2
- data/lib/generators/teaspoon/install/install_generator.rb +22 -11
- data/lib/generators/teaspoon/install/templates/_body.html.erb +0 -0
- data/lib/generators/teaspoon/install/templates/_boot.html.erb +4 -0
- data/lib/generators/teaspoon/install/templates/jasmine/env.rb +11 -0
- data/lib/generators/teaspoon/install/templates/jasmine/env_comments.rb +182 -0
- data/lib/generators/teaspoon/install/templates/jasmine/spec_helper.coffee +8 -6
- data/lib/generators/teaspoon/install/templates/jasmine/spec_helper.js +8 -7
- data/lib/generators/teaspoon/install/templates/mocha/env.rb +11 -0
- data/lib/generators/teaspoon/install/templates/mocha/env_comments.rb +182 -0
- data/lib/generators/teaspoon/install/templates/mocha/spec_helper.coffee +13 -13
- data/lib/generators/teaspoon/install/templates/mocha/spec_helper.js +13 -13
- data/lib/generators/teaspoon/install/templates/qunit/env.rb +11 -0
- data/lib/generators/teaspoon/install/templates/qunit/env_comments.rb +182 -0
- data/lib/generators/teaspoon/install/templates/qunit/test_helper.coffee +6 -5
- data/lib/generators/teaspoon/install/templates/qunit/test_helper.js +6 -5
- data/lib/tasks/teaspoon.rake +9 -2
- data/lib/teaspoon.rb +4 -6
- data/lib/teaspoon/command_line.rb +116 -134
- data/lib/teaspoon/configuration.rb +144 -66
- data/lib/teaspoon/console.rb +70 -37
- data/lib/teaspoon/coverage.rb +42 -15
- data/lib/teaspoon/deprecated.rb +65 -0
- data/lib/teaspoon/drivers/base.rb +10 -0
- data/lib/teaspoon/drivers/phantomjs/runner.js +9 -11
- data/lib/teaspoon/drivers/phantomjs_driver.rb +21 -21
- data/lib/teaspoon/drivers/selenium_driver.rb +32 -13
- data/lib/teaspoon/engine.rb +32 -12
- data/lib/teaspoon/environment.rb +16 -12
- data/lib/teaspoon/exceptions.rb +41 -5
- data/lib/teaspoon/exporter.rb +52 -0
- data/lib/teaspoon/formatters/base.rb +171 -0
- data/lib/teaspoon/formatters/clean_formatter.rb +2 -4
- data/lib/teaspoon/formatters/documentation_formatter.rb +60 -0
- data/lib/teaspoon/formatters/dot_formatter.rb +12 -90
- data/lib/teaspoon/formatters/json_formatter.rb +36 -0
- data/lib/teaspoon/formatters/junit_formatter.rb +51 -32
- data/lib/teaspoon/formatters/modules/report_module.rb +76 -0
- data/lib/teaspoon/formatters/pride_formatter.rb +23 -27
- data/lib/teaspoon/formatters/snowday_formatter.rb +7 -11
- data/lib/teaspoon/formatters/swayze_or_oprah_formatter.rb +88 -64
- data/lib/teaspoon/formatters/tap_formatter.rb +18 -27
- data/lib/teaspoon/formatters/tap_y_formatter.rb +35 -45
- data/lib/teaspoon/formatters/teamcity_formatter.rb +69 -31
- data/lib/teaspoon/instrumentation.rb +33 -33
- data/lib/teaspoon/result.rb +2 -1
- data/lib/teaspoon/runner.rb +40 -28
- data/lib/teaspoon/server.rb +23 -25
- data/lib/teaspoon/suite.rb +52 -72
- data/lib/teaspoon/utility.rb +3 -14
- data/lib/teaspoon/version.rb +1 -1
- data/spec/dummy/app/assets/javascripts/integration/integration_spec.coffee +3 -0
- data/spec/dummy/app/assets/javascripts/integration/spec_helper.coffee +2 -0
- data/spec/dummy/config/application.rb +3 -0
- data/spec/features/console_reporter_spec.rb +48 -18
- data/spec/features/hooks_spec.rb +23 -41
- data/spec/features/html_reporter_spec.rb +38 -21
- data/spec/features/install_generator_spec.rb +34 -20
- data/spec/features/instrumentation_spec.rb +3 -2
- data/spec/fixtures/coverage.json +243 -0
- data/spec/javascripts/fixtures/_body.html.erb +1 -0
- data/spec/javascripts/jasmine_helper.coffee +1 -1
- data/spec/javascripts/teaspoon/base/fixture_spec.coffee +4 -4
- data/spec/javascripts/teaspoon/base/reporters/html_spec.coffee +9 -10
- data/spec/javascripts/teaspoon/mocha/reporters/html_mspec.coffee +0 -6
- data/spec/javascripts/teaspoon/phantomjs/runner_spec.coffee +5 -6
- data/spec/javascripts/turbolinks_helper.coffee +1 -1
- data/spec/spec_helper.rb +3 -4
- data/spec/teaspoon/command_line_spec.rb +139 -23
- data/spec/teaspoon/configuration_spec.rb +164 -46
- data/spec/teaspoon/console_spec.rb +142 -47
- data/spec/teaspoon/coverage_spec.rb +98 -28
- data/spec/teaspoon/drivers/base_spec.rb +5 -0
- data/spec/teaspoon/drivers/phantomjs_driver_spec.rb +32 -14
- data/spec/teaspoon/drivers/selenium_driver_spec.rb +32 -24
- data/spec/teaspoon/engine_spec.rb +8 -5
- data/spec/teaspoon/environment_spec.rb +56 -33
- data/spec/teaspoon/exceptions_spec.rb +57 -0
- data/spec/teaspoon/exporter_spec.rb +96 -0
- data/spec/teaspoon/formatters/base_spec.rb +259 -0
- data/spec/teaspoon/formatters/clean_formatter_spec.rb +37 -0
- data/spec/teaspoon/formatters/documentation_formatter_spec.rb +127 -0
- data/spec/teaspoon/formatters/dot_formatter_spec.rb +52 -56
- data/spec/teaspoon/formatters/json_formatter_spec.rb +77 -0
- data/spec/teaspoon/formatters/junit_formatter_spec.rb +72 -35
- data/spec/teaspoon/formatters/pride_formatter_spec.rb +37 -0
- data/spec/teaspoon/formatters/snowday_formatter_spec.rb +35 -0
- data/spec/teaspoon/formatters/tap_formatter_spec.rb +29 -81
- data/spec/teaspoon/formatters/tap_y_formatter_spec.rb +31 -141
- data/spec/teaspoon/formatters/teamcity_formatter_spec.rb +99 -42
- data/spec/teaspoon/instrumentation_spec.rb +44 -44
- data/spec/teaspoon/result_spec.rb +37 -0
- data/spec/teaspoon/runner_spec.rb +70 -59
- data/spec/teaspoon/server_spec.rb +34 -52
- data/spec/teaspoon/suite_spec.rb +42 -188
- data/spec/teaspoon_env.rb +39 -28
- data/vendor/assets/javascripts/{angular-scenario-1.0.5.js → angular/1.0.5.js} +0 -0
- data/vendor/assets/javascripts/{angular-scenario-1.0.5.MIT-LICENSE → angular/MIT-LICENSE} +0 -0
- data/vendor/assets/javascripts/{jasmine-1.3.1.js → jasmine/1.3.1.js} +0 -0
- data/vendor/assets/javascripts/jasmine/2.0.0.js +2412 -0
- data/vendor/assets/javascripts/{jasmine-1.3.1.MIT.LICENSE → jasmine/MIT.LICENSE} +0 -0
- data/vendor/assets/javascripts/{mocha-1.10.0.js → mocha/1.10.0.js} +1 -0
- data/vendor/assets/javascripts/mocha/1.17.1.js +5813 -0
- data/vendor/assets/javascripts/{mocha-1.10.1.MIT.LICENSE → mocha/MIT.LICENSE} +0 -0
- data/vendor/assets/javascripts/{qunit-1.12.0.js → qunit/1.12.0.js} +1 -1
- data/vendor/assets/javascripts/qunit/1.14.0.js +2288 -0
- data/vendor/assets/javascripts/{qunit-1.12.0.MIT.LICENSE → qunit/MIT.LICENSE} +0 -0
- data/vendor/assets/javascripts/support/chai.js +827 -385
- data/vendor/assets/javascripts/support/jasmine-jquery-1.7.0.js +720 -0
- data/vendor/assets/javascripts/support/jasmine-jquery-2.0.0.js +812 -0
- data/vendor/assets/javascripts/support/sinon-chai.js +17 -0
- data/vendor/assets/javascripts/support/sinon.js +1138 -643
- metadata +57 -36
- data/app/controllers/teaspoon/spec_controller.rb +0 -38
- data/app/helpers/teaspoon/spec_helper.rb +0 -36
- data/app/views/teaspoon/spec/_require_js.html.erb +0 -21
- data/app/views/teaspoon/spec/_standard.html.erb +0 -4
- data/app/views/teaspoon/spec/runner.html.erb +0 -19
- data/lib/generators/teaspoon/install/templates/env.rb +0 -38
- data/lib/generators/teaspoon/install/templates/jasmine/initializer.rb +0 -64
- data/lib/generators/teaspoon/install/templates/mocha/initializer.rb +0 -64
- data/lib/generators/teaspoon/install/templates/qunit/initializer.rb +0 -64
- data/lib/teaspoon/check_coverage.rb +0 -33
- data/lib/teaspoon/drivers/base_driver.rb +0 -10
- data/lib/teaspoon/exception_handling.rb +0 -18
- data/lib/teaspoon/formatters/base_formatter.rb +0 -63
- data/spec/dummy/config/initializers/teaspoon.rb +0 -41
- data/spec/teaspoon/check_coverage_spec.rb +0 -50
- data/spec/teaspoon/formatters/base_formatter_spec.rb +0 -45
- data/vendor/assets/javascripts/support/chai.MIT.LICENSE +0 -22
- data/vendor/assets/javascripts/support/expect.MIT.LICENSE +0 -22
- data/vendor/assets/javascripts/support/jasmine-jquery.MIT.LICENSE +0 -20
- data/vendor/assets/javascripts/support/jasmine-jquery.js +0 -659
- data/vendor/assets/javascripts/support/sinon-chai.MIT-ISH.LICENSE +0 -13
- data/vendor/assets/javascripts/support/sinon.BSD.LICENSE +0 -27
@@ -0,0 +1 @@
|
|
1
|
+
This is a body partial.
|
@@ -21,8 +21,8 @@ describe "Teaspoon.fixture", ->
|
|
21
21
|
|
22
22
|
it "loads all of the files requested", ->
|
23
23
|
fixture.load("fixture.html", "fixture.json")
|
24
|
-
expect(@xhrSpy).toHaveBeenCalledWith("GET", "/
|
25
|
-
expect(@xhrSpy).toHaveBeenCalledWith("GET", "/
|
24
|
+
expect(@xhrSpy).toHaveBeenCalledWith("GET", "#{Teaspoon.root}/fixtures/fixture.html", false)
|
25
|
+
expect(@xhrSpy).toHaveBeenCalledWith("GET", "#{Teaspoon.root}/fixtures/fixture.json", false)
|
26
26
|
|
27
27
|
it "caches the type/contents of those files", ->
|
28
28
|
fixture.load("fixture.html")
|
@@ -83,8 +83,8 @@ describe "Teaspoon.fixture", ->
|
|
83
83
|
|
84
84
|
it "loads all of the files requested", ->
|
85
85
|
fixture.preload("fixture.html", "fixture.json")
|
86
|
-
expect(@xhrSpy).toHaveBeenCalledWith("GET", "/
|
87
|
-
expect(@xhrSpy).toHaveBeenCalledWith("GET", "/
|
86
|
+
expect(@xhrSpy).toHaveBeenCalledWith("GET", "#{Teaspoon.root}/fixtures/fixture.html", false)
|
87
|
+
expect(@xhrSpy).toHaveBeenCalledWith("GET", "#{Teaspoon.root}/fixtures/fixture.json", false)
|
88
88
|
expect(document.getElementById("teaspoon-fixtures")).toBe(null)
|
89
89
|
|
90
90
|
it "caches the type/contents of those files", ->
|
@@ -29,12 +29,11 @@ describe "Teaspoon.Reporters.HTML", ->
|
|
29
29
|
describe "constructor", ->
|
30
30
|
|
31
31
|
it "sets up the expected variables", ->
|
32
|
-
|
33
32
|
expect(@reporter.start).toBeDefined()
|
34
33
|
expect(@reporter.config).toEqual("use-catch": true, "build-full-report": false, "display-progress": true)
|
35
34
|
expect(@reporter.total).toEqual({exist: 0, run: 0, passes: 0, failures: 0, skipped: 0})
|
36
35
|
expect(@reporter.views).toEqual({specs: {}, suites: {}})
|
37
|
-
expect(@reporter.filters).toEqual(["by match: foo
|
36
|
+
expect(@reporter.filters).toEqual(["by match: foo"])
|
38
37
|
|
39
38
|
it "calls readConfig", ->
|
40
39
|
expect(@readConfigSpy).toHaveBeenCalled()
|
@@ -110,7 +109,7 @@ describe "Teaspoon.Reporters.HTML", ->
|
|
110
109
|
it "builds a select that displays the suites", ->
|
111
110
|
result = @reporter.buildSuiteSelect()
|
112
111
|
expect(result).toContain("select id=")
|
113
|
-
expect(result).toContain("selected
|
112
|
+
expect(result).toContain("selected value=\"#{Teaspoon.root}/foo\"")
|
114
113
|
|
115
114
|
|
116
115
|
describe "#buildProgress", ->
|
@@ -339,8 +338,8 @@ describe "Teaspoon.Reporters.HTML", ->
|
|
339
338
|
|
340
339
|
it "sets a class and the html for the filter display", ->
|
341
340
|
expect(@reporter.filters.length).toBe(2)
|
342
|
-
expect(@reporter.filters[0]).toBe("by file: _file_
|
343
|
-
expect(@reporter.filters[1]).toBe("by match: _grep_
|
341
|
+
expect(@reporter.filters[0]).toBe("by file: _file_")
|
342
|
+
expect(@reporter.filters[1]).toBe("by match: _grep_")
|
344
343
|
|
345
344
|
|
346
345
|
describe "#readConfig", ->
|
@@ -348,26 +347,26 @@ describe "Teaspoon.Reporters.HTML", ->
|
|
348
347
|
beforeEach ->
|
349
348
|
@readConfigSpy.andCallThrough()
|
350
349
|
@config = {}
|
351
|
-
@
|
350
|
+
@storeSpy = spyOn(@reporter, "store").andReturn(@config)
|
352
351
|
@reporter.readConfig()
|
353
352
|
|
354
353
|
it "reads the configuration from the cookie", ->
|
355
|
-
expect(@
|
354
|
+
expect(@storeSpy).toHaveBeenCalledWith("teaspoon")
|
356
355
|
expect(@reporter.config).toEqual(@config)
|
357
356
|
|
358
357
|
|
359
358
|
describe "#toggleConfig", ->
|
360
359
|
|
361
360
|
beforeEach ->
|
362
|
-
@refreshSpy = spyOn(
|
363
|
-
@
|
361
|
+
@refreshSpy = spyOn(Teaspoon, "reload")
|
362
|
+
@storeSpy = spyOn(@reporter, "store")
|
364
363
|
@reporter.toggleConfig(target: {tagName: "button", getAttribute: -> "teaspoon-use-catch"})
|
365
364
|
|
366
365
|
it "toggles the configuration", ->
|
367
366
|
expect(@reporter.config["use-catch"]).toBe(false)
|
368
367
|
|
369
368
|
it "sets the cookie", ->
|
370
|
-
expect(@
|
369
|
+
expect(@storeSpy).toHaveBeenCalledWith("teaspoon", @reporter.config)
|
371
370
|
|
372
371
|
it "refreshes the page", ->
|
373
372
|
expect(@refreshSpy).toHaveBeenCalled()
|
@@ -26,12 +26,6 @@ describe "Mocha Teaspoon.Reporters.HTML", ->
|
|
26
26
|
expect(spec.err).to.eql(foo: "bar")
|
27
27
|
|
28
28
|
|
29
|
-
describe "#envInfo", ->
|
30
|
-
|
31
|
-
it "returns the version", ->
|
32
|
-
expect(@reporter.envInfo()).to.be("mocha 1.9.1")
|
33
|
-
|
34
|
-
|
35
29
|
describe "Mocha Teaspoon.Reporters.HTML.SpecView", ->
|
36
30
|
|
37
31
|
describe "#updateState", ->
|
@@ -93,8 +93,7 @@ describe "PhantomJS Runner", ->
|
|
93
93
|
|
94
94
|
it "logs the error message", ->
|
95
95
|
@runner.fail("_message_")
|
96
|
-
expect(@logSpy).toHaveBeenCalledWith("
|
97
|
-
expect(@logSpy).toHaveBeenCalledWith('{"_teaspoon":true,"type":"exception"}')
|
96
|
+
expect(@logSpy).toHaveBeenCalledWith('{"_teaspoon":true,"type":"exception","message":"_message_"}')
|
98
97
|
|
99
98
|
it "exits with the error code", ->
|
100
99
|
spy = spyOn(phantom, "exit")
|
@@ -104,10 +103,6 @@ describe "PhantomJS Runner", ->
|
|
104
103
|
|
105
104
|
describe "#finish", ->
|
106
105
|
|
107
|
-
it "logs an empty string (to fix line feeds in the console)", ->
|
108
|
-
@runner.finish()
|
109
|
-
expect(@logSpy).toHaveBeenCalledWith(" ")
|
110
|
-
|
111
106
|
it "calls exit with a success code", ->
|
112
107
|
spy = spyOn(phantom, "exit")
|
113
108
|
@runner.finish()
|
@@ -133,6 +128,10 @@ describe "PhantomJS Runner", ->
|
|
133
128
|
@callbacks.onError("_message_", ["trace1", "trace2"])
|
134
129
|
expect(@logSpy).toHaveBeenCalledWith('{"_teaspoon":true,"type":"error","message":"_message_","trace":["trace1","trace2"]}')
|
135
130
|
|
131
|
+
it "calls #fail if the error is a TeaspoonError", ->
|
132
|
+
spyOn(@runner, "fail")
|
133
|
+
@callbacks.onError("TeaspoonError: _message_")
|
134
|
+
expect(@runner.fail).toHaveBeenCalledWith("Execution halted.")
|
136
135
|
|
137
136
|
describe "#onConsoleMessage", ->
|
138
137
|
|
@@ -1,2 +1,2 @@
|
|
1
1
|
#= require turbolinks
|
2
|
-
#= require ./spec_helper
|
2
|
+
#= require ./spec_helper
|
data/spec/spec_helper.rb
CHANGED
@@ -2,22 +2,21 @@ ENV["RAILS_ENV"] ||= "test"
|
|
2
2
|
ENV["RAILS_ROOT"] = File.expand_path("../dummy", __FILE__)
|
3
3
|
require File.expand_path("../dummy/config/environment", __FILE__)
|
4
4
|
|
5
|
+
require "coveralls"
|
6
|
+
Coveralls.wear!
|
7
|
+
|
5
8
|
require "rspec/rails"
|
6
9
|
require "rspec/autorun"
|
7
10
|
require "capybara/rails"
|
8
|
-
#require 'capybara/poltergeist'
|
9
11
|
require "aruba/api"
|
10
12
|
|
11
13
|
require "ostruct"
|
12
14
|
|
13
15
|
Dir[File.expand_path("../support/**/*.rb", __FILE__)].each { |f| require f }
|
14
16
|
|
15
|
-
#Capybara.javascript_driver = :poltergeist
|
16
|
-
|
17
17
|
RSpec.configure do |config|
|
18
18
|
config.infer_base_class_for_anonymous_controllers = false
|
19
19
|
config.order = "random"
|
20
20
|
|
21
|
-
config.filter_run :focus => true
|
22
21
|
config.run_all_when_everything_filtered = true
|
23
22
|
end
|
@@ -2,47 +2,163 @@ require "spec_helper"
|
|
2
2
|
require "teaspoon/command_line"
|
3
3
|
require "teaspoon/console"
|
4
4
|
|
5
|
+
module Kernel
|
6
|
+
def suppress_warnings
|
7
|
+
original_verbosity = $VERBOSE
|
8
|
+
$VERBOSE = nil
|
9
|
+
result = yield
|
10
|
+
$VERBOSE = original_verbosity
|
11
|
+
return result
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
5
15
|
describe Teaspoon::CommandLine do
|
6
16
|
|
7
|
-
|
17
|
+
subject { Teaspoon::CommandLine }
|
8
18
|
|
9
|
-
|
10
|
-
|
19
|
+
let(:console) { double(failures?: false) }
|
20
|
+
let(:parser) { double(parse!: ["file1", "file2"]) }
|
21
|
+
|
22
|
+
describe "#initialize" do
|
11
23
|
|
12
24
|
before do
|
13
|
-
Teaspoon::CommandLine.any_instance.stub(:abort)
|
14
25
|
Teaspoon::Console.stub(:new).and_return(console)
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
it "assigns @options" do
|
19
|
-
instance = Teaspoon::CommandLine.new
|
20
|
-
expect(instance.instance_variable_get(:@options)).to eq({})
|
26
|
+
subject.any_instance.stub(:abort)
|
27
|
+
subject.any_instance.stub(:opt_parser).and_return(parser)
|
21
28
|
end
|
22
29
|
|
23
|
-
it "assigns @files" do
|
24
|
-
|
25
|
-
expect(instance.instance_variable_get(:@files)).to eq(["file1", "file2"])
|
30
|
+
it "assigns @options and adds the files that were parsed out" do
|
31
|
+
expect(subject.new.instance_variable_get(:@options)).to eq(files: ["file1", "file2"])
|
26
32
|
end
|
27
33
|
|
28
34
|
it "aborts with a message on Teaspoon::EnvironmentNotFound" do
|
29
35
|
Teaspoon::Console.should_receive(:new).and_raise(Teaspoon::EnvironmentNotFound)
|
30
|
-
|
31
|
-
|
32
|
-
STDOUT.should_receive(:print).with("Consider using -r path/to/teaspoon_env\n")
|
33
|
-
Teaspoon::CommandLine.new
|
36
|
+
subject.any_instance.should_receive(:abort).with("Teaspoon::EnvironmentNotFound\nConsider using -r path/to/teaspoon_env\n")
|
37
|
+
subject.new
|
34
38
|
end
|
35
39
|
|
36
40
|
it "executes using Teaspoon::Console" do
|
37
|
-
Teaspoon::Console.should_receive(:new).with(
|
38
|
-
console.should_receive(:
|
39
|
-
|
41
|
+
Teaspoon::Console.should_receive(:new).with(files: ["file1", "file2"])
|
42
|
+
console.should_receive(:failures?)
|
43
|
+
subject.new
|
40
44
|
end
|
41
45
|
|
42
46
|
it "aborts if Teaspoon::Console fails" do
|
43
|
-
|
44
|
-
console.should_receive(:
|
45
|
-
|
47
|
+
subject.any_instance.should_receive(:abort)
|
48
|
+
console.should_receive(:failures?).and_return(true)
|
49
|
+
subject.new
|
50
|
+
end
|
51
|
+
|
52
|
+
it "logs a message and exits on abort" do
|
53
|
+
STDOUT.should_receive(:print).with("Teaspoon::EnvironmentNotFound\nConsider using -r path/to/teaspoon_env\n")
|
54
|
+
Teaspoon::Console.should_receive(:new).and_raise(Teaspoon::EnvironmentNotFound)
|
55
|
+
subject.any_instance.should_receive(:abort).and_call_original
|
56
|
+
expect { subject.new }.to raise_error SystemExit
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "opt_parser" do
|
62
|
+
|
63
|
+
before do
|
64
|
+
@log = ""
|
65
|
+
STDOUT.stub(:print) { |s| @log << s }
|
66
|
+
Teaspoon::Console.stub(:new).and_return(console)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "has --help" do
|
70
|
+
suppress_warnings { ARGV = ["--help"] }
|
71
|
+
expect { subject.new.opt_parser }.to raise_error SystemExit
|
72
|
+
expect(@log).to include <<-OUTPUT.strip_heredoc
|
73
|
+
Usage: teaspoon [options] [files]
|
74
|
+
|
75
|
+
-r, --require FILE Require Teaspoon environment file.
|
76
|
+
-d, --driver DRIVER Specify driver:
|
77
|
+
phantomjs (default)
|
78
|
+
selenium
|
79
|
+
--driver-options OPTIONS Specify driver-specific options to pass into the driver.
|
80
|
+
e.g. "--ssl-protocol=any --ssl-certificates-path=/path/to/certs".
|
81
|
+
Driver options are only supported with phantomjs.
|
82
|
+
--driver-timeout SECONDS Sets the timeout for the driver to wait before exiting.
|
83
|
+
--server SERVER Sets server to use with Rack.
|
84
|
+
e.g. webrick, thin
|
85
|
+
--server-port PORT Sets the server to use a specific port.
|
86
|
+
--server-timeout SECONDS Sets the timeout that the server must start within.
|
87
|
+
-F, --[no-]fail-fast Abort after the first failing suite.
|
88
|
+
|
89
|
+
**** Filtering ****
|
90
|
+
|
91
|
+
-s, --suite SUITE Focus to a specific suite.
|
92
|
+
-g, --filter FILTER Filter tests matching a specific filter.
|
93
|
+
|
94
|
+
**** Output ****
|
95
|
+
|
96
|
+
-q, --[no-]suppress-log Suppress logs coming from console[log/debug/error].
|
97
|
+
-c, --[no-]color Enable/Disable color output.
|
98
|
+
-e, --export [OUTPUT_PATH] Exports the test suite as the full HTML (requires wget).
|
99
|
+
-f, --format FORMATTERS Specify formatters (comma separated)
|
100
|
+
dot (default) - dots
|
101
|
+
documentation - descriptive documentation
|
102
|
+
clean - like dots but doesn't log re-run commands
|
103
|
+
json - json formatter (raw teaspoon)
|
104
|
+
junit - junit compatible formatter
|
105
|
+
pride - yay rainbows!
|
106
|
+
snowday - makes you feel warm inside
|
107
|
+
swayze_or_oprah - quote from either Patrick Swayze or Oprah Winfrey
|
108
|
+
tap - test anything protocol formatter
|
109
|
+
tap_y - tap_yaml, format used by tapout
|
110
|
+
teamcity - teamcity compatible formatter
|
111
|
+
|
112
|
+
**** Coverage ****
|
113
|
+
|
114
|
+
-C, --coverage CONFIG_NAME Generate coverage reports using a pre-defined coverage configuration.
|
115
|
+
|
116
|
+
**** Utility ****
|
117
|
+
|
118
|
+
-v, --version Display the version.
|
119
|
+
-h, --help You're looking at it.
|
120
|
+
OUTPUT
|
121
|
+
end
|
122
|
+
|
123
|
+
it "has --version" do
|
124
|
+
suppress_warnings { ARGV = ["--version"] }
|
125
|
+
expect { subject.new.opt_parser }.to raise_error SystemExit
|
126
|
+
expect(@log).to match(/\d+\.\d+\.\d+\n/)
|
127
|
+
end
|
128
|
+
|
129
|
+
it "has various other arguments" do
|
130
|
+
value_flags = {
|
131
|
+
environment: ["require", "_environment_"],
|
132
|
+
driver: ["driver", "_driver_"],
|
133
|
+
driver_options: ["driver-options", "_driver_options_"],
|
134
|
+
driver_timeout: ["driver-timeout", "_driver_timeout_"],
|
135
|
+
server: ["server", "_server_"],
|
136
|
+
server_port: ["server-port", "_server_port_"],
|
137
|
+
server_timeout: ["server-timeout", "_server_timeout_"],
|
138
|
+
suite: ["suite", "_suite_"],
|
139
|
+
filter: ["filter", "_filter_"],
|
140
|
+
export: ["export", "_export_"],
|
141
|
+
formatters: ["format", "_foo,bar_"],
|
142
|
+
use_coverage: ["coverage", "_coverage_"],
|
143
|
+
}
|
144
|
+
|
145
|
+
bool_flags = {
|
146
|
+
fail_fast: "fail-fast",
|
147
|
+
suppress_log: "suppress-log",
|
148
|
+
color: "color",
|
149
|
+
}
|
150
|
+
|
151
|
+
value_flags.each do |k, v|
|
152
|
+
suppress_warnings { ARGV = ["--#{v[0]}=#{v[1]}"] }
|
153
|
+
expect(subject.new.instance_variable_get(:@options)[k]).to eq(v[1])
|
154
|
+
end
|
155
|
+
|
156
|
+
bool_flags.each do |k, v|
|
157
|
+
suppress_warnings { ARGV = ["--#{v}"] }
|
158
|
+
expect(subject.new.instance_variable_get(:@options)[k]).to eq(true)
|
159
|
+
suppress_warnings { ARGV = ["--no-#{v}"] }
|
160
|
+
expect(subject.new.instance_variable_get(:@options)[k]).to eq(false)
|
161
|
+
end
|
46
162
|
end
|
47
163
|
|
48
164
|
end
|
@@ -2,36 +2,38 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe Teaspoon do
|
4
4
|
|
5
|
+
subject { Teaspoon }
|
6
|
+
|
5
7
|
it "has a configuration property" do
|
6
|
-
expect(
|
8
|
+
expect(subject.configuration).to be(Teaspoon::Configuration)
|
7
9
|
end
|
8
10
|
|
9
|
-
describe ".
|
11
|
+
describe ".configure" do
|
10
12
|
|
11
13
|
it "yields configuration" do
|
12
14
|
config = nil
|
13
|
-
|
15
|
+
subject.configure { |c| config = c }
|
14
16
|
expect(config).to be(Teaspoon::Configuration)
|
15
17
|
end
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
-
|
19
|
+
it "sets configured to true" do
|
20
|
+
subject.configured = false
|
21
|
+
subject.configure { }
|
22
|
+
expect(subject.configured).to be_true
|
23
|
+
end
|
20
24
|
|
21
|
-
|
22
|
-
ENV
|
23
|
-
|
24
|
-
ENV["FORMATTERS"] = nil
|
25
|
+
it "overrides configuration from ENV" do
|
26
|
+
subject.configuration.should_receive(:override_from_env).with(ENV)
|
27
|
+
subject.configure { }
|
25
28
|
end
|
26
29
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
Teaspoon.send(:override_from_env)
|
30
|
+
end
|
31
|
+
|
32
|
+
describe ".setup" do
|
33
|
+
|
34
|
+
it "calls configure" do
|
35
|
+
subject.should_receive(:configure).with(&block = proc{})
|
36
|
+
subject.setup(&block)
|
35
37
|
end
|
36
38
|
|
37
39
|
end
|
@@ -43,68 +45,184 @@ describe Teaspoon::Configuration do
|
|
43
45
|
|
44
46
|
subject { Teaspoon::Configuration }
|
45
47
|
|
48
|
+
before do
|
49
|
+
@orig_root = subject.root
|
50
|
+
@orig_asset_paths = subject.asset_paths
|
51
|
+
@orig_formatters = subject.formatters
|
52
|
+
end
|
53
|
+
|
46
54
|
after do
|
47
|
-
|
48
|
-
|
49
|
-
|
55
|
+
subject.mount_at = "/teaspoon"
|
56
|
+
subject.suite_configs.delete("test_suite")
|
57
|
+
subject.server = nil
|
58
|
+
subject.root = @orig_root
|
59
|
+
subject.asset_paths = @orig_asset_paths
|
60
|
+
subject.formatters = @orig_formatters
|
50
61
|
end
|
51
62
|
|
52
63
|
it "has the default configuration" do
|
53
64
|
expect(subject.mount_at).to eq("/teaspoon")
|
54
|
-
expect(subject.
|
65
|
+
expect(subject.root).to eq(Rails.root.join('..', '..'))
|
55
66
|
expect(subject.asset_paths).to include("spec/javascripts")
|
56
67
|
expect(subject.asset_paths).to include("spec/javascripts/stylesheets")
|
57
|
-
expect(subject.
|
58
|
-
|
59
|
-
expect(subject.
|
60
|
-
expect(subject.
|
61
|
-
expect(subject.
|
62
|
-
expect(subject.suites).to be_a(Hash)
|
63
|
-
expect(subject.coverage).to eq(false)
|
64
|
-
expect(subject.coverage_reports).to eq(["text-summary"])
|
65
|
-
expect(subject.coverage_output_dir).to eq("coverage")
|
68
|
+
expect(subject.fixture_paths).to eq(["spec/javascripts/fixtures", "test/javascripts/fixtures"])
|
69
|
+
|
70
|
+
expect(subject.driver).to eq("phantomjs")
|
71
|
+
expect(subject.driver_options).to be_nil
|
72
|
+
expect(subject.driver_timeout).to eq(180)
|
66
73
|
expect(subject.server).to be_nil
|
67
|
-
expect(subject.
|
68
|
-
expect(subject.
|
69
|
-
expect(subject.
|
70
|
-
expect(subject.
|
74
|
+
expect(subject.server_port).to be_nil
|
75
|
+
expect(subject.server_timeout).to eq(20)
|
76
|
+
expect(subject.formatters).to eq(['dot'])
|
77
|
+
expect(subject.use_coverage).to be_nil
|
78
|
+
expect(subject.fail_fast).to be_true
|
79
|
+
expect(subject.suppress_log).to be_false
|
80
|
+
expect(subject.color).to be_true
|
81
|
+
|
82
|
+
expect(subject.suite_configs).to be_a(Hash)
|
83
|
+
expect(subject.coverage_configs).to be_a(Hash)
|
71
84
|
end
|
72
85
|
|
73
86
|
it "allows setting various configuration options" do
|
74
|
-
|
87
|
+
subject.mount_at = "/teaspoons_are_awesome"
|
75
88
|
expect(subject.mount_at).to eq("/teaspoons_are_awesome")
|
76
|
-
|
89
|
+
subject.server = :webrick
|
77
90
|
expect(subject.server).to eq(:webrick)
|
78
91
|
end
|
79
92
|
|
80
|
-
it "allows defining
|
93
|
+
it "allows defining suite configurations" do
|
81
94
|
subject.suite(:test_suite) { }
|
82
|
-
expect(subject.
|
95
|
+
expect(subject.suite_configs["test_suite"][:block]).to be_a(Proc)
|
96
|
+
expect(subject.suite_configs["test_suite"][:instance]).to be_a(Teaspoon::Configuration::Suite)
|
97
|
+
end
|
98
|
+
|
99
|
+
it "allows defining coverage configurations" do
|
100
|
+
subject.coverage(:test_coverage) { }
|
101
|
+
expect(subject.coverage_configs["test_coverage"][:block]).to be_a(Proc)
|
102
|
+
expect(subject.coverage_configs["test_coverage"][:instance]).to be_a(Teaspoon::Configuration::Coverage)
|
103
|
+
end
|
104
|
+
|
105
|
+
describe ".root=" do
|
106
|
+
|
107
|
+
it "forces the path provided into a Pathname" do
|
108
|
+
subject.root = "/path"
|
109
|
+
expect(subject.root).to be_a(Pathname)
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
describe ".formatters" do
|
115
|
+
|
116
|
+
it "returns the default dot formatter if nothing was set" do
|
117
|
+
expect(subject.formatters).to eq(["dot"])
|
118
|
+
end
|
119
|
+
|
120
|
+
it "returns an array of formatters if they were comma separated" do
|
121
|
+
subject.formatters = "dot,swayze_or_oprah"
|
122
|
+
expect(subject.formatters).to eq(["dot", "swayze_or_oprah"])
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
describe ".override_from_options" do
|
128
|
+
|
129
|
+
it "allows overriding from options" do
|
130
|
+
subject.should_receive(:fail_fast=).with(true)
|
131
|
+
subject.should_receive(:driver_timeout=).with(123)
|
132
|
+
subject.should_receive(:driver=).with("driver")
|
133
|
+
|
134
|
+
subject.send(:override_from_options, fail_fast: true, driver_timeout: 123, driver: "driver")
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
|
139
|
+
describe ".override_from_env" do
|
140
|
+
|
141
|
+
it "allows overriding from the env" do
|
142
|
+
subject.should_receive(:fail_fast=).with(true)
|
143
|
+
subject.should_receive(:driver_timeout=).with(123)
|
144
|
+
subject.should_receive(:driver=).with("driver")
|
145
|
+
|
146
|
+
subject.send(:override_from_env, "FAIL_FAST" => "true", "DRIVER_TIMEOUT" => "123", "DRIVER" => "driver")
|
147
|
+
end
|
148
|
+
|
83
149
|
end
|
150
|
+
|
84
151
|
end
|
85
152
|
|
86
153
|
|
87
154
|
describe Teaspoon::Configuration::Suite do
|
88
155
|
|
156
|
+
subject { Teaspoon::Configuration::Suite.new &(@suite || proc{}) }
|
157
|
+
|
89
158
|
it "has the default configuration" do
|
90
|
-
subject = Teaspoon::Configuration::Suite.new
|
91
159
|
expect(subject.matcher).to eq("{spec/javascripts,spec/dummy/app/assets/javascripts/specs}/**/*_spec.{js,js.coffee,coffee,js.coffee.erb}")
|
92
160
|
expect(subject.helper).to eq("spec_helper")
|
93
|
-
expect(subject.javascripts).to eq(["teaspoon/jasmine"])
|
161
|
+
expect(subject.javascripts).to eq(["jasmine/1.3.1", "teaspoon/jasmine"])
|
94
162
|
expect(subject.stylesheets).to eq(["teaspoon"])
|
163
|
+
expect(subject.no_coverage).to eq([%r{/lib/ruby/gems/}, %r{/vendor/assets/}, %r{/support/}, %r{/(.+)_helper.}])
|
95
164
|
end
|
96
165
|
|
97
166
|
it "accepts a block that can override defaults" do
|
98
|
-
|
167
|
+
@suite = proc{ |s| s.helper = "helper_file" }
|
99
168
|
expect(subject.helper).to eq("helper_file")
|
100
169
|
end
|
101
170
|
|
102
|
-
|
103
|
-
it "allows creating hooks" do
|
171
|
+
it "allows registering hooks" do
|
104
172
|
expect(subject.hooks).to eq({})
|
105
|
-
|
106
173
|
subject.hook {}
|
107
|
-
|
108
174
|
expect(subject.hooks['default'].length).to eq(1)
|
109
175
|
end
|
176
|
+
|
177
|
+
describe "specifying a framework" do
|
178
|
+
|
179
|
+
it "allows specifying mocha with a version" do
|
180
|
+
@suite = proc{ |s| s.use_framework :mocha, "1.10.0" }
|
181
|
+
expect(subject.javascripts).to eq(["mocha/1.10.0", "teaspoon-mocha"])
|
182
|
+
end
|
183
|
+
|
184
|
+
it "handles qunit specifically to set matcher and helper" do
|
185
|
+
@suite = proc{ |s| s.use_framework :qunit }
|
186
|
+
expect(subject.javascripts).to eq(["qunit/1.14.0", "teaspoon-qunit"])
|
187
|
+
expect(subject.matcher).to eq("{test/javascripts,app/assets}/**/*_test.{js,js.coffee,coffee}")
|
188
|
+
expect(subject.helper).to eq("test_helper")
|
189
|
+
end
|
190
|
+
|
191
|
+
describe "exceptions" do
|
192
|
+
|
193
|
+
it "shows an error for unknown frameworks" do
|
194
|
+
@suite = proc{ |s| s.use_framework :foo }
|
195
|
+
expect{ subject }.to raise_error Teaspoon::UnknownFramework, "Unknown framework \"foo\""
|
196
|
+
end
|
197
|
+
|
198
|
+
it "shows an error for unknown versions" do
|
199
|
+
@suite = proc{ |s| s.use_framework :qunit, "666" }
|
200
|
+
expect{ subject }.to raise_error Teaspoon::UnknownFramework, "Unknown framework \"qunit\" with version 666 -- available versions 1.12.0, 1.14.0"
|
201
|
+
end
|
202
|
+
|
203
|
+
end
|
204
|
+
|
205
|
+
end
|
206
|
+
|
207
|
+
end
|
208
|
+
|
209
|
+
|
210
|
+
describe Teaspoon::Configuration::Coverage do
|
211
|
+
|
212
|
+
subject { Teaspoon::Configuration::Coverage.new &(@coverage || proc{}) }
|
213
|
+
|
214
|
+
it "has the default configuration" do
|
215
|
+
expect(subject.reports).to eq(["text-summary"])
|
216
|
+
expect(subject.output_path).to eq("coverage")
|
217
|
+
expect(subject.statements).to be_nil
|
218
|
+
expect(subject.functions).to be_nil
|
219
|
+
expect(subject.branches).to be_nil
|
220
|
+
expect(subject.lines).to be_nil
|
221
|
+
end
|
222
|
+
|
223
|
+
it "accepts a block that can override defaults" do
|
224
|
+
@coverage = proc{ |s| s.reports = "report_format" }
|
225
|
+
expect(subject.reports).to eq("report_format")
|
226
|
+
end
|
227
|
+
|
110
228
|
end
|