teaspoon 0.7.9 → 0.8.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 (163) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +382 -260
  3. data/app/assets/javascripts/teaspoon-angular.js +108 -26241
  4. data/app/assets/javascripts/teaspoon-jasmine.js +103 -2642
  5. data/app/assets/javascripts/teaspoon-mocha.js +109 -5416
  6. data/app/assets/javascripts/teaspoon-qunit.js +107 -2255
  7. data/app/assets/javascripts/teaspoon-teaspoon.js +0 -1
  8. data/app/assets/javascripts/teaspoon/angular.coffee +3 -1
  9. data/app/assets/javascripts/teaspoon/base/hook.coffee +21 -0
  10. data/app/assets/javascripts/teaspoon/base/reporters/html.coffee +26 -14
  11. data/app/assets/javascripts/teaspoon/base/reporters/html/progress_view.coffee +1 -1
  12. data/app/assets/javascripts/teaspoon/base/reporters/html/template.coffee +3 -3
  13. data/app/assets/javascripts/teaspoon/base/teaspoon.coffee +10 -1
  14. data/app/assets/javascripts/teaspoon/jasmine.coffee +3 -1
  15. data/app/assets/javascripts/teaspoon/mocha.coffee +3 -1
  16. data/app/assets/javascripts/teaspoon/mocha/reporters/html.coffee +1 -1
  17. data/app/assets/javascripts/teaspoon/qunit.coffee +3 -1
  18. data/app/assets/javascripts/teaspoon/qunit/reporters/html.coffee +1 -1
  19. data/app/assets/javascripts/teaspoon/teaspoon.coffee +0 -1
  20. data/app/assets/stylesheets/teaspoon.css +12 -8
  21. data/app/controllers/teaspoon/suite_controller.rb +32 -0
  22. data/app/views/teaspoon/suite/_body.html.erb +0 -0
  23. data/app/views/teaspoon/suite/_boot.html.erb +4 -0
  24. data/app/views/teaspoon/suite/_boot_require_js.html.erb +19 -0
  25. data/app/views/teaspoon/{spec/suites.html.erb → suite/index.html.erb} +6 -7
  26. data/app/views/teaspoon/suite/show.html.erb +19 -0
  27. data/bin/teaspoon +1 -1
  28. data/config/routes.rb +14 -4
  29. data/lib/generators/teaspoon/install/POST_INSTALL +2 -2
  30. data/lib/generators/teaspoon/install/install_generator.rb +22 -11
  31. data/lib/generators/teaspoon/install/templates/_body.html.erb +0 -0
  32. data/lib/generators/teaspoon/install/templates/_boot.html.erb +4 -0
  33. data/lib/generators/teaspoon/install/templates/jasmine/env.rb +11 -0
  34. data/lib/generators/teaspoon/install/templates/jasmine/env_comments.rb +182 -0
  35. data/lib/generators/teaspoon/install/templates/jasmine/spec_helper.coffee +8 -6
  36. data/lib/generators/teaspoon/install/templates/jasmine/spec_helper.js +8 -7
  37. data/lib/generators/teaspoon/install/templates/mocha/env.rb +11 -0
  38. data/lib/generators/teaspoon/install/templates/mocha/env_comments.rb +182 -0
  39. data/lib/generators/teaspoon/install/templates/mocha/spec_helper.coffee +13 -13
  40. data/lib/generators/teaspoon/install/templates/mocha/spec_helper.js +13 -13
  41. data/lib/generators/teaspoon/install/templates/qunit/env.rb +11 -0
  42. data/lib/generators/teaspoon/install/templates/qunit/env_comments.rb +182 -0
  43. data/lib/generators/teaspoon/install/templates/qunit/test_helper.coffee +6 -5
  44. data/lib/generators/teaspoon/install/templates/qunit/test_helper.js +6 -5
  45. data/lib/tasks/teaspoon.rake +9 -2
  46. data/lib/teaspoon.rb +4 -6
  47. data/lib/teaspoon/command_line.rb +116 -134
  48. data/lib/teaspoon/configuration.rb +144 -66
  49. data/lib/teaspoon/console.rb +70 -37
  50. data/lib/teaspoon/coverage.rb +42 -15
  51. data/lib/teaspoon/deprecated.rb +65 -0
  52. data/lib/teaspoon/drivers/base.rb +10 -0
  53. data/lib/teaspoon/drivers/phantomjs/runner.js +9 -11
  54. data/lib/teaspoon/drivers/phantomjs_driver.rb +21 -21
  55. data/lib/teaspoon/drivers/selenium_driver.rb +32 -13
  56. data/lib/teaspoon/engine.rb +32 -12
  57. data/lib/teaspoon/environment.rb +16 -12
  58. data/lib/teaspoon/exceptions.rb +41 -5
  59. data/lib/teaspoon/exporter.rb +52 -0
  60. data/lib/teaspoon/formatters/base.rb +171 -0
  61. data/lib/teaspoon/formatters/clean_formatter.rb +2 -4
  62. data/lib/teaspoon/formatters/documentation_formatter.rb +60 -0
  63. data/lib/teaspoon/formatters/dot_formatter.rb +12 -90
  64. data/lib/teaspoon/formatters/json_formatter.rb +36 -0
  65. data/lib/teaspoon/formatters/junit_formatter.rb +51 -32
  66. data/lib/teaspoon/formatters/modules/report_module.rb +76 -0
  67. data/lib/teaspoon/formatters/pride_formatter.rb +23 -27
  68. data/lib/teaspoon/formatters/snowday_formatter.rb +7 -11
  69. data/lib/teaspoon/formatters/swayze_or_oprah_formatter.rb +88 -64
  70. data/lib/teaspoon/formatters/tap_formatter.rb +18 -27
  71. data/lib/teaspoon/formatters/tap_y_formatter.rb +35 -45
  72. data/lib/teaspoon/formatters/teamcity_formatter.rb +69 -31
  73. data/lib/teaspoon/instrumentation.rb +33 -33
  74. data/lib/teaspoon/result.rb +2 -1
  75. data/lib/teaspoon/runner.rb +40 -28
  76. data/lib/teaspoon/server.rb +23 -25
  77. data/lib/teaspoon/suite.rb +52 -72
  78. data/lib/teaspoon/utility.rb +3 -14
  79. data/lib/teaspoon/version.rb +1 -1
  80. data/spec/dummy/app/assets/javascripts/integration/integration_spec.coffee +3 -0
  81. data/spec/dummy/app/assets/javascripts/integration/spec_helper.coffee +2 -0
  82. data/spec/dummy/config/application.rb +3 -0
  83. data/spec/features/console_reporter_spec.rb +48 -18
  84. data/spec/features/hooks_spec.rb +23 -41
  85. data/spec/features/html_reporter_spec.rb +38 -21
  86. data/spec/features/install_generator_spec.rb +34 -20
  87. data/spec/features/instrumentation_spec.rb +3 -2
  88. data/spec/fixtures/coverage.json +243 -0
  89. data/spec/javascripts/fixtures/_body.html.erb +1 -0
  90. data/spec/javascripts/jasmine_helper.coffee +1 -1
  91. data/spec/javascripts/teaspoon/base/fixture_spec.coffee +4 -4
  92. data/spec/javascripts/teaspoon/base/reporters/html_spec.coffee +9 -10
  93. data/spec/javascripts/teaspoon/mocha/reporters/html_mspec.coffee +0 -6
  94. data/spec/javascripts/teaspoon/phantomjs/runner_spec.coffee +5 -6
  95. data/spec/javascripts/turbolinks_helper.coffee +1 -1
  96. data/spec/spec_helper.rb +3 -4
  97. data/spec/teaspoon/command_line_spec.rb +139 -23
  98. data/spec/teaspoon/configuration_spec.rb +164 -46
  99. data/spec/teaspoon/console_spec.rb +142 -47
  100. data/spec/teaspoon/coverage_spec.rb +98 -28
  101. data/spec/teaspoon/drivers/base_spec.rb +5 -0
  102. data/spec/teaspoon/drivers/phantomjs_driver_spec.rb +32 -14
  103. data/spec/teaspoon/drivers/selenium_driver_spec.rb +32 -24
  104. data/spec/teaspoon/engine_spec.rb +8 -5
  105. data/spec/teaspoon/environment_spec.rb +56 -33
  106. data/spec/teaspoon/exceptions_spec.rb +57 -0
  107. data/spec/teaspoon/exporter_spec.rb +96 -0
  108. data/spec/teaspoon/formatters/base_spec.rb +259 -0
  109. data/spec/teaspoon/formatters/clean_formatter_spec.rb +37 -0
  110. data/spec/teaspoon/formatters/documentation_formatter_spec.rb +127 -0
  111. data/spec/teaspoon/formatters/dot_formatter_spec.rb +52 -56
  112. data/spec/teaspoon/formatters/json_formatter_spec.rb +77 -0
  113. data/spec/teaspoon/formatters/junit_formatter_spec.rb +72 -35
  114. data/spec/teaspoon/formatters/pride_formatter_spec.rb +37 -0
  115. data/spec/teaspoon/formatters/snowday_formatter_spec.rb +35 -0
  116. data/spec/teaspoon/formatters/tap_formatter_spec.rb +29 -81
  117. data/spec/teaspoon/formatters/tap_y_formatter_spec.rb +31 -141
  118. data/spec/teaspoon/formatters/teamcity_formatter_spec.rb +99 -42
  119. data/spec/teaspoon/instrumentation_spec.rb +44 -44
  120. data/spec/teaspoon/result_spec.rb +37 -0
  121. data/spec/teaspoon/runner_spec.rb +70 -59
  122. data/spec/teaspoon/server_spec.rb +34 -52
  123. data/spec/teaspoon/suite_spec.rb +42 -188
  124. data/spec/teaspoon_env.rb +39 -28
  125. data/vendor/assets/javascripts/{angular-scenario-1.0.5.js → angular/1.0.5.js} +0 -0
  126. data/vendor/assets/javascripts/{angular-scenario-1.0.5.MIT-LICENSE → angular/MIT-LICENSE} +0 -0
  127. data/vendor/assets/javascripts/{jasmine-1.3.1.js → jasmine/1.3.1.js} +0 -0
  128. data/vendor/assets/javascripts/jasmine/2.0.0.js +2412 -0
  129. data/vendor/assets/javascripts/{jasmine-1.3.1.MIT.LICENSE → jasmine/MIT.LICENSE} +0 -0
  130. data/vendor/assets/javascripts/{mocha-1.10.0.js → mocha/1.10.0.js} +1 -0
  131. data/vendor/assets/javascripts/mocha/1.17.1.js +5813 -0
  132. data/vendor/assets/javascripts/{mocha-1.10.1.MIT.LICENSE → mocha/MIT.LICENSE} +0 -0
  133. data/vendor/assets/javascripts/{qunit-1.12.0.js → qunit/1.12.0.js} +1 -1
  134. data/vendor/assets/javascripts/qunit/1.14.0.js +2288 -0
  135. data/vendor/assets/javascripts/{qunit-1.12.0.MIT.LICENSE → qunit/MIT.LICENSE} +0 -0
  136. data/vendor/assets/javascripts/support/chai.js +827 -385
  137. data/vendor/assets/javascripts/support/jasmine-jquery-1.7.0.js +720 -0
  138. data/vendor/assets/javascripts/support/jasmine-jquery-2.0.0.js +812 -0
  139. data/vendor/assets/javascripts/support/sinon-chai.js +17 -0
  140. data/vendor/assets/javascripts/support/sinon.js +1138 -643
  141. metadata +57 -36
  142. data/app/controllers/teaspoon/spec_controller.rb +0 -38
  143. data/app/helpers/teaspoon/spec_helper.rb +0 -36
  144. data/app/views/teaspoon/spec/_require_js.html.erb +0 -21
  145. data/app/views/teaspoon/spec/_standard.html.erb +0 -4
  146. data/app/views/teaspoon/spec/runner.html.erb +0 -19
  147. data/lib/generators/teaspoon/install/templates/env.rb +0 -38
  148. data/lib/generators/teaspoon/install/templates/jasmine/initializer.rb +0 -64
  149. data/lib/generators/teaspoon/install/templates/mocha/initializer.rb +0 -64
  150. data/lib/generators/teaspoon/install/templates/qunit/initializer.rb +0 -64
  151. data/lib/teaspoon/check_coverage.rb +0 -33
  152. data/lib/teaspoon/drivers/base_driver.rb +0 -10
  153. data/lib/teaspoon/exception_handling.rb +0 -18
  154. data/lib/teaspoon/formatters/base_formatter.rb +0 -63
  155. data/spec/dummy/config/initializers/teaspoon.rb +0 -41
  156. data/spec/teaspoon/check_coverage_spec.rb +0 -50
  157. data/spec/teaspoon/formatters/base_formatter_spec.rb +0 -45
  158. data/vendor/assets/javascripts/support/chai.MIT.LICENSE +0 -22
  159. data/vendor/assets/javascripts/support/expect.MIT.LICENSE +0 -22
  160. data/vendor/assets/javascripts/support/jasmine-jquery.MIT.LICENSE +0 -20
  161. data/vendor/assets/javascripts/support/jasmine-jquery.js +0 -659
  162. data/vendor/assets/javascripts/support/sinon-chai.MIT-ISH.LICENSE +0 -13
  163. data/vendor/assets/javascripts/support/sinon.BSD.LICENSE +0 -27
