teaspoon 0.8.0 → 0.9.0
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.
- checksums.yaml +4 -4
- data/MIT.LICENSE +1 -1
- data/README.md +46 -377
- data/app/assets/javascripts/teaspoon-jasmine.js +200 -194
- data/app/assets/javascripts/teaspoon-mocha.js +183 -185
- data/app/assets/javascripts/teaspoon-qunit.js +201 -193
- data/app/assets/javascripts/teaspoon-teaspoon.js +10 -10
- data/app/assets/javascripts/teaspoon/base/fixture.coffee +0 -1
- data/app/assets/javascripts/teaspoon/base/hook.coffee +7 -6
- data/app/assets/javascripts/teaspoon/qunit.coffee +10 -0
- data/app/controllers/teaspoon/suite_controller.rb +3 -4
- data/app/views/teaspoon/suite/_boot.html.erb +1 -1
- data/app/views/teaspoon/suite/_boot_require_js.html.erb +1 -0
- data/bin/teaspoon +1 -1
- data/config/routes.rb +4 -14
- data/lib/generators/teaspoon/install/install_generator.rb +22 -11
- data/lib/generators/teaspoon/install/templates/jasmine/{env_comments.rb → env_comments.rb.tt} +10 -5
- data/lib/generators/teaspoon/install/templates/jasmine/spec_helper.coffee +5 -5
- data/lib/generators/teaspoon/install/templates/jasmine/spec_helper.js +5 -5
- data/lib/generators/teaspoon/install/templates/mocha/{env_comments.rb → env_comments.rb.tt} +10 -5
- data/lib/generators/teaspoon/install/templates/mocha/spec_helper.coffee +6 -5
- data/lib/generators/teaspoon/install/templates/mocha/spec_helper.js +6 -5
- data/lib/generators/teaspoon/install/templates/qunit/{env_comments.rb → env_comments.rb.tt} +10 -5
- data/lib/generators/teaspoon/install/templates/qunit/test_helper.coffee +5 -5
- data/lib/generators/teaspoon/install/templates/qunit/test_helper.js +5 -5
- data/lib/tasks/teaspoon.rake +1 -1
- data/lib/teaspoon/command_line.rb +37 -40
- data/lib/teaspoon/configuration.rb +27 -30
- data/lib/teaspoon/configuration.rb.orig +187 -0
- data/lib/teaspoon/console.rb +31 -17
- data/lib/teaspoon/coverage.rb +2 -3
- data/lib/teaspoon/deprecated.rb +13 -8
- data/lib/teaspoon/drivers/base.rb +2 -2
- data/lib/teaspoon/drivers/capybara_webkit_driver.rb +33 -0
- data/lib/teaspoon/drivers/phantomjs/runner.js +2 -2
- data/lib/teaspoon/drivers/phantomjs_driver.rb +13 -4
- data/lib/teaspoon/drivers/selenium_driver.rb +3 -5
- data/lib/teaspoon/engine.rb +33 -5
- data/lib/teaspoon/environment.rb +2 -4
- data/lib/teaspoon/exceptions.rb +8 -5
- data/lib/teaspoon/formatters/base.rb +39 -27
- data/lib/teaspoon/formatters/clean_formatter.rb +0 -1
- data/lib/teaspoon/formatters/description.rb +36 -0
- data/lib/teaspoon/formatters/documentation_formatter.rb +2 -2
- data/lib/teaspoon/formatters/json_formatter.rb +1 -2
- data/lib/teaspoon/formatters/junit_formatter.rb +20 -20
- data/lib/teaspoon/formatters/modules/report_module.rb +4 -4
- data/lib/teaspoon/formatters/pride_formatter.rb +0 -1
- data/lib/teaspoon/formatters/rspec_html_formatter.rb +463 -0
- data/lib/teaspoon/formatters/snowday_formatter.rb +0 -1
- data/lib/teaspoon/formatters/swayze_or_oprah_formatter.rb +5 -4
- data/lib/teaspoon/formatters/tap_formatter.rb +2 -3
- data/lib/teaspoon/formatters/tap_y_formatter.rb +20 -21
- data/lib/teaspoon/formatters/teamcity_formatter.rb +4 -5
- data/lib/teaspoon/instrumentation.rb +7 -7
- data/lib/teaspoon/result.rb +1 -3
- data/lib/teaspoon/runner.rb +1 -2
- data/lib/teaspoon/server.rb +2 -1
- data/lib/teaspoon/suite.rb +20 -17
- data/lib/teaspoon/utility.rb +1 -3
- data/lib/teaspoon/version.rb +1 -1
- data/spec/dummy/config/application.rb +14 -18
- data/spec/dummy/config/boot.rb +2 -6
- data/spec/dummy/config/environment.rb +3 -3
- data/spec/dummy/config/environments/development.rb +27 -13
- data/spec/dummy/config/environments/production.rb +79 -0
- data/spec/dummy/config/environments/test.rb +26 -13
- data/spec/dummy/config/routes.rb +1 -1
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/features/console_reporter_spec.rb +3 -8
- data/spec/features/hooks_spec.rb +17 -4
- data/spec/features/html_reporter_spec.rb +12 -1
- data/spec/features/install_generator_spec.rb +2 -3
- data/spec/features/instrumentation_spec.rb +11 -11
- data/spec/javascripts/teaspoon/base/teaspoon_spec.coffee +14 -1
- data/spec/spec_helper.rb +7 -4
- data/spec/teaspoon/command_line_spec.rb +19 -28
- data/spec/teaspoon/configuration_spec.rb +22 -14
- data/spec/teaspoon/console_spec.rb +79 -63
- data/spec/teaspoon/coverage_spec.rb +23 -23
- data/spec/teaspoon/drivers/capybara_webkit_driver_spec.rb +39 -0
- data/spec/teaspoon/drivers/phantomjs_driver_spec.rb +10 -5
- data/spec/teaspoon/drivers/selenium_driver_spec.rb +10 -10
- data/spec/teaspoon/environment_spec.rb +28 -20
- data/spec/teaspoon/exceptions_spec.rb +4 -4
- data/spec/teaspoon/exporter_spec.rb +28 -28
- data/spec/teaspoon/formatters/base_spec.rb +29 -29
- data/spec/teaspoon/formatters/clean_formatter_spec.rb +1 -1
- data/spec/teaspoon/formatters/documentation_formatter_spec.rb +1 -1
- data/spec/teaspoon/formatters/dot_formatter_spec.rb +1 -1
- data/spec/teaspoon/formatters/json_formatter_spec.rb +7 -7
- data/spec/teaspoon/formatters/junit_formatter_spec.rb +10 -10
- data/spec/teaspoon/formatters/pride_formatter_spec.rb +1 -1
- data/spec/teaspoon/formatters/rspec_html_formatter_spec.rb +107 -0
- data/spec/teaspoon/formatters/snowday_formatter_spec.rb +1 -1
- data/spec/teaspoon/formatters/tap_formatter_spec.rb +1 -1
- data/spec/teaspoon/formatters/tap_y_formatter_spec.rb +1 -1
- data/spec/teaspoon/formatters/teamcity_formatter_spec.rb +27 -27
- data/spec/teaspoon/instrumentation_spec.rb +35 -29
- data/spec/teaspoon/result_spec.rb +40 -36
- data/spec/teaspoon/runner_spec.rb +23 -20
- data/spec/teaspoon/server_spec.rb +19 -16
- data/spec/teaspoon/suite_spec.rb +23 -9
- data/spec/teaspoon_env.rb +7 -12
- data/test/javascripts/teaspoon/qunit/models_test.coffee +6 -2
- data/vendor/assets/javascripts/support/chai-1.10.0.js +4800 -0
- data/vendor/assets/javascripts/support/chai-jq-0.0.7.js +524 -0
- data/vendor/assets/javascripts/support/chai.js +4435 -4349
- metadata +57 -54
- data/app/assets/javascripts/teaspoon-angular.js +0 -1299
- data/app/assets/javascripts/teaspoon/angular.coffee +0 -55
- data/app/assets/javascripts/teaspoon/angular/reporters/console.coffee +0 -11
- data/app/assets/javascripts/teaspoon/angular/reporters/html.coffee +0 -21
- data/spec/javascripts/angular_helper.coffee +0 -5
- data/spec/javascripts/teaspoon/angular/models_aspec.coffee +0 -95
- data/spec/javascripts/teaspoon/angular/reporters/html_aspec.coffee +0 -9
- data/vendor/assets/javascripts/angular/1.0.5.js +0 -26195
- data/vendor/assets/javascripts/angular/MIT-LICENSE +0 -22
|
@@ -10,7 +10,7 @@ describe Teaspoon::Formatters::JsonFormatter do
|
|
|
10
10
|
let(:result) { double(hash.merge(total: 42)) }
|
|
11
11
|
|
|
12
12
|
it "logs the original json" do
|
|
13
|
-
subject.
|
|
13
|
+
expect(subject).to receive(:log_result).with(result)
|
|
14
14
|
subject.runner(result)
|
|
15
15
|
end
|
|
16
16
|
|
|
@@ -19,7 +19,7 @@ describe Teaspoon::Formatters::JsonFormatter do
|
|
|
19
19
|
describe "#suite" do
|
|
20
20
|
|
|
21
21
|
it "logs the original json" do
|
|
22
|
-
subject.
|
|
22
|
+
expect(subject).to receive(:log_result).with(result)
|
|
23
23
|
subject.suite(result)
|
|
24
24
|
end
|
|
25
25
|
|
|
@@ -30,7 +30,7 @@ describe Teaspoon::Formatters::JsonFormatter do
|
|
|
30
30
|
let(:result) { double(hash.merge(passing?: true)) }
|
|
31
31
|
|
|
32
32
|
it "logs the original json" do
|
|
33
|
-
subject.
|
|
33
|
+
expect(subject).to receive(:log_result).with(result)
|
|
34
34
|
subject.spec(result)
|
|
35
35
|
end
|
|
36
36
|
|
|
@@ -39,7 +39,7 @@ describe Teaspoon::Formatters::JsonFormatter do
|
|
|
39
39
|
describe "#error" do
|
|
40
40
|
|
|
41
41
|
it "logs the original json" do
|
|
42
|
-
subject.
|
|
42
|
+
expect(subject).to receive(:log_result).with(result)
|
|
43
43
|
subject.error(result)
|
|
44
44
|
end
|
|
45
45
|
|
|
@@ -48,7 +48,7 @@ describe Teaspoon::Formatters::JsonFormatter do
|
|
|
48
48
|
describe "#exception" do
|
|
49
49
|
|
|
50
50
|
it "logs the original json" do
|
|
51
|
-
subject.
|
|
51
|
+
expect(subject).to receive(:log_result).with(result)
|
|
52
52
|
subject.exception(result)
|
|
53
53
|
end
|
|
54
54
|
|
|
@@ -57,7 +57,7 @@ describe Teaspoon::Formatters::JsonFormatter do
|
|
|
57
57
|
describe "#console" do
|
|
58
58
|
|
|
59
59
|
it "logs the message as json" do
|
|
60
|
-
subject.
|
|
60
|
+
expect(subject).to receive(:log_line).with(%Q{{"type":"console","log":"_message_"}})
|
|
61
61
|
subject.console("_message_")
|
|
62
62
|
end
|
|
63
63
|
|
|
@@ -68,7 +68,7 @@ describe Teaspoon::Formatters::JsonFormatter do
|
|
|
68
68
|
let(:result) { double(hash.merge(coverage: nil)) }
|
|
69
69
|
|
|
70
70
|
it "logs the original json" do
|
|
71
|
-
subject.
|
|
71
|
+
expect(subject).to receive(:log_str).with("_original_json_")
|
|
72
72
|
subject.result(result)
|
|
73
73
|
end
|
|
74
74
|
|
|
@@ -4,11 +4,11 @@ describe Teaspoon::Formatters::JunitFormatter do
|
|
|
4
4
|
|
|
5
5
|
let(:passing_spec) { double(passing?: true, suite: "_suite_name_", label: "_passing_label_") }
|
|
6
6
|
let(:pending_spec) { double(passing?: false, pending?: true, suite: "_suite_name_", label: "_pending_label_") }
|
|
7
|
-
let(:failing_spec) { double(passing?: false, pending?: false, suite: "
|
|
7
|
+
let(:failing_spec) { double(passing?: false, pending?: false, suite: "_suite&name_", label: "_failing&label_", message: "_failure_message_") }
|
|
8
8
|
|
|
9
9
|
before do
|
|
10
10
|
@log = ""
|
|
11
|
-
STDOUT.
|
|
11
|
+
allow(STDOUT).to receive(:print) { |s| @log << s }
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
describe "#runner" do
|
|
@@ -16,28 +16,28 @@ describe Teaspoon::Formatters::JunitFormatter do
|
|
|
16
16
|
let(:result) { double(start: "_start_", total: 42) }
|
|
17
17
|
|
|
18
18
|
before do
|
|
19
|
-
subject.instance_variable_set(:@suite_name, "not_default")
|
|
19
|
+
subject.instance_variable_set(:@suite_name, "not_default&")
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
it "starts the suite" do
|
|
23
23
|
subject.runner(result)
|
|
24
|
-
expect(@log).to eq(%Q{<?xml version="1.0" encoding="UTF-8"?>\n<testsuites name="Teaspoon">\n<testsuite name="not_default" tests="42" time="_start_">\n})
|
|
24
|
+
expect(@log).to eq(%Q{<?xml version="1.0" encoding="UTF-8"?>\n<testsuites name="Teaspoon">\n<testsuite name="not_default&" tests="42" time="_start_">\n})
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
describe "#suite" do
|
|
30
30
|
|
|
31
|
-
let(:result) { double(label: "
|
|
31
|
+
let(:result) { double(label: "_suite>label_") }
|
|
32
32
|
|
|
33
33
|
it "calls #log_end_suite" do
|
|
34
|
-
subject.
|
|
34
|
+
expect(subject).to receive(:log_end_suite)
|
|
35
35
|
subject.suite(result)
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
it "logs the start of the testsuite" do
|
|
39
39
|
subject.suite(result)
|
|
40
|
-
expect(@log).to eq(%Q{<testsuite name="
|
|
40
|
+
expect(@log).to eq(%Q{<testsuite name="_suite>label_">\n})
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
end
|
|
@@ -56,7 +56,7 @@ describe Teaspoon::Formatters::JunitFormatter do
|
|
|
56
56
|
|
|
57
57
|
it "logs a failing testcase with the message on failing results" do
|
|
58
58
|
subject.spec(failing_spec)
|
|
59
|
-
expect(@log).to include(%Q{<testcase classname="
|
|
59
|
+
expect(@log).to include(%Q{<testcase classname="_suite&name_" name="_failing&label_">\n})
|
|
60
60
|
expect(@log).to include(%Q{ <failure type="AssertionFailed">\n<![CDATA[\n_failure_message_\n]]>\n</failure>\n})
|
|
61
61
|
expect(@log).to include(%Q{</testcase>\n})
|
|
62
62
|
end
|
|
@@ -74,7 +74,7 @@ describe Teaspoon::Formatters::JunitFormatter do
|
|
|
74
74
|
let(:result) { double(coverage: nil) }
|
|
75
75
|
|
|
76
76
|
it "closes the last suite" do
|
|
77
|
-
subject.
|
|
77
|
+
expect(subject).to receive(:log_end_suite)
|
|
78
78
|
subject.result(result)
|
|
79
79
|
end
|
|
80
80
|
|
|
@@ -84,7 +84,7 @@ describe Teaspoon::Formatters::JunitFormatter do
|
|
|
84
84
|
|
|
85
85
|
it "logs the coverage" do
|
|
86
86
|
subject.coverage("_text_\n\n_text_summary_")
|
|
87
|
-
expect(@log).to eq(%Q{<testsuite name="Coverage summary" tests="0">\n<properties>\n<![CDATA[\n_text_\n_text_summary_\n]]>\n
|
|
87
|
+
expect(@log).to eq(%Q{<testsuite name="Coverage summary" tests="0">\n<properties>\n<![CDATA[\n_text_\n_text_summary_\n]]>\n</properties>\n</testsuite>\n})
|
|
88
88
|
end
|
|
89
89
|
|
|
90
90
|
end
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Teaspoon::Formatters::RspecHtmlFormatter do
|
|
4
|
+
|
|
5
|
+
let(:suite) { double(label: "_suite&_", level: @level || 0)}
|
|
6
|
+
let(:passing_spec) { double(passing?: true, failing?: false, elapsed: nil, status: "passed", label: "_passing&_") }
|
|
7
|
+
let(:pending_spec) { double(passing?: false, pending?: true, failing?: false, elapsed: nil, status: "pending", label: "_pending&_", description: "_description&_") }
|
|
8
|
+
let(:failing_spec) { double(passing?: false, pending?: false, failing?: true, elapsed: nil, status: "failed", label: "_failing&_", description: "_description&_", message: "_message&_", link: "_link&_", trace: "_trace&_") }
|
|
9
|
+
|
|
10
|
+
before do
|
|
11
|
+
@log = ""
|
|
12
|
+
allow(STDOUT).to receive(:print) { |s| @log << s }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe "#runner" do
|
|
16
|
+
|
|
17
|
+
let(:result) { double(start: "_start&_", total: 42) }
|
|
18
|
+
|
|
19
|
+
before do
|
|
20
|
+
subject.instance_variable_set(:@suite_name, "not_default&")
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "starts the HTML" do
|
|
24
|
+
subject.runner(result)
|
|
25
|
+
expect(@log).to eq(Teaspoon::Formatters::RspecHtmlFormatter::Templates::HEADER)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
describe "#suite" do
|
|
31
|
+
|
|
32
|
+
it "logs a suite header" do
|
|
33
|
+
subject.suite(suite)
|
|
34
|
+
expect(@log).to eq(Teaspoon::Formatters::RspecHtmlFormatter::Templates::SUITE_START.gsub("<%= h @o.label %>", "_suite&_"))
|
|
35
|
+
expect(subject.instance_variable_get(:@current_suite)).to eq(["_suite&_"])
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "finishes any ended suites" do
|
|
39
|
+
subject.instance_variable_get(:@current_suite) << "Suite 1" << "Suite 2" << "Suite 3" << "Suite 4"
|
|
40
|
+
@level = 2
|
|
41
|
+
subject.suite(suite)
|
|
42
|
+
expected_head = Teaspoon::Formatters::RspecHtmlFormatter::Templates::SUITE_END * 2
|
|
43
|
+
expected_tail = Teaspoon::Formatters::RspecHtmlFormatter::Templates::SUITE_START.gsub("<%= h @o.label %>", "_suite&_")
|
|
44
|
+
expect(@log).to eq(expected_head + expected_tail)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
describe "#spec" do
|
|
50
|
+
|
|
51
|
+
it "logs passing results" do
|
|
52
|
+
subject.spec(passing_spec)
|
|
53
|
+
expected_log = Teaspoon::Formatters::RspecHtmlFormatter::Templates::SPEC.gsub("<%= h @o.status %>", "passed")
|
|
54
|
+
expected_log.gsub!("<%= h @o.label %>", "_passing&_")
|
|
55
|
+
expected_log.gsub!("<%= h \"\#{@o.elapsed}s\" if @o.elapsed %>", "")
|
|
56
|
+
expected_log.gsub!(/\<% if @o.failing\? %\>.*?\<% end %\>/m, "")
|
|
57
|
+
expect(@log).to eq(expected_log)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it "logs pending results" do
|
|
61
|
+
subject.spec(pending_spec)
|
|
62
|
+
expected_log = Teaspoon::Formatters::RspecHtmlFormatter::Templates::SPEC.gsub("<%= h @o.status %>", "pending")
|
|
63
|
+
expected_log.gsub!("<%= h @o.label %>", "_pending&_")
|
|
64
|
+
expected_log.gsub!("<%= h \"\#{@o.elapsed}s\" if @o.elapsed %>", "")
|
|
65
|
+
expected_log.gsub!(/\<% if @o.failing\? %\>.*?\<% end %\>/m, "")
|
|
66
|
+
expect(@log).to eq(expected_log)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "logs failing results" do
|
|
70
|
+
subject.spec(failing_spec)
|
|
71
|
+
expected_log = Teaspoon::Formatters::RspecHtmlFormatter::Templates::SPEC.gsub("<%= h @o.status %>", "failed")
|
|
72
|
+
expected_log.gsub!("<%= h @o.label %>", "_failing&_")
|
|
73
|
+
expected_log.gsub!("<%= h \"\#{@o.elapsed}s\" if @o.elapsed %>", "")
|
|
74
|
+
expected_log.gsub!("<%= h @o.trace %>", "_trace&_")
|
|
75
|
+
expected_log.gsub!("<% if @o.failing? %>", "")
|
|
76
|
+
expected_log.gsub!("<% end %>", "")
|
|
77
|
+
expect(@log).to eq(expected_log)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
describe "#result" do
|
|
83
|
+
|
|
84
|
+
let(:result) { double(elapsed: 3.1337, coverage: nil) }
|
|
85
|
+
|
|
86
|
+
before do
|
|
87
|
+
subject.run_count = 666
|
|
88
|
+
subject.failures << failing_spec
|
|
89
|
+
subject.pendings << pending_spec
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it "ends the HTML" do
|
|
93
|
+
subject.result(result)
|
|
94
|
+
expect(@log).to eq(Teaspoon::Formatters::RspecHtmlFormatter::Templates::FOOTER.gsub("<%= h @o.elapsed %>", "3.1337"))
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "finishes any remaining suites" do
|
|
98
|
+
subject.instance_variable_get(:@current_suite) << "Suite 1" << "Suite 2"
|
|
99
|
+
subject.result(result)
|
|
100
|
+
expected_head = Teaspoon::Formatters::RspecHtmlFormatter::Templates::SUITE_END * 2
|
|
101
|
+
expected_tail = Teaspoon::Formatters::RspecHtmlFormatter::Templates::FOOTER.gsub("<%= h @o.elapsed %>", "3.1337")
|
|
102
|
+
expect(@log).to eq(expected_head + expected_tail)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
end
|
|
@@ -10,7 +10,7 @@ describe Teaspoon::Formatters::TeamcityFormatter do
|
|
|
10
10
|
|
|
11
11
|
before do
|
|
12
12
|
@log = ""
|
|
13
|
-
STDOUT.
|
|
13
|
+
allow(STDOUT).to receive(:print) { |s| @log << s }
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
describe "#runner" do
|
|
@@ -18,7 +18,7 @@ describe Teaspoon::Formatters::TeamcityFormatter do
|
|
|
18
18
|
let(:result) { double(total: 42, start: "_start_") }
|
|
19
19
|
|
|
20
20
|
it "starts the suite" do
|
|
21
|
-
Time.
|
|
21
|
+
expect(Time).to receive(:now).and_return(double(to_json: "_json_time_"))
|
|
22
22
|
subject.runner(result)
|
|
23
23
|
expect(@log).to include("##teamcity[enteredTheMatrix timestamp='_json_time_']\n")
|
|
24
24
|
expect(@log).to include("##teamcity[testCount count='42' timestamp='_start_']\n")
|
|
@@ -30,13 +30,13 @@ describe Teaspoon::Formatters::TeamcityFormatter do
|
|
|
30
30
|
|
|
31
31
|
it "logs the suite" do
|
|
32
32
|
subject.suite(suite)
|
|
33
|
-
expect(@log).to include(%
|
|
33
|
+
expect(@log).to include(%{##teamcity[testSuiteStarted name='_suite_']})
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
it "closes the last suite if there was one" do
|
|
37
37
|
subject.instance_variable_set(:@last_suite, suite)
|
|
38
38
|
subject.suite(suite)
|
|
39
|
-
expect(@log).to include(%
|
|
39
|
+
expect(@log).to include(%{##teamcity[testSuiteFinished name='_suite_']})
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
end
|
|
@@ -45,29 +45,29 @@ describe Teaspoon::Formatters::TeamcityFormatter do
|
|
|
45
45
|
|
|
46
46
|
it "logs a passing testcase on passing results" do
|
|
47
47
|
subject.spec(passing_spec)
|
|
48
|
-
expect(@log).to include(%
|
|
49
|
-
expect(@log).to include(%
|
|
48
|
+
expect(@log).to include(%{##teamcity[testStarted name='_passing_|[desc|]|rip|||'o|n_' captureStandardOutput='true']\n})
|
|
49
|
+
expect(@log).to include(%{##teamcity[testFinished name='_passing_|[desc|]|rip|||'o|n_']\n})
|
|
50
50
|
end
|
|
51
51
|
|
|
52
52
|
it "logs a skipped testcase on pending results" do
|
|
53
53
|
subject.spec(pending_spec)
|
|
54
|
-
expect(@log).to include(%
|
|
55
|
-
expect(@log).to include(%
|
|
54
|
+
expect(@log).to include(%{##teamcity[testIgnored name='_pending_|[desc|]_' captureStandardOutput='true']\n})
|
|
55
|
+
expect(@log).to include(%{##teamcity[testFinished name='_pending_|[desc|]_']\n})
|
|
56
56
|
end
|
|
57
57
|
|
|
58
58
|
it "logs a failing testcase with the message on failing results" do
|
|
59
59
|
subject.spec(failing_spec)
|
|
60
|
-
expect(@log).to include(%
|
|
61
|
-
expect(@log).to include(%
|
|
62
|
-
expect(@log).to include(%
|
|
60
|
+
expect(@log).to include(%{##teamcity[testStarted name='_failing_|[desc|]_' captureStandardOutput='true']\n})
|
|
61
|
+
expect(@log).to include(%{##teamcity[testFailed name='_failing_|[desc|]_' message='_failure_|[mess|]age_']\n})
|
|
62
|
+
expect(@log).to include(%{##teamcity[testFinished name='_failing_|[desc|]_']\n})
|
|
63
63
|
end
|
|
64
64
|
|
|
65
65
|
it "captures stdout and puts it in the right place" do
|
|
66
66
|
subject.instance_variable_set(:@stdout, "_stdout_\n")
|
|
67
67
|
subject.spec(pending_spec)
|
|
68
|
-
expect(@log).to include(%
|
|
69
|
-
expect(@log).to include(%
|
|
70
|
-
expect(@log).to include(%
|
|
68
|
+
expect(@log).to include(%{##teamcity[testIgnored name='_pending_|[desc|]_' captureStandardOutput='true']\n})
|
|
69
|
+
expect(@log).to include(%{_stdout_\n})
|
|
70
|
+
expect(@log).to include(%{##teamcity[testFinished name='_pending_|[desc|]_']\n})
|
|
71
71
|
end
|
|
72
72
|
|
|
73
73
|
end
|
|
@@ -78,7 +78,7 @@ describe Teaspoon::Formatters::TeamcityFormatter do
|
|
|
78
78
|
|
|
79
79
|
it "logs the error" do
|
|
80
80
|
subject.error(result)
|
|
81
|
-
expect(@log).to include(%
|
|
81
|
+
expect(@log).to include(%{##teamcity[message text='_error_message_' errorDetails='myfile.js:420|nmyfile.js:666' status='ERROR']\n})
|
|
82
82
|
end
|
|
83
83
|
|
|
84
84
|
end
|
|
@@ -88,7 +88,7 @@ describe Teaspoon::Formatters::TeamcityFormatter do
|
|
|
88
88
|
it "closes any open suites" do
|
|
89
89
|
subject.instance_variable_set(:@last_suite, double(label: "_last_suite_label_"))
|
|
90
90
|
subject.result(result)
|
|
91
|
-
expect(@log).to include(%
|
|
91
|
+
expect(@log).to include(%{##teamcity[testSuiteFinished name='_last_suite_label_']})
|
|
92
92
|
end
|
|
93
93
|
|
|
94
94
|
it "assigns @result" do
|
|
@@ -102,9 +102,9 @@ describe Teaspoon::Formatters::TeamcityFormatter do
|
|
|
102
102
|
|
|
103
103
|
it "logs the coverage" do
|
|
104
104
|
subject.coverage("_text_\n\n_text_summary_")
|
|
105
|
-
expect(@log).to include(%
|
|
106
|
-
expect(@log).to include(%
|
|
107
|
-
expect(@log).to include(%
|
|
105
|
+
expect(@log).to include(%{##teamcity[testSuiteStarted name='Coverage summary']\n})
|
|
106
|
+
expect(@log).to include(%{_text_\n\n_text_summary_\n})
|
|
107
|
+
expect(@log).to include(%{##teamcity[testSuiteFinished name='Coverage summary']\n})
|
|
108
108
|
end
|
|
109
109
|
|
|
110
110
|
end
|
|
@@ -113,12 +113,12 @@ describe Teaspoon::Formatters::TeamcityFormatter do
|
|
|
113
113
|
|
|
114
114
|
it "logs the threshold failures" do
|
|
115
115
|
subject.threshold_failure("_was_not_met_\n_was_not_met_")
|
|
116
|
-
expect(@log).to include(%
|
|
117
|
-
expect(@log).to include(%
|
|
118
|
-
expect(@log).to include(%
|
|
119
|
-
expect(@log).to include(%
|
|
120
|
-
expect(@log).to include(%
|
|
121
|
-
expect(@log).to include(%
|
|
116
|
+
expect(@log).to include(%{##teamcity[testSuiteStarted name='Coverage thresholds']\n})
|
|
117
|
+
expect(@log).to include(%{##teamcity[testStarted name='Coverage thresholds' captureStandardOutput='true']\n})
|
|
118
|
+
expect(@log).to include(%{##teamcity[testFailed name='Coverage thresholds' message='were not met']\n})
|
|
119
|
+
expect(@log).to include(%{_was_not_met_\n_was_not_met_\n})
|
|
120
|
+
expect(@log).to include(%{##teamcity[testFinished name='Coverage thresholds']\n})
|
|
121
|
+
expect(@log).to include(%{##teamcity[testSuiteFinished name='Coverage thresholds']\n})
|
|
122
122
|
end
|
|
123
123
|
|
|
124
124
|
end
|
|
@@ -139,8 +139,8 @@ describe Teaspoon::Formatters::TeamcityFormatter do
|
|
|
139
139
|
|
|
140
140
|
it "ends the suite" do
|
|
141
141
|
subject.complete(1)
|
|
142
|
-
expect(@log).to include(%
|
|
143
|
-
expect(@log).to include(%
|
|
142
|
+
expect(@log).to include(%{Finished in 3.1337 seconds\n})
|
|
143
|
+
expect(@log).to include(%{6 examples, 1 failure, 2 pending\n\n})
|
|
144
144
|
end
|
|
145
145
|
|
|
146
146
|
end
|
|
@@ -7,96 +7,102 @@ describe Teaspoon::Instrumentation do
|
|
|
7
7
|
|
|
8
8
|
subject { Teaspoon::Instrumentation }
|
|
9
9
|
|
|
10
|
-
let(:asset) { double(source: source, pathname:
|
|
10
|
+
let(:asset) { double(source: source, pathname: "path/to/instrument.js") }
|
|
11
11
|
let(:source) { "function add(a, b) { return a + b } // ☃ " }
|
|
12
|
-
let(:response) { [200, {"Content-Type" => "application/javascript"}, asset] }
|
|
13
|
-
let(:env) { {"QUERY_STRING" => "instrument=true"} }
|
|
12
|
+
let(:response) { [200, { "Content-Type" => "application/javascript" }, asset] }
|
|
13
|
+
let(:env) { { "QUERY_STRING" => "instrument=true" } }
|
|
14
14
|
|
|
15
15
|
describe ".add_to" do
|
|
16
16
|
|
|
17
17
|
before do
|
|
18
|
-
Teaspoon::Instrumentation.
|
|
18
|
+
allow(Teaspoon::Instrumentation).to receive(:executable).and_return("/path/to/istanbul")
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
before do
|
|
22
|
-
Teaspoon::Instrumentation.
|
|
23
|
-
asset.
|
|
22
|
+
allow(Teaspoon::Instrumentation).to receive(:add?).and_return(true)
|
|
23
|
+
expect(asset).to receive(:clone).and_return(asset)
|
|
24
24
|
|
|
25
|
-
File.
|
|
26
|
-
subject.
|
|
25
|
+
allow(File).to receive(:open)
|
|
26
|
+
allow_any_instance_of(subject).to receive(:instrument).and_return(source + " // instrumented")
|
|
27
27
|
|
|
28
28
|
path = nil
|
|
29
29
|
Dir.mktmpdir { |p| path = p }
|
|
30
|
-
Dir.
|
|
30
|
+
allow(Dir).to receive(:mktmpdir).and_yield(path)
|
|
31
31
|
@output = File.join(path, "instrument.js")
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
it "writes the file to a tmp path" do
|
|
35
|
-
file = double(
|
|
36
|
-
File.
|
|
37
|
-
file.
|
|
35
|
+
file = double("file")
|
|
36
|
+
expect(File).to receive(:open).with(@output, "w").and_yield(file)
|
|
37
|
+
expect(file).to receive(:write).with("function add(a, b) { return a + b } // ☃ ")
|
|
38
38
|
subject.add_to(response, env)
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
it "instruments the javascript file" do
|
|
42
|
-
subject.
|
|
42
|
+
expect_any_instance_of(subject).to receive(:instrument).with(@output).and_return("_instrumented_")
|
|
43
43
|
subject.add_to(response, env)
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
it "replaces the response array with the appropriate information" do
|
|
47
|
-
response = [666, {"Content-Type" => "application/javascript"}, asset]
|
|
48
|
-
expected = [666, {"Content-Type" => "application/javascript", "Content-Length" => "59"}, asset]
|
|
47
|
+
response = [666, { "Content-Type" => "application/javascript" }, asset]
|
|
48
|
+
expected = [666, { "Content-Type" => "application/javascript", "Content-Length" => "59" }, asset]
|
|
49
49
|
|
|
50
50
|
expect(subject.add_to(response, env)).to eq(expected)
|
|
51
51
|
end
|
|
52
52
|
|
|
53
|
+
it "raises an exception if istanbul fails" do
|
|
54
|
+
`(exit 1)`
|
|
55
|
+
allow(subject).to receive(:`)
|
|
56
|
+
allow_any_instance_of(subject).to receive(:instrument).and_call_original
|
|
57
|
+
expect { subject.add_to(response, env) }.to raise_error(
|
|
58
|
+
Teaspoon::DependencyFailure, "Could not generate instrumentation for instrument.js."
|
|
59
|
+
)
|
|
60
|
+
end
|
|
61
|
+
|
|
53
62
|
end
|
|
54
63
|
|
|
55
64
|
describe ".add?" do
|
|
56
65
|
|
|
57
66
|
before do
|
|
58
|
-
Teaspoon::Instrumentation.
|
|
67
|
+
allow(Teaspoon::Instrumentation).to receive(:executable).and_return("/path/to/istanbul")
|
|
59
68
|
end
|
|
60
69
|
|
|
61
70
|
it "returns true when everything is good" do
|
|
62
|
-
expect(subject.add?(response,
|
|
63
|
-
expect(subject.add?(response,
|
|
71
|
+
expect(subject.add?(response, "QUERY_STRING" => "instrument=true")).to be(true)
|
|
72
|
+
expect(subject.add?(response, "QUERY_STRING" => "instrument=1")).to be(true)
|
|
64
73
|
end
|
|
65
74
|
|
|
66
75
|
it "doesn't if the query param isn't set (or isn't something we care about)" do
|
|
67
76
|
expect(subject.add?(response, {})).to_not be(true)
|
|
68
|
-
expect(subject.add?(response,
|
|
77
|
+
expect(subject.add?(response, "QUERY_STRING" => "instrument=foo")).to_not be(true)
|
|
69
78
|
end
|
|
70
79
|
|
|
71
80
|
it "doesn't if response isn't 200" do
|
|
72
|
-
expect(subject.add?([404, {"Content-Type" => "application/javascript"}, asset], env)).to_not be(true)
|
|
81
|
+
expect(subject.add?([404, { "Content-Type" => "application/javascript" }, asset], env)).to_not be(true)
|
|
73
82
|
end
|
|
74
83
|
|
|
75
84
|
it "doesn't when the content type isn't application/javascript" do
|
|
76
|
-
expect(subject.add?([200, {"Content-Type" => "foo/bar"}, asset], env)).to_not be(true)
|
|
85
|
+
expect(subject.add?([200, { "Content-Type" => "foo/bar" }, asset], env)).to_not be(true)
|
|
77
86
|
end
|
|
78
87
|
|
|
79
88
|
it "doesn't if there's no executable" do
|
|
80
|
-
subject.
|
|
89
|
+
expect(subject).to receive(:executable).and_return(false)
|
|
81
90
|
expect(subject.add?(response, env)).to_not be(true)
|
|
82
91
|
end
|
|
83
92
|
|
|
84
93
|
it "doesn't if there's no asset" do
|
|
85
|
-
expect(subject.add?([404, {"Content-Type" => "application/javascript"}, []], env)).to_not be(true)
|
|
94
|
+
expect(subject.add?([404, { "Content-Type" => "application/javascript" }, []], env)).to_not be(true)
|
|
86
95
|
end
|
|
87
96
|
|
|
88
97
|
end
|
|
89
98
|
|
|
90
99
|
describe "integration" do
|
|
91
100
|
|
|
92
|
-
let(:asset) { Rails.application.assets.find_asset(
|
|
93
|
-
|
|
94
|
-
before do
|
|
95
|
-
pending("needs istanbul to be installed") unless Teaspoon::Instrumentation.executable
|
|
96
|
-
end
|
|
101
|
+
let(:asset) { Rails.application.assets.find_asset("instrumented1.coffee") }
|
|
97
102
|
|
|
98
103
|
it "instruments a file" do
|
|
99
|
-
|
|
104
|
+
pending("needs istanbul to be installed") unless Teaspoon::Instrumentation.executable
|
|
105
|
+
status, headers, asset = subject.add_to(response, "QUERY_STRING" => "instrument=true")
|
|
100
106
|
expect(status).to eq(200)
|
|
101
107
|
expect(headers).to include("Content-Type" => "application/javascript")
|
|
102
108
|
expect(asset.source).to match(/var __cov_.+ = \(Function\('return this'\)\)\(\);/)
|