opal-rspec 0.5.0.beta2 → 0.5.0.beta3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (281) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +23 -4
  4. data/CHANGELOG.md +22 -1
  5. data/Gemfile +10 -3
  6. data/README.md +142 -36
  7. data/Rakefile +101 -75
  8. data/config.ru +8 -6
  9. data/gemfiles/opal_master.gemfile +18 -0
  10. data/lib/opal/rspec.rb +6 -10
  11. data/lib/opal/rspec/cached_environment.rb +23 -0
  12. data/lib/opal/rspec/post_rack_locator.rb +20 -0
  13. data/lib/opal/rspec/pre_rack_locator.rb +68 -0
  14. data/lib/opal/rspec/rake_task.rb +97 -20
  15. data/lib/opal/rspec/sprockets_environment.rb +35 -0
  16. data/lib/opal/rspec/version.rb +1 -1
  17. data/opal-rspec.gemspec +9 -12
  18. data/opal/opal/rspec.rb +11 -8
  19. data/opal/opal/rspec/async.rb +1 -0
  20. data/opal/opal/rspec/async/async_example.rb +27 -18
  21. data/opal/opal/rspec/async/example_group.rb +23 -21
  22. data/opal/opal/rspec/async/hooks.rb +0 -36
  23. data/opal/opal/rspec/async/reporter.rb +9 -0
  24. data/opal/opal/rspec/fixes.rb +3 -10
  25. data/opal/opal/rspec/fixes/opal.rb +5 -0
  26. data/opal/opal/rspec/fixes/opal/class.rb +8 -0
  27. data/opal/opal/rspec/fixes/opal/compatibility.rb +228 -0
  28. data/opal/opal/rspec/fixes/opal/corelib.rb +3 -0
  29. data/opal/opal/rspec/fixes/opal/corelib/error.rb +61 -0
  30. data/opal/opal/rspec/fixes/opal/corelib/regexp.rb +92 -0
  31. data/opal/opal/rspec/fixes/opal/corelib/struct.rb +260 -0
  32. data/opal/opal/rspec/fixes/opal/kernel.rb +80 -0
  33. data/opal/opal/rspec/fixes/opal/stdlib.rb +2 -0
  34. data/opal/opal/rspec/fixes/opal/stdlib/pp.rb +23 -0
  35. data/opal/opal/rspec/fixes/opal/stdlib/set.rb +36 -0
  36. data/opal/opal/rspec/fixes/rspec.rb +7 -0
  37. data/opal/opal/rspec/fixes/{caller_filter.rb → rspec/caller_filter.rb} +0 -0
  38. data/opal/opal/rspec/fixes/rspec/core.rb +9 -0
  39. data/opal/opal/rspec/fixes/rspec/core/configuration.rb +11 -0
  40. data/opal/opal/rspec/fixes/{example.rb → rspec/core/example.rb} +1 -1
  41. data/opal/opal/rspec/fixes/rspec/core/example_group.rb +9 -0
  42. data/opal/opal/rspec/fixes/rspec/core/formatters.rb +6 -0
  43. data/opal/opal/rspec/fixes/rspec/core/formatters/backtrace_formatter.rb +20 -0
  44. data/opal/opal/rspec/fixes/rspec/core/formatters/console_codes.rb +11 -0
  45. data/opal/opal/rspec/fixes/rspec/core/formatters/deprecation_formatter.rb +20 -0
  46. data/opal/opal/rspec/fixes/rspec/core/formatters/generated_deprecation_message.rb +15 -0
  47. data/opal/opal/rspec/fixes/rspec/core/formatters/json_formatter.rb +10 -0
  48. data/opal/opal/rspec/fixes/rspec/core/formatters/loader.rb +38 -0
  49. data/opal/opal/rspec/fixes/rspec/core/metadata.rb +39 -0
  50. data/opal/opal/rspec/fixes/rspec/core/notifications.rb +3 -0
  51. data/opal/opal/rspec/fixes/rspec/core/notifications/examples_notification.rb +30 -0
  52. data/opal/opal/rspec/fixes/rspec/core/notifications/failed_example_notification.rb +20 -0
  53. data/opal/opal/rspec/fixes/rspec/core/notifications/summary_notification.rb +26 -0
  54. data/opal/opal/rspec/fixes/rspec/core/ordering.rb +1 -0
  55. data/opal/opal/rspec/fixes/rspec/core/ordering/random.rb +13 -0
  56. data/opal/opal/rspec/fixes/rspec/core/reporter.rb +14 -0
  57. data/opal/opal/rspec/fixes/rspec/core/warnings.rb +18 -0
  58. data/opal/opal/rspec/fixes/rspec/example_groups.rb +49 -0
  59. data/opal/opal/rspec/fixes/rspec/expectations.rb +2 -0
  60. data/opal/opal/rspec/fixes/{expectations.rb → rspec/expectations/fail_with.rb} +0 -0
  61. data/opal/opal/rspec/fixes/rspec/expectations/syntax.rb +25 -0
  62. data/opal/opal/rspec/fixes/rspec/matchers.rb +2 -0
  63. data/opal/opal/rspec/fixes/rspec/matchers/built_in.rb +4 -0
  64. data/opal/opal/rspec/fixes/rspec/matchers/built_in/all.rb +10 -0
  65. data/opal/opal/rspec/fixes/rspec/matchers/built_in/compound.rb +15 -0
  66. data/opal/opal/rspec/fixes/rspec/matchers/built_in/start_and_end_with.rb +42 -0
  67. data/opal/opal/rspec/fixes/rspec/matchers/built_in/yield.rb +21 -0
  68. data/opal/opal/rspec/fixes/{matchers.rb → rspec/matchers/pretty.rb} +0 -0
  69. data/opal/opal/rspec/fixes/rspec/mocks.rb +4 -0
  70. data/opal/opal/rspec/fixes/rspec/mocks/error_generator.rb +40 -0
  71. data/opal/opal/rspec/fixes/rspec/mocks/space.rb +37 -0
  72. data/opal/opal/rspec/fixes/rspec/mocks/test_double.rb +39 -0
  73. data/opal/opal/rspec/fixes/rspec/mocks/verifying_double.rb +29 -0
  74. data/opal/opal/rspec/fixes/rspec/support.rb +4 -0
  75. data/opal/opal/rspec/fixes/rspec/support/encoded_string.rb +10 -0
  76. data/opal/opal/rspec/fixes/rspec/support/fuzzy_matcher.rb +23 -0
  77. data/opal/opal/rspec/fixes/rspec/support/recursive_const_methods.rb +7 -0
  78. data/opal/opal/rspec/fixes/rspec/support/ruby_features.rb +8 -0
  79. data/opal/opal/rspec/fixes/rspec/support/warnings.rb +18 -0
  80. data/opal/opal/rspec/formatter/browser_formatter.rb +38 -0
  81. data/opal/opal/rspec/formatter/document_io.rb +27 -0
  82. data/opal/opal/rspec/formatter/element.rb +88 -0
  83. data/opal/opal/rspec/formatter/html_printer.rb +109 -0
  84. data/opal/opal/rspec/formatter/noop_flush_string_io.rb +9 -0
  85. data/opal/opal/rspec/formatter/opal_closed_tty_io.rb +27 -0
  86. data/opal/opal/rspec/pre_require_fixes.rb +7 -0
  87. data/opal/opal/rspec/requires.rb +32 -0
  88. data/opal/opal/rspec/runner.rb +71 -53
  89. data/opal/opal/rspec/spec_opts.rb.erb +28 -0
  90. data/opal/opal/rspec/sprockets_runner.rb.erb +5 -3
  91. data/spec/mri/integration/browser_spec.rb +31 -0
  92. data/spec/mri/integration/rack/sprockets_runner_js_errors.rb.erb +20 -0
  93. data/spec/mri/integration/spec_opts_spec.rb +81 -0
  94. data/spec/mri/unit/opal/rspec/browser_formatter_spec.rb +35 -0
  95. data/spec/mri/unit/opal/rspec/cached_environment_spec.rb +103 -0
  96. data/spec/mri/unit/opal/rspec/opal/browser_formatter_spec.rb +14 -0
  97. data/spec/mri/unit/opal/rspec/rack/config.ru +12 -0
  98. data/spec/mri/unit/opal/rspec/rake_task_spec.rb +245 -0
  99. data/spec/mri/unit/opal/rspec/sprockets_environment_spec.rb +94 -0
  100. data/spec/mri/unit/opal/rspec/temp_dir_helper.rb +19 -0
  101. data/spec/{after_hooks_spec.rb → opal/after_hooks_spec.rb} +0 -0
  102. data/spec/{around_hooks_spec.rb → opal/around_hooks_spec.rb} +46 -105
  103. data/spec/{async_spec.rb → opal/async_spec.rb} +0 -0
  104. data/spec/{before_hooks_spec.rb → opal/before_hooks_spec.rb} +0 -0
  105. data/spec/{example_spec.rb → opal/example_spec.rb} +0 -0
  106. data/spec/opal/expected_failures.txt +40 -0
  107. data/spec/{matchers_spec.rb → opal/matchers_spec.rb} +0 -0
  108. data/spec/{mock_spec.rb → opal/mock_spec.rb} +0 -0
  109. data/spec/{should_syntax_spec.rb → opal/should_syntax_spec.rb} +0 -0
  110. data/spec/{skip_pending_spec.rb → opal/skip_pending_spec.rb} +0 -0
  111. data/spec/{subject_spec.rb → opal/subject_spec.rb} +16 -16
  112. data/spec/other/color_on_by_default_spec.rb +9 -0
  113. data/spec/other/dummy_spec.rb +5 -0
  114. data/spec/other/formatter_dependency.rb +3 -0
  115. data/spec/other/ignored_spec.opal +5 -0
  116. data/spec/other/test_formatter.rb +9 -0
  117. data/spec/rspec/core/config.rb +5 -0
  118. data/spec/rspec/core/config.ru +4 -0
  119. data/spec/rspec/core/core_spec_loader.rb +42 -0
  120. data/spec/rspec/core/filter/core/async/example_group.txt +13 -0
  121. data/spec/rspec/core/filter/core/async/hooks.rb +12 -0
  122. data/spec/rspec/core/filter/core/async/memoized_helpers.txt +3 -0
  123. data/spec/rspec/core/filter/core/async/metadata.txt +2 -0
  124. data/spec/rspec/core/filter/core/bugs/filter_manager.txt +4 -0
  125. data/spec/rspec/core/filter/core/bugs/formatters.txt +4 -0
  126. data/spec/rspec/core/filter/core/bugs/memoized_helpers.rb +11 -0
  127. data/spec/rspec/core/filter/core/bugs/metadata.txt +5 -0
  128. data/spec/rspec/core/filter/core/bugs/sandbox/subject_issue_test.rb +328 -0
  129. data/spec/rspec/core/filter/core/bugs/warnings_deprecations.txt +3 -0
  130. data/spec/rspec/core/filter/core/unsupported/core.txt +5 -0
  131. data/spec/rspec/core/filter/core/unsupported/example.txt +7 -0
  132. data/spec/rspec/core/filter/core/unsupported/example_group.txt +13 -0
  133. data/spec/rspec/core/filter/core/unsupported/filter_manager.txt +7 -0
  134. data/spec/rspec/core/filter/core/unsupported/formatters.txt +27 -0
  135. data/spec/rspec/core/filter/core/unsupported/hooks.txt +2 -0
  136. data/spec/rspec/core/filter/core/unsupported/memoized_helpers.txt +6 -0
  137. data/spec/rspec/core/filter/core/unsupported/metadata.txt +14 -0
  138. data/spec/rspec/core/filter/core/unsupported/metadata_filter.txt +2 -0
  139. data/spec/rspec/core/filter/core/unsupported/notifications.txt +8 -0
  140. data/spec/rspec/core/filter/core/unsupported/world.txt +3 -0
  141. data/spec/rspec/core/fixes/missing_constants.rb +20 -0
  142. data/spec/rspec/core/fixes/opal_itself.rb +38 -0
  143. data/spec/rspec/core/fixes/shared_examples.rb +3 -0
  144. data/spec/rspec/core/opal_alternates/rspec/core/example_group_spec.rb +145 -0
  145. data/spec/rspec/core/opal_alternates/rspec/core/failed_example_notification_spec.rb +31 -0
  146. data/spec/rspec/core/opal_alternates/rspec/core/hooks_spec.rb +113 -0
  147. data/spec/rspec/core/opal_alternates/rspec/core/memoized_helpers_spec.rb +36 -0
  148. data/spec/rspec/core/opal_alternates/rspec/core/metadata_spec.rb +48 -0
  149. data/spec/rspec/core/require_specs.rb +25 -0
  150. data/spec/rspec/core/sandboxing.rb +72 -0
  151. data/spec/rspec/core/spec_files_exclude.txt +41 -0
  152. data/spec/rspec/expectations/config.rb +16 -0
  153. data/spec/rspec/expectations/config.ru +4 -0
  154. data/spec/rspec/expectations/expectation_spec_loader.rb +106 -0
  155. data/spec/rspec/expectations/filter/bugs/aliased_matcher.txt +2 -0
  156. data/spec/rspec/expectations/filter/bugs/aliases.rb +13 -0
  157. data/spec/rspec/expectations/filter/bugs/base_matcher.txt +2 -0
  158. data/spec/rspec/expectations/filter/bugs/be.rb +4 -0
  159. data/spec/rspec/expectations/filter/bugs/be_instance_of.rb +7 -0
  160. data/spec/rspec/expectations/filter/bugs/be_spec.txt +2 -0
  161. data/spec/rspec/expectations/filter/bugs/configuration.txt +8 -0
  162. data/spec/rspec/expectations/filter/bugs/contain_exactly.rb +13 -0
  163. data/spec/rspec/expectations/filter/bugs/define_negated_matcher.rb +9 -0
  164. data/spec/rspec/expectations/filter/bugs/description_generation.rb +4 -0
  165. data/spec/rspec/expectations/filter/bugs/dsl.txt +14 -0
  166. data/spec/rspec/expectations/filter/bugs/equal.txt +3 -0
  167. data/spec/rspec/expectations/filter/bugs/expectation_target.txt +2 -0
  168. data/spec/rspec/expectations/filter/bugs/expectations.txt +2 -0
  169. data/spec/rspec/expectations/filter/bugs/have_attributes.rb +8 -0
  170. data/spec/rspec/expectations/filter/bugs/include.rb +4 -0
  171. data/spec/rspec/expectations/filter/bugs/operators.txt +2 -0
  172. data/spec/rspec/expectations/filter/bugs/raise_error.txt +2 -0
  173. data/spec/rspec/expectations/filter/bugs/respond_to.rb +13 -0
  174. data/spec/rspec/expectations/filter/bugs/sandbox/undef.rb +20 -0
  175. data/spec/rspec/expectations/filter/unsupported/aliases.txt +5 -0
  176. data/spec/rspec/expectations/filter/unsupported/be.txt +2 -0
  177. data/spec/rspec/expectations/filter/unsupported/be_instance_of.txt +3 -0
  178. data/spec/rspec/expectations/filter/unsupported/change.txt +2 -0
  179. data/spec/rspec/expectations/filter/unsupported/configuration.txt +2 -0
  180. data/spec/rspec/expectations/filter/unsupported/contain_exactly.txt +2 -0
  181. data/spec/rspec/expectations/filter/unsupported/description_generation.txt +6 -0
  182. data/spec/rspec/expectations/filter/unsupported/dsl.txt +8 -0
  183. data/spec/rspec/expectations/filter/unsupported/eq.txt +10 -0
  184. data/spec/rspec/expectations/filter/unsupported/equal.txt +3 -0
  185. data/spec/rspec/expectations/filter/unsupported/expectation_target.txt +2 -0
  186. data/spec/rspec/expectations/filter/unsupported/expectations.txt +8 -0
  187. data/spec/rspec/expectations/filter/unsupported/has.txt +2 -0
  188. data/spec/rspec/expectations/filter/unsupported/include.txt +3 -0
  189. data/spec/rspec/expectations/filter/unsupported/match.txt +2 -0
  190. data/spec/rspec/expectations/filter/unsupported/matchers.txt +11 -0
  191. data/spec/rspec/expectations/filter/unsupported/output.txt +14 -0
  192. data/spec/rspec/expectations/filter/unsupported/raise_error.txt +3 -0
  193. data/spec/rspec/expectations/filter/unsupported/respond_to.rb +5 -0
  194. data/spec/rspec/expectations/filter/unsupported/syntax.txt +3 -0
  195. data/spec/rspec/expectations/filter/unsupported/yield.txt +2 -0
  196. data/spec/rspec/expectations/fixes/example_patches.rb +32 -0
  197. data/spec/rspec/expectations/fixes/missing_constants.rb +12 -0
  198. data/spec/rspec/expectations/fixes/not_compatible.rb +6 -0
  199. data/spec/rspec/expectations/fixes/opal_itself.rb +140 -0
  200. data/spec/rspec/expectations/opal_alternates/be_instance_of_spec.rb +11 -0
  201. data/spec/rspec/expectations/opal_alternates/dsl_spec.rb +66 -0
  202. data/spec/rspec/expectations/opal_alternates/expectation_target_spec.rb +21 -0
  203. data/spec/rspec/expectations/opal_alternates/yield_spec.rb +11 -0
  204. data/spec/rspec/expectations/require_specs.rb +16 -0
  205. data/spec/rspec/expectations/shared_examples.rb +47 -0
  206. data/spec/rspec/expectations/spec_files_exclude.txt +2 -0
  207. data/spec/rspec/expectations/spec_helper_opal.rb +13 -0
  208. data/spec/rspec/filter_processor.rb +77 -0
  209. data/spec/rspec/mocks/config.ru +4 -0
  210. data/spec/rspec/mocks/filter/bugs/and_call_original.txt +9 -0
  211. data/spec/rspec/mocks/filter/bugs/and_wrap_original.txt +2 -0
  212. data/spec/rspec/mocks/filter/bugs/any_instance.rb +24 -0
  213. data/spec/rspec/mocks/filter/bugs/argument_matchers.rb +3 -0
  214. data/spec/rspec/mocks/filter/bugs/configuration.txt +2 -0
  215. data/spec/rspec/mocks/filter/bugs/double.txt +3 -0
  216. data/spec/rspec/mocks/filter/bugs/expiration.txt +2 -0
  217. data/spec/rspec/mocks/filter/bugs/instance_method_stasher.txt +2 -0
  218. data/spec/rspec/mocks/filter/bugs/methods.rb +5 -0
  219. data/spec/rspec/mocks/filter/bugs/mocks.txt +6 -0
  220. data/spec/rspec/mocks/filter/bugs/mutate_const.txt +2 -0
  221. data/spec/rspec/mocks/filter/bugs/partial_double.rb +8 -0
  222. data/spec/rspec/mocks/filter/bugs/receive.txt +5 -0
  223. data/spec/rspec/mocks/filter/bugs/should_syntax.txt +5 -0
  224. data/spec/rspec/mocks/filter/bugs/space.txt +2 -0
  225. data/spec/rspec/mocks/filter/bugs/spy.txt +5 -0
  226. data/spec/rspec/mocks/filter/bugs/stub_implementation.rb +9 -0
  227. data/spec/rspec/mocks/filter/unsupported/and_call_original.txt +5 -0
  228. data/spec/rspec/mocks/filter/unsupported/and_return.txt +2 -0
  229. data/spec/rspec/mocks/filter/unsupported/any_instance.rb +6 -0
  230. data/spec/rspec/mocks/filter/unsupported/argument_matchers.rb +10 -0
  231. data/spec/rspec/mocks/filter/unsupported/combining_implementation_instructions.rb +9 -0
  232. data/spec/rspec/mocks/filter/unsupported/double.rb +16 -0
  233. data/spec/rspec/mocks/filter/unsupported/expected_arg_verification.txt +2 -0
  234. data/spec/rspec/mocks/filter/unsupported/have_received.txt +2 -0
  235. data/spec/rspec/mocks/filter/unsupported/instance_double_with_class_loaded.txt +8 -0
  236. data/spec/rspec/mocks/filter/unsupported/mocks.rb +8 -0
  237. data/spec/rspec/mocks/filter/unsupported/nil_expectation_warning.rb +8 -0
  238. data/spec/rspec/mocks/filter/unsupported/partial_double.rb +6 -0
  239. data/spec/rspec/mocks/filter/unsupported/receive.txt +13 -0
  240. data/spec/rspec/mocks/filter/unsupported/receive_message_chain.rb +4 -0
  241. data/spec/rspec/mocks/filter/unsupported/receive_messages.txt +2 -0
  242. data/spec/rspec/mocks/filter/unsupported/should_syntax.txt +1 -0
  243. data/spec/rspec/mocks/filter/unsupported/space.rb +7 -0
  244. data/spec/rspec/mocks/filter/unsupported/stub.rb +7 -0
  245. data/spec/rspec/mocks/fixes/doubled_classes.rb +76 -0
  246. data/spec/rspec/mocks/fixes/missing_constants.rb +3 -0
  247. data/spec/rspec/mocks/fixes/opal_itself.rb +59 -0
  248. data/spec/rspec/mocks/mocks_spec_loader.rb +87 -0
  249. data/spec/rspec/mocks/require_specs.rb +15 -0
  250. data/spec/rspec/mocks/spec_files_exclude.txt +11 -0
  251. data/spec/rspec/mocks/spec_helper_opal.rb +129 -0
  252. data/spec/rspec/opal_rspec_spec_loader.rb +349 -0
  253. data/spec/rspec/shared/opal/fixes/deprecation_helpers.rb +31 -0
  254. data/spec/rspec/shared/opal/fixes/rspec_helpers.rb +6 -0
  255. data/spec/rspec/shared/opal/progress_json_formatter.rb +29 -0
  256. data/spec/rspec/support/config.rb +5 -0
  257. data/spec/rspec/support/config.ru +4 -0
  258. data/spec/rspec/support/filter/bugs/recursive_const_methods.txt +3 -0
  259. data/spec/rspec/support/filter/bugs/sandbox/basic_object.rb +30 -0
  260. data/spec/rspec/support/filter/bugs/stderr_splitter_spec.txt +2 -0
  261. data/spec/rspec/support/filter/bugs/support.txt +2 -0
  262. data/spec/rspec/support/filter/unsupported/fuzzy_matcher.txt +2 -0
  263. data/spec/rspec/support/filter/unsupported/support.rb +7 -0
  264. data/spec/rspec/support/filter/unsupported/warnings.txt +6 -0
  265. data/spec/rspec/support/fixes/missing_constants.rb +3 -0
  266. data/spec/rspec/support/fixes/opal_itself.rb +13 -0
  267. data/spec/rspec/support/require_specs.rb +15 -0
  268. data/spec/rspec/support/spec_files_exclude.txt +26 -0
  269. data/spec/rspec/support/spec_helper.rb +27 -0
  270. data/spec/rspec/support/support_spec_loader.rb +34 -0
  271. data/util/create_requires.rb +6 -2
  272. data/vendor/spec_runner.js +14 -0
  273. metadata +255 -43
  274. data/opal/opal/rspec/browser_formatter.rb +0 -225
  275. data/opal/opal/rspec/fixes/example_groups.rb +0 -32
  276. data/opal/opal/rspec/fixes/formatter.rb +0 -62
  277. data/opal/opal/rspec/fixes/kernel.rb +0 -48
  278. data/opal/opal/rspec/fixes/mocks.rb +0 -13
  279. data/opal/opal/rspec/fixes/reporter.rb +0 -12
  280. data/opal/opal/rspec/text_formatter.rb +0 -88
  281. data/spec_mri/integration/browser_spec.rb +0 -37