@@ -4,13 +4,13 @@
4
4
  # require support/chai
5
5
  # require support/your-support-file
6
6
  #
7
- # PhantomJS (Teaspoons default driver) doesn't have support for Function.prototype.bind, which has caused confusion. Use
8
- # this polyfill to avoid the confusion.
7
+ # PhantomJS (Teaspoons default driver) doesn't have support for Function.prototype.bind, which has caused confusion.
8
+ # Use this polyfill to avoid the confusion.
9
9
  #= require support/bind-poly
10
10
  #
11
11
  # Deferring execution
12
- # If you're using CommonJS, RequireJS or some other asynchronous library you can defer execution. Call Teaspoon.execute()
13
- # after everything has been loaded. Simple example of a timeout:
12
+ # If you're using CommonJS, RequireJS or some other asynchronous library you can defer execution. Call
13
+ # Teaspoon.execute() after everything has been loaded. Simple example of a timeout:
14
14
  #
15
15
  # Teaspoon.defer = true
16
16
  # setTimeout(Teaspoon.execute, 1000)
@@ -24,16 +24,16 @@
24
24
  # If you'd rather require your spec files manually (to control order for instance) you can disable the suite matcher in
25
25
  # the configuration and use this file as a manifest.
26
26
  #
27
- # Chai
28
- # If you're using Chai, you probably want to initialize your preferred assertion style here.
29
- # For more information see: http://chaijs.com/guide/styles
30
- # Examples:
27
+ # For more information: http://github.com/modeset/teaspoon
31
28
  #
