teaspoon 0.9.1 → 1.0.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.
Files changed (214) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +141 -0
  3. data/README.md +9 -19
  4. data/{vendor → app}/assets/javascripts/support/bind-poly.js +0 -0
  5. data/{vendor → app}/assets/javascripts/support/sinon.js +0 -0
  6. data/app/assets/javascripts/teaspoon-filterer.js +55 -0
  7. data/app/assets/javascripts/teaspoon/error.coffee +5 -0
  8. data/app/assets/javascripts/teaspoon/{base/fixture.coffee → fixture.coffee} +15 -15
  9. data/app/assets/javascripts/teaspoon/{base/hook.coffee → hook.coffee} +0 -0
  10. data/app/assets/javascripts/teaspoon/{base/reporters → reporters}/console.coffee +18 -10
  11. data/app/assets/javascripts/teaspoon/{base/reporters → reporters}/html.coffee +43 -40
  12. data/app/assets/javascripts/teaspoon/{base/reporters → reporters}/html/base_view.coffee +0 -0
  13. data/app/assets/javascripts/teaspoon/{base/reporters → reporters}/html/failure_view.coffee +2 -0
  14. data/app/assets/javascripts/teaspoon/reporters/html/progress_view.coffee +18 -0
  15. data/app/assets/javascripts/teaspoon/{base/reporters/html/progress_view.coffee → reporters/html/radial_progress_view.coffee} +1 -34
  16. data/app/assets/javascripts/teaspoon/reporters/html/simple_progress_view.coffee +15 -0
  17. data/app/assets/javascripts/teaspoon/{base/reporters → reporters}/html/spec_view.coffee +5 -3
  18. data/app/assets/javascripts/teaspoon/{base/reporters → reporters}/html/suite_view.coffee +4 -2
  19. data/app/assets/javascripts/teaspoon/{base/reporters → reporters}/html/template.coffee +0 -0
  20. data/app/assets/javascripts/teaspoon/{base/runner.coffee → runner.coffee} +7 -3
  21. data/app/assets/javascripts/teaspoon/teaspoon.coffee +90 -32
  22. data/app/controllers/teaspoon/suite_controller.rb +5 -0
  23. data/app/views/teaspoon/suite/index.html.erb +1 -1
  24. data/lib/generators/teaspoon/install/install_generator.rb +67 -37
  25. data/lib/generators/teaspoon/install/templates/MISSING_FRAMEWORK +14 -0
  26. data/lib/generators/teaspoon/install/{POST_INSTALL → templates/POST_INSTALL} +0 -0
  27. data/lib/generators/teaspoon/install/templates/env.rb.tt +14 -0
  28. data/lib/generators/teaspoon/install/templates/{jasmine/env_comments.rb.tt → env_comments.rb.tt} +34 -43
  29. data/lib/tasks/teaspoon/info.rake +17 -0
  30. data/lib/teaspoon-devkit.rb +61 -0
  31. data/lib/teaspoon.rb +2 -0
  32. data/lib/teaspoon/command_line.rb +19 -14
  33. data/lib/teaspoon/configuration.rb +24 -35
  34. data/lib/teaspoon/console.rb +11 -21
  35. data/lib/teaspoon/coverage.rb +14 -7
  36. data/lib/teaspoon/deprecated.rb +22 -4
  37. data/lib/teaspoon/driver.rb +15 -0
  38. data/lib/teaspoon/driver/base.rb +7 -0
  39. data/lib/teaspoon/{drivers/capybara_webkit_driver.rb → driver/capybara_webkit.rb} +8 -5
  40. data/lib/teaspoon/{drivers/phantomjs_driver.rb → driver/phantomjs.rb} +8 -4
  41. data/lib/teaspoon/{drivers → driver}/phantomjs/runner.js +0 -0
  42. data/lib/teaspoon/{drivers/selenium_driver.rb → driver/selenium.rb} +11 -9
  43. data/lib/teaspoon/engine.rb +38 -25
  44. data/lib/teaspoon/environment.rb +24 -15
  45. data/lib/teaspoon/exceptions.rb +154 -41
  46. data/lib/teaspoon/exporter.rb +2 -2
  47. data/lib/teaspoon/formatter.rb +30 -0
  48. data/lib/teaspoon/{formatters → formatter}/base.rb +2 -36
  49. data/lib/teaspoon/{formatters/clean_formatter.rb → formatter/clean.rb} +4 -2
  50. data/lib/teaspoon/{formatters/documentation_formatter.rb → formatter/documentation.rb} +4 -3
  51. data/lib/teaspoon/{formatters/dot_formatter.rb → formatter/dot.rb} +4 -3
  52. data/lib/teaspoon/{formatters/json_formatter.rb → formatter/json.rb} +4 -2
  53. data/lib/teaspoon/{formatters/junit_formatter.rb → formatter/junit.rb} +3 -2
  54. data/lib/teaspoon/{formatters → formatter}/modules/report_module.rb +1 -1
  55. data/lib/teaspoon/{formatters/pride_formatter.rb → formatter/pride.rb} +4 -2
  56. data/lib/teaspoon/{formatters/rspec_html_formatter.rb → formatter/rspec_html.rb} +3 -2
  57. data/lib/teaspoon/{formatters/snowday_formatter.rb → formatter/snowday.rb} +3 -2
  58. data/lib/teaspoon/formatter/swayze_or_oprah.rb +111 -0
  59. data/lib/teaspoon/{formatters/tap_formatter.rb → formatter/tap.rb} +4 -2
  60. data/lib/teaspoon/{formatters/tap_y_formatter.rb → formatter/tap_y.rb} +3 -2
  61. data/lib/teaspoon/{formatters/teamcity_formatter.rb → formatter/teamcity.rb} +4 -2
  62. data/lib/teaspoon/framework.rb +17 -0
  63. data/lib/teaspoon/framework/base.rb +88 -0
  64. data/lib/teaspoon/instrumentation.rb +12 -2
  65. data/lib/teaspoon/registry.rb +47 -0
  66. data/lib/teaspoon/registry/has_default.rb +11 -0
  67. data/lib/teaspoon/runner.rb +6 -7
  68. data/lib/teaspoon/server.rb +2 -2
  69. data/lib/teaspoon/suite.rb +28 -30
  70. data/lib/teaspoon/utility.rb +5 -0
  71. data/lib/teaspoon/version.rb +1 -1
  72. metadata +52 -276
  73. data/app/assets/javascripts/teaspoon-jasmine.js +0 -1344
  74. data/app/assets/javascripts/teaspoon-mocha.js +0 -1350
  75. data/app/assets/javascripts/teaspoon-qunit.js +0 -1415
  76. data/app/assets/javascripts/teaspoon-teaspoon.js +0 -51
  77. data/app/assets/javascripts/teaspoon/base/teaspoon.coffee +0 -69
  78. data/app/assets/javascripts/teaspoon/jasmine.coffee +0 -119
  79. data/app/assets/javascripts/teaspoon/jasmine/reporters/html.coffee +0 -11
  80. data/app/assets/javascripts/teaspoon/mocha.coffee +0 -90
  81. data/app/assets/javascripts/teaspoon/mocha/reporters/console.coffee +0 -16
  82. data/app/assets/javascripts/teaspoon/mocha/reporters/html.coffee +0 -27
  83. data/app/assets/javascripts/teaspoon/qunit.coffee +0 -81
  84. data/app/assets/javascripts/teaspoon/qunit/reporters/console.coffee +0 -25
  85. data/app/assets/javascripts/teaspoon/qunit/reporters/html.coffee +0 -80
  86. data/lib/generators/teaspoon/install/templates/jasmine/env.rb +0 -11
  87. data/lib/generators/teaspoon/install/templates/jasmine/spec_helper.coffee +0 -31
  88. data/lib/generators/teaspoon/install/templates/jasmine/spec_helper.js +0 -31
  89. data/lib/generators/teaspoon/install/templates/mocha/env.rb +0 -11
  90. data/lib/generators/teaspoon/install/templates/mocha/env_comments.rb.tt +0 -187
  91. data/lib/generators/teaspoon/install/templates/mocha/spec_helper.coffee +0 -40
  92. data/lib/generators/teaspoon/install/templates/mocha/spec_helper.js +0 -40
  93. data/lib/generators/teaspoon/install/templates/qunit/env.rb +0 -11
  94. data/lib/generators/teaspoon/install/templates/qunit/env_comments.rb.tt +0 -187
  95. data/lib/generators/teaspoon/install/templates/qunit/test_helper.coffee +0 -29
  96. data/lib/generators/teaspoon/install/templates/qunit/test_helper.js +0 -30
  97. data/lib/teaspoon/drivers/base.rb +0 -10
  98. data/lib/teaspoon/formatters/description.rb +0 -36
  99. data/lib/teaspoon/formatters/swayze_or_oprah_formatter.rb +0 -101
  100. data/spec/dummy/Rakefile +0 -7
  101. data/spec/dummy/app/assets/javascripts/instrumented1.coffee +0 -1
  102. data/spec/dummy/app/assets/javascripts/instrumented2.coffee +0 -1
  103. data/spec/dummy/app/assets/javascripts/integration/integration.coffee +0 -1
  104. data/spec/dummy/app/assets/javascripts/integration/integration_spec.coffee +0 -32
  105. data/spec/dummy/app/assets/javascripts/integration/spec_helper.coffee +0 -7
  106. data/spec/dummy/app/assets/javascripts/specs/asset_spec.js +0 -11
  107. data/spec/dummy/config.ru +0 -15
  108. data/spec/dummy/config/application.rb +0 -29
  109. data/spec/dummy/config/boot.rb +0 -3
  110. data/spec/dummy/config/environment.rb +0 -5
  111. data/spec/dummy/config/environments/development.rb +0 -41
  112. data/spec/dummy/config/environments/production.rb +0 -79
  113. data/spec/dummy/config/environments/test.rb +0 -42
  114. data/spec/dummy/config/routes.rb +0 -2
  115. data/spec/dummy/config/secrets.yml +0 -22
  116. data/spec/dummy/log/.gitkeep +0 -0
  117. data/spec/dummy/public/favicon.ico +0 -0
  118. data/spec/dummy/script/rails +0 -6
  119. data/spec/features/console_reporter_spec.rb +0 -62
  120. data/spec/features/hooks_spec.rb +0 -60
  121. data/spec/features/html_reporter_spec.rb +0 -81
  122. data/spec/features/install_generator_spec.rb +0 -54
  123. data/spec/features/instrumentation_spec.rb +0 -21
  124. data/spec/fixtures/coverage.json +0 -243
  125. data/spec/javascripts/fixtures/_body.html.erb +0 -1
  126. data/spec/javascripts/fixtures/fixture.html.haml +0 -4
  127. data/spec/javascripts/fixtures/fixture.json +0 -4
  128. data/spec/javascripts/jasmine_helper.coffee +0 -3
  129. data/spec/javascripts/mocha_helper.coffee +0 -4
  130. data/spec/javascripts/spec_helper.coffee +0 -7
  131. data/spec/javascripts/stylesheets/stylesheet.css.scss +0 -0
  132. data/spec/javascripts/support/json2.js +0 -486
  133. data/spec/javascripts/support/support.js.coffee +0 -0
  134. data/spec/javascripts/teaspoon/base/fixture_spec.coffee +0 -93
  135. data/spec/javascripts/teaspoon/base/reporters/console_spec.coffee +0 -162
  136. data/spec/javascripts/teaspoon/base/reporters/html/base_view_spec.coffee +0 -88
  137. data/spec/javascripts/teaspoon/base/reporters/html/failure_view_spec.coffee +0 -28
  138. data/spec/javascripts/teaspoon/base/reporters/html/progress_view_spec.coffee +0 -1
  139. data/spec/javascripts/teaspoon/base/reporters/html/spec_view_spec.coffee +0 -1
  140. data/spec/javascripts/teaspoon/base/reporters/html/suite_view_spec.coffee +0 -1
  141. data/spec/javascripts/teaspoon/base/reporters/html_spec.coffee +0 -372
  142. data/spec/javascripts/teaspoon/base/runner_spec.coffee +0 -58
  143. data/spec/javascripts/teaspoon/base/teaspoon_spec.coffee +0 -47
  144. data/spec/javascripts/teaspoon/jasmine/fixture_jspec.coffee +0 -13
  145. data/spec/javascripts/teaspoon/jasmine/models_jspec.coffee +0 -101
  146. data/spec/javascripts/teaspoon/jasmine/reporters/html_jspec.coffee +0 -17
  147. data/spec/javascripts/teaspoon/jasmine/runner_jspec.coffee +0 -59
  148. data/spec/javascripts/teaspoon/jasmine/spec_jspec.coffee +0 -3
  149. data/spec/javascripts/teaspoon/mocha/fixture_mspec.coffee +0 -12
  150. data/spec/javascripts/teaspoon/mocha/models_mspec.coffee +0 -93
  151. data/spec/javascripts/teaspoon/mocha/reporters/console_mspec.coffee +0 -24
  152. data/spec/javascripts/teaspoon/mocha/reporters/html_mspec.coffee +0 -41
  153. data/spec/javascripts/teaspoon/mocha/runner_mspec.coffee +0 -23
  154. data/spec/javascripts/teaspoon/mocha/spec_mspec.coffee +0 -9
  155. data/spec/javascripts/teaspoon/other/erb_spec.js.coffee.erb +0 -4
  156. data/spec/javascripts/teaspoon/phantomjs/runner_spec.coffee +0 -161
  157. data/spec/javascripts/turbolinks_helper.coffee +0 -2
  158. data/spec/spec_helper.rb +0 -25
  159. data/spec/support/aruba.rb +0 -15
  160. data/spec/teaspoon/command_line_spec.rb +0 -157
  161. data/spec/teaspoon/configuration_spec.rb +0 -236
  162. data/spec/teaspoon/console_spec.rb +0 -224
  163. data/spec/teaspoon/coverage_spec.rb +0 -118
  164. data/spec/teaspoon/drivers/base_spec.rb +0 -5
  165. data/spec/teaspoon/drivers/capybara_webkit_driver_spec.rb +0 -39
  166. data/spec/teaspoon/drivers/phantomjs_driver_spec.rb +0 -66
  167. data/spec/teaspoon/drivers/selenium_driver_spec.rb +0 -68
  168. data/spec/teaspoon/engine_spec.rb +0 -22
  169. data/spec/teaspoon/environment_spec.rb +0 -109
  170. data/spec/teaspoon/exceptions_spec.rb +0 -57
  171. data/spec/teaspoon/exporter_spec.rb +0 -96
  172. data/spec/teaspoon/formatters/base_spec.rb +0 -259
  173. data/spec/teaspoon/formatters/clean_formatter_spec.rb +0 -37
  174. data/spec/teaspoon/formatters/documentation_formatter_spec.rb +0 -127
  175. data/spec/teaspoon/formatters/dot_formatter_spec.rb +0 -116
  176. data/spec/teaspoon/formatters/json_formatter_spec.rb +0 -77
  177. data/spec/teaspoon/formatters/junit_formatter_spec.rb +0 -114
  178. data/spec/teaspoon/formatters/pride_formatter_spec.rb +0 -37
  179. data/spec/teaspoon/formatters/rspec_html_formatter_spec.rb +0 -107
  180. data/spec/teaspoon/formatters/snowday_formatter_spec.rb +0 -35
  181. data/spec/teaspoon/formatters/tap_formatter_spec.rb +0 -72
  182. data/spec/teaspoon/formatters/tap_y_formatter_spec.rb +0 -80
  183. data/spec/teaspoon/formatters/teamcity_formatter_spec.rb +0 -148
  184. data/spec/teaspoon/instrumentation_spec.rb +0 -113
  185. data/spec/teaspoon/result_spec.rb +0 -98
  186. data/spec/teaspoon/runner_spec.rb +0 -116
  187. data/spec/teaspoon/server_spec.rb +0 -105
  188. data/spec/teaspoon/suite_spec.rb +0 -138
  189. data/spec/teaspoon_env.rb +0 -39
  190. data/test/javascripts/qunit_helper.coffee +0 -3
  191. data/test/javascripts/teaspoon/qunit/fixture_test.coffee +0 -10
  192. data/test/javascripts/teaspoon/qunit/models_test.coffee +0 -66
  193. data/test/javascripts/teaspoon/qunit/reporters/console_test.coffee +0 -3
  194. data/test/javascripts/teaspoon/qunit/reporters/html/failure_view_test.coffee +0 -3
  195. data/test/javascripts/teaspoon/qunit/reporters/html/spec_view_test.coffee +0 -3
  196. data/test/javascripts/teaspoon/qunit/reporters/html/suite_view_test.coffee +0 -3
  197. data/test/javascripts/teaspoon/qunit/reporters/html_test.coffee +0 -3
  198. data/test/javascripts/teaspoon/qunit/runner_test.coffee +0 -18
  199. data/vendor/assets/javascripts/jasmine/1.3.1.js +0 -2602
  200. data/vendor/assets/javascripts/jasmine/2.0.0.js +0 -2412
  201. data/vendor/assets/javascripts/jasmine/MIT.LICENSE +0 -20
  202. data/vendor/assets/javascripts/mocha/1.10.0.js +0 -5374
  203. data/vendor/assets/javascripts/mocha/1.17.1.js +0 -5813
  204. data/vendor/assets/javascripts/mocha/MIT.LICENSE +0 -22
  205. data/vendor/assets/javascripts/qunit/1.12.0.js +0 -2212
  206. data/vendor/assets/javascripts/qunit/1.14.0.js +0 -2288
  207. data/vendor/assets/javascripts/qunit/MIT.LICENSE +0 -21
  208. data/vendor/assets/javascripts/support/chai-1.10.0.js +0 -4800
  209. data/vendor/assets/javascripts/support/chai-jq-0.0.7.js +0 -524
  210. data/vendor/assets/javascripts/support/chai.js +0 -4782
  211. data/vendor/assets/javascripts/support/expect.js +0 -1284
  212. data/vendor/assets/javascripts/support/jasmine-jquery-1.7.0.js +0 -720
  213. data/vendor/assets/javascripts/support/jasmine-jquery-2.0.0.js +0 -812
  214. data/vendor/assets/javascripts/support/sinon-chai.js +0 -126
