jasmine 1.3.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +11 -2
- data/generators/jasmine/templates/spec/javascripts/support/jasmine-rails.yml +2 -2
- data/generators/jasmine/templates/spec/javascripts/support/jasmine.yml +2 -1
- data/jasmine.gemspec +1 -1
- data/lib/jasmine.rb +10 -2
- data/lib/jasmine/application.rb +6 -33
- data/lib/jasmine/asset_expander.rb +19 -0
- data/lib/jasmine/asset_pipeline_mapper.rb +11 -14
- data/lib/jasmine/asset_pipeline_utility.rb +19 -0
- data/lib/jasmine/base.rb +4 -0
- data/lib/jasmine/config.rb +74 -111
- data/lib/jasmine/configuration.rb +83 -0
- data/lib/jasmine/core_configuration.rb +28 -0
- data/lib/jasmine/javascripts/boot.js +28 -0
- data/lib/jasmine/path_expander.rb +18 -0
- data/lib/jasmine/path_mapper.rb +29 -0
- data/lib/jasmine/results_processor.rb +21 -20
- data/lib/jasmine/run.html.erb +0 -37
- data/lib/jasmine/run_specs.rb +12 -8
- data/lib/jasmine/server.rb +1 -1
- data/lib/jasmine/tasks/jasmine.rake +3 -4
- data/lib/jasmine/version.rb +1 -1
- data/lib/jasmine/yaml_config_parser.rb +54 -0
- data/spec/application_integration_spec.rb +15 -0
- data/spec/application_spec.rb +37 -92
- data/spec/asset_expander_spec.rb +42 -0
- data/spec/asset_pipeline_mapper_spec.rb +12 -11
- data/spec/base_spec.rb +14 -0
- data/spec/configuration_spec.rb +163 -0
- data/spec/jasmine_self_test_spec.rb +14 -7
- data/spec/page_spec.rb +2 -4
- data/spec/path_expander_spec.rb +96 -0
- data/spec/path_mapper_spec.rb +33 -0
- data/spec/server_spec.rb +2 -2
- data/spec/yaml_config_parser_spec.rb +182 -0
- metadata +34 -23
- data/lib/jasmine/runner_config.rb +0 -71
- data/lib/jasmine/sprockets_mapper.rb +0 -13
- data/lib/rack/jasmine/redirect.rb +0 -20
- data/spec/config_spec.rb +0 -309
- data/spec/fixture/jasmine.erb.yml +0 -4
- data/spec/fixture/spec/example_spec.js +0 -5
- data/spec/fixture/src/example.js +0 -3
- data/spec/jasmine_self_test_config.rb +0 -19
- data/spec/runner_config_spec.rb +0 -136
- data/spec/sprockets_mapper_spec.rb +0 -17
@@ -0,0 +1,28 @@
|
|
1
|
+
module Jasmine
|
2
|
+
class CoreConfiguration
|
3
|
+
def initialize(core = Jasmine::Core)
|
4
|
+
@core = core
|
5
|
+
end
|
6
|
+
|
7
|
+
def path
|
8
|
+
@core.path
|
9
|
+
end
|
10
|
+
|
11
|
+
#TODO: maybe this doesn't belong in CoreConfig
|
12
|
+
def boot_path
|
13
|
+
Jasmine.root('javascripts')
|
14
|
+
end
|
15
|
+
|
16
|
+
def boot_files
|
17
|
+
Dir.glob(File.join(boot_path, "**"))
|
18
|
+
end
|
19
|
+
|
20
|
+
def js_files
|
21
|
+
@core.js_files
|
22
|
+
end
|
23
|
+
|
24
|
+
def css_files
|
25
|
+
@core.css_files
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
var jsApiReporter;
|
2
|
+
(function() {
|
3
|
+
var jasmineEnv = jasmine.getEnv();
|
4
|
+
|
5
|
+
jsApiReporter = new jasmine.JsApiReporter();
|
6
|
+
var htmlReporter = new jasmine.HtmlReporter();
|
7
|
+
|
8
|
+
jasmineEnv.addReporter(jsApiReporter);
|
9
|
+
jasmineEnv.addReporter(htmlReporter);
|
10
|
+
|
11
|
+
jasmineEnv.specFilter = function(spec) {
|
12
|
+
return htmlReporter.specFilter(spec);
|
13
|
+
};
|
14
|
+
|
15
|
+
var currentWindowOnload = window.onload;
|
16
|
+
|
17
|
+
window.onload = function() {
|
18
|
+
if (currentWindowOnload) {
|
19
|
+
currentWindowOnload();
|
20
|
+
}
|
21
|
+
execJasmine();
|
22
|
+
};
|
23
|
+
|
24
|
+
function execJasmine() {
|
25
|
+
jasmineEnv.execute();
|
26
|
+
}
|
27
|
+
|
28
|
+
})();
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Jasmine
|
2
|
+
class PathExpander
|
3
|
+
|
4
|
+
def self.expand(base_directory, patterns, globber = Dir.method(:glob))
|
5
|
+
negative, positive = patterns.partition {|pattern| /^!/ =~ pattern}
|
6
|
+
chosen, negated = [positive, negative].collect do |patterns|
|
7
|
+
patterns.map do |path|
|
8
|
+
files = globber.call(File.join(base_directory, path.gsub(/^!/, '')))
|
9
|
+
if files.empty? && !(path =~ /\*|^\!/)
|
10
|
+
files = [File.join(base_directory, path)]
|
11
|
+
end
|
12
|
+
files
|
13
|
+
end.flatten.uniq
|
14
|
+
end
|
15
|
+
chosen - negated
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Jasmine
|
2
|
+
class PathMapper
|
3
|
+
def initialize(config)
|
4
|
+
@config = config
|
5
|
+
end
|
6
|
+
|
7
|
+
def map_src_paths(paths)
|
8
|
+
map(paths, @config.src_dir, @config.src_path)
|
9
|
+
end
|
10
|
+
|
11
|
+
def map_spec_paths(paths)
|
12
|
+
map(paths, @config.spec_dir, @config.spec_path)
|
13
|
+
end
|
14
|
+
|
15
|
+
def map_boot_paths(paths)
|
16
|
+
map(paths, @config.boot_dir, @config.boot_path)
|
17
|
+
end
|
18
|
+
|
19
|
+
def map_jasmine_paths(paths)
|
20
|
+
map(paths, @config.jasmine_dir, @config.jasmine_path)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
def map(paths, remove_path, add_path)
|
25
|
+
paths.map { |path| File.join(add_path, (path.gsub(remove_path, ''))) }
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -10,27 +10,28 @@ module Jasmine
|
|
10
10
|
end
|
11
11
|
|
12
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
|
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
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
|
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
|
+
{}
|
34
35
|
end
|
35
36
|
|
36
37
|
end
|
data/lib/jasmine/run.html.erb
CHANGED
@@ -7,43 +7,6 @@
|
|
7
7
|
<% css_files.each do |css_file| %>
|
8
8
|
<link rel="stylesheet" href="<%= css_file %>" type="text/css" media="screen"/>
|
9
9
|
<% end %>
|
10
|
-
|
11
|
-
<% jasmine_files.each do |jasmine_file| %>
|
12
|
-
<script src="<%= jasmine_file %>" type="text/javascript"></script>
|
13
|
-
<% end %>
|
14
|
-
|
15
|
-
<script type="text/javascript">
|
16
|
-
//TODO: make this a js file that gets passed in, then iterate over only js_files
|
17
|
-
var jsApiReporter;
|
18
|
-
(function() {
|
19
|
-
var jasmineEnv = jasmine.getEnv();
|
20
|
-
|
21
|
-
jsApiReporter = new jasmine.JsApiReporter();
|
22
|
-
var htmlReporter = new jasmine.HtmlReporter();
|
23
|
-
|
24
|
-
jasmineEnv.addReporter(jsApiReporter);
|
25
|
-
jasmineEnv.addReporter(htmlReporter);
|
26
|
-
|
27
|
-
jasmineEnv.specFilter = function(spec) {
|
28
|
-
return htmlReporter.specFilter(spec);
|
29
|
-
};
|
30
|
-
|
31
|
-
var currentWindowOnload = window.onload;
|
32
|
-
|
33
|
-
window.onload = function() {
|
34
|
-
if (currentWindowOnload) {
|
35
|
-
currentWindowOnload();
|
36
|
-
}
|
37
|
-
execJasmine();
|
38
|
-
};
|
39
|
-
|
40
|
-
function execJasmine() {
|
41
|
-
jasmineEnv.execute();
|
42
|
-
}
|
43
|
-
|
44
|
-
})();
|
45
|
-
</script>
|
46
|
-
|
47
10
|
<% js_files.each do |js_file| %>
|
48
11
|
<script src="<%= js_file %>" type="text/javascript"></script>
|
49
12
|
<% end %>
|
data/lib/jasmine/run_specs.rb
CHANGED
@@ -2,18 +2,22 @@ $:.unshift(ENV['JASMINE_GEM_PATH']) if ENV['JASMINE_GEM_PATH'] # for gem testing
|
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'jasmine'
|
5
|
-
jasmine_config_overrides = File.expand_path(File.join(Dir.pwd, 'spec', 'javascripts', 'support', 'jasmine_config.rb'))
|
6
|
-
require jasmine_config_overrides if File.exist?(jasmine_config_overrides)
|
7
5
|
if Jasmine::Dependencies.rspec2?
|
8
6
|
require 'rspec'
|
9
7
|
else
|
10
8
|
require 'spec'
|
11
9
|
end
|
12
10
|
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
jasmine_yml = File.join(Dir.pwd, 'spec', 'javascripts', 'support', 'jasmine.yml')
|
12
|
+
if File.exist?(jasmine_yml)
|
13
|
+
end
|
14
|
+
|
15
|
+
Jasmine.load_configuration_from_yaml
|
16
|
+
|
17
|
+
config = Jasmine.config
|
16
18
|
|
19
|
+
server = Jasmine::Server.new(config.port, Jasmine::Application.app(config))
|
20
|
+
driver = Jasmine::SeleniumDriver.new(config.browser, "#{config.host}:#{config.port}/")
|
17
21
|
t = Thread.new do
|
18
22
|
begin
|
19
23
|
server.start
|
@@ -22,11 +26,11 @@ t = Thread.new do
|
|
22
26
|
# # ignore bad exits
|
23
27
|
end
|
24
28
|
t.abort_on_exception = true
|
25
|
-
Jasmine::wait_for_listener(
|
29
|
+
Jasmine::wait_for_listener(config.port, "jasmine server")
|
26
30
|
puts "jasmine server started."
|
27
31
|
|
28
|
-
results_processor = Jasmine::ResultsProcessor.new(
|
29
|
-
results = Jasmine::Runners::HTTP.new(
|
32
|
+
results_processor = Jasmine::ResultsProcessor.new(config)
|
33
|
+
results = Jasmine::Runners::HTTP.new(driver, results_processor, config.result_batch_size).run
|
30
34
|
formatter = Jasmine::RspecFormatter.new
|
31
35
|
formatter.format_results(results)
|
32
36
|
|
data/lib/jasmine/server.rb
CHANGED
@@ -42,13 +42,12 @@ namespace :jasmine do
|
|
42
42
|
end
|
43
43
|
|
44
44
|
task :server => "jasmine:require" do
|
45
|
-
jasmine_config_overrides = File.join(Jasmine::Config.new.project_root, 'spec', 'javascripts' ,'support' ,'jasmine_config.rb')
|
46
|
-
require jasmine_config_overrides if File.exist?(jasmine_config_overrides)
|
47
|
-
|
48
45
|
port = ENV['JASMINE_PORT'] || 8888
|
49
46
|
puts "your tests are here:"
|
50
47
|
puts " http://localhost:#{port}/"
|
51
|
-
Jasmine
|
48
|
+
Jasmine.load_configuration_from_yaml
|
49
|
+
app = Jasmine::Application.app(Jasmine.config)
|
50
|
+
Jasmine::Server.new(port, app).start
|
52
51
|
end
|
53
52
|
end
|
54
53
|
|
data/lib/jasmine/version.rb
CHANGED
@@ -0,0 +1,54 @@
|
|
1
|
+
module Jasmine
|
2
|
+
class YamlConfigParser
|
3
|
+
def initialize(path, pwd, path_expander = lambda {}, yaml_loader = lambda {})
|
4
|
+
@path = path
|
5
|
+
@path_expander = path_expander
|
6
|
+
@pwd = pwd
|
7
|
+
@yaml_loader = yaml_loader
|
8
|
+
end
|
9
|
+
|
10
|
+
def src_dir
|
11
|
+
return @pwd unless loaded_yaml['src_dir']
|
12
|
+
File.join(@pwd, loaded_yaml['src_dir'])
|
13
|
+
end
|
14
|
+
|
15
|
+
def spec_dir
|
16
|
+
return File.join(@pwd, 'spec', 'javascripts') unless loaded_yaml['spec_dir']
|
17
|
+
File.join(@pwd, loaded_yaml['spec_dir'])
|
18
|
+
end
|
19
|
+
|
20
|
+
def jasmine_dir
|
21
|
+
return nil unless loaded_yaml['jasmine_dir']
|
22
|
+
File.join(@pwd, loaded_yaml['jasmine_dir'])
|
23
|
+
end
|
24
|
+
|
25
|
+
def src_files
|
26
|
+
@path_expander.call(src_dir, loaded_yaml['src_files'] || [])
|
27
|
+
end
|
28
|
+
|
29
|
+
def jasmine_files
|
30
|
+
@path_expander.call(jasmine_dir, loaded_yaml['jasmine_files'] || [])
|
31
|
+
end
|
32
|
+
|
33
|
+
def jasmine_css_files
|
34
|
+
@path_expander.call(jasmine_dir, loaded_yaml['jasmine_css_files'] || [])
|
35
|
+
end
|
36
|
+
|
37
|
+
def spec_files
|
38
|
+
@path_expander.call(spec_dir, loaded_yaml['spec_files'] || [])
|
39
|
+
end
|
40
|
+
|
41
|
+
def helpers
|
42
|
+
@path_expander.call(spec_dir, loaded_yaml['helpers'] || [])
|
43
|
+
end
|
44
|
+
|
45
|
+
def css_files
|
46
|
+
@path_expander.call(src_dir, loaded_yaml['stylesheets'] || [])
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
def loaded_yaml
|
51
|
+
@yaml_loader.call(@path)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Jasmine::Application" do
|
4
|
+
|
5
|
+
it "includes no-cache headers for specs" do
|
6
|
+
pending
|
7
|
+
get "/__spec__/example_spec.js"
|
8
|
+
last_response.headers.should have_key("Cache-Control")
|
9
|
+
last_response.headers["Cache-Control"].should == "max-age=0, private, must-revalidate"
|
10
|
+
last_response.headers['Pragma'].each do |key|
|
11
|
+
last_response.headers[key].should == 'no-cache'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
data/spec/application_spec.rb
CHANGED
@@ -1,99 +1,44 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'rack/test'
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
last_response.status.should == 200
|
32
|
-
last_response.content_type.should == "application/javascript"
|
33
|
-
last_response.body.should == File.read(File.join(@root, "fixture/spec/example_spec.js"))
|
34
|
-
end
|
35
|
-
|
36
|
-
it "should serve static files from root dir under __root__" do
|
37
|
-
get "/__root__/fixture/src/example.js"
|
38
|
-
last_response.status.should == 200
|
39
|
-
last_response.content_type.should == "application/javascript"
|
40
|
-
last_response.body.should == File.read(File.join(@root, "fixture/src/example.js"))
|
41
|
-
end
|
42
|
-
|
43
|
-
it "should serve static files from src dir under /" do
|
44
|
-
get "/example.js"
|
45
|
-
last_response.status.should == 200
|
46
|
-
last_response.content_type.should == "application/javascript"
|
47
|
-
last_response.body.should == File.read(File.join(@root, "fixture/src/example.js"))
|
48
|
-
end
|
49
|
-
|
50
|
-
it "should serve Jasmine static files under /__JASMINE_ROOT__/" do
|
51
|
-
get "/__JASMINE_ROOT__/jasmine.css"
|
52
|
-
last_response.status.should == 200
|
53
|
-
last_response.content_type.should == "text/css"
|
54
|
-
last_response.body.should == File.read(File.join(Jasmine::Core.path, "jasmine.css"))
|
55
|
-
end
|
56
|
-
|
57
|
-
it "should serve focused suites when prefixing spec files with /__suite__/" do
|
58
|
-
pending "Temporarily removing this feature (maybe permanent)"
|
59
|
-
Dir.stub!(:glob).and_return { |glob_string| [glob_string] }
|
60
|
-
get "/__suite__/file2.js"
|
61
|
-
last_response.status.should == 200
|
62
|
-
last_response.content_type.should == "text/html"
|
63
|
-
last_response.body.should include("\"/__spec__/file2.js")
|
64
|
-
end
|
65
|
-
|
66
|
-
it "should redirect /run.html to /" do
|
67
|
-
get "/run.html"
|
68
|
-
last_response.status.should == 302
|
69
|
-
last_response.location.should == "/"
|
70
|
-
end
|
71
|
-
|
72
|
-
it "should 404 non-existent files" do
|
73
|
-
get "/some-non-existent-file"
|
74
|
-
last_response.should be_not_found
|
75
|
-
end
|
76
|
-
|
77
|
-
describe "/ page" do
|
78
|
-
it "should load each js file in order" do
|
79
|
-
get "/"
|
80
|
-
last_response.status.should == 200
|
81
|
-
last_response.body.should include("path/file1.js")
|
82
|
-
last_response.body.should include("path/file2.js")
|
83
|
-
end
|
3
|
+
#Rspec 1 doesn't correctly pass blocks to stubs, so skip (covered by integration tests)
|
4
|
+
#https://groups.google.com/forum/?fromgroups=#!topic/rspec/XT7paH2asCo
|
5
|
+
|
6
|
+
if Jasmine::Dependencies.rspec2?
|
7
|
+
describe "Jasmine::Application" do
|
8
|
+
it "should map paths provided by the config" do
|
9
|
+
handler1 = double(:handler1)
|
10
|
+
handler2 = double(:handler2)
|
11
|
+
app1 = double(:app1)
|
12
|
+
app2 = double(:app2)
|
13
|
+
rack_path_map = {"/foo" => lambda { handler1 }, "/bar" => lambda { handler2 }}
|
14
|
+
config = double(:config, :rack_path_map => rack_path_map, :rack_apps => [])
|
15
|
+
builder = double("Rack::Builder.new")
|
16
|
+
#Rack::Builder instance evals, so builder.run is invalid syntax,
|
17
|
+
#this is the only way to stub out the 'run' dsl it gives to the block.
|
18
|
+
Jasmine::Application.stub(:run).with(handler1).and_return(app1)
|
19
|
+
Jasmine::Application.stub(:run).with(handler2).and_return(app2)
|
20
|
+
|
21
|
+
builder.should_receive(:map).twice do |path, &app|
|
22
|
+
if path == '/foo'
|
23
|
+
app.call.should == app1
|
24
|
+
elsif path == '/bar'
|
25
|
+
app.call.should == app2
|
26
|
+
else
|
27
|
+
raise "Unexpected path passed"
|
28
|
+
end
|
29
|
+
end
|
84
30
|
|
85
|
-
|
86
|
-
head "/"
|
87
|
-
last_response.status.should == 200
|
88
|
-
last_response.headers['Content-Type'].should == 'text/html'
|
89
|
-
last_response.body.should == ''
|
31
|
+
Jasmine::Application.app(config, builder).should == builder
|
90
32
|
end
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
33
|
+
it "should run rack apps provided by the config" do
|
34
|
+
app1 = double(:app1)
|
35
|
+
app2 = double(:app2)
|
36
|
+
block = lambda { "foo" }
|
37
|
+
config = double(:config, :rack_path_map => [], :rack_apps => [[app1, nil], [app2, block]])
|
38
|
+
builder = double("Rack::Builder.new")
|
39
|
+
builder.should_receive(:use).with(app1)
|
40
|
+
builder.should_receive(:use).with(app2, &block)
|
41
|
+
Jasmine::Application.app(config, builder).should == builder
|
97
42
|
end
|
98
43
|
end
|
99
44
|
end
|