32
- # window.assert = chai.assert
33
- # window.expect = chai.expect
34
- # window.should = chai.should()
29
+ # Chai
30
+ # If you're using Chai, you'll probably want to initialize your preferred assertion style. You can read more about Chai
31
+ # at: http://chaijs.com/guide/styles
35
32
  #
36
- # For more information: http://github.com/modeset/teaspoon
33
+ # window.assert = chai.assert
34
+ # window.expect = chai.expect
35
+ # window.should = chai.should()
37
36
  #
38
- # You can require javascript files here. A good place to start is by requiring your application.js.
37
+ # You can require your own javascript files here. By default this will include everything in application, however you
38
+ # may get better load performance if you require the specific files that are being used in the spec that tests them.
39
39
  #= require application
@@ -4,13 +4,13 @@
4
4
  // require support/chai
5
5
  // require support/your-support-file
6
6
  //
7
- // PhantomJS (Teaspoons default driver) doesn't have support for Function.prototype.bind, which has caused confusion. Use
8
- // this polyfill to avoid the confusion.
7
+ // PhantomJS (Teaspoons default driver) doesn't have support for Function.prototype.bind, which has caused confusion.
8
+ // Use this polyfill to avoid the confusion.
9
9
  //= require support/bind-poly
10
10
  //
11
11
  // Deferring execution