@@ -0,0 +1,81 @@
1
+ require 'rspec'
2
+ require 'json'
3
+
4
+ describe 'spec_opts' do
5
+ let(:rake_task) { 'other_specs' }
6
+ subject(:output) { `SPEC_OPTS="#{spec_opts}" rake #{rake_task}` }
7
+
8
+ RSpec.shared_context :color_test do |expected_pass|
9
+ it {
10
+ matcher = match Regexp.new Regexp.escape("\e[32m1 example, 0 failures\e[0m")
11
+ exp = is_expected
12
+ expected_pass ? exp.to(matcher) : exp.to_not(matcher)
13
+ }
14
+ end
15
+
16
+ context 'color set' do
17
+ let(:spec_opts) { '--color' }
18
+
19
+ include_context :color_test, true
20
+ end
21
+
22
+ context 'no color explicitly set' do
23
+ let(:spec_opts) { '--no-color' }
24
+ let(:rake_task) { 'color_on_by_default' }
25
+
26
+ it { is_expected.to match /1 example, 0 failures/ }
27
+
28
+ include_context :color_test, false
29
+ end
30
+
31
+ context 'formatter set' do
32
+ let(:spec_opts) { '--format json' }
33
+ let(:expected_json_hash) do
34
+ {
35
+ 'examples' =>
36
+ [
37
+ {
38
+ 'description' => 'should eq 42',
39
+ 'full_description' => 'foobar should eq 42',
40
+ 'status' => 'passed',
41
+ 'file_path' => /\S+/,
42
+ 'line_number' => be_a(Fixnum),
43
+ 'run_time' => be_a(Float)}
44
+ ],
45
+ 'summary' => {
46
+ 'duration' => be_a(Float),
47
+ 'example_count' => 1,
48
+ 'failure_count' => 0,
49
+ 'pending_count' => 0
50
+ },
51
+ 'summary_line' => '1 example, 0 failures'
52
+ }
53
+ end
54
+
55
+ subject { JSON.parse(/(\{.*)/.match(output).captures[0]) }
56
+
57
+ it { is_expected.to include expected_json_hash }
58
+ end
59
+
60
+ context 'empty' do
61
+ let(:spec_opts) { '' }
62
+
63
+ it { is_expected.to match /1 example, 0 failures/ }
64
+
65
+ include_context :color_test, false
66
+ end
67
+
68
+ context 'requires and format' do
69
+ let(:spec_opts) { '--format TestFormatter --require formatter_dependency --require test_formatter' }
70
+
71
+ it { is_expected.to match /{"examples".*test formatter ran!/m }
72
+ end
73
+
74
+ context 'default' do
75
+ subject { `rake other_specs` }
76
+
77
+ it { is_expected.to match /1 example, 0 failures/ }
78
+
79
+ include_context :color_test, false
80
+ end
81
+ end
@@ -0,0 +1,35 @@
1
+ require 'rspec'
2
+ require 'capybara/rspec'
3
+ require 'capybara-webkit'
4
+
5
+ # Use Rack config exactly as shipped in the GEM
6
+ rack_path = File.join(File.dirname(__FILE__), 'rack/config.ru')
7
+ Capybara.app = Rack::Builder.new_from_string(File.read(rack_path))
8
+
9
+ describe 'Opal::RSpec::BrowserFormatter', type: :feature do
10
+ RSpec.shared_examples :browser do |driver, error_fetcher|
11
+ context "in #{driver}", driver: driver do
12
+ before do
13
+ visit '/'
14
+ # Specs should run in 12 seconds but in case Travis takes longer, provide some cushion
15
+ Capybara.default_wait_time = 40
16
+ end
17
+
18
+ after do
19
+ js_errors = error_fetcher[page]
20
+ puts "Javascript errors: #{js_errors}" if js_errors.any?
21
+ end
22
+
23
+ it 'matches test results' do
24
+ expect(page).to have_content '3 examples, 1 failure, 1 pending'
25
+ expect(page).to have_content 'group'
26
+ expect(page).to have_content 'a skipped example'
27
+ expect(page).to have_content 'a failed example'
28
+ end
29
+ end
30
+ end
31
+
32
+ # Travis version (4.x QT) might be causing this to fail
33
+ #include_examples :browser, :webkit, lambda { |page| page.driver.error_messages }
34
+ include_examples :browser, :selenium, lambda {|page| page.evaluate_script('window.jsErrors') }
35
+ end
@@ -0,0 +1,103 @@
1
+ require 'rspec'
2
+ require 'opal/rspec/cached_environment'
3
+ require 'opal/rspec/sprockets_environment'
4
+ require_relative 'temp_dir_helper'
5
+
6
+ describe Opal::RSpec::CachedEnvironment do
7
+ let(:pattern) { nil }
8
+ let(:exclude_pattern) { nil }
9
+ let(:files) { nil }
10
+ include_context :temp_dir
11
+
12
+ let(:original_env) { Opal::RSpec::SprocketsEnvironment.new pattern, exclude_pattern, files }
13
+
14
+ subject(:env) do
15
+ # in subject to allow contexts to execute before logic
16
+ original_env.add_spec_paths_to_sprockets
17
+ original_env.cached
18
+ end
19
+
20
+ describe '#get_opal_spec_requires' do
21
+ subject { env.get_opal_spec_requires.sort }
22
+
23
+ context '1 path' do
24
+ before do
25
+ create_dummy_spec_files 'spec/foobar/dummy_spec.rb', 'spec/foobar/ignored_spec.opal'
26
+ end
27
+
28
+ let(:pattern) { 'spec/foobar/**/*_spec.rb' }
29
+
30
+ it { is_expected.to eq ['dummy_spec'] }
31
+ end
32
+
33
+ context '2 paths, same root' do
34
+ before do
35
+ create_dummy_spec_files 'spec/foobar/dummy_spec.rb', 'spec/noway/other_spec.rb'
36
+ end
37
+
38
+ let(:pattern) { ['spec/foobar/**/*y_spec.rb', 'spec/noway/**/*_spec.rb'] }
39
+
40
+ it { is_expected.to eq ['foobar/dummy_spec', 'noway/other_spec'] }
41
+ end
42
+
43
+ context '2 paths, different root' do
44
+ before do
45
+ create_dummy_spec_files 'spec/foobar/dummy_spec.rb', 'other_path/other_spec.rb'
46
+ end
47
+
48
+ let(:pattern) { ['spec/foobar/**/*_spec.rb', 'other_path/**/*.rb'] }
49
+
50
+ it { is_expected.to eq ['dummy_spec', 'other_spec'] }
51
+ end
52
+
53
+ context 'specs in different paths, same name in middle dirs' do
54
+ before do
55
+ create_dummy_spec_files 'foobar/spec/something/dummy_spec.rb', 'spec/foobar/other_spec.rb'
56
+ end
57
+
58
+ let(:pattern) { ['foobar/spec/**/*_spec.rb', 'spec/foobar/other_spec.rb'] }
59
+
60
+ it { is_expected.to eq ['other_spec', 'something/dummy_spec'] }
61
+ end
62
+
63
+ context 'absolute path and relative path that are not in the same tree' do
64
+ before do
65
+ create_dummy_spec_files 'spec/foobar/dummy_spec.rb', 'stuff/bar/other_spec.rb'
66
+ end
67
+
68
+ let(:files) { FileList['spec/foobar/**/*_spec.rb', 'stuff/bar/other_spec.rb'] }
69
+
70
+ it { is_expected.to eq ['dummy_spec', 'other_spec'] }
71
+ end
72
+
73
+ context 'exclude pattern' do
74
+ before do
75
+ create_dummy_spec_files 'spec/foobar/hello1_spec.rb', 'spec/foobar/hello2_spec.rb', 'spec/foobar/bye1_spec.rb', 'spec/foobar/bye2_spec.rb'
76
+ end
77
+
78
+ let(:pattern) { 'spec/**/*_spec.rb' }
79
+
80
+ context 'single' do
81
+ let(:exclude_pattern) { '**/*/*1_spec.rb' }
82
+
83
+ it { is_expected.to eq ['foobar/bye2_spec', 'foobar/hello2_spec'] }
84
+ end
85
+
86
+ context 'multiple' do
87
+ let(:exclude_pattern) { ['**/*/*1_spec.rb', '**/*/bye*_spec.rb' ] }
88
+
89
+ it { is_expected.to eq ['foobar/hello2_spec'] }
90
+ end
91
+ end
92
+
93
+ context 'files' do
94
+ before do
95
+ create_dummy_spec_files 'spec/foobar/hello1_spec.rb', 'spec/foobar/hello2_spec.rb', 'spec/foobar/bye1_spec.rb', 'spec/foobar/bye2_spec.rb'
96
+ end
97
+
98
+ let(:files) { FileList['spec/**/h*_spec.rb'] }
99
+
100
+ it { is_expected.to eq ['hello1_spec', 'hello2_spec'] }
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,14 @@
1
+ describe Opal::RSpec::BrowserFormatter do
2
+ context 'group' do
3
+ it 'passes' do
4
+ expect(42).to eq 42
5
+ end
6
+
7
+ xit 'a skipped example' do
8
+ end
9
+
10
+ it 'a failed example' do
11
+ expect(42).to eq 43
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ require 'opal/rspec'
2
+
3
+ Opal::Processor.source_map_enabled = false
4
+
5
+ sprockets_env = Opal::RSpec::SprocketsEnvironment.new(spec_pattern='spec/mri/unit/opal/rspec/opal/browser_formatter_spec.rb')
6
+ run Opal::Server.new(sprockets: sprockets_env) { |s|
7
+ s.main = 'sprockets_runner_js_errors'
8
+ # sprockets_runner_js_errors will not be in the opal load path by default
9
+ s.append_path 'spec/mri/integration/rack'
10
+ sprockets_env.add_spec_paths_to_sprockets
11
+ s.debug = ENV['OPAL_DEBUG']
12
+ }
@@ -0,0 +1,245 @@
1
+ require 'rspec'
2
+ require 'opal/rspec/rake_task'
3
+ require 'rack'
4
+ require_relative 'temp_dir_helper'
5
+
6
+ describe Opal::RSpec::RakeTask do
7
+ include_context :temp_dir
8
+ let(:captured_opal_server) { {} }
9
+
10
+ RSpec::Matchers.define :invoke_runner do |expected, timeout_value=nil|
11
+ match do
12
+ invoked_runners == [{
13
+ type: expected,
14
+ timeout_value: timeout_value
15
+ }]
16
+ end
17
+ end
18
+
19
+ RSpec::Matchers.define :require_opal_specs do |matcher|
20
+ def actual
21
+ captured_opal_server[:server].sprockets.cached.get_opal_spec_requires
22
+ end
23
+
24
+ match do
25
+ matcher.matches? actual
26
+ end
27
+
28
+ failure_message do
29
+ matcher.failure_message
30
+ end
31
+
32
+ failure_message_when_negated do
33
+ matcher.failure_message_when_negated
34
+ end
35
+ end
36
+
37
+ RSpec::Matchers.define :append_opal_path do |expected_path|
38
+ def actual
39
+ captured_opal_server[:server].sprockets.paths
40
+ end
41
+
42
+ abs_expected = lambda { File.expand_path(expected_path) }
43
+
44
+ match do
45
+ actual.include? abs_expected.call
46
+ end
47
+
48
+ failure_message do
49
+ "Expected paths #{actual} to include #{abs_expected.call}"
50
+ end
51
+
52
+ failure_message_when_negated do
53
+ "Expected paths #{actual} to not include #{abs_expected.call}"
54
+ end
55
+ end
56
+
57
+ before do
58
+ if Rake::Task.tasks.map { |t| t.name }.include?(task_name.to_s) # Don't want prior examples to mess up state
59
+ task = Rake::Task[task_name]
60
+ task.clear
61
+ task.reenable
62
+ end
63
+ allow(Rack::Server).to receive(:start) do |config| # don't want to actually run specs
64
+ captured_opal_server[:server] = config[:app]
65
+ end
66
+ thread_double = instance_double Thread
67
+ allow(thread_double).to receive :kill
68
+ allow(Thread).to receive(:new) do |&block| # real threads would complicate specs
69
+ block.call
70
+ thread_double
71
+ end
72
+ allow(task_definition).to receive(:launch_phantom) do |timeout_value|
73
+ invoked_runners << {
74
+ type: :phantom,
75
+ timeout_value: timeout_value
76
+ }
77
+ nil
78
+ end
79
+ allow(task_definition).to receive(:launch_node) do
80
+ invoked_runners << {
81
+ type: :node,
82
+ timeout_value: nil
83
+ }
84
+ nil
85
+ end
86
+ expect(task_definition).to receive(:wait_for_server) if expected_to_run
87
+ end
88
+
89
+ let(:invoked_runners) { [] }
90
+ let(:task_name) { :foobar }
91
+ let(:expected_to_run) { true }
92
+
93
+ subject do
94
+ task = task_definition
95
+ Rake::Task[task_name].invoke
96
+ task
97
+ end
98
+
99
+ context 'default' do
100
+ let(:task_definition) do
101
+ Opal::RSpec::RakeTask.new(task_name)
102
+ end
103
+
104
+ before do
105
+ create_dummy_spec_files 'spec/something/dummy_spec.rb'
106
+ end
107
+
108
+ around do |example|
109
+ # in case we're running on travis, etc.
110
+ current_env_runner = ENV['RUNNER']
111
+ ENV['RUNNER'] = nil
112
+ example.run
113
+ ENV['RUNNER'] = current_env_runner
114
+ end
115
+
116
+ it { is_expected.to have_attributes pattern: nil }
117
+ it { is_expected.to append_opal_path 'spec' }
118
+ it { is_expected.to require_opal_specs eq ['something/dummy_spec'] }
119
+ it { is_expected.to invoke_runner :phantom }
120
+ end
121
+
122
+ context 'explicit runner' do
123
+ let(:task_definition) do
124
+ Opal::RSpec::RakeTask.new(task_name)
125
+ end
126
+
127
+ before do
128
+ ENV['RUNNER'] = nil
129
+ create_dummy_spec_files 'spec/something/dummy_spec.rb'
130
+ end
131
+
132
+ RSpec.shared_context :explicit do |expected_runner|
133
+ it { is_expected.to have_attributes pattern: nil }
134
+ it { is_expected.to append_opal_path 'spec' }
135
+ it { is_expected.to require_opal_specs eq ['something/dummy_spec'] }
136
+ it { is_expected.to invoke_runner expected_runner }
137
+ end
138
+
139
+ TEST_RUNNERS = [:phantom, :node]
140
+
141
+ context 'ENV' do
142
+ TEST_RUNNERS.each do |runner|
143
+ context runner do
144
+ before do
145
+ ENV['RUNNER'] = runner.to_s
146
+ end
147
+
148
+ include_context :explicit, runner
149
+ end
150
+ end
151
+ end
152
+
153
+ context 'Rake task' do
154
+ TEST_RUNNERS.each do |runner|
155
+ context runner do
156
+ before do
157
+ task_definition.runner = runner
158
+ end
159
+
160
+ include_context :explicit, runner
161
+ end
162
+ end
163
+ end
164
+ end
165
+
166
+ context 'pattern' do
167
+ let(:task_definition) do
168
+ Opal::RSpec::RakeTask.new(task_name) do |server, task|
169
+ task.pattern = 'spec/other/**/*_spec.rb'
170
+ end
171
+ end
172
+
173
+ before do
174
+ create_dummy_spec_files 'spec/other/dummy_spec.rb'
175
+ end
176
+
177
+ it { is_expected.to have_attributes pattern: 'spec/other/**/*_spec.rb' }
178
+ it { is_expected.to append_opal_path 'spec/other' }
179
+ it { is_expected.to_not append_opal_path 'spec' }
180
+ it { is_expected.to require_opal_specs eq ['dummy_spec'] }
181
+ end
182
+
183
+ context 'files' do
184
+ let(:task_definition) do
185
+ Opal::RSpec::RakeTask.new(task_name) do |server, task|
186
+ task.files = FileList['spec/other/**/*_spec.rb']
187
+ end
188
+ end
189
+
190
+ before do
191
+ create_dummy_spec_files 'spec/other/dummy_spec.rb'
192
+ end
193
+
194
+ it { is_expected.to have_attributes files: FileList['spec/other/**/*_spec.rb'] }
195
+ it { is_expected.to_not append_opal_path 'spec' }
196
+ it { is_expected.to append_opal_path 'spec/other' }
197
+ it { is_expected.to require_opal_specs eq ['dummy_spec'] }
198
+ end
199
+
200
+ context 'pattern and files' do
201
+ let(:expected_to_run) { false }
202
+
203
+ let(:task_definition) do
204
+ Opal::RSpec::RakeTask.new(task_name) do |server, task|
205
+ task.files = FileList['spec/other/**/*_spec.rb', 'util/**/*.rb']
206
+ task.pattern = 'spec/opal/**/*hooks_spec.rb'
207
+ end
208
+ end
209
+
210
+ subject do
211
+ lambda {
212
+ task = task_definition
213
+ Rake::Task[task_name].invoke
214
+ task
215
+ }
216
+ end
217
+
218
+ it { is_expected.to raise_exception 'Cannot supply both a pattern and files!' }
219
+ end
220
+
221
+ context 'custom timeout value' do
222
+ let(:task_definition) do
223
+ Opal::RSpec::RakeTask.new(task_name) do |server, task|
224
+ task.timeout = 40000
225
+ end
226
+ end
227
+
228
+ before do
229
+ create_dummy_spec_files 'spec/something/dummy_spec.rb'
230
+ end
231
+
232
+ around do |example|
233
+ # in case we're running on travis, etc.
234
+ current_env_runner = ENV['RUNNER']
235
+ ENV['RUNNER'] = nil
236
+ example.run
237
+ ENV['RUNNER'] = current_env_runner
238
+ end
239
+
240
+ it { is_expected.to have_attributes pattern: nil }
241
+ it { is_expected.to append_opal_path 'spec' }
242
+ it { is_expected.to require_opal_specs eq ['something/dummy_spec'] }
243
+ it { is_expected.to invoke_runner :phantom, timeout_value=40000 }
244
+ end
245
+ end