screw-unit 0.3.1 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +7 -1
- data/core/CHANGES +10 -0
- data/core/example/models/man.js +2 -2
- data/core/lib/jquery.print.js +2 -2
- data/core/lib/screw.behaviors.js +3 -2
- data/core/lib/screw.builder.js +15 -15
- data/core/lib/screw.css +2 -2
- data/core/lib/screw.events.js +3 -2
- data/core/lib/screw.matchers.js +53 -11
- data/core/spec/behaviors_spec.js +11 -1
- data/core/spec/matchers_spec.js +144 -9
- data/core/spec/print_spec.js +14 -8
- data/lib/screw_unit/resources/spec.rb +66 -3
- data/spec/functional/functional_spec_helper.rb +1 -1
- data/spec/unit/js_test_core/specs/spec_dir_spec.rb +7 -8
- data/spec/unit/js_test_core/specs/spec_file_spec.rb +5 -6
- data/spec/unit/unit_spec_helper.rb +1 -3
- data/vendor/js-test-core/CHANGES +5 -0
- data/vendor/js-test-core/Rakefile +1 -1
- data/vendor/js-test-core/lib/js_test_core/client.rb +19 -16
- data/vendor/js-test-core/lib/js_test_core/resources.rb +2 -2
- data/vendor/js-test-core/lib/js_test_core/resources/file.rb +9 -18
- data/vendor/js-test-core/lib/js_test_core/resources/runner.rb +17 -15
- data/vendor/js-test-core/lib/js_test_core/resources/{suite.rb → session.rb} +8 -4
- data/vendor/js-test-core/lib/js_test_core/resources/{suite_finish.rb → session_finish.rb} +5 -5
- data/vendor/js-test-core/lib/js_test_core/resources/web_root.rb +6 -3
- data/vendor/js-test-core/spec/unit/js_test_core/client_spec.rb +22 -21
- data/vendor/js-test-core/spec/unit/js_test_core/resources/file_spec.rb +0 -38
- data/vendor/js-test-core/spec/unit/js_test_core/resources/runners/runner_spec.rb +83 -63
- data/vendor/js-test-core/spec/unit/js_test_core/resources/{suite_finish_spec.rb → session_finish_spec.rb} +15 -18
- data/vendor/js-test-core/spec/unit/js_test_core/resources/session_spec.rb +82 -0
- data/vendor/js-test-core/spec/unit/js_test_core/resources/specs/spec_dir_spec.rb +3 -3
- data/vendor/js-test-core/spec/unit/unit_spec_helper.rb +37 -10
- data/vendor/js-test-core/vendor/thin-rest/lib/thin_rest/resource.rb +4 -0
- metadata +88 -89
- data/core/lib/screw.assets.js +0 -36
- data/core/lib/screw.server.js +0 -21
- data/vendor/js-test-core/spec/unit/js_test_core/resources/suite_spec.rb +0 -86
data/core/spec/print_spec.js
CHANGED
@@ -48,9 +48,9 @@ Screw.Unit(function() {
|
|
48
48
|
|
49
49
|
describe('when given a function', function() {
|
50
50
|
it("returns the function's signature", function() {
|
51
|
-
expect($.print(function() {})).to(
|
52
|
-
expect($.print(function foo() {})).to(
|
53
|
-
expect($.print(function foo(bar) {})).to(
|
51
|
+
expect($.print(function() {})).to(match, /function\s*\(\)/);
|
52
|
+
expect($.print(function foo() {})).to(match, /function\s*foo\(\)/);
|
53
|
+
expect($.print(function foo(bar) {})).to(match, /function\s*foo\(bar\)/);
|
54
54
|
});
|
55
55
|
});
|
56
56
|
|
@@ -66,16 +66,22 @@ Screw.Unit(function() {
|
|
66
66
|
});
|
67
67
|
});
|
68
68
|
|
69
|
+
describe('when given 0', function() {
|
70
|
+
it('should print the string "0"', function() {
|
71
|
+
expect($.print(0)).to(equal, '0');
|
72
|
+
});
|
73
|
+
});
|
74
|
+
|
69
75
|
describe('when given an element', function() {
|
70
76
|
it("returns the string representation of the element", function() {
|
71
|
-
expect($.print($('<div>').get(0))).to(equal, '<div>');
|
72
|
-
expect($.print($('<div foo="bar">').get(0))).to(equal, '<div>');
|
73
|
-
expect($.print($('<div class="foo" id="bar">').get(0))).to(equal, '<div class="foo" id="bar">');
|
77
|
+
expect($.print($('<div></div>').get(0))).to(equal, '<div>');
|
78
|
+
expect($.print($('<div foo="bar"></div>').get(0))).to(equal, '<div>');
|
79
|
+
expect($.print($('<div class="foo" id="bar"></div>').get(0))).to(equal, '<div class="foo" id="bar">');
|
74
80
|
});
|
75
81
|
|
76
82
|
describe('when the element is an img', function() {
|
77
83
|
it('prints out the img src attribute', function() {
|
78
|
-
expect($.print($('<img src="test.png"
|
84
|
+
expect($.print($('<img src="test.png"/>'))).to(match, /<img src=".+?test.png">/);
|
79
85
|
})
|
80
86
|
});
|
81
87
|
});
|
@@ -118,7 +124,7 @@ Screw.Unit(function() {
|
|
118
124
|
|
119
125
|
describe('when given a jQuery', function() {
|
120
126
|
it("returns the printed array of elements engirthed in '$()'", function() {
|
121
|
-
expect($.print($('<div>'))).to(equal, '$([ <div> ])');
|
127
|
+
expect($.print($('<div></div>'))).to(equal, '$([ <div> ])');
|
122
128
|
});
|
123
129
|
});
|
124
130
|
|
@@ -2,6 +2,7 @@ module ScrewUnit
|
|
2
2
|
module Resources
|
3
3
|
module Spec
|
4
4
|
def get
|
5
|
+
# TODO: BT/JN - Remove the Screw.Assets when we implement rendering of script and link tags from yml files.
|
5
6
|
html = <<-HTML
|
6
7
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
7
8
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
@@ -15,9 +16,71 @@ module ScrewUnit
|
|
15
16
|
<script src="/core/screw.matchers.js"></script>
|
16
17
|
<script src="/core/screw.events.js"></script>
|
17
18
|
<script src="/core/screw.behaviors.js"></script>
|
18
|
-
<script
|
19
|
-
|
20
|
-
|
19
|
+
<script type="text/javascript">
|
20
|
+
(function($) {
|
21
|
+
Screw.Assets = {};
|
22
|
+
Screw.Assets.use_cache_buster = false; // TODO: NS/CTI - make this configurable from the UI.
|
23
|
+
var required_paths = [];
|
24
|
+
var included_stylesheets = {};
|
25
|
+
var cache_buster = parseInt(new Date().getTime()/(1*1000));
|
26
|
+
|
27
|
+
function tag(name, attributes) {
|
28
|
+
var html = "<" + name;
|
29
|
+
for(var attribute in attributes) {
|
30
|
+
html += (" " + attribute + "='" + attributes[attribute]) + "'";
|
31
|
+
};
|
32
|
+
html += "></";
|
33
|
+
html += name;
|
34
|
+
html += ">";
|
35
|
+
return html;
|
36
|
+
}
|
37
|
+
|
38
|
+
Screw.Assets.require = function(javascript_path, onload) {
|
39
|
+
if(!required_paths[javascript_path]) {
|
40
|
+
var full_path = javascript_path + ".js";
|
41
|
+
if (Screw.Assets.use_cache_buster) {
|
42
|
+
full_path += '?' + cache_buster;
|
43
|
+
}
|
44
|
+
document.write(tag("script", {src: full_path, type: 'text/javascript'}));
|
45
|
+
if(onload) {
|
46
|
+
var scripts = document.getElementsByTagName('script');
|
47
|
+
scripts[scripts.length-1].onload = onload;
|
48
|
+
}
|
49
|
+
required_paths[javascript_path] = true;
|
50
|
+
}
|
51
|
+
};
|
52
|
+
|
53
|
+
Screw.Assets.stylesheet = function(stylesheet_path) {
|
54
|
+
if(!included_stylesheets[stylesheet_path]) {
|
55
|
+
var full_path = stylesheet_path + ".css";
|
56
|
+
if(Screw.Assets.use_cache_buster) {
|
57
|
+
full_path += '?' + cache_buster;
|
58
|
+
}
|
59
|
+
document.write(tag("link", {rel: 'stylesheet', type: 'text/css', href: full_path}));
|
60
|
+
included_stylesheets[stylesheet_path] = true;
|
61
|
+
}
|
62
|
+
};
|
63
|
+
|
64
|
+
window.require = Screw.Assets.require;
|
65
|
+
window.stylesheet = Screw.Assets.stylesheet;
|
66
|
+
})(jQuery);
|
67
|
+
|
68
|
+
(function($) {
|
69
|
+
var ajax = $.ajax;
|
70
|
+
$(Screw).bind('after', function() {
|
71
|
+
var error_text = $(".error").map(function(i, element) {
|
72
|
+
return element.innerHTML;
|
73
|
+
}).get().join("\\n");
|
74
|
+
|
75
|
+
ajax({
|
76
|
+
type: "POST",
|
77
|
+
url: '/session/finish',
|
78
|
+
data: {"text": error_text}
|
79
|
+
});
|
80
|
+
});
|
81
|
+
})(jQuery);
|
82
|
+
</script>
|
83
|
+
<link rel="stylesheet" href="/core/screw.css" />
|
21
84
|
HTML
|
22
85
|
spec_files.each do |file|
|
23
86
|
html << %{<script type="text/javascript" src="#{file.relative_path}"></script>\n}
|
@@ -19,17 +19,16 @@ module JsTestCore
|
|
19
19
|
end
|
20
20
|
|
21
21
|
it "returns script tags for each test javascript file" do
|
22
|
-
doc.at("script[@src='/specs/failing_spec.js']").
|
23
|
-
doc.at("script[@src='/specs/foo/failing_spec.js']").
|
24
|
-
doc.at("script[@src='/specs/foo/passing_spec.js']").
|
22
|
+
doc.at("script[@src='/specs/failing_spec.js']").should_not be_nil
|
23
|
+
doc.at("script[@src='/specs/foo/failing_spec.js']").should_not be_nil
|
24
|
+
doc.at("script[@src='/specs/foo/passing_spec.js']").should_not be_nil
|
25
25
|
end
|
26
26
|
|
27
27
|
it "returns the screw unit template" do
|
28
|
-
doc.at("link[@href='/core/screw.css']").
|
29
|
-
doc.at("script[@src='/core/screw.builder.js']").
|
30
|
-
doc.at("script[@src='/core/screw.events.js']").
|
31
|
-
doc.at("script[@src='/core/screw.behaviors.js']").
|
32
|
-
doc.at("script[@src='/core/screw.assets.js']").should exist
|
28
|
+
doc.at("link[@href='/core/screw.css']").should_not be_nil
|
29
|
+
doc.at("script[@src='/core/screw.builder.js']").should_not be_nil
|
30
|
+
doc.at("script[@src='/core/screw.events.js']").should_not be_nil
|
31
|
+
doc.at("script[@src='/core/screw.behaviors.js']").should_not be_nil
|
33
32
|
doc.at("body/#screw_unit_content").should_not be_nil
|
34
33
|
end
|
35
34
|
end
|
@@ -17,15 +17,14 @@ module JsTestCore
|
|
17
17
|
end
|
18
18
|
|
19
19
|
it "returns script tags for the test javascript file" do
|
20
|
-
doc.at("script[@src='/specs/failing_spec.js']").
|
20
|
+
doc.at("script[@src='/specs/failing_spec.js']").should_not be_nil
|
21
21
|
end
|
22
22
|
|
23
23
|
it "returns the screw unit template" do
|
24
|
-
doc.at("link[@href='/core/screw.css']").
|
25
|
-
doc.at("script[@src='/core/screw.builder.js']").
|
26
|
-
doc.at("script[@src='/core/screw.events.js']").
|
27
|
-
doc.at("script[@src='/core/screw.behaviors.js']").
|
28
|
-
doc.at("script[@src='/core/screw.assets.js']").should exist
|
24
|
+
doc.at("link[@href='/core/screw.css']").should_not be_nil
|
25
|
+
doc.at("script[@src='/core/screw.builder.js']").should_not be_nil
|
26
|
+
doc.at("script[@src='/core/screw.events.js']").should_not be_nil
|
27
|
+
doc.at("script[@src='/core/screw.behaviors.js']").should_not be_nil
|
29
28
|
doc.at("body/#screw_unit_content").should_not be_nil
|
30
29
|
end
|
31
30
|
end
|
@@ -22,7 +22,7 @@ module Spec
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
class Spec::
|
25
|
+
class Spec::ExampleGroup
|
26
26
|
class << self
|
27
27
|
def thin_logging
|
28
28
|
@thin_logging = true if @thin_logging.nil?
|
@@ -31,9 +31,7 @@ class Spec::Example::ExampleGroup
|
|
31
31
|
|
32
32
|
attr_writer :thin_logging
|
33
33
|
end
|
34
|
-
end
|
35
34
|
|
36
|
-
module Spec::Example::ExampleMethods
|
37
35
|
attr_reader :spec_root_path, :implementation_root_path, :public_path, :server, :connection
|
38
36
|
before(:all) do
|
39
37
|
dir = File.dirname(__FILE__)
|
data/vendor/js-test-core/CHANGES
CHANGED
@@ -1,4 +1,9 @@
|
|
1
1
|
0.2.0
|
2
|
+
- Renamed Suite to Session to follow Selenium conventions
|
3
|
+
- Renamed SuiteFinish to SessionFinish to follow Selenium conventions
|
4
|
+
- Added /session, which uses the session_id cookie to derive the current session.
|
5
|
+
- Added /session/finished to be used to simplify client/server interactions.
|
6
|
+
- Remove File caching because it doesn't cause a noticable performance benefit over a local network and because it sometimes doesn't write over stale files.
|
2
7
|
- Client accepts selenium_browser_start_command parameter, which allows the user to parameterize the selenium_browser_start_command
|
3
8
|
- Added support for running specs in Internet Explorer via POST /runners/iexplore
|
4
9
|
- Resource file download performance improvements via caching and chunked sending
|
@@ -6,7 +6,7 @@ module JsTestCore
|
|
6
6
|
class InvalidStatusResponse < ClientException
|
7
7
|
end
|
8
8
|
|
9
|
-
class
|
9
|
+
class SessionNotFound < ClientException
|
10
10
|
end
|
11
11
|
|
12
12
|
class << self
|
@@ -44,7 +44,7 @@ module JsTestCore
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
attr_reader :parameters, :query_string, :http, :
|
47
|
+
attr_reader :parameters, :query_string, :http, :session_start_response, :last_poll_status, :last_poll_reason, :last_poll
|
48
48
|
def initialize(parameters)
|
49
49
|
@parameters = parameters
|
50
50
|
@query_string = SeleniumServerConfiguration.query_string_from(parameters)
|
@@ -53,7 +53,7 @@ module JsTestCore
|
|
53
53
|
def run
|
54
54
|
Net::HTTP.start(DEFAULT_HOST, DEFAULT_PORT) do |@http|
|
55
55
|
start_runner
|
56
|
-
|
56
|
+
wait_for_session_to_finish
|
57
57
|
end
|
58
58
|
report_result
|
59
59
|
end
|
@@ -68,19 +68,22 @@ module JsTestCore
|
|
68
68
|
|
69
69
|
protected
|
70
70
|
def start_runner
|
71
|
-
@
|
71
|
+
@session_start_response = http.post('/runners', query_string)
|
72
72
|
end
|
73
73
|
|
74
|
-
def
|
75
|
-
|
74
|
+
def wait_for_session_to_finish
|
75
|
+
while session_not_completed?
|
76
|
+
poll
|
77
|
+
sleep 0.25
|
78
|
+
end
|
76
79
|
end
|
77
80
|
|
78
81
|
def report_result
|
79
82
|
case last_poll_status
|
80
|
-
when Resources::
|
83
|
+
when Resources::Session::SUCCESSFUL_COMPLETION
|
81
84
|
STDOUT.puts "SUCCESS"
|
82
85
|
true
|
83
|
-
when Resources::
|
86
|
+
when Resources::Session::FAILURE_COMPLETION
|
84
87
|
STDOUT.puts "FAILURE"
|
85
88
|
STDOUT.puts last_poll_reason
|
86
89
|
false
|
@@ -89,26 +92,26 @@ module JsTestCore
|
|
89
92
|
end
|
90
93
|
end
|
91
94
|
|
92
|
-
def
|
93
|
-
last_poll_status.nil? || last_poll_status == Resources::
|
95
|
+
def session_not_completed?
|
96
|
+
last_poll_status.nil? || last_poll_status == Resources::Session::RUNNING
|
94
97
|
end
|
95
98
|
|
96
99
|
def poll
|
97
|
-
@last_poll = http.get("/
|
98
|
-
|
100
|
+
@last_poll = http.get("/sessions/#{session_id}")
|
101
|
+
ensure_session_exists!
|
99
102
|
parts = parts_from_query(last_poll.body)
|
100
103
|
@last_poll_status = parts['status']
|
101
104
|
@last_poll_reason = parts['reason']
|
102
105
|
end
|
103
106
|
|
104
|
-
def
|
107
|
+
def ensure_session_exists!
|
105
108
|
if (400..499).include?(Integer(last_poll.code))
|
106
|
-
raise
|
109
|
+
raise SessionNotFound, "Could not find session with id #{session_id}"
|
107
110
|
end
|
108
111
|
end
|
109
112
|
|
110
|
-
def
|
111
|
-
@
|
113
|
+
def session_id
|
114
|
+
@session_id ||= parts_from_query(session_start_response.body)['session_id']
|
112
115
|
end
|
113
116
|
end
|
114
117
|
end
|
@@ -6,5 +6,5 @@ require "#{dir}/resources/file_not_found"
|
|
6
6
|
require "#{dir}/resources/specs/spec_file"
|
7
7
|
require "#{dir}/resources/specs/spec_dir"
|
8
8
|
require "#{dir}/resources/web_root"
|
9
|
-
require "#{dir}/resources/
|
10
|
-
require "#{dir}/resources/
|
9
|
+
require "#{dir}/resources/session"
|
10
|
+
require "#{dir}/resources/session_finish"
|
@@ -17,24 +17,15 @@ module JsTestCore
|
|
17
17
|
content_type = MIME_TYPES[extension] || 'text/html'
|
18
18
|
|
19
19
|
connection.terminate_after_sending do
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
200,
|
30
|
-
'Content-Type' => content_type,
|
31
|
-
'Last-Modified' => ::File.mtime(absolute_path).rfc822,
|
32
|
-
'Content-Length' => ::File.size(absolute_path)
|
33
|
-
)
|
34
|
-
::File.open(absolute_path) do |file|
|
35
|
-
while !file.eof?
|
36
|
-
connection.send_data(file.read(1024))
|
37
|
-
end
|
20
|
+
connection.send_head(
|
21
|
+
200,
|
22
|
+
'Content-Type' => content_type,
|
23
|
+
'Last-Modified' => ::File.mtime(absolute_path).rfc822,
|
24
|
+
'Content-Length' => ::File.size(absolute_path)
|
25
|
+
)
|
26
|
+
::File.open(absolute_path) do |file|
|
27
|
+
while !file.eof?
|
28
|
+
connection.send_data(file.read(1024))
|
38
29
|
end
|
39
30
|
end
|
40
31
|
end
|
@@ -18,7 +18,7 @@ module JsTestCore
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def post
|
21
|
-
spec_url = rack_request['spec_url'].to_s == "" ?
|
21
|
+
spec_url = rack_request['spec_url'].to_s == "" ? full_spec_suite_url : rack_request['spec_url']
|
22
22
|
parsed_spec_url = URI.parse(spec_url)
|
23
23
|
selenium_host = rack_request['selenium_host'].to_s == "" ? 'localhost' : rack_request['selenium_host'].to_s
|
24
24
|
selenium_port = rack_request['selenium_port'].to_s == "" ? 4444 : Integer(rack_request['selenium_port'])
|
@@ -34,17 +34,19 @@ module JsTestCore
|
|
34
34
|
rescue Errno::ECONNREFUSED => e
|
35
35
|
raise Errno::ECONNREFUSED, "Cannot connect to Selenium Server at #{http_address}. To start the selenium server, run `selenium`."
|
36
36
|
end
|
37
|
-
Thread.start do
|
38
|
-
driver.open(spec_url)
|
39
|
-
end
|
40
37
|
runner = Runner.new(:driver => driver)
|
41
38
|
Runner.register(runner)
|
39
|
+
Thread.start do
|
40
|
+
driver.open("/")
|
41
|
+
driver.create_cookie("session_id=#{runner.session_id}")
|
42
|
+
driver.open(parsed_spec_url.path)
|
43
|
+
end
|
42
44
|
connection.send_head
|
43
|
-
connection.send_body("
|
45
|
+
connection.send_body("session_id=#{runner.session_id}")
|
44
46
|
end
|
45
47
|
|
46
48
|
protected
|
47
|
-
def
|
49
|
+
def full_spec_suite_url
|
48
50
|
"#{Server.root_url}/specs"
|
49
51
|
end
|
50
52
|
end
|
@@ -54,14 +56,14 @@ module JsTestCore
|
|
54
56
|
instances[id.to_s]
|
55
57
|
end
|
56
58
|
|
57
|
-
def finalize(
|
58
|
-
if runner = find(
|
59
|
+
def finalize(session_id, text)
|
60
|
+
if runner = find(session_id)
|
59
61
|
runner.finalize(text)
|
60
62
|
end
|
61
63
|
end
|
62
64
|
|
63
65
|
def register(runner)
|
64
|
-
instances[runner.
|
66
|
+
instances[runner.session_id] = runner
|
65
67
|
end
|
66
68
|
|
67
69
|
protected
|
@@ -72,7 +74,7 @@ module JsTestCore
|
|
72
74
|
|
73
75
|
include FileUtils
|
74
76
|
property :driver
|
75
|
-
attr_reader :profile_dir, :
|
77
|
+
attr_reader :profile_dir, :session_run_result
|
76
78
|
|
77
79
|
def after_initialize
|
78
80
|
profile_base = "#{::Dir.tmpdir}/js_test_core/#{self.class.name}"
|
@@ -80,24 +82,24 @@ module JsTestCore
|
|
80
82
|
@profile_dir = "#{profile_base}/#{Time.now.to_i}"
|
81
83
|
end
|
82
84
|
|
83
|
-
def finalize(
|
85
|
+
def finalize(session_run_result)
|
84
86
|
driver.stop
|
85
|
-
@
|
87
|
+
@session_run_result = session_run_result.to_s
|
86
88
|
end
|
87
89
|
|
88
90
|
def running?
|
89
|
-
|
91
|
+
driver.session_started?
|
90
92
|
end
|
91
93
|
|
92
94
|
def successful?
|
93
|
-
!running? &&
|
95
|
+
!running? && session_run_result.empty?
|
94
96
|
end
|
95
97
|
|
96
98
|
def failed?
|
97
99
|
!running? && !successful?
|
98
100
|
end
|
99
101
|
|
100
|
-
def
|
102
|
+
def session_id
|
101
103
|
driver.session_id
|
102
104
|
end
|
103
105
|
end
|