12
- // If you're using CommonJS, RequireJS or some other asynchronous library you can defer execution. Call Teaspoon.execute()
13
- // after everything has been loaded. Simple example of a timeout:
12
+ // If you're using CommonJS, RequireJS or some other asynchronous library you can defer execution. Call
13
+ // Teaspoon.execute() after everything has been loaded. Simple example of a timeout:
14
14
  //
15
15
  // Teaspoon.defer = true
16
16
  // setTimeout(Teaspoon.execute, 1000)
@@ -24,16 +24,16 @@
24
24
  // If you'd rather require your spec files manually (to control order for instance) you can disable the suite matcher in
25
25
  // the configuration and use this file as a manifest.
26
26
  //
27
- // Chai
28
- // If you're using Chai, you probably want to initialize your preferred assertion style here.
29
- // For more information see: http://chaijs.com/guide/styles
30
- // Examples:
27
+ // For more information: http://github.com/modeset/teaspoon
31
28
  //
32
- // window.assert = chai.assert();
33
- // window.expect = chai.expect();
34
- // window.should = chai.should();
29
+ // Chai
30
+ // If you're using Chai, you'll probably want to initialize your preferred assertion style. You can read more about Chai
31
+ // at: http://chaijs.com/guide/styles
35
32
  //
36
- // For more information: http://github.com/modeset/teaspoon
33
+ // window.assert = chai.assert;
34
+ // window.expect = chai.expect;
35
+ // window.should = chai.should();
37
36
  //
38
- // You can require javascript files here. A good place to start is by requiring your application.js.
37
+ // You can require your own javascript files here. By default this will include everything in application, however you
38
+ // may get better load performance if you require the specific files that are being used in the spec that tests them.
39
39
  //= require application
