jasmine 2.0.0.rc2 → 2.0.0.rc3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +9 -11
  3. data/Gemfile +4 -2
  4. data/HOW_TO_TEST.markdown +1 -1
  5. data/README.markdown +23 -14
  6. data/RELEASE.markdown +6 -13
  7. data/Rakefile +21 -23
  8. data/jasmine.gemspec +9 -16
  9. data/{generators/jasmine/templates/jasmine-example/spec → lib/generators/jasmine/examples/templates/spec/javascripts/helpers/jasmine_examples}/SpecHelper.js +0 -0
  10. data/lib/generators/jasmine/examples/templates/spec/javascripts/jasmine_examples/PlayerSpec.js +1 -1
  11. data/lib/generators/jasmine/install/templates/spec/javascripts/support/jasmine.yml +15 -2
  12. data/lib/generators/jasmine/install/templates/spec/javascripts/support/jasmine_helper.rb +2 -2
  13. data/lib/jasmine.rb +5 -7
  14. data/lib/jasmine/asset_bundle.rb +9 -10
  15. data/lib/jasmine/command_line_install.txt +13 -0
  16. data/lib/jasmine/command_line_tool.rb +100 -58
  17. data/lib/jasmine/config.rb +25 -13
  18. data/lib/jasmine/configuration.rb +21 -16
  19. data/lib/jasmine/dependencies.rb +1 -1
  20. data/lib/jasmine/formatters/console.rb +21 -13
  21. data/lib/jasmine/formatters/exit_code.rb +21 -0
  22. data/lib/jasmine/formatters/multi.rb +25 -0
  23. data/lib/jasmine/result.rb +46 -0
  24. data/lib/jasmine/run.html.erb +3 -1
  25. data/lib/jasmine/runners/phantom_jasmine_run.js +54 -0
  26. data/lib/jasmine/runners/phantom_js.rb +29 -0
  27. data/lib/jasmine/tasks/jasmine.rake +42 -21
  28. data/lib/jasmine/version.rb +1 -1
  29. data/spec/configuration_spec.rb +34 -72
  30. data/spec/fixture/coffee_spec.coffee +3 -0
  31. data/spec/fixture/failing_runner.rb +9 -0
  32. data/spec/fixture/failing_test.js +5 -0
  33. data/spec/fixture/large_test_suite_spec.js +20 -0
  34. data/spec/jasmine_command_line_tool_spec.rb +94 -52
  35. data/spec/jasmine_pojs_spec.rb +37 -21
  36. data/spec/jasmine_rails_spec.rb +89 -49
  37. data/spec/lib/jasmine/formatters/console_spec.rb +50 -35
  38. data/spec/lib/jasmine/formatters/multi_spec.rb +17 -0
  39. data/spec/performance/phantom_js_runner_performance_spec.rb +23 -0
  40. data/spec/result_spec.rb +34 -0
  41. data/spec/spec_helper.rb +40 -16
  42. metadata +34 -84
  43. data/generators/jasmine/jasmine_generator.rb +0 -25
  44. data/generators/jasmine/templates/INSTALL +0 -9
  45. data/generators/jasmine/templates/jasmine-example/spec/PlayerSpec.js +0 -58
  46. data/generators/jasmine/templates/jasmine-example/src/Player.js +0 -22
  47. data/generators/jasmine/templates/jasmine-example/src/Song.js +0 -7
  48. data/generators/jasmine/templates/lib/tasks/jasmine.rake +0 -8
  49. data/generators/jasmine/templates/spec/javascripts/support/jasmine-rails.yml +0 -81
  50. data/generators/jasmine/templates/spec/javascripts/support/jasmine.yml +0 -88
  51. data/generators/jasmine/templates/spec/javascripts/support/jasmine_helper.rb +0 -12
  52. data/lib/generators/jasmine/examples/templates/spec/javascripts/helpers/SpecHelper.js +0 -15
  53. data/lib/jasmine/firebug/firebug-1.6.2.xpi +0 -0
  54. data/lib/jasmine/firebug/firebug-1.7.0.xpi +0 -0
  55. data/lib/jasmine/firebug/firebug-license.txt +0 -30
  56. data/lib/jasmine/firebug/firebug.rb +0 -30
  57. data/lib/jasmine/formatters/base.rb +0 -9
  58. data/lib/jasmine/formatters/junit_xml.rb +0 -47
  59. data/lib/jasmine/reporters/api_reporter.rb +0 -38
  60. data/lib/jasmine/results.rb +0 -38
  61. data/lib/jasmine/results_processor.rb +0 -38
  62. data/lib/jasmine/run_specs.rb +0 -33
  63. data/lib/jasmine/runners/http.rb +0 -33
  64. data/lib/jasmine/selenium_driver.rb +0 -45
  65. data/spec/asset_expander_spec.rb +0 -13
  66. data/spec/asset_pipeline_mapper_spec.rb +0 -19
  67. data/spec/jasmine_command_line_tool_rakeless_spec.rb +0 -20
  68. data/spec/lib/jasmine/formatters/base_spec.rb +0 -9
  69. data/spec/lib/jasmine/formatters/junit_xml_spec.rb +0 -55
  70. data/spec/lib/jasmine/reporters/api_reporter_spec.rb +0 -53
  71. data/spec/lib/jasmine/runners/http_spec.rb +0 -21
  72. data/spec/results_processor_spec.rb +0 -3
  73. data/spec/results_spec.rb +0 -69
  74. data/spec/support/fake_selenium_driver.rb +0 -35