@@ -1,113 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require "spec_helper"
4
- require "rack/test"
5
-
6
- describe Teaspoon::Instrumentation do
7
-
8
- subject { Teaspoon::Instrumentation }
9
-
10
- let(:asset) { double(source: source, pathname: "path/to/instrument.js") }
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" } }
14
-
15
- describe ".add_to" do
16
-
17
- before do
18
- allow(Teaspoon::Instrumentation).to receive(:executable).and_return("/path/to/istanbul")
19
- end
20
-
21
- before do
22
- allow(Teaspoon::Instrumentation).to receive(:add?).and_return(true)
23
- expect(asset).to receive(:clone).and_return(asset)
24
-
25
- allow(File).to receive(:open)
26
- allow_any_instance_of(subject).to receive(:instrument).and_return(source + " // instrumented")
27
-
28
- path = nil
29
- Dir.mktmpdir { |p| path = p }
30
- allow(Dir).to receive(:mktmpdir).and_yield(path)
31
- @output = File.join(path, "instrument.js")
32
- end
33
-
34
- it "writes the file to a tmp path" do
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
- subject.add_to(response, env)
39
- end
40
-
41
- it "instruments the javascript file" do
42
- expect_any_instance_of(subject).to receive(:instrument).with(@output).and_return("_instrumented_")
43
- subject.add_to(response, env)
44
- end
45
-
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]
49
-
50
- expect(subject.add_to(response, env)).to eq(expected)
51
- end
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
-
62
- end
63
-
64
- describe ".add?" do
65
-
66
- before do
67
- allow(Teaspoon::Instrumentation).to receive(:executable).and_return("/path/to/istanbul")
68
- end
69
-
70
- it "returns true when everything is good" do
71
- expect(subject.add?(response, "QUERY_STRING" => "instrument=true")).to be(true)
72
- expect(subject.add?(response, "QUERY_STRING" => "instrument=1")).to be(true)
73
- end
74
-
75
- it "doesn't if the query param isn't set (or isn't something we care about)" do
76
- expect(subject.add?(response, {})).to_not be(true)
77
- expect(subject.add?(response, "QUERY_STRING" => "instrument=foo")).to_not be(true)
78
- end
79
-
80
- it "doesn't if response isn't 200" do
81
- expect(subject.add?([404, { "Content-Type" => "application/javascript" }, asset], env)).to_not be(true)
82
- end
83
-
84
- it "doesn't when the content type isn't application/javascript" do
85
- expect(subject.add?([200, { "Content-Type" => "foo/bar" }, asset], env)).to_not be(true)
86
- end
87
-
88
- it "doesn't if there's no executable" do
89
- expect(subject).to receive(:executable).and_return(false)
90
- expect(subject.add?(response, env)).to_not be(true)
91
- end
92
-
93
- it "doesn't if there's no asset" do
94
- expect(subject.add?([404, { "Content-Type" => "application/javascript" }, []], env)).to_not be(true)
95
- end
96
-
97
- end
98
-
99
- describe "integration" do
100
-
101
- let(:asset) { Rails.application.assets.find_asset("instrumented1.coffee") }
102
-
103
- it "instruments a file" do
104
- pending("needs istanbul to be installed") unless Teaspoon::Instrumentation.executable
105
- status, headers, asset = subject.add_to(response, "QUERY_STRING" => "instrument=true")
106
- expect(status).to eq(200)
107
- expect(headers).to include("Content-Type" => "application/javascript")
108
- expect(asset.source).to match(/var __cov_.+ = \(Function\('return this'\)\)\(\);/)
109
- end
110
-
111
- end
112
-
113
- end
@@ -1,98 +0,0 @@
1
- require "spec_helper"
2
- require "teaspoon/result"
3
-
4
- describe Teaspoon::Result do
5
-
6
- subject { Teaspoon::Result.build_from_json(json) }
7
- let(:suite_name) { "My Suite" }
8
- let(:json) do
9
- {
10
- "type" => "spec",
11
- "suite" => "_suite_name_",
12
- "label" => "_spec_name_",
13
- "status" => "failed",
14
- "skipped" => false,
15
- "link" => "?grep=_spec_description_",
16
- "message" => "_message_",
17
- "trace" => "_trace_",
18
- "coverage" => "_coverage_",
19
- }
20
- end
21
-
22
- describe ".build_from_json" do
23
-
24
- describe "with a results object" do
25
-
26
- let(:json) do
27
- {
28
- "elapsed" => 0.01,
29
- "failures" => 10,
30
- "pending" => 1,
31
- "total" => 25
32
- }
33
- end
34
-
35
- it "assigns from the JSON hash" do
36
- expect(subject.elapsed).to eq(0.01)
37
- expect(subject.total).to eq(25)
38
- end
39
-
40
- end
41
-
42
- describe "with a spec" do
43
-
44
- it "assigns from the JSON hash" do
45
- expect(subject.type).to eq("spec")
46
- expect(subject.suite).to eq("_suite_name_")
47
- expect(subject.label).to eq("_spec_name_")
48
- expect(subject.description).to eq("_suite_name_ _spec_name_")
49
- expect(subject.status).to eq("failed")
50
- expect(subject.skipped).to be_falsey
51
- expect(subject.link).to eq("?grep=_spec_description_")
52
- expect(subject.message).to eq("_message_")
53
- expect(subject.trace).to eq("_trace_")
54
- expect(subject.coverage).to eq("_coverage_")
55
- end
56
-
57
- end
58
-
59
- end
60
-
61
- describe "#failing?" do
62
-
63
- it "returns a boolean based on status" do
64
- subject.status = "foo"
65
- expect(subject.failing?).to be_truthy
66
- subject.status = "bar"
67
- expect(subject.failing?).to be_truthy
68
- subject.status = "passed"
69
- expect(subject.failing?).to be_falsey
70
- subject.status = "pending"
71
- expect(subject.failing?).to be_falsey
72
- end
73
-
74
- end
75
-
76
- describe "#passing?" do
77
-
78
- it "returns a boolean based on status" do
79
- subject.status = "passed"
80
- expect(subject.passing?).to be_truthy
81
- subject.status = "foo"
82
- expect(subject.passing?).to be_falsey
83
- end
84
-
85
- end
86
-
87
- describe "#pending?" do
88
-
89
- it "returns a boolean based on status" do
90
- subject.status = "pending"
91
- expect(subject.pending?).to be_truthy
92
- subject.status = "foo"
93
- expect(subject.pending?).to be_falsey
94
- end
95
-
96
- end
97
-
98
- end
@@ -1,116 +0,0 @@
1
- require "spec_helper"
2
- require "teaspoon/runner"
3
- require "teaspoon/exceptions"
4
- require "teaspoon/coverage"
5
-
6
- describe Teaspoon::Runner do
7
-
8
- before do
9
- allow(Teaspoon.configuration).to receive(:formatters).and_return([])
10
- end
11
-
12
- describe "#initialize" do
13
-
14
- it "sets @suite_name and @failure_count" do
15
- subject = Teaspoon::Runner.new(:foo)
16
- expect(subject.instance_variable_get(:@suite_name)).to eq(:foo)
17
- expect(subject.failure_count).to eq(0)
18
- end
19
-
20
- it "instantiates formatters based on configuration" do
21
- allow(Teaspoon.configuration).to receive(:formatters).and_return(["dot", "xml"])
22
- Teaspoon::Formatters::XmlFormatter = Class.new do
23
- def initialize(_suite_name = :default, _output_file = nil) end
24
- end
25
- expect(subject.instance_variable_get(:@formatters)[0]).to be_a(Teaspoon::Formatters::DotFormatter)
26
- expect(subject.instance_variable_get(:@formatters)[1]).to be_a(Teaspoon::Formatters::XmlFormatter)
27
- end
28
-
29
- it "raises a Teaspoon::UnknownFormatter exception when a formatter isn't found" do
30
- allow(Teaspoon.configuration).to receive(:formatters).and_return(["bar"])
31
- expect { Teaspoon::Runner.new(:foo) }.to raise_error Teaspoon::UnknownFormatter, "Unknown formatter: \"bar\""
32
- end
33
-
34
- end
35
-
36
- describe "#process" do
37
-
38
- let(:formatter) { double }
39
- let(:coverage) { double(generate_reports: nil, check_thresholds: nil) }
40
-
41
- before do
42
- subject.instance_variable_set(:@formatters, [formatter])
43
- end
44
-
45
- it "notifies formatters when it understands the log" do
46
- expect(formatter).to receive(:foo)
47
- expect(formatter).to_not receive(:bar)
48
- subject.process('{"_teaspoon":true,"type":"foo"}')
49
- subject.process('{"_teaspoon":false,"type":"bar"}')
50
- end
51
-
52
- it "notifies formatters of console output when it doesn't understand the log" do
53
- expect(formatter).to receive(:console).with("_line_")
54
- expect(subject).to receive(:result_from_line).and_return(false)
55
- subject.process("_line_")
56
- end
57
-
58
- it "handles bad json" do
59
- expect(formatter).to receive(:console).with("{bad: true}")
60
- subject.process("{bad: true}")
61
- end
62
-
63
- it "handles json when it's not intended for it" do
64
- expect(formatter).to receive(:console).with('{"good": true}')
65
- subject.process('{"good": true}')
66
- end
67
-
68
- it "keeps a count of errors" do
69
- subject.process('{"_teaspoon":true,"type":"spec"}')
70
- subject.process('{"_teaspoon":true,"type":"spec", "status": "passed"}')
71
- subject.process('{"_teaspoon":true,"type":"spec", "status": "pending"}')
72
- subject.process('{"_teaspoon":true,"type":"error"}')
73
- subject.process('{"_teaspoon":true,"type":"results"}')
74
- expect(subject.failure_count).to be(1)
75
- end
76
-
77
- describe "with an exception" do
78
-
79
- it "notifies itself, and raises Teaspoon::RunnerException" do
80
- expect(subject).to receive(:on_exception).and_call_original
81
- expect { subject.process('{"_teaspoon":true,"type":"exception","message":"_message_"}') }.to raise_error(
82
- Teaspoon::RunnerException,
83
- "_message_"
84
- )
85
- end
86
-
87
- end
88
-
89
- describe "with a result" do
90
-
91
- before do
92
- allow(Teaspoon::Coverage).to receive(:new).and_return(coverage)
93
- end
94
-
95
- it "notifies itself" do
96
- expect(subject).to receive(:on_result)
97
- subject.process('{"_teaspoon":true,"type":"result"}')
98
- end
99
-
100
- it "resolves coverage" do
101
- expect(Teaspoon.configuration).to receive(:use_coverage).twice.and_return("_config_")
102
- expect(Teaspoon::Coverage).to receive(:new).with(:default, "_config_", "_coverage_").and_return(coverage)
103
- expect(coverage).to receive(:generate_reports).and_yield("_generated_reports_")
104
- expect(coverage).to receive(:check_thresholds).and_yield("_threshold_failures_")
105
- expect(subject).to receive(:notify_formatters).once.with("coverage", "_generated_reports_")
106
- expect(subject).to receive(:notify_formatters).once.with("threshold_failure", "_threshold_failures_")
107
- expect(subject).to receive(:notify_formatters).exactly(2).times.and_call_original
108
- subject.process('{"_teaspoon":true,"type":"result","coverage":"_coverage_"}')
109
- expect(subject.failure_count).to eq(1)
110
- end
111
-
112
- end
113
-
114
- end
115
-
116
- end
@@ -1,105 +0,0 @@
1
- require "spec_helper"
2
- require "teaspoon/server"
3
- require "net/http"
4
-
5
- describe Teaspoon::Server do
6
-
7
- subject { Teaspoon::Server.new }
8
-
9
- describe "#start" do
10
-
11
- let(:server) { double(start: nil) }
12
-
13
- before do
14
- allow(Thread).to receive(:new) { |&b| @block = b; "_thread_" }
15
- allow(subject).to receive(:wait_until_started).and_return(nil)
16
- end
17
-
18
- it "spawns a thread" do
19
- expect(Thread).to receive(:new)
20
- subject.start
21
- end
22
-
23
- it "starts a rack server" do
24
- expect(Rack::Server).to receive(:new).and_return(server)
25
- expect(server).to receive(:start)
26
-
27
- subject.start
28
- @block.call
29
- end
30
-
31
- it "waits until the server is started" do
32
- expect(Thread).to receive(:new)
33
- expect(subject).to receive(:wait_until_started).with("_thread_")
34
- subject.start
35
- end
36
-
37
- it "rescues errors" do
38
- expect(Thread).to receive(:new).and_raise("OMG!")
39
- expect { subject.start }.to raise_error("Cannot start server: OMG!")
40
- end
41
-
42
- it "creates a Rack::Server with the correct setting" do
43
- expected_opts = {
44
- app: Rails.application,
45
- Port: subject.port,
46
- environment: "test",
47
- AccessLog: [],
48
- Logger: Rails.logger,
49
- server: Teaspoon.configuration.server
50
- }
51
- expect(Rack::Server).to receive(:new).with(expected_opts).and_return(server)
52
-
53
- subject.start
54
- @block.call
55
- end
56
-
57
- it "raises a ServerException if the timeout fails" do
58
- expect(subject).to receive(:wait_until_started).and_call_original
59
- expect(Timeout).to receive(:timeout).with(Teaspoon.configuration.server_timeout.to_i).and_raise(Timeout::Error)
60
- expect { subject.start }.to raise_error(
61
- Teaspoon::ServerException,
62
- "Server failed to start. You may need to increase the timeout configuration."
63
- )
64
- end
65
-
66
- end
67
-
68
- describe "#responsive?" do
69
-
70
- let(:socket) { double(close: nil) }
71
-
72
- it "checks a local port to see if a server is running" do
73
- subject.port = 31337
74
- expect(TCPSocket).to receive(:new).with("127.0.0.1", 31337).and_return(socket)
75
- expect(socket).to receive(:close)
76
- subject.responsive?
77
- end
78
-
79
- end
80
-
81
- describe "#url" do
82
-
83
- it "returns a url for the server that includes the port" do
84
- subject.port = 31337
85
- expect(subject.url).to eq("http://127.0.0.1:31337")
86
- end
87
-
88
- end
89
-
90
- describe "integration" do
91
-
92
- before do
93
- allow(Teaspoon.configuration).to receive(:suite_configs).and_return("foo" => { block: proc {} })
94
- allow(Teaspoon.configuration).to receive(:suppress_log).and_return(true)
95
- end
96
-
97
- it "really starts a server" do
98
- subject.start
99
- response = Net::HTTP.get_response(URI.parse("#{subject.url}/teaspoon/foo"))
100
- expect(response.code).to eq("200")
101
- end
102
-
103
- end
104
-
105
- end
@@ -1,138 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Teaspoon::Suite do
4
-
5
- before do
6
- allow(Teaspoon.configuration).to receive(:suite_configs).and_return("default" => { block: proc {} })
7
- end
8
-
9
- describe ".all" do
10
-
11
- before do
12
- Teaspoon::Suite.instance_variable_set(:@all, nil)
13
- suites = { "default" => { block: proc {} }, "foo" => { block: proc {} } }
14
- allow(Teaspoon.configuration).to receive(:suite_configs).and_return(suites)
15
- end
16
-
17
- it "returns all the suites" do
18
- result = Teaspoon::Suite.all
19
- expect(result.first).to be_a(Teaspoon::Suite)
20
- expect(result.length).to be(2)
21
- expect(result.first.name).to eq("default")
22
- expect(result.last.name).to eq("foo")
23
- end
24
-
25
- end
26
-
27
- describe ".resolve_spec_for" do
28
-
29
- it "return a hash with the suite name and path" do
30
- result = Teaspoon::Suite.resolve_spec_for("fixture_spec")
31
- expect(result[:suite]).to eq("default")
32
- expect(result[:path].first).to include("base/fixture_spec.")
33
- end
34
-
35
- it "returns a hash with the suite name and an array of paths if a directory is given" do
36
- result = Teaspoon::Suite.resolve_spec_for("base")
37
- expect(result[:suite]).to eq("default")
38
- dirs = ["base/fixture_spec.", "base/runner_spec.", "base/teaspoon_spec"]
39
- expect(dirs.all? { |path| result[:path].grep(/#{path}/)[0] }).to be_truthy
40
- end
41
-
42
- it "returns false if the spec wasn't found" do
43
- expect(Teaspoon::Suite.resolve_spec_for("foo")).to be_falsey
44
- end
45
-
46
- end
47
-
48
- describe "#initialize" do
49
-
50
- it "uses default suite configuration" do
51
- expect(subject.name).to eq("default")
52
- expect(subject.config.helper).to eq("spec_helper")
53
- end
54
-
55
- it "accepts a suite in the options" do
56
- suite = { "test" => { block: proc { |s| s.helper = "helper_file" } } }
57
- expect(Teaspoon.configuration).to receive(:suite_configs).and_return(suite)
58
- subject = Teaspoon::Suite.new(suite: :test)
59
- expect(subject.name).to eql("test")
60
- expect(subject.config.helper).to eq("helper_file")
61
- end
62
-
63
- end
64
-
65
- describe "#spec_files" do
66
-
67
- it "returns an array of hashes with the filename and the asset name" do
68
- file = Teaspoon::Engine.root.join("spec/javascripts/teaspoon/base/reporters/console_spec.js").to_s
69
- expect(subject).to receive(:glob).and_return([file])
70
- expect(subject.spec_files[0]).to eql(path: file, name: "teaspoon/base/reporters/console_spec.js")
71
- end
72
-
73
- it "raises an exception if the file isn't servable (in an asset path)" do
74
- expect(subject).to receive(:glob).and_return(["/foo"])
75
- expect { subject.spec_files[0] }.to raise_error Teaspoon::AssetNotServable
76
- end
77
-
78
- end
79
-
80
- describe "#spec_assets" do
81
-
82
- it "returns an array of assets" do
83
- result = subject.spec_assets
84
- expect(result).to include("spec_helper.js?body=1")
85
- expect(result).to include("teaspoon/base/reporters/console_spec.js?body=1")
86
- end
87
-
88
- it "returns just a file if one was requested" do
89
- subject.instance_variable_set(:@options, file: "spec/javascripts/foo.js")
90
- result = subject.spec_assets(false)
91
- expect(result).to eql(["foo.js"])
92
- end
93
-
94
- it "returns the asset tree (all dependencies resolved) if we want coverage" do
95
- allow(subject).to receive(:no_coverage).and_return([%r{support/}, "spec_helper.coffee"])
96
- subject.instance_variable_set(:@options, coverage: true)
97
- result = subject.spec_assets(true)
98
- expect(result).to include("support/json2.js?body=1")
99
- expect(result).to include("spec_helper.js?body=1")
100
- expect(result).to include("drivers/phantomjs/runner.js?body=1&instrument=1")
101
- end
102
-
103
- it "returns only the top level assets in the asset tree if config/expand_assets is set to false" do
104
- allow(subject.config).to receive(:expand_assets).and_return(false)
105
- result = subject.spec_assets(true)
106
- expect(result.any? { |file| file =~ /body=1/ }).to eq(false)
107
- end
108
-
109
- end
110
-
111
- describe "#include_spec?" do
112
-
113
- it "returns true if the spec was found in the suite" do
114
- files = subject.send(:glob)
115
- expect(subject.include_spec?(files.first)).to eq(true)
116
- end
117
-
118
- end
119
-
120
- describe "#include_spec_for?" do
121
-
122
- it "returns the spec if an exact match was found" do
123
- files = subject.send(:glob)
124
- expect(subject.include_spec_for?(files.first)).to eq(files.first)
125
- end
126
-
127
- it "returns a list of specs when the file name looks like it could be a match" do
128
- files = subject.include_spec_for?("fixture_spec")
129
- expect(files.any? { |file| file.include?("fixture_spec.coffee") }).to be_truthy
130
- end
131
-
132
- it "returns false if a matching spec isn't found" do
133
- expect(subject.include_spec_for?("_not_a_match_")).to eq(false)
134
- end
135
-
136
- end
137
-
138
- end