@@ -0,0 +1,11 @@
1
+ # Set RAILS_ROOT and load the environment if it's not already loaded.
2
+ unless defined?(Rails)
3
+ ENV["RAILS_ROOT"] = File.expand_path("../../", __FILE__)
4
+ require File.expand_path("../../config/environment", __FILE__)
5
+ end
6
+
7
+ Teaspoon.configure do |config|
8
+ config.suite do |suite|
9
+ suite.use_framework :qunit
10
+ end
11
+ end
@@ -0,0 +1,182 @@
1
+ # Set RAILS_ROOT and load the environment if it's not already loaded.
2
+ unless defined?(Rails)
3
+ ENV["RAILS_ROOT"] = File.expand_path("../../", __FILE__)
4
+ require File.expand_path("../../config/environment", __FILE__)
5
+ end
6
+
7
+ Teaspoon.configure do |config|
8
+
9
+ # Determines where the Teaspoon routes will be mounted. Changing this to "/jasmine" would allow you to browse to
10
+ # `http://localhost:3000/jasmine` to run your tests.
11
+ #config.mount_at = "/teaspoon"
12
+
13
+ # Specifies the root where Teaspoon will look for files. If you're testing an engine using a dummy application it can
14
+ # be useful to set this to your engines root (e.g. `Teaspoon::Engine.root`).
15
+ # Note: Defaults to `Rails.root` if nil.
16
+ #config.root = nil
17
+
18
+ # Paths that will be appended to the Rails assets paths
19
+ # Note: Relative to `config.root`.
20
+ #config.asset_paths = ["test/javascripts", "test/javascripts/stylesheets"]
21
+
22
+ # Fixtures are rendered through a controller, which allows using HAML, RABL/JBuilder, etc. Files in these paths will
23
+ # be rendered as fixtures.
24
+ #config.fixture_paths = ["test/javascripts/fixtures"]
25
+
26
+ # SUITES
27
+ #
28
+ # You can modify the default suite configuration and create new suites here. Suites are isolated from one another.
29
+ #
30
+ # When defining a suite you can provide a name and a block. If the name is left blank, :default is assumed. You can
31
+ # omit various directives and the ones defined in the default suite will be used.
32
+ #
33
+ # To run a specific suite
34
+ # - in the browser: http://localhost/teaspoon/[suite_name]
35
+ # - with the rake task: rake teaspoon suite=[suite_name]
36
+ # - with the cli: teaspoon --suite=[suite_name]
37
+ config.suite do |suite|
38
+
39
+ # Specify the framework you would like to use. This allows you to specify version, and will do some basic setup for
40
+ # you -- which you can override with the directives below. This should be specified first, as it can override other
41
+ # directives.
42
+ # Note: If no version is specified, the latest is assumed.
43
+ #
44
+ # Available: jasmine[1.3.1, 2.0.0], mocha[1.10.0, 1.17.1] qunit[1.12.0, 1.14.0]
45
+ suite.use_framework :qunit
46
+
47
+ # Specify a file matcher as a regular expression and all matching files will be loaded when the suite is run. These
48
+ # files need to be within an asset path. You can add asset paths using the `config.asset_paths`.
49
+ #suite.matcher = "{test/javascripts,app/assets}/**/*_test.{js,js.coffee,coffee}"
50
+
51
+ # This suites spec helper, which can require additional support files. This file is loaded before any of your test
52
+ # files are loaded.
53
+ #suite.helper = "test_helper"
54
+
55
+ # The core Teaspoon javascripts. It's recommended to include only the base files here, as you can require support
56
+ # libraries from your spec helper.
57
+ # Note: For CoffeeScript files use `"teaspoon/jasmine"` etc.
58
+ #
59
+ # Available: teaspoon-jasmine, teaspoon-mocha, teaspoon-qunit
60
+ #suite.javascripts = ["qunit/1.14.0", "teaspoon-qunit"]
61
+
62
+ # You can include your own stylesheets if you want to change how Teaspoon looks.
63
+ # Note: Spec related CSS can and should be loaded using fixtures.
64
+ #suite.stylesheets = ["teaspoon"]
65
+
66
+ # Partial to be rendered in the head tag of the runner. You can use the provided ones or define your own by creating
67
+ # a `_boot.html.erb` in your fixtures path, and adjust the config to `"/boot"` for instance.
68
+ #
69
+ # Available: boot, boot_require_js
70
+ #suite.boot_partial = "boot"
71
+
72
+ # Partial to be rendered in the body tag of the runner. You can define your own to create a custom body structure.
73
+ #suite.body_partial = "body"
74
+
75
+ # Assets to be ignored when generating coverage reports. Accepts an array of filenames or regular expressions. The
76
+ # default excludes assets from vendor, gems and support libraries.<br/><br/>
77
+ #suite.no_coverage = [%r{/lib/ruby/gems/}, %r{/vendor/assets/}, %r{/support/}, %r{/(.+)_helper.}]
78
+
79
+ # Hooks allow you to use `Teaspoon.hook("fixtures")` before, after, or during your spec run. This will make a
80
+ # synchronous Ajax request to the server that will call all of the blocks you've defined for that hook name.
81
+ #suite.hook :fixtures, proc{ }
82
+
83
+ end
84
+
85
+ # Example suite. Since we're just filtering to files already within the root test/javascripts, these files will also
86
+ # be run in the default suite -- but can be focused into a more specific suite.
87
+ #config.suite :targeted do |suite|
88
+ # suite.matcher = "test/javascripts/targeted/*_test.{js,js.coffee,coffee}"
89
+ #end
90
+
91
+ # CONSOLE RUNNER SPECIFIC
92
+ #
93
+ # These configuration directives are applicable only when running via the rake task or command line interface. These
94
+ # directives can be overridden using the command line interface arguments or with ENV variables when using the rake
95
+ # task.
96
+ #
97
+ # Command Line Interface:
98
+ # teaspoon --driver=phantomjs --server-port=31337 --fail-fast=true --format=junit --suite=my_suite /spec/file_spec.js
99
+ #
100
+ # Rake:
101
+ # teaspoon DRIVER=phantomjs SERVER_PORT=31337 FAIL_FAST=true FORMATTERS=junit suite=my_suite
102
+
103
+ # Specify which headless driver to use. Supports PhantomJS and Selenium Webdriver.
104
+ #
105
+ # Available: phantomjs, selenium
106
+ # PhantomJS: https://github.com/modeset/teaspoon/wiki/Using-PhantomJS
107
+ # Selenium Webdriver: https://github.com/modeset/teaspoon/wiki/Using-Selenium-WebDriver
108
+ #config.driver = "phantomjs"
109
+
110
+ # Specify additional options for the driver.
111
+ #
112
+ # PhantomJS: https://github.com/modeset/teaspoon/wiki/Using-PhantomJS
113
+ # Selenium Webdriver: https://github.com/modeset/teaspoon/wiki/Using-Selenium-WebDriver
114
+ #config.driver_options = nil
115
+
116
+ # Specify the timeout for the driver. Specs are expected to complete within this time frame or the run will be
117
+ # considered a failure. This is to avoid issues that can arise where tests stall.
118
+ #config.driver_timeout = 180
119
+
120
+ # Specify a server to use with Rack (e.g. thin, mongrel). If nil is provided Rack::Server is used.
121
+ #config.server = nil
122
+
123
+ # Specify a port to run on a specific port, otherwise Teaspoon will use a random available port.
124
+ #config.server_port = nil
125
+
126
+ # Timeout for starting the server in seconds. If your server is slow to start you may have to bump this, or you may
127
+ # want to lower this if you know it shouldn't take long to start.
128
+ #config.server_timeout = 20
129
+
130
+ # Force Teaspoon to fail immediately after a failing suite. Can be useful to make Teaspoon fail early if you have
131
+ # several suites, but in environments like CI this may not be desirable.
132
+ #config.fail_fast = true
133
+
134
+ # Specify the formatters to use when outputting the results.
135
+ # Note: Output files can be specified by using `"junit>/path/to/output.xml"`.
136
+ #
137
+ # Available: dot, documentation, clean, json, junit, pride, snowday, swayze_or_oprah, tap, tap_y, teamcity
138
+ #config.formatters = ["dot"]
139
+
140
+ # Specify if you want color output from the formatters.
141
+ #config.color = true
142
+
143
+ # Teaspoon pipes all console[log/debug/error] to $stdout. This is useful to catch places where you've forgotten to
144
+ # remove them, but in verbose applications this may not be desirable.
145
+ #config.suppress_log = false
146
+
147
+ # COVERAGE REPORTS / THRESHOLD ASSERTIONS
148
+ #
149
+ # Coverage reports requires Istanbul (https://github.com/gotwarlost/istanbul) to add instrumentation to your code and
150
+ # display coverage statistics.
151
+ #
152
+ # Coverage configurations are similar to suites. You can define several, and use different ones under different
153
+ # conditions.
154
+ #
155
+ # To run with a specific coverage configuration
156
+ # - with the rake task: rake teaspoon USE_COVERAGE=[coverage_name]
157
+ # - with the cli: teaspoon --coverage=[coverage_name]
158
+
159
+ # Specify that you always want a coverage configuration to be used.
160
+ #config.use_coverage = nil
161
+
162
+ config.coverage do |coverage|
163
+
164
+ # Which coverage reports Instanbul should generate. Correlates directly to what Istanbul supports.
165
+ #
166
+ # Available: text-summary, text, html, lcov, lcovonly, cobertura, teamcity
167
+ #coverage.reports = ["text-summary", "html"]
168
+
169
+ # The path that the coverage should be written to - when there's an artifact to write to disk.
170
+ # Note: Relative to `config.root`.
171
+ #coverage.output_dir = "coverage"
172
+
173
+ # Various thresholds requirements can be defined, and those thresholds will be checked at the end of a run. If any
174
+ # aren't met the run will fail with a message. Thresholds can be defined as a percentage (0-100), or nil.
175
+ #coverage.statements = nil
176
+ #coverage.functions = nil
177
+ #coverage.branches = nil
178
+ #coverage.lines = nil
179
+
180
+ end
181
+
182
+ end
@@ -2,13 +2,13 @@
2
2
  # require support/sinon
3
3
  # require support/your-support-file
4
4
  #
5
- # PhantomJS (Teaspoons default driver) doesn't have support for Function.prototype.bind, which has caused confusion. Use
6
- # this polyfill to avoid the confusion.
5
+ # PhantomJS (Teaspoons default driver) doesn't have support for Function.prototype.bind, which has caused confusion.
6
+ # Use this polyfill to avoid the confusion.
7
7
  #= require support/bind-poly
8
8
  #
9
9
  # Deferring execution
10
- # If you're using CommonJS, RequireJS or some other asynchronous library you can defer execution. Call Teaspoon.execute()
11
- # after everything has been loaded. Simple example of a timeout:
10
+ # If you're using CommonJS, RequireJS or some other asynchronous library you can defer execution. Call
11
+ # Teaspoon.execute() after everything has been loaded. Simple example of a timeout:
12
12
  #
13
13
  # Teaspoon.defer = true
14
14
  # setTimeout(Teaspoon.execute, 1000)
@@ -24,5 +24,6 @@
24
24
  #
25
25
  # For more information: http://github.com/modeset/teaspoon
26
26
  #
27
- # You can require javascript files here. A good place to start is by requiring your application.js.
27
+ # You can require your own javascript files here. By default this will include everything in application, however you
28
+ # may get better load performance if you require the specific files that are being used in the test that tests them.
28
29
  #= require application
@@ -2,13 +2,13 @@
2
2
  // require support/sinon
3
3
  // require support/your-support-file
4
4
  //
5
- // PhantomJS (Teaspoons default driver) doesn't have support for Function.prototype.bind, which has caused confusion. Use
6
- // this polyfill to avoid the confusion.
5
+ // PhantomJS (Teaspoons default driver) doesn't have support for Function.prototype.bind, which has caused confusion.
6
+ // Use this polyfill to avoid the confusion.
7
7
  //= require support/bind-poly
8
8
  //
9
9
  // Deferring execution
10
- // If you're using CommonJS, RequireJS or some other asynchronous library you can defer execution. Call Teaspoon.execute()
11
- // after everything has been loaded. Simple example of a timeout:
10
+ // If you're using CommonJS, RequireJS or some other asynchronous library you can defer execution. Call
11
+ // Teaspoon.execute() after everything has been loaded. Simple example of a timeout:
12
12
  //
13
13
  // Teaspoon.defer = true
14
14
  // setTimeout(Teaspoon.execute, 1000)
@@ -24,6 +24,7 @@
24
24
  //
25
25
  // For more information: http://github.com/modeset/teaspoon
26
26
  //
27
- // You can require javascript files here. A good place to start is by requiring your application.js.
27
+ // You can require your own javascript files here. By default this will include everything in application, however you
28
+ // may get better load performance if you require the specific files that are being used in the test that tests them.
28
29
  //= require application
29
30
 
@@ -1,6 +1,13 @@
1
1
  desc "Run the javascript specs"
2
2
  task :teaspoon => :environment do |t, args|
3
3
  require "teaspoon/console"
4
- files = ENV['files'].nil? ? [] : ENV['files'].split(',')
5
- fail if Teaspoon::Console.new({suite: ENV["suite"], driver_cli_options: ENV["driver_cli_options"]}, files ).execute
4
+
5
+ options = {
6
+ files: ENV["files"].nil? ? [] : ENV["files"].split(","),
7
+ suite: ENV["suite"],
8
+ coverage: ENV["coverage"],
9
+ driver_options: ENV["driver_options"],
10
+ }
11
+
12
+ abort("rake teaspoon failed") if Teaspoon::Console.new(options).failures?
6
13
  end
data/lib/teaspoon.rb CHANGED
@@ -1,10 +1,8 @@
1
1
  require "teaspoon/version"
2
2
  require "teaspoon/exceptions"
3
- require "teaspoon/configuration"
4
- require "teaspoon/suite"
5
3
  require "teaspoon/utility"
6
- require "teaspoon/check_coverage"
7
- require "teaspoon/coverage"
8
- require "teaspoon/instrumentation"
4
+ require "teaspoon/configuration"
5
+
6
+ require "teaspoon/engine" if defined?(Rails)
9
7
 
10
- require "teaspoon/engine"
8
+ require "teaspoon/deprecated"
@@ -1,156 +1,138 @@
1
1
  require "optparse"
2
2
  require "teaspoon/version"
3
+ require "teaspoon/exceptions"
3
4
 
4
5
  module Teaspoon
5
6
  class CommandLine
6
7
 
7
8
  def initialize
8
9
  @options = {}
