jasmine 2.0.0 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +3 -0
- data/lib/generators/jasmine/install/templates/spec/javascripts/support/jasmine.yml +13 -1
- data/lib/jasmine/application.rb +2 -2
- data/lib/jasmine/base.rb +1 -1
- data/lib/jasmine/command_line_tool.rb +4 -4
- data/lib/jasmine/config.rb +4 -0
- data/lib/jasmine/configuration.rb +13 -5
- data/lib/jasmine/dependencies.rb +1 -1
- data/lib/jasmine/formatters/console.rb +17 -3
- data/lib/jasmine/path_expander.rb +5 -1
- data/lib/jasmine/path_mapper.rb +11 -2
- data/lib/jasmine/railtie.rb +1 -1
- data/lib/jasmine/runners/phantom_boot.js +11 -0
- data/lib/jasmine/runners/phantom_jasmine_run.js +8 -44
- data/lib/jasmine/runners/phantom_js.rb +10 -3
- data/lib/jasmine/server.rb +3 -2
- data/lib/jasmine/tasks/jasmine.rake +18 -15
- data/lib/jasmine/version.rb +1 -1
- data/lib/jasmine/yaml_config_parser.rb +7 -0
- data/spec/application_spec.rb +11 -1
- data/spec/configuration_spec.rb +19 -3
- data/spec/fixture/exception_test.js +1 -0
- data/spec/jasmine_command_line_tool_spec.rb +19 -0
- data/spec/jasmine_rails_spec.rb +39 -5
- data/spec/lib/jasmine/formatters/console_spec.rb +11 -6
- data/spec/path_expander_spec.rb +17 -0
- data/spec/server_spec.rb +7 -0
- metadata +52 -23
- checksums.yaml +0 -7
data/.travis.yml
CHANGED
@@ -25,7 +25,7 @@ src_files:
|
|
25
25
|
# - stylesheets/*.css
|
26
26
|
#
|
27
27
|
stylesheets:
|
28
|
-
-
|
28
|
+
- assets/application.css
|
29
29
|
|
30
30
|
# helpers
|
31
31
|
#
|
@@ -110,3 +110,15 @@ boot_dir:
|
|
110
110
|
#
|
111
111
|
boot_files:
|
112
112
|
|
113
|
+
# rack_options
|
114
|
+
#
|
115
|
+
# Extra options to be passed to the rack server
|
116
|
+
# by default, Port and AccessLog are passed.
|
117
|
+
#
|
118
|
+
# This is an advanced options, and left empty by default
|
119
|
+
#
|
120
|
+
# EXAMPLE
|
121
|
+
#
|
122
|
+
# rack_options:
|
123
|
+
# server: 'thin'
|
124
|
+
|
data/lib/jasmine/application.rb
CHANGED
@@ -9,8 +9,8 @@ require 'ostruct'
|
|
9
9
|
module Jasmine
|
10
10
|
class Application
|
11
11
|
def self.app(config, builder = Rack::Builder.new)
|
12
|
-
config.rack_apps.each do |
|
13
|
-
builder.use(app, &
|
12
|
+
config.rack_apps.each do |app_config|
|
13
|
+
builder.use(app_config[:app], *app_config[:args], &app_config[:block])
|
14
14
|
end
|
15
15
|
config.rack_path_map.each do |path, handler|
|
16
16
|
builder.map(path) { run handler.call }
|
data/lib/jasmine/base.rb
CHANGED
@@ -5,7 +5,7 @@ module Jasmine
|
|
5
5
|
def process(argv)
|
6
6
|
@argv = argv
|
7
7
|
|
8
|
-
if respond_to?(@argv[0])
|
8
|
+
if @argv.size > 0 && respond_to?(@argv[0])
|
9
9
|
public_send(@argv[0])
|
10
10
|
else
|
11
11
|
print_help
|
@@ -50,7 +50,7 @@ module Jasmine
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def print_help
|
53
|
-
puts "unknown command #{@argv.join(' ')}"
|
53
|
+
puts "unknown command #{@argv.join(' ')}" unless @argv.empty?
|
54
54
|
puts "Usage: jasmine init"
|
55
55
|
puts " examples"
|
56
56
|
puts " copy_boot_js"
|
@@ -76,7 +76,7 @@ module Jasmine
|
|
76
76
|
FileUtils.mkdir_p(File.dirname(dest_path))
|
77
77
|
FileUtils.copy(source_path, dest_path)
|
78
78
|
if File.basename(dest_path) == 'jasmine.yml'
|
79
|
-
replaced = File.read(dest_path).gsub("assets/application.js", "public/javascripts/**/*.js")
|
79
|
+
replaced = File.read(dest_path).gsub("assets/application.js", "public/javascripts/**/*.js").gsub("assets/application.css", "stylesheets/**/*.css")
|
80
80
|
File.open(dest_path, 'w') do |file|
|
81
81
|
file.write(replaced)
|
82
82
|
end
|
@@ -94,7 +94,7 @@ module Jasmine
|
|
94
94
|
puts <<-EOF
|
95
95
|
|
96
96
|
You're attempting to run jasmine init in a Rails project. You probably want to use the Rails generator like so:
|
97
|
-
rails g jasmine:
|
97
|
+
rails g jasmine:install
|
98
98
|
|
99
99
|
If you're not actually in a Rails application, just run this command again with --force
|
100
100
|
jasmine init --force
|
data/lib/jasmine/config.rb
CHANGED
@@ -17,6 +17,7 @@ module Jasmine
|
|
17
17
|
@config.src_path = src_path = '/'
|
18
18
|
@config.spec_path = spec_path = '/__spec__'
|
19
19
|
@config.boot_path = boot_path = '/__boot__'
|
20
|
+
@config.runner_boot_path = runner_boot_path = '/__runner_boot__'
|
20
21
|
@config.image_path = image_path = '/__images__'
|
21
22
|
|
22
23
|
@config.jasmine_dir = core_config.path
|
@@ -26,6 +27,7 @@ module Jasmine
|
|
26
27
|
@config.jasmine_css_files = lambda { core_config.css_files }
|
27
28
|
@config.add_rack_path(jasmine_path, lambda { Rack::File.new(config.jasmine_dir) })
|
28
29
|
@config.add_rack_path(boot_path, lambda { Rack::File.new(config.boot_dir) })
|
30
|
+
@config.add_rack_path(runner_boot_path, lambda { Rack::File.new(config.runner_boot_dir) })
|
29
31
|
if Jasmine::Dependencies.use_asset_pipeline?
|
30
32
|
@config.add_rack_path(spec_path, lambda {
|
31
33
|
sprockets_spec_env = Sprockets::Environment.new
|
@@ -96,6 +98,8 @@ module Jasmine
|
|
96
98
|
|
97
99
|
config.spec_dir = yaml_config.spec_dir
|
98
100
|
config.spec_files = lambda { yaml_config.helpers + yaml_config.spec_files }
|
101
|
+
|
102
|
+
config.rack_options = yaml_config.rack_options
|
99
103
|
end
|
100
104
|
require yaml_config.spec_helper if File.exist?(yaml_config.spec_helper)
|
101
105
|
else
|
@@ -1,13 +1,14 @@
|
|
1
1
|
module Jasmine
|
2
2
|
class Configuration
|
3
3
|
attr_writer :jasmine_css_files, :css_files
|
4
|
-
attr_writer :jasmine_files, :boot_files, :src_files, :spec_files
|
5
|
-
attr_accessor :jasmine_path, :spec_path, :boot_path, :src_path, :image_path
|
6
|
-
attr_accessor :jasmine_dir, :spec_dir, :boot_dir, :src_dir, :images_dir
|
4
|
+
attr_writer :jasmine_files, :boot_files, :src_files, :spec_files, :runner_boot_files
|
5
|
+
attr_accessor :jasmine_path, :spec_path, :boot_path, :src_path, :image_path, :runner_boot_path
|
6
|
+
attr_accessor :jasmine_dir, :spec_dir, :boot_dir, :src_dir, :images_dir, :runner_boot_dir
|
7
7
|
attr_accessor :formatters
|
8
8
|
attr_accessor :host
|
9
9
|
attr_accessor :spec_format
|
10
10
|
attr_accessor :runner
|
11
|
+
attr_accessor :rack_options
|
11
12
|
|
12
13
|
def initialize()
|
13
14
|
@rack_paths = {}
|
@@ -17,9 +18,11 @@ module Jasmine
|
|
17
18
|
@css_files = lambda { [] }
|
18
19
|
@jasmine_files = lambda { [] }
|
19
20
|
@boot_files = lambda { [] }
|
21
|
+
@runner_boot_files = lambda { [] }
|
20
22
|
@src_files = lambda { [] }
|
21
23
|
@spec_files = lambda { [] }
|
22
24
|
@runner = lambda { |config| }
|
25
|
+
@rack_options = {}
|
23
26
|
|
24
27
|
@formatters = [Jasmine::Formatters::Console]
|
25
28
|
|
@@ -34,6 +37,7 @@ module Jasmine
|
|
34
37
|
def js_files
|
35
38
|
map(@jasmine_files, :jasmine) +
|
36
39
|
map(@boot_files, :boot) +
|
40
|
+
map(@runner_boot_files, :runner_boot) +
|
37
41
|
map(@src_files, :src) +
|
38
42
|
map(@spec_files, :spec)
|
39
43
|
end
|
@@ -50,8 +54,12 @@ module Jasmine
|
|
50
54
|
[] + @apps
|
51
55
|
end
|
52
56
|
|
53
|
-
def add_rack_app(app, &block)
|
54
|
-
@apps <<
|
57
|
+
def add_rack_app(app, *args, &block)
|
58
|
+
@apps << {
|
59
|
+
:app => app,
|
60
|
+
:args => args,
|
61
|
+
:block => block
|
62
|
+
}
|
55
63
|
end
|
56
64
|
|
57
65
|
def add_path_mapper(mapper)
|
data/lib/jasmine/dependencies.rb
CHANGED
@@ -1,17 +1,19 @@
|
|
1
1
|
module Jasmine
|
2
2
|
module Formatters
|
3
3
|
class Console
|
4
|
-
def initialize(outputter = Kernel
|
4
|
+
def initialize(outputter = Kernel)
|
5
5
|
@results = []
|
6
6
|
@outputter = outputter
|
7
7
|
end
|
8
8
|
|
9
9
|
def format(results_batch)
|
10
|
-
outputter.
|
10
|
+
outputter.print(chars(results_batch))
|
11
11
|
@results += results_batch
|
12
12
|
end
|
13
13
|
|
14
14
|
def done
|
15
|
+
outputter.puts
|
16
|
+
outputter.puts(failures(@results))
|
15
17
|
failure_count = results.count(&:failed?)
|
16
18
|
pending_count = results.count(&:pending?)
|
17
19
|
summary = "#{pluralize(results.size, 'spec')}, " +
|
@@ -19,7 +21,7 @@ module Jasmine
|
|
19
21
|
|
20
22
|
summary += ", #{pluralize(pending_count, 'pending spec')}" if pending_count > 0
|
21
23
|
|
22
|
-
outputter.
|
24
|
+
outputter.puts(summary)
|
23
25
|
end
|
24
26
|
|
25
27
|
private
|
@@ -29,6 +31,18 @@ module Jasmine
|
|
29
31
|
results.select(&:failed?).map { |f| failure_message(f) }.join("\n\n")
|
30
32
|
end
|
31
33
|
|
34
|
+
def chars(results)
|
35
|
+
results.map do |result|
|
36
|
+
if result.succeeded?
|
37
|
+
"\e[32m.\e[0m"
|
38
|
+
elsif result.pending?
|
39
|
+
"\e[33m*\e[0m"
|
40
|
+
else
|
41
|
+
"\e[31mF\e[0m"
|
42
|
+
end
|
43
|
+
end.join('')
|
44
|
+
end
|
45
|
+
|
32
46
|
def pluralize(count, str)
|
33
47
|
word = (count == 1) ? str : str + 's'
|
34
48
|
"#{count} #{word}"
|
@@ -7,7 +7,11 @@ module Jasmine
|
|
7
7
|
patterns.map do |path|
|
8
8
|
files = globber.call(File.join(base_directory, path.gsub(/^!/, '')))
|
9
9
|
if files.empty? && !(path =~ /\*|^\!/)
|
10
|
-
|
10
|
+
if path[0..3] == 'http'
|
11
|
+
files << path
|
12
|
+
else
|
13
|
+
files = [File.join(base_directory, path)]
|
14
|
+
end
|
11
15
|
end
|
12
16
|
files.sort
|
13
17
|
end.flatten.uniq
|
data/lib/jasmine/path_mapper.rb
CHANGED
@@ -16,14 +16,23 @@ module Jasmine
|
|
16
16
|
map(paths, @config.boot_dir, @config.boot_path)
|
17
17
|
end
|
18
18
|
|
19
|
+
def map_runner_boot_paths(paths)
|
20
|
+
map(paths, @config.runner_boot_dir, @config.runner_boot_path)
|
21
|
+
end
|
22
|
+
|
19
23
|
def map_jasmine_paths(paths)
|
20
24
|
map(paths, @config.jasmine_dir, @config.jasmine_path)
|
21
25
|
end
|
22
26
|
|
23
27
|
private
|
24
28
|
def map(paths, remove_path, add_path)
|
25
|
-
paths.map
|
29
|
+
paths.map do |path|
|
30
|
+
if path[0..3] == 'http'
|
31
|
+
path
|
32
|
+
else
|
33
|
+
File.join(add_path, (path.gsub(remove_path, '')))
|
34
|
+
end
|
35
|
+
end
|
26
36
|
end
|
27
|
-
|
28
37
|
end
|
29
38
|
end
|
data/lib/jasmine/railtie.rb
CHANGED
@@ -3,7 +3,7 @@ require 'rails/railtie'
|
|
3
3
|
module Jasmine
|
4
4
|
class Railtie < Rails::Railtie
|
5
5
|
|
6
|
-
|
6
|
+
initializer "jasmine.initializer", :before => :load_environment_hook do
|
7
7
|
old_jasmine_rakefile = ::Rails.root.join('lib', 'tasks', 'jasmine.rake')
|
8
8
|
if old_jasmine_rakefile.exist? && !ENV['USE_JASMINE_RAKE']
|
9
9
|
puts '
|
@@ -0,0 +1,11 @@
|
|
1
|
+
function PhantomReporter() {
|
2
|
+
this.jasmineDone = function() {
|
3
|
+
window.callPhantom({ state: 'jasmineDone' });
|
4
|
+
};
|
5
|
+
|
6
|
+
this.specDone = function(results) {
|
7
|
+
window.callPhantom({ state: 'specDone', results: results});
|
8
|
+
};
|
9
|
+
}
|
10
|
+
|
11
|
+
jasmine.getEnv().addReporter(new PhantomReporter());
|
@@ -1,54 +1,18 @@
|
|
1
1
|
(function() {
|
2
|
-
/**
|
3
|
-
* Wait until the test condition is true or a timeout occurs. Useful for waiting
|
4
|
-
* on a server response or for a ui change (fadeIn, etc.) to occur.
|
5
|
-
*
|
6
|
-
* @param testFx javascript condition that evaluates to a boolean,
|
7
|
-
* it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
|
8
|
-
* as a callback function.
|
9
|
-
* @param onReady what to do when testFx condition is fulfilled,
|
10
|
-
* it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
|
11
|
-
* as a callback function.
|
12
|
-
*/
|
13
|
-
function waitFor(testFx, onReady) {
|
14
|
-
var condition = false,
|
15
|
-
interval = setInterval(function() {
|
16
|
-
if (!condition) {
|
17
|
-
condition = (typeof(testFx) === 'string' ? eval(testFx) : testFx());
|
18
|
-
} else {
|
19
|
-
if (typeof(onReady) === 'string') {
|
20
|
-
eval(onReady);
|
21
|
-
} else {
|
22
|
-
onReady();
|
23
|
-
}
|
24
|
-
clearInterval(interval);
|
25
|
-
}
|
26
|
-
}, 100);
|
27
|
-
}
|
28
|
-
|
29
2
|
var url = phantom.args[0];
|
30
|
-
var batchSize = parseInt(phantom.args[1], 10);
|
31
3
|
var page = require('webpage').create();
|
32
4
|
|
5
|
+
page.onCallback = function(data) {
|
6
|
+
if(data.state === 'specDone') {
|
7
|
+
console.log('jasmine_result' + JSON.stringify([].concat(data.results)));
|
8
|
+
} else {
|
9
|
+
phantom.exit(0);
|
10
|
+
}
|
11
|
+
};
|
12
|
+
|
33
13
|
page.open(url, function(status) {
|
34
14
|
if (status !== "success") {
|
35
15
|
phantom.exit(1);
|
36
|
-
} else {
|
37
|
-
waitFor(function() {
|
38
|
-
return page.evaluate(function() {
|
39
|
-
return jsApiReporter && jsApiReporter.finished
|
40
|
-
});
|
41
|
-
}, function() {
|
42
|
-
var index = 0, results;
|
43
|
-
do {
|
44
|
-
results = page.evaluate(function(index, batchSize) {
|
45
|
-
return jsApiReporter.specResults(index, batchSize)
|
46
|
-
}, index, batchSize);
|
47
|
-
console.log(JSON.stringify(results));
|
48
|
-
index += batchSize;
|
49
|
-
} while (results && results.length == batchSize)
|
50
|
-
phantom.exit(0);
|
51
|
-
});
|
52
16
|
}
|
53
17
|
});
|
54
18
|
}).call(this);
|
@@ -13,14 +13,21 @@ module Jasmine
|
|
13
13
|
command = "#{Phantomjs.path} '#{File.join(File.dirname(__FILE__), 'phantom_jasmine_run.js')}' #{jasmine_server_url} #{result_batch_size}"
|
14
14
|
IO.popen(command) do |output|
|
15
15
|
output.each do |line|
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
if line =~ /^jasmine_result/
|
17
|
+
line = line.sub(/^jasmine_result/, '')
|
18
|
+
raw_results = JSON.parse(line, :max_nesting => false)
|
19
|
+
results = raw_results.map { |r| Result.new(r) }
|
20
|
+
formatter.format(results)
|
21
|
+
end
|
19
22
|
end
|
20
23
|
end
|
21
24
|
formatter.done
|
22
25
|
end
|
23
26
|
|
27
|
+
def boot_js
|
28
|
+
File.expand_path('phantom_boot.js', File.dirname(__FILE__))
|
29
|
+
end
|
30
|
+
|
24
31
|
private
|
25
32
|
attr_reader :formatter, :jasmine_server_url, :result_batch_size
|
26
33
|
end
|
data/lib/jasmine/server.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
module Jasmine
|
2
2
|
class Server
|
3
|
-
def initialize(port = 8888, application = nil)
|
3
|
+
def initialize(port = 8888, application = nil, rack_options = nil)
|
4
4
|
@port = port
|
5
5
|
@application = application
|
6
|
+
@rack_options = rack_options || {}
|
6
7
|
end
|
7
8
|
|
8
9
|
def start
|
@@ -10,7 +11,7 @@ module Jasmine
|
|
10
11
|
handler = Rack::Handler.get('webrick')
|
11
12
|
handler.run(@application, :Port => @port, :AccessLog => [])
|
12
13
|
else
|
13
|
-
server = Rack::Server.new(:Port => @port, :AccessLog => [])
|
14
|
+
server = Rack::Server.new(@rack_options.merge(:Port => @port, :AccessLog => []))
|
14
15
|
# workaround for Rack bug, when Rack > 1.2.1 is released Rack::Server.start(:app => Jasmine.app(self)) will work
|
15
16
|
server.instance_variable_set(:@app, @application)
|
16
17
|
server.start
|
@@ -23,22 +23,12 @@ namespace :jasmine do
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
+
task :configure_plugins
|
27
|
+
|
26
28
|
desc 'Run continuous integration tests'
|
27
|
-
task :ci => %w(jasmine:require_json jasmine:require jasmine:configure) do
|
29
|
+
task :ci => %w(jasmine:require_json jasmine:require jasmine:configure jasmine:configure_plugins) do
|
28
30
|
config = Jasmine.config
|
29
31
|
|
30
|
-
server = Jasmine::Server.new(config.port(:ci), Jasmine::Application.app(config))
|
31
|
-
t = Thread.new do
|
32
|
-
begin
|
33
|
-
server.start
|
34
|
-
rescue ChildProcess::TimeoutError
|
35
|
-
end
|
36
|
-
# # ignore bad exits
|
37
|
-
end
|
38
|
-
t.abort_on_exception = true
|
39
|
-
Jasmine::wait_for_listener(config.port(:ci), 'jasmine server')
|
40
|
-
puts 'jasmine server started.'
|
41
|
-
|
42
32
|
formatters = config.formatters.map { |formatter_class| formatter_class.new }
|
43
33
|
|
44
34
|
exit_code_formatter = Jasmine::Formatters::ExitCode.new
|
@@ -46,15 +36,28 @@ namespace :jasmine do
|
|
46
36
|
|
47
37
|
url = "#{config.host}:#{config.port(:ci)}/"
|
48
38
|
runner = config.runner.call(Jasmine::Formatters::Multi.new(formatters), url)
|
39
|
+
if runner.respond_to?(:boot_js)
|
40
|
+
config.runner_boot_dir = File.dirname(runner.boot_js)
|
41
|
+
config.runner_boot_files = lambda { [runner.boot_js] }
|
42
|
+
end
|
43
|
+
|
44
|
+
server = Jasmine::Server.new(config.port(:ci), Jasmine::Application.app(config), config.rack_options)
|
45
|
+
t = Thread.new do
|
46
|
+
server.start
|
47
|
+
end
|
48
|
+
t.abort_on_exception = true
|
49
|
+
Jasmine::wait_for_listener(config.port(:ci), 'jasmine server')
|
50
|
+
puts 'jasmine server started.'
|
51
|
+
|
49
52
|
runner.run
|
50
53
|
|
51
54
|
break unless exit_code_formatter.succeeded?
|
52
55
|
end
|
53
56
|
|
54
|
-
task :server => %w(jasmine:require jasmine:configure) do
|
57
|
+
task :server => %w(jasmine:require jasmine:configure jasmine:configure_plugins) do
|
55
58
|
config = Jasmine.config
|
56
59
|
port = config.port(:server)
|
57
|
-
server = Jasmine::Server.new(port, Jasmine::Application.app(Jasmine.config))
|
60
|
+
server = Jasmine::Server.new(port, Jasmine::Application.app(Jasmine.config), config.rack_options)
|
58
61
|
puts "your server is running here: http://localhost:#{port}/"
|
59
62
|
puts "your tests are here: #{config.spec_dir}"
|
60
63
|
puts "your source files are here: #{config.src_dir}"
|
data/lib/jasmine/version.rb
CHANGED
@@ -59,6 +59,13 @@ module Jasmine
|
|
59
59
|
File.join(@pwd, loaded_yaml['spec_helper'] || File.join('spec', 'javascripts', 'support', 'jasmine_helper.rb'))
|
60
60
|
end
|
61
61
|
|
62
|
+
def rack_options
|
63
|
+
loaded_yaml.fetch('rack_options', {}).inject({}) do |memo, (key, value)|
|
64
|
+
memo[key.to_sym] = value
|
65
|
+
memo
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
62
69
|
private
|
63
70
|
def loaded_yaml
|
64
71
|
@yaml_loader.call(@path)
|
data/spec/application_spec.rb
CHANGED
@@ -26,14 +26,24 @@ describe 'Jasmine::Application' do
|
|
26
26
|
|
27
27
|
Jasmine::Application.app(config, builder).should == builder
|
28
28
|
end
|
29
|
+
|
29
30
|
it 'should run rack apps provided by the config' do
|
30
31
|
app1 = double(:app1)
|
31
32
|
app2 = double(:app2)
|
33
|
+
app3 = double(:app3)
|
34
|
+
app4 = double(:app4)
|
32
35
|
block = lambda { 'foo' }
|
33
|
-
config = double(:config, :rack_path_map => [], :rack_apps => [
|
36
|
+
config = double(:config, :rack_path_map => [], :rack_apps => [
|
37
|
+
{ :app => app1 },
|
38
|
+
{ :app => app2, :block => block },
|
39
|
+
{ :app => app3, :args => [:foo], :block => block },
|
40
|
+
{ :app => app4, :args => [:bar] }
|
41
|
+
])
|
34
42
|
builder = double('Rack::Builder.new')
|
35
43
|
builder.should_receive(:use).with(app1)
|
36
44
|
builder.should_receive(:use).with(app2, &block)
|
45
|
+
builder.should_receive(:use).with(app3, :foo, &block)
|
46
|
+
builder.should_receive(:use).with(app4, :bar)
|
37
47
|
Jasmine::Application.app(config, builder).should == builder
|
38
48
|
end
|
39
49
|
end
|
data/spec/configuration_spec.rb
CHANGED
@@ -94,14 +94,30 @@ describe Jasmine::Configuration do
|
|
94
94
|
config = Jasmine::Configuration.new()
|
95
95
|
app = double
|
96
96
|
config.add_rack_app(app)
|
97
|
-
config.rack_apps.should == [
|
97
|
+
config.rack_apps.should == [{ :app => app, :args => [], :block => nil }]
|
98
98
|
end
|
99
|
-
|
99
|
+
|
100
|
+
it 'permits the addition of arbitary rack apps with a config block' do
|
100
101
|
config = Jasmine::Configuration.new()
|
101
102
|
app = double
|
102
103
|
block = lambda { 'foo' }
|
103
104
|
config.add_rack_app(app, &block)
|
104
|
-
config.rack_apps.should == [
|
105
|
+
config.rack_apps.should == [{ :app => app, :args => [], :block => block }]
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'permits the addition of arbitary rack apps with arbitrary config' do
|
109
|
+
config = Jasmine::Configuration.new()
|
110
|
+
app = double
|
111
|
+
config.add_rack_app(app, { :foo => 'bar' })
|
112
|
+
config.rack_apps.should == [{ :app => app, :args => [{ :foo => 'bar' }], :block => nil }]
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'permits the addition of arbitary rack apps with arbitrary config and a config block' do
|
116
|
+
config = Jasmine::Configuration.new()
|
117
|
+
app = double
|
118
|
+
block = lambda { 'foo' }
|
119
|
+
config.add_rack_app(app, { :foo => 'bar' }, &block)
|
120
|
+
config.rack_apps.should == [{ :app => app, :args => [{ :foo => 'bar' }], :block => block }]
|
105
121
|
end
|
106
122
|
end
|
107
123
|
|
@@ -0,0 +1 @@
|
|
1
|
+
desibe('oops', function() {});
|
@@ -23,6 +23,15 @@ describe 'Jasmine command line tool' do
|
|
23
23
|
ci_output.should =~ (/0 specs, 0 failures/)
|
24
24
|
end
|
25
25
|
|
26
|
+
it 'should not have rails-like paths' do
|
27
|
+
output = capture_stdout { Jasmine::CommandLineTool.new.process ['init'] }
|
28
|
+
output.should =~ /Jasmine has been installed\./
|
29
|
+
|
30
|
+
config = YAML.load_file(File.join(@tmp, 'spec/javascripts/support/jasmine.yml'))
|
31
|
+
config['src_files'].should == ['public/javascripts/**/*.js']
|
32
|
+
config['stylesheets'].should == ['stylesheets/**/*.css']
|
33
|
+
end
|
34
|
+
|
26
35
|
it 'should create a new Rakefile if it does not exist' do
|
27
36
|
output = capture_stdout { Jasmine::CommandLineTool.new.process ["init"] }
|
28
37
|
output.should =~ /Jasmine has been installed\./
|
@@ -120,4 +129,14 @@ describe 'Jasmine command line tool' do
|
|
120
129
|
|
121
130
|
output.should =~ /already exists/
|
122
131
|
end
|
132
|
+
|
133
|
+
it 'should show help' do
|
134
|
+
no_arg_output = capture_stdout { Jasmine::CommandLineTool.new.process [] }
|
135
|
+
no_arg_output.should_not =~ /unknown command/
|
136
|
+
no_arg_output.should =~ /Usage:/
|
137
|
+
|
138
|
+
unknown_arg_output = capture_stdout { Jasmine::CommandLineTool.new.process ['blurgh', 'blargh'] }
|
139
|
+
unknown_arg_output.should =~ /unknown command blurgh blargh/
|
140
|
+
unknown_arg_output.should =~ /Usage:/
|
141
|
+
end
|
123
142
|
end
|
data/spec/jasmine_rails_spec.rb
CHANGED
@@ -26,11 +26,17 @@ if Jasmine::Dependencies.rails_available?
|
|
26
26
|
|
27
27
|
base = File.absolute_path(File.join(__FILE__, '../..'))
|
28
28
|
|
29
|
-
|
29
|
+
# sqlite3 v 1.3.9 is broken on rbx, so restrict to 1.3.8 for now until they fix it.
|
30
|
+
# see: https://github.com/sparklemotion/sqlite3-ruby/issues/122
|
31
|
+
file_contents = File.read('Gemfile')
|
32
|
+
|
33
|
+
open('Gemfile', 'w') { |f|
|
34
|
+
f.puts file_contents.sub("gem 'sqlite3'", "gem 'sqlite3', '1.3.8'")
|
30
35
|
f.puts "gem 'jasmine', :path => '#{base}'"
|
31
36
|
f.puts "gem 'jasmine-core', :github => 'pivotal/jasmine'"
|
32
37
|
f.puts "gem 'rubysl', :platform => :rbx"
|
33
38
|
f.puts "gem 'racc', :platform => :rbx"
|
39
|
+
f.puts "gem 'thin'" unless RUBY_PLATFORM == 'java'
|
34
40
|
f.flush
|
35
41
|
}
|
36
42
|
|
@@ -81,6 +87,18 @@ if Jasmine::Dependencies.rails_available?
|
|
81
87
|
end
|
82
88
|
end
|
83
89
|
|
90
|
+
it "rake jasmine:ci runs specs when an error occurs in the javascript" do
|
91
|
+
Bundler.with_clean_env do
|
92
|
+
FileUtils.cp(File.join(@root, 'spec', 'fixture', 'exception_test.js'), File.join('spec', 'javascripts'))
|
93
|
+
exception_yaml = custom_jasmine_config('exception') do |jasmine_config|
|
94
|
+
jasmine_config['spec_files'] << 'exception_test.js'
|
95
|
+
end
|
96
|
+
output = `bundle exec rake jasmine:ci JASMINE_CONFIG_PATH=#{exception_yaml}`
|
97
|
+
$?.should be_success
|
98
|
+
output.should include('5 specs, 0 failures')
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
84
102
|
it "runs specs written in coffeescript" do
|
85
103
|
coffee_yaml = custom_jasmine_config('coffee') do |jasmine_config|
|
86
104
|
jasmine_config['spec_files'] << 'coffee_spec.coffee'
|
@@ -100,7 +118,7 @@ if Jasmine::Dependencies.rails_available?
|
|
100
118
|
}
|
101
119
|
|
102
120
|
css_yaml = custom_jasmine_config('css') do |jasmine_config|
|
103
|
-
jasmine_config['src_files'] = [
|
121
|
+
jasmine_config['src_files'] = %w[assets/application.js http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js]
|
104
122
|
jasmine_config['stylesheets'] = ['assets/application.css']
|
105
123
|
end
|
106
124
|
|
@@ -120,9 +138,10 @@ if Jasmine::Dependencies.rails_available?
|
|
120
138
|
end
|
121
139
|
|
122
140
|
output = Net::HTTP.get(URI.parse('http://localhost:8888/'))
|
123
|
-
output.should match(%r{script src.*/assets/jasmine_examples/Player
|
124
|
-
output.should match(%r{script src
|
125
|
-
output.should match(%r{
|
141
|
+
output.should match(%r{script src.*/assets/jasmine_examples/Player\.js})
|
142
|
+
output.should match(%r{script src=['"]http://ajax\.googleapis\.com/ajax/libs/jquery/1\.11\.0/jquery\.min\.js})
|
143
|
+
output.should match(%r{script src.*/assets/jasmine_examples/Song\.js})
|
144
|
+
output.should match(%r{<link rel=.stylesheet.*?href=./assets/foo\.css\?.*?>})
|
126
145
|
ensure
|
127
146
|
Process.kill(:SIGINT, pid)
|
128
147
|
begin
|
@@ -147,5 +166,20 @@ if Jasmine::Dependencies.rails_available?
|
|
147
166
|
output.should include('1 spec, 0 failures')
|
148
167
|
end
|
149
168
|
end
|
169
|
+
|
170
|
+
it "should pass custom rack options from jasmine.yml" do
|
171
|
+
pending "we're testing this with thin, which doesn't work in jruby" if RUBY_PLATFORM == 'java'
|
172
|
+
rack_yaml = custom_jasmine_config('custom_rack') do |jasmine_config|
|
173
|
+
jasmine_config['rack_options'] = { 'server' => 'webrick' }
|
174
|
+
end
|
175
|
+
|
176
|
+
Bundler.with_clean_env do
|
177
|
+
default_output = `bundle exec rake jasmine:ci`
|
178
|
+
default_output.should include('Thin web server')
|
179
|
+
|
180
|
+
custom_output = `bundle exec rake jasmine:ci JASMINE_CONFIG_PATH=#{rack_yaml} 2>&1`
|
181
|
+
custom_output.should include("WEBrick")
|
182
|
+
end
|
183
|
+
end
|
150
184
|
end
|
151
185
|
end
|
@@ -3,19 +3,24 @@ require 'spec_helper'
|
|
3
3
|
describe Jasmine::Formatters::Console do
|
4
4
|
|
5
5
|
let(:outputter_output) { '' }
|
6
|
-
let(:outputter)
|
7
|
-
|
6
|
+
let(:outputter) do
|
7
|
+
double(:outputter).tap do |o|
|
8
|
+
o.stub(:print) { |str| outputter_output << str }
|
9
|
+
o.stub(:puts) { |str| outputter_output << "#{str}\n" }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#summary' do
|
8
14
|
it 'shows the failure messages' do
|
9
15
|
results = [failing_result, failing_result]
|
10
|
-
Jasmine::Formatters::Console.new(outputter)
|
11
|
-
|
16
|
+
formatter = Jasmine::Formatters::Console.new(outputter)
|
17
|
+
formatter.format(results)
|
18
|
+
formatter.done
|
12
19
|
outputter_output.should match(/a suite with a failing spec/)
|
13
20
|
outputter_output.should match(/a failure message/)
|
14
21
|
outputter_output.should match(/a stack trace/)
|
15
22
|
end
|
16
|
-
end
|
17
23
|
|
18
|
-
describe '#summary' do
|
19
24
|
describe 'when the full suite passes' do
|
20
25
|
it 'shows the spec counts' do
|
21
26
|
results = [passing_result]
|
data/spec/path_expander_spec.rb
CHANGED
@@ -118,4 +118,21 @@ describe Jasmine::PathExpander do
|
|
118
118
|
File.join('some_base', 'src2.js')
|
119
119
|
]
|
120
120
|
end
|
121
|
+
|
122
|
+
it "passes through files that are not found by the globber and look like urls" do
|
123
|
+
#this is designed to support cdn files
|
124
|
+
dir_glob = lambda do |pattern|
|
125
|
+
[]
|
126
|
+
end
|
127
|
+
|
128
|
+
expanded_files = Jasmine::PathExpander.expand(
|
129
|
+
'some_base',
|
130
|
+
['http://www.google.com'],
|
131
|
+
dir_glob
|
132
|
+
)
|
133
|
+
|
134
|
+
expanded_files.should == [
|
135
|
+
'http://www.google.com'
|
136
|
+
]
|
137
|
+
end
|
121
138
|
end
|
data/spec/server_spec.rb
CHANGED
@@ -44,5 +44,12 @@ describe Jasmine::Server do
|
|
44
44
|
Jasmine::Server.new(1234, app).start
|
45
45
|
server.instance_variable_get(:@app).should == app
|
46
46
|
end
|
47
|
+
|
48
|
+
it "should pass rack options when starting the server" do
|
49
|
+
app = double('application')
|
50
|
+
server = double(:server)
|
51
|
+
Rack::Server.should_receive(:new).with(hash_including(:Port => 1234, :foo => 'bar')).and_return(double(:server).as_null_object)
|
52
|
+
Jasmine::Server.new(1234, app, {:foo => 'bar', :Port => 4321}).start
|
53
|
+
end
|
47
54
|
end
|
48
55
|
end
|
metadata
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jasmine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.1
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Rajan Agaskar
|
@@ -10,81 +11,92 @@ authors:
|
|
10
11
|
autorequire:
|
11
12
|
bindir: bin
|
12
13
|
cert_chain: []
|
13
|
-
date:
|
14
|
+
date: 2014-04-17 00:00:00.000000000 Z
|
14
15
|
dependencies:
|
15
16
|
- !ruby/object:Gem::Dependency
|
16
17
|
name: rails
|
17
18
|
requirement: !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
18
20
|
requirements:
|
19
|
-
- - '>='
|
21
|
+
- - ! '>='
|
20
22
|
- !ruby/object:Gem::Version
|
21
23
|
version: '4'
|
22
24
|
type: :development
|
23
25
|
prerelease: false
|
24
26
|
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
25
28
|
requirements:
|
26
|
-
- - '>='
|
29
|
+
- - ! '>='
|
27
30
|
- !ruby/object:Gem::Version
|
28
31
|
version: '4'
|
29
32
|
- !ruby/object:Gem::Dependency
|
30
33
|
name: rack-test
|
31
34
|
requirement: !ruby/object:Gem::Requirement
|
35
|
+
none: false
|
32
36
|
requirements:
|
33
|
-
- - '>='
|
37
|
+
- - ! '>='
|
34
38
|
- !ruby/object:Gem::Version
|
35
39
|
version: '0'
|
36
40
|
type: :development
|
37
41
|
prerelease: false
|
38
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
39
44
|
requirements:
|
40
|
-
- - '>='
|
45
|
+
- - ! '>='
|
41
46
|
- !ruby/object:Gem::Version
|
42
47
|
version: '0'
|
43
48
|
- !ruby/object:Gem::Dependency
|
44
49
|
name: multi_json
|
45
50
|
requirement: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
46
52
|
requirements:
|
47
|
-
- - '>='
|
53
|
+
- - ! '>='
|
48
54
|
- !ruby/object:Gem::Version
|
49
55
|
version: '0'
|
50
56
|
type: :development
|
51
57
|
prerelease: false
|
52
58
|
version_requirements: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
53
60
|
requirements:
|
54
|
-
- - '>='
|
61
|
+
- - ! '>='
|
55
62
|
- !ruby/object:Gem::Version
|
56
63
|
version: '0'
|
57
64
|
- !ruby/object:Gem::Dependency
|
58
65
|
name: rspec
|
59
66
|
requirement: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
60
68
|
requirements:
|
61
|
-
- - '>='
|
69
|
+
- - ! '>='
|
62
70
|
- !ruby/object:Gem::Version
|
63
71
|
version: 2.5.0
|
64
72
|
type: :development
|
65
73
|
prerelease: false
|
66
74
|
version_requirements: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
67
76
|
requirements:
|
68
|
-
- - '>='
|
77
|
+
- - ! '>='
|
69
78
|
- !ruby/object:Gem::Version
|
70
79
|
version: 2.5.0
|
71
80
|
- !ruby/object:Gem::Dependency
|
72
81
|
name: nokogiri
|
73
82
|
requirement: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
74
84
|
requirements:
|
75
|
-
- - '>='
|
85
|
+
- - ! '>='
|
76
86
|
- !ruby/object:Gem::Version
|
77
87
|
version: '0'
|
78
88
|
type: :development
|
79
89
|
prerelease: false
|
80
90
|
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
none: false
|
81
92
|
requirements:
|
82
|
-
- - '>='
|
93
|
+
- - ! '>='
|
83
94
|
- !ruby/object:Gem::Version
|
84
95
|
version: '0'
|
85
96
|
- !ruby/object:Gem::Dependency
|
86
97
|
name: jasmine-core
|
87
98
|
requirement: !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
88
100
|
requirements:
|
89
101
|
- - ~>
|
90
102
|
- !ruby/object:Gem::Version
|
@@ -92,6 +104,7 @@ dependencies:
|
|
92
104
|
type: :runtime
|
93
105
|
prerelease: false
|
94
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
95
108
|
requirements:
|
96
109
|
- - ~>
|
97
110
|
- !ruby/object:Gem::Version
|
@@ -99,43 +112,49 @@ dependencies:
|
|
99
112
|
- !ruby/object:Gem::Dependency
|
100
113
|
name: rack
|
101
114
|
requirement: !ruby/object:Gem::Requirement
|
115
|
+
none: false
|
102
116
|
requirements:
|
103
|
-
- - '>='
|
117
|
+
- - ! '>='
|
104
118
|
- !ruby/object:Gem::Version
|
105
119
|
version: 1.2.1
|
106
120
|
type: :runtime
|
107
121
|
prerelease: false
|
108
122
|
version_requirements: !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
109
124
|
requirements:
|
110
|
-
- - '>='
|
125
|
+
- - ! '>='
|
111
126
|
- !ruby/object:Gem::Version
|
112
127
|
version: 1.2.1
|
113
128
|
- !ruby/object:Gem::Dependency
|
114
129
|
name: rake
|
115
130
|
requirement: !ruby/object:Gem::Requirement
|
131
|
+
none: false
|
116
132
|
requirements:
|
117
|
-
- - '>='
|
133
|
+
- - ! '>='
|
118
134
|
- !ruby/object:Gem::Version
|
119
135
|
version: '0'
|
120
136
|
type: :runtime
|
121
137
|
prerelease: false
|
122
138
|
version_requirements: !ruby/object:Gem::Requirement
|
139
|
+
none: false
|
123
140
|
requirements:
|
124
|
-
- - '>='
|
141
|
+
- - ! '>='
|
125
142
|
- !ruby/object:Gem::Version
|
126
143
|
version: '0'
|
127
144
|
- !ruby/object:Gem::Dependency
|
128
145
|
name: phantomjs
|
129
146
|
requirement: !ruby/object:Gem::Requirement
|
147
|
+
none: false
|
130
148
|
requirements:
|
131
|
-
- - '>='
|
149
|
+
- - ! '>='
|
132
150
|
- !ruby/object:Gem::Version
|
133
151
|
version: '0'
|
134
152
|
type: :runtime
|
135
153
|
prerelease: false
|
136
154
|
version_requirements: !ruby/object:Gem::Requirement
|
155
|
+
none: false
|
137
156
|
requirements:
|
138
|
-
- - '>='
|
157
|
+
- - ! '>='
|
139
158
|
- !ruby/object:Gem::Version
|
140
159
|
version: '0'
|
141
160
|
description: Test your JavaScript without any framework dependencies, in any environment,
|
@@ -189,6 +208,7 @@ files:
|
|
189
208
|
- lib/jasmine/railtie.rb
|
190
209
|
- lib/jasmine/result.rb
|
191
210
|
- lib/jasmine/run.html.erb
|
211
|
+
- lib/jasmine/runners/phantom_boot.js
|
192
212
|
- lib/jasmine/runners/phantom_jasmine_run.js
|
193
213
|
- lib/jasmine/runners/phantom_js.rb
|
194
214
|
- lib/jasmine/server.rb
|
@@ -208,6 +228,7 @@ files:
|
|
208
228
|
- spec/configuration_spec.rb
|
209
229
|
- spec/fixture/Rakefile
|
210
230
|
- spec/fixture/coffee_spec.coffee
|
231
|
+
- spec/fixture/exception_test.js
|
211
232
|
- spec/fixture/failing_runner.rb
|
212
233
|
- spec/fixture/failing_test.js
|
213
234
|
- spec/fixture/large_test_suite_spec.js
|
@@ -230,27 +251,34 @@ files:
|
|
230
251
|
homepage: http://pivotal.github.com/jasmine/
|
231
252
|
licenses:
|
232
253
|
- MIT
|
233
|
-
metadata: {}
|
234
254
|
post_install_message:
|
235
255
|
rdoc_options:
|
236
256
|
- --charset=UTF-8
|
237
257
|
require_paths:
|
238
258
|
- lib
|
239
259
|
required_ruby_version: !ruby/object:Gem::Requirement
|
260
|
+
none: false
|
240
261
|
requirements:
|
241
|
-
- - '>='
|
262
|
+
- - ! '>='
|
242
263
|
- !ruby/object:Gem::Version
|
243
264
|
version: '0'
|
265
|
+
segments:
|
266
|
+
- 0
|
267
|
+
hash: 1868816023203409385
|
244
268
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
269
|
+
none: false
|
245
270
|
requirements:
|
246
|
-
- - '>='
|
271
|
+
- - ! '>='
|
247
272
|
- !ruby/object:Gem::Version
|
248
273
|
version: '0'
|
274
|
+
segments:
|
275
|
+
- 0
|
276
|
+
hash: 1868816023203409385
|
249
277
|
requirements: []
|
250
278
|
rubyforge_project:
|
251
|
-
rubygems_version:
|
279
|
+
rubygems_version: 1.8.23
|
252
280
|
signing_key:
|
253
|
-
specification_version:
|
281
|
+
specification_version: 3
|
254
282
|
summary: JavaScript BDD framework
|
255
283
|
test_files:
|
256
284
|
- spec/application_integration_spec.rb
|
@@ -259,6 +287,7 @@ test_files:
|
|
259
287
|
- spec/configuration_spec.rb
|
260
288
|
- spec/fixture/Rakefile
|
261
289
|
- spec/fixture/coffee_spec.coffee
|
290
|
+
- spec/fixture/exception_test.js
|
262
291
|
- spec/fixture/failing_runner.rb
|
263
292
|
- spec/fixture/failing_test.js
|
264
293
|
- spec/fixture/large_test_suite_spec.js
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 3a7ce607ec6c8a6bb64af21d08f21d8305dceb95
|
4
|
-
data.tar.gz: c86fcfa19f64ff33754b2fd6251d1d4c8abc9073
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: d0013fece64deeb497579113f9004c4765a1040b6cd5b076c8876bde288488f2a08a0505df12f75bb7e1b48cbb4eb6deec0984c2dde5bfb8ef175a0c7d5abf86
|
7
|
-
data.tar.gz: e613e70b7b99fd68da008e3f2ae2bba56cc145df85ae9c8053b4bdb062d7324562e9f6bd1561e85288122345a9cf7cecb66782717af663c54122a254a1aed4ec
|