@@ -1,38 +0,0 @@
1
- module Jasmine
2
- module Reporters
3
- #TODO: where does this live?
4
- class ApiReporter < Struct.new(:driver, :batch_size)
5
- STARTED_JS = "return jsApiReporter && jsApiReporter.started"
6
- FINISHED_JS = "return jsApiReporter && jsApiReporter.finished"
7
-
8
- def started?
9
- driver.eval_js STARTED_JS
10
- end
11
-
12
- def finished?
13
- driver.eval_js FINISHED_JS
14
- end
15
-
16
- def results
17
- index = 0
18
- spec_results = []
19
-
20
- loop do
21
- slice = get_results_slice(index)
22
- spec_results << slice
23
- index += batch_size
24
-
25
- break if slice.size < batch_size
26
- end
27
-
28
- spec_results.flatten
29
- end
30
-
31
- private
32
-
33
- def get_results_slice(index)
34
- driver.eval_js("return jsApiReporter.specResults(#{index}, #{batch_size})")
35
- end
36
- end
37
- end
38
- end
@@ -1,38 +0,0 @@
1
- module Jasmine
2
- class Results
3
- attr_reader :results
4
-
5
- def initialize(raw_results)
6
- @results = raw_results.map {|raw| Result.new(raw) }
7
- end
8
-
9
- def failures
10
- @results.select { |result|
11
- result.status == "failed"
12
- }
13
- end
14
-
15
- def pending_specs
16
- @results.select { |result|
17
- result.status == "pending"
18
- }
19
- end
20
-
21
- def size
22
- @results.size
23
- end
24
-
25
- class Result < OpenStruct
26
- def full_name
27
- fullName
28
- end
29
-
30
- def failed_expectations
31
- failedExpectations.map { |e|
32
- short_stack = e["stack"].split("\n").slice(0, 7).join("\n")
33
- OpenStruct.new(:message => e["message"], :stack => short_stack)
34
- }
35
- end
36
- end
37
- end
38
- end
@@ -1,38 +0,0 @@
1
- module Jasmine
2
- class ResultsProcessor
3
-
4
- def initialize(config)
5
- @config = config
6
- end
7
-
8
- def process(results_hash, suites_hash)
9
- Jasmine::Results.new(results_hash, suites_hash, example_locations)
10
- end
11
-
12
- def example_locations
13
- # example_locations = {}
14
- # example_name_parts = []
15
- # previous_indent_level = 0
16
- # @config.spec_files_full_paths.each do |filename|
17
- # line_number = 1
18
- # File.open(filename, "r") do |file|
19
- # file.readlines.each do |line|
20
- # match = /^(\s*)(describe|it)\s*\(\s*["'](.*)["']\s*,\s*function/.match(line)
21
- # if (match)
22
- # indent_level = match[1].length / 2
23
- # example_name = match[3]
24
- # example_name_parts[indent_level] = example_name
25
-
26
- # full_example_name = example_name_parts.slice(0, indent_level + 1).join(" ")
27
- # example_locations[full_example_name] = "#{filename}:#{line_number}: in `it'"
28
- # end
29
- # line_number += 1
30
- # end
31
- # end
32
- # end
33
- # example_locations
34
- {}
35
- end
36
-
37
- end
38
- end
@@ -1,33 +0,0 @@
1
- $:.unshift(ENV['JASMINE_GEM_PATH']) if ENV['JASMINE_GEM_PATH'] # for gem testing purposes
2
-
3
- require 'rubygems'
4
- require 'jasmine'
5
- require 'rspec'
6
-
7
- Jasmine.load_configuration_from_yaml
8
-
9
- config = Jasmine.config
10
-
11
- server = Jasmine::Server.new(config.port, Jasmine::Application.app(config))
12
- driver = Jasmine::SeleniumDriver.new(config.browser, "#{config.host}:#{config.port}/")
13
- t = Thread.new do
14
- begin
15
- server.start
16
- rescue ChildProcess::TimeoutError
17
- end
18
- # # ignore bad exits
19
- end
20
- t.abort_on_exception = true
21
- Jasmine::wait_for_listener(config.port, 'jasmine server')
22
- puts 'jasmine server started.'
23
-
24
- reporter = Jasmine::Reporters::ApiReporter.new(driver, config.result_batch_size)
25
- raw_results = Jasmine::Runners::HTTP.new(driver, reporter).run
26
- results = Jasmine::Results.new(raw_results)
27
-
28
- config.formatters.each do |formatter_class|
29
- formatter = formatter_class.new(results)
30
- formatter.format()
31
- end
32
-
33
- exit results.failures.size
@@ -1,33 +0,0 @@
1
- module Jasmine
2
- module Runners
3
- class HTTP < Struct.new(:driver, :reporter)
4
- def run
5
- driver.connect
6
- ensure_connection_established
7
- wait_for_suites_to_finish_running
8
-
9
- results = reporter.results
10
-
11
- driver.disconnect
12
- results
13
- end
14
-
15
- private
16
-
17
- def ensure_connection_established
18
- started = Time.now
19
- until reporter.started? do
20
- raise "couldn't connect to Jasmine after 60 seconds" if (started + 60 < Time.now)
21
- sleep 0.1
22
- end
23
- end
24
-
25
- def wait_for_suites_to_finish_running
26
- puts "Waiting for suite to finish in browser ..."
27
- until reporter.finished? do
28
- sleep 0.1
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,45 +0,0 @@
1
- module Jasmine
2
- require 'json'
3
- class SeleniumDriver
4
- def initialize(browser, http_address)
5
- require 'selenium-webdriver'
6
-
7
- selenium_server = if Jasmine.config.selenium_server
8
- Jasmine.config.selenium_server
9
- elsif Jasmine.config.selenium_server_port
10
- "http://localhost:#{Jasmine.config.selenium_server_port}/wd/hub"
11
- end
12
- options = if browser == 'firefox-firebug'
13
- require File.join(File.dirname(__FILE__), 'firebug/firebug')
14
- (profile = Selenium::WebDriver::Firefox::Profile.new)
15
- profile.enable_firebug
16
- {:profile => profile}
17
- end || {}
18
- @driver = if Jasmine.config.webdriver
19
- Jasmine.config.webdriver
20
- elsif selenium_server
21
- Selenium::WebDriver.for :remote, :url => selenium_server, :desired_capabilities => browser.to_sym
22
- else
23
- Selenium::WebDriver.for browser.to_sym, options
24
- end
25
- @http_address = http_address
26
- end
27
-
28
- def connect
29
- @driver.navigate.to @http_address
30
- end
31
-
32
- def disconnect
33
- @driver.quit
34
- end
35
-
36
- def eval_js(script)
37
- result = @driver.execute_script(script)
38
- JSON.parse("{\"result\":#{result.to_json}}", :max_nesting => false)['result']
39
- end
40
-
41
- def json_generate(obj)
42
- JSON.generate(obj)
43
- end
44
- end
45
- end
@@ -1,13 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Jasmine::AssetExpander do
4
- it "expands asset files" do
5
- bundled_asset = double(:bundled_asset, :assets => ['asset1_path', 'asset2_path'])
6
- bundled_asset_factory = double(:bundled_asset_factory)
7
- bundled_asset_factory.should_receive(:new).with('asset_file').and_return(bundled_asset)
8
- expander = Jasmine::AssetExpander.new(bundled_asset_factory)
9
- expanded_assets = expander.expand('/some_src_dir', 'asset_file')
10
- expanded_assets.should == ['/asset1_path?body=true',
11
- '/asset2_path?body=true']
12
- end
13
- end
@@ -1,19 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Jasmine::AssetPipelineMapper do
4
- it "expands asset paths if available" do
5
- expander = lambda do |dir, path|
6
- if dir == "/some_location/" && path == 'asset1'
7
- ['asset1', 'asset2']
8
- elsif dir == "/some_location/" && path == 'asset2'
9
- ['asset1', 'asset3']
10
- end
11
-
12
- end
13
- config = double(:config, :src_dir => "/some_location/")
14
-
15
- mapper = Jasmine::AssetPipelineMapper.new(config, expander)
16
-
17
- mapper.map_src_paths(['asset1', 'asset2', 'asset4']).should == ['asset1', 'asset2', 'asset3', 'asset4']
18
- end
19
- end
@@ -1,20 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "Jasmine command line tool" do
4
- context "when rake has not been required yet" do
5
- before :each do
6
- temp_dir_before
7
- Dir::chdir @tmp
8
- end
9
-
10
- after :each do
11
- temp_dir_after
12
- end
13
-
14
- it "should append to an existing Rakefile" do
15
- FileUtils.cp("#{@old_dir}/spec/fixture/Rakefile", @tmp)
16
- output = capture_stdout { Jasmine::CommandLineTool.new.process ["init"] }
17
- output.should =~ /Jasmine has been installed with example specs./
18
- end
19
- end
20
- end
@@ -1,9 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Jasmine::Formatters::BaseFormatter do
4
- it 'raises an error on summary to teach people a lesson' do
5
- expect {
6
- Jasmine::Formatters::BaseFormatter.new.format
7
- }.to(raise_error(NotImplementedError))
8
- end
9
- end
@@ -1,55 +0,0 @@
1
- require 'spec_helper'
2
- require 'nokogiri'
3
-
4
- describe Jasmine::Formatters::JUnitXml do
5
- describe '#summary' do
6
- describe 'when the full suite passes' do
7
- it 'shows the spec counts' do
8
- results = OpenStruct.new(:size => 1, :failures => [], :pending_specs => [],
9
- :results => [passing_result(fullName: 'Passing test', description: 'test')])
10
- subject = Jasmine::Formatters::JUnitXml.new(results)
11
-
12
- xml = Nokogiri::XML(subject.summary)
13
-
14
- testsuite = xml.xpath('/testsuites/testsuite').first
15
- testsuite['tests'].should == '1'
16
- testsuite['failures'].should == '0'
17
- testsuite['name'].should == 'Passing'
18
-
19
- xml.xpath('//testcase').size.should == 1
20
- xml.xpath('//testcase').first['name'].should == 'test'
21
- end
22
- end
23
-
24
- describe 'when there are failures' do
25
- it 'shows the spec counts' do
26
- results = OpenStruct.new(:size => 2, :failures => [failing_result], :pending_specs=> [],
27
- :results => [passing_result, failing_result])
28
- subject = Jasmine::Formatters::JUnitXml.new(results)
29
-
30
- xml = Nokogiri::XML(subject.summary)
31
-
32
- testsuite = xml.xpath('/testsuites/testsuite').first
33
- testsuite['tests'].should == '1'
34
- testsuite['failures'].should == '0'
35
-
36
- testsuite = xml.xpath('/testsuites/testsuite')[1]
37
- testsuite['tests'].should == '1'
38
- testsuite['failures'].should == '1'
39
-
40
- xml.xpath('//testcase').size.should == 2
41
- xml.xpath('//testcase/failure').size.should == 1
42
- xml.xpath('//testcase/failure').first['message'].should == 'a failure message'
43
- xml.xpath('//testcase/failure').first.content.should == 'a stack trace'
44
- end
45
- end
46
- end
47
-
48
- def failing_result(options = {})
49
- Jasmine::Results::Result.new(failing_raw_result.merge(options))
50
- end
51
-
52
- def passing_result(options = {})
53
- Jasmine::Results::Result.new(passing_raw_result.merge(options))
54
- end
55
- end
@@ -1,53 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Jasmine::Reporters::ApiReporter do
4
- let(:driver) { FakeSeleniumDriver.new }
5
- let(:batch_size) { 3 }
6
- subject { Jasmine::Reporters::ApiReporter.new(driver, batch_size) }
7
-
8
- describe '#started?' do
9
- it "reflects that Jasmine has started" do
10
- driver.should_receive(:eval_js).with(Jasmine::Reporters::ApiReporter::STARTED_JS).and_return(false)
11
-
12
- driver.start
13
-
14
- subject.should_not be_started
15
-
16
- driver.should_receive(:eval_js).with(Jasmine::Reporters::ApiReporter::STARTED_JS).and_return(true)
17
-
18
- driver.start
19
-
20
- subject.should be_started
21
- end
22
- end
23
-
24
- describe '#finished?' do
25
- it "reflects that Jasmine has finished" do
26
- driver.should_receive(:eval_js).with(Jasmine::Reporters::ApiReporter::FINISHED_JS).and_return(false)
27
-
28
- subject.should_not be_finished
29
-
30
- driver.should_receive(:eval_js).with(Jasmine::Reporters::ApiReporter::FINISHED_JS).and_return(true)
31
-
32
- driver.finish
33
-
34
- subject.should be_finished
35
- end
36
- end
37
-
38
- describe "#results" do
39
- it "gets all of the results" do
40
- driver.should_receive(:eval_js).with("return jsApiReporter.specResults(0, 3)").and_return(driver.results.slice(0, 3))
41
- driver.should_receive(:eval_js).with("return jsApiReporter.specResults(3, 3)").and_return(driver.results.slice(3, 4))
42
-
43
- results = subject.results
44
-
45
- results.size.should == 4
46
- results[0]['id'].should == 1
47
- results[1]['id'].should == 2
48
- results[2]['id'].should == 3
49
- results[3]['id'].should == 4
50
- end
51
- end
52
-
53
- end
@@ -1,21 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Jasmine::Runners::HTTP do
4
- let(:driver) { FakeSeleniumDriver.new }
5
- let(:batch_size) { 3 }
6
- let(:reporter) { Jasmine::Reporters::ApiReporter.new(driver, batch_size) }
7
- subject { Jasmine::Runners::HTTP.new(driver, reporter) }
8
-
9
- describe '#run' do
10
- it "gets the results from the Jasmine HTML page" do
11
- driver.should_receive(:connect)
12
- driver.should_receive(:disconnect)
13
- reporter.should_receive(:results).and_return(driver.results)
14
- reporter.stub(:started?).and_return(true)
15
- reporter.stub(:finished?).and_return(true)
16
-
17
- results = subject.run
18
- results.size.should == 4
19
- end
20
- end
21
- end
@@ -1,3 +0,0 @@
1
- describe Jasmine::ResultsProcessor do
2
-
3
- end
data/spec/results_spec.rb DELETED
@@ -1,69 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Jasmine::Results do
4
- describe "#failures" do
5
- it "should report all the failing spec" do
6
- subject = Jasmine::Results.new([failing_raw_result, failing_raw_result])
7
- subject.failures.size.should == 2
8
-
9
- subject = Jasmine::Results.new([failing_raw_result, passing_raw_result])
10
- subject.failures.size.should == 1
11
- end
12
- end
13
-
14
- describe "#pending_specs" do
15
- it "should report all the pending specs" do
16
- subject = Jasmine::Results.new([pending_raw_result, pending_raw_result])
17
- subject.pending_specs.size.should == 2
18
-
19
- subject = Jasmine::Results.new([pending_raw_result, passing_raw_result])
20
- subject.pending_specs.size.should == 1
21
- end
22
- end
23
-
24
- describe "#size" do
25
- it "should report the spec count" do
26
- subject = Jasmine::Results.new([failing_raw_result, failing_raw_result])
27
- subject.size.should == 2
28
-
29
- subject = Jasmine::Results.new([failing_raw_result])
30
- subject.size.should == 1
31
- end
32
- end
33
-
34
- end
35
-
36
- describe Jasmine::Results::Result do
37
- describe "data accessors" do
38
- it "delegates to raw results" do
39
- result = Jasmine::Results::Result.new("status" => "failed")
40
- result.status.should == "failed"
41
- end
42
-
43
- it "remaps important camelCase names to snake_case" do
44
- result = Jasmine::Results::Result.new(failing_raw_result)
45
- result.full_name.should == "a suite with a failing spec"
46
- end
47
-
48
- it "exposes failed expectations" do
49
- result = Jasmine::Results::Result.new(failing_raw_result)
50
-
51
- expectation = result.failed_expectations[0]
52
- expectation.message.should == "a failure message"
53
- expectation.stack.should == "a stack trace"
54
- end
55
-
56
- it "exposes only the last 7 lines of the stack trace" do
57
- raw_result = failing_raw_result
58
- raw_result["failedExpectations"][0]["stack"] = "1\n2\n3\n4\n5\n6\n7\n8\n9"
59
-
60
- result = Jasmine::Results::Result.new(raw_result)
61
- expectation = result.failed_expectations[0].stack
62
- expectation.should match(/1/)
63
- expectation.should match(/7/)
64
- expectation.should_not match(/8/)
65
- expectation.should_not match(/9/)
66
- end
67
- end
68
- end
69
-