9
- @files = opt_parser.parse!
10
-
11
- begin
12
- require_console
13
- abort if Teaspoon::Console.new(@options, @files).execute
14
- rescue Teaspoon::EnvironmentNotFound => e
15
- STDOUT.print "Unable to load Teaspoon environment in {#{Teaspoon::Environment.standard_environments.join(', ')}}.\n"
16
- STDOUT.print "Consider using -r path/to/teaspoon_env\n"
17
- abort
18
- end
10
+ @options[:files] = opt_parser.parse!
11
+
12
+ require_console
13
+ abort if Teaspoon::Console.new(@options).failures?
14
+ rescue Teaspoon::EnvironmentNotFound => e
15
+ abort("#{e.message}\nConsider using -r path/to/teaspoon_env\n")
19
16
  end
20
17
 
21
18
  def opt_parser
22
19
  OptionParser.new do |parser|
23
- parser.banner = "Usage: teaspoon [options] [files]\n\n"
24
-
25
- parser.on("-r", "--require FILE", "Require Teaspoon environment file.") do |file|
26
- @options[:environment] = file
27
- end
28
-
29
- #parser.on("-O", "--options PATH", "Specify the path to a custom options file.") do |path|
30
- # @options[:custom_options_file] = path
31
- #end
32
-
33
- parser.on("-d", "--driver DRIVER", "Specify driver:",
34
- " phantomjs (default)",
35
- " selenium") do |driver|
36
- @options[:driver] = driver
37
- end
38
-
39
- parser.on("-o", "--driver-cli-options OPTIONS", "Specify driver-specific options string to pass into the driver, e.g.",
40
- " '--ssl-protocol=any --ssl-certificates-path=/path/to/certs' could be used for phantomjs",
41
- " Currently driver CLI options are only supported for phantomjs. It will be ignored if using the selenium driver.") do |driver_cli_options|
42
- @options[:driver_cli_options] = driver_cli_options
43
- end
44
-
45
- parser.on("--server SERVER", "Sets server to use with Rack.") do |server|
46
- @options[:server] = server
47
- end
48
-
49
- parser.on("--server-timeout SECONDS", "Sets the timeout for the server to start.") do |seconds|
50
- @options[:server_timeout] = seconds
51
- end
52
-
53
- parser.on("--server-port PORT", "Sets the server to use a specific port.") do |port|
54
- @options[:server_port] = port
55
- end
56
-
57
- parser.on("--[no-]fail-fast", "Abort after the first failing suite.") do |bool|
58
- @options[:fail_fast] = bool
59
- end
60
-
61
- parser.separator("\n **** Filtering ****\n\n")
62
-
63
- parser.on("-s", "--suite SUITE", "Focus to a specific suite.") do |suite|
64
- @options[:suite] = suite
65
- end
66
-
67
- parser.on("-g", "--filter FILTER", "Filter tests matching a specific filter.") do |filter|
68
- @options[:filter] = filter
69
- end
70
-
71
- parser.separator("\n **** Output ****\n\n")
72
-
73
- parser.on("-f", "--format FORMATTERS", "Specify formatters (comma separated)",
74
- " dot (default) - dots",
75
- " tap_y - format used by tapout",
76
- " swayze_or_oprah - random quote from Patrick Swayze or Oprah Winfrey") do |formatters|
77
- @options[:formatters] = formatters
78
- end
79
-
80
- parser.on("-q", "--[no-]suppress-log", "Suppress logs coming from console[log/debug/error].") do |bool|
81
- @options[:suppress_log] = bool
82
- end
83
-
84
- parser.on("-c", "--[no-]colour", "Enable/Disable color output.") do |bool|
85
- @options[:color] = bool
86
- end
87
-
88
- parser.separator("\n **** Coverage ****\n\n")
89
-
90
- parser.on("-C", "--coverage", "Generate coverage report (requires Istanbul).") do |bool|
91
- @options[:coverage] = bool
92
- end
93
-
94
- parser.on("-R", "--coverage-reports FORMATS", "Specify which coverage reports to generate (comma separated)",
95
- " text-summary (default) - compact text summary in results",
96
- " text - text table with coverage for all files in results",
97
- " html - HTML files with annotated source code",
98
- " lcov - html + lcov files",
99
- " lcovonly - an lcov.info file",
100
- " cobertura - cobertura-coverage.xml used by Hudson") do |reports|
101
- @options[:coverage] = true
102
- @options[:coverage_reports] = reports
103
- end
104
-
105
- parser.on("-O", "--coverage-output-dir DIR", "Specify directory where coverage reports should be generated.") do |dir|
106
- @options[:coverage_output_dir] = dir
107
- end
108
-
109
- parser.separator("\n **** Coverage Thresholds ****\n\n")
110
-
111
- parser.on("-S", "--statements-coverage-threshold THRESHOLD", "Specify the statements coverage threshold.",
112
- " If this is a positive number, it is the minimum percentage required for coverage to not fail.",
113
- " If it is a negative number, it is the maximum number of uncovered statements allowed to not fail.") do |threshold|
114
- @options[:statements_coverage_threshold] = threshold
115
- end
116
-
117
- parser.on("-F", "--functions-coverage-threshold THRESHOLD", "Specify the functions coverage threshold.",
118
- " If this is a positive number, it is the minimum percentage required for coverage to not fail.",
119
- " If it is a negative number, it is the maximum number of uncovered functions allowed to not fail.") do |threshold|
120
- @options[:functions_coverage_threshold] = threshold
121
- end
122
-
123
- parser.on("-B", "--branches-coverage-threshold THRESHOLD", "Specify the branches coverage threshold.",
124
- " If this is a positive number, it is the minimum percentage required for coverage to not fail.",
125
- " If it is a negative number, it is the maximum number of uncovered branches allowed to not fail.") do |threshold|
126
- @options[:branches_coverage_threshold] = threshold
127
- end
128
-
129
- parser.on("-L", "--lines-coverage-threshold THRESHOLD", "Specify the lines coverage threshold.",
130
- " If this is a positive number, it is the minimum percentage required for coverage to not fail.",
131
- " If it is a negative number, it is the maximum number of uncovered lines allowed to not fail.") do |threshold|
132
- @options[:lines_coverage_threshold] = threshold
133
- end
134
-
135
- parser.separator("\n **** Utility ****\n\n")
136
-
137
- parser.on("-v", "--version", "Display the version.") do
138
- puts Teaspoon::VERSION
139
- exit
140
- end
141
-
142
- parser.on("-h", "--help", "You're looking at it.") do
143
- puts parser
144
- exit
145
- end
20
+ @parser = parser
21
+ @parser.banner = "Usage: teaspoon [options] [files]\n\n"
22
+
23
+ opts_for_general
24
+ opts_for_filtering
25
+ opts_for_output
26
+ opts_for_coverage
27
+ opts_for_utility
146
28
  end
147
29
  end
148
30
 
31
+ protected
32
+
33
+ def opts_for_general
34
+ opt :environment,
35
+ "-r", "--require FILE",
36
+ "Require Teaspoon environment file."
37
+
38
+ #opt :custom_options_file,
39
+ # "-O", "--options PATH",
40
+ # "Specify the path to a custom options file."
41
+
42
+ opt :driver, "-d", "--driver DRIVER",
43
+ "Specify driver:",
44
+ " phantomjs (default)",
45
+ " selenium"
46
+
47
+ opt :driver_options, "--driver-options OPTIONS",
48
+ "Specify driver-specific options to pass into the driver.",
49
+ " e.g. \"--ssl-protocol=any --ssl-certificates-path=/path/to/certs\".",
50
+ " Driver options are only supported with phantomjs."
51
+
52
+ opt :driver_timeout, "--driver-timeout SECONDS",
53
+ "Sets the timeout for the driver to wait before exiting."
54
+
55
+ opt :server, "--server SERVER",
56
+ "Sets server to use with Rack.",
57
+ " e.g. webrick, thin"
58
+
59
+ opt :server_port, "--server-port PORT",
60
+ "Sets the server to use a specific port."
61
+
62
+ opt :server_timeout, "--server-timeout SECONDS",
63
+ "Sets the timeout that the server must start within."
64
+
65
+ opt :fail_fast, "-F", "--[no-]fail-fast",
66
+ "Abort after the first failing suite."
67
+ end
68
+
69
+ def opts_for_filtering
70
+ separator("Filtering")
71
+
72
+ opt :suite, "-s", "--suite SUITE",
73
+ "Focus to a specific suite."
74
+
75
+ opt :filter, "-g", "--filter FILTER",
76
+ "Filter tests matching a specific filter."
77
+ end
78
+
79
+ def opts_for_output
80
+ separator("Output")
81
+
82
+ opt :suppress_log, "-q", "--[no-]suppress-log",
83
+ "Suppress logs coming from console[log/debug/error]."
84
+
85
+ opt :color, "-c", "--[no-]color",
86
+ "Enable/Disable color output."
87
+
88
+ opt :export, "-e", "--export [OUTPUT_PATH]",
89
+ "Exports the test suite as the full HTML (requires wget)."
90
+
91
+ opt :formatters, "-f", "--format FORMATTERS",
92
+ "Specify formatters (comma separated)",
93
+ " dot (default) - dots",
94
+ " documentation - descriptive documentation",
95
+ " clean - like dots but doesn't log re-run commands",
96
+ " json - json formatter (raw teaspoon)",
97
+ " junit - junit compatible formatter",
98
+ " pride - yay rainbows!",
99
+ " snowday - makes you feel warm inside",
100
+ " swayze_or_oprah - quote from either Patrick Swayze or Oprah Winfrey",
101
+ " tap - test anything protocol formatter",
102
+ " tap_y - tap_yaml, format used by tapout",
103
+ " teamcity - teamcity compatible formatter"
104
+ end
105
+
106
+ def opts_for_coverage
107
+ separator("Coverage")
108
+
109
+ opt :use_coverage, "-C", "--coverage CONFIG_NAME",
110
+ "Generate coverage reports using a pre-defined coverage configuration."
111
+ end
112
+
113
+ def opts_for_utility
114
+ separator("Utility")
115
+
116
+ @parser.on "-v", "--version", "Display the version.", proc{ STDOUT.print("#{Teaspoon::VERSION}\n"); exit }
117
+ @parser.on "-h", "--help", "You're looking at it.", proc { STDOUT.print("#{@parser}\n"); exit }
118
+ end
119
+
120
+ private
121
+
122
+ def separator(message)
123
+ @parser.separator("\n **** #{message} ****\n\n")
124
+ end
125
+
126
+ def opt(config, *args)
127
+ @parser.on(*args, proc{ |value| @options[config] = value })
128
+ end
129
+
149
130
  def require_console
150
131
  require "teaspoon/console"
151
132
  end
152
133
 
153
- def abort
134
+ def abort(message = nil)
135
+ STDOUT.print(message) if message
154
136
  exit(1)
155
137
  end
156
138
  end