honkster-js-test-server 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. data/CHANGES +40 -0
  2. data/Gemfile +21 -0
  3. data/Gemfile.lock +60 -0
  4. data/README.markdown +9 -0
  5. data/Rakefile +67 -0
  6. data/bin/jasmine-server +9 -0
  7. data/bin/js-test-client +8 -0
  8. data/bin/js-test-server +9 -0
  9. data/bin/screw-unit-server +9 -0
  10. data/lib/js_test_server.rb +29 -0
  11. data/lib/js_test_server/client.rb +23 -0
  12. data/lib/js_test_server/client/runner.rb +130 -0
  13. data/lib/js_test_server/configuration.rb +69 -0
  14. data/lib/js_test_server/server.rb +14 -0
  15. data/lib/js_test_server/server/app.rb +10 -0
  16. data/lib/js_test_server/server/resources.rb +14 -0
  17. data/lib/js_test_server/server/resources/file.rb +58 -0
  18. data/lib/js_test_server/server/resources/framework_file.rb +15 -0
  19. data/lib/js_test_server/server/resources/implementations_deprecation.rb +8 -0
  20. data/lib/js_test_server/server/resources/not_found.rb +25 -0
  21. data/lib/js_test_server/server/resources/remote_control.rb +80 -0
  22. data/lib/js_test_server/server/resources/resource.rb +12 -0
  23. data/lib/js_test_server/server/resources/spec_file.rb +47 -0
  24. data/lib/js_test_server/server/resources/web_root.rb +17 -0
  25. data/lib/js_test_server/server/runner.rb +77 -0
  26. data/lib/js_test_server/server/standalone.ru +1 -0
  27. data/lib/js_test_server/server/views.rb +12 -0
  28. data/lib/js_test_server/server/views/dir.html.rb +22 -0
  29. data/lib/js_test_server/server/views/frameworks.rb +3 -0
  30. data/lib/js_test_server/server/views/not_found.html.rb +13 -0
  31. data/lib/js_test_server/server/views/page.html.rb +40 -0
  32. data/lib/js_test_server/server/views/remote_control_subscriber.rb +17 -0
  33. data/lib/js_test_server/server/views/suite.html.rb +54 -0
  34. data/lib/js_test_server/server/views/suites.rb +6 -0
  35. data/lib/js_test_server/server/views/suites/jasmine.html.rb +30 -0
  36. data/lib/js_test_server/server/views/suites/screw_unit.html.rb +44 -0
  37. data/public/js_test_server.js +565 -0
  38. data/public/js_test_server/jasmine_driver.js +63 -0
  39. data/public/js_test_server/remote_control.js +28 -0
  40. data/public/js_test_server/screw_unit_driver.js +31 -0
  41. data/scratch.rb +8 -0
  42. data/spec/frameworks/jasmine/cruise_config.rb +21 -0
  43. data/spec/frameworks/jasmine/spec/jasmine_helper.rb +44 -0
  44. data/spec/frameworks/jasmine/spec/jasmine_spec.rb +31 -0
  45. data/spec/functional/functional_spec_helper.rb +55 -0
  46. data/spec/functional/functional_spec_server_starter.rb +69 -0
  47. data/spec/functional/jasmine/jasmine_functional_spec.rb +27 -0
  48. data/spec/functional/screw-unit/screw_unit_functional_spec.rb +27 -0
  49. data/spec/functional_suite.rb +16 -0
  50. data/spec/spec_helpers/be_http.rb +32 -0
  51. data/spec/spec_helpers/example_group.rb +41 -0
  52. data/spec/spec_helpers/fake_deferrable.rb +3 -0
  53. data/spec/spec_helpers/fake_selenium_driver.rb +16 -0
  54. data/spec/spec_helpers/mock_session.rb +30 -0
  55. data/spec/spec_helpers/show_test_exceptions.rb +22 -0
  56. data/spec/spec_helpers/wait_for.rb +11 -0
  57. data/spec/spec_suite.rb +3 -0
  58. data/spec/unit/js_test_core/client/runner_spec.rb +198 -0
  59. data/spec/unit/js_test_core/configuration_spec.rb +44 -0
  60. data/spec/unit/js_test_core/resources/file_spec.rb +79 -0
  61. data/spec/unit/js_test_core/resources/framework_file_spec.rb +58 -0
  62. data/spec/unit/js_test_core/resources/implementations_deprecation_spec.rb +16 -0
  63. data/spec/unit/js_test_core/resources/not_found_spec.rb +49 -0
  64. data/spec/unit/js_test_core/resources/remote_control_spec.rb +117 -0
  65. data/spec/unit/js_test_core/resources/spec_file_spec.rb +147 -0
  66. data/spec/unit/js_test_core/resources/web_root_spec.rb +26 -0
  67. data/spec/unit/js_test_core/server/server_spec.rb +103 -0
  68. data/spec/unit/unit_spec_helper.rb +34 -0
  69. data/spec/unit_suite.rb +10 -0
  70. data/vendor/lucky-luciano/lib/lucky_luciano.rb +5 -0
  71. data/vendor/lucky-luciano/lib/lucky_luciano/resource.rb +142 -0
  72. data/vendor/lucky-luciano/lib/lucky_luciano/resource/path.rb +24 -0
  73. data/vendor/lucky-luciano/lib/lucky_luciano/rspec.rb +4 -0
  74. data/vendor/lucky-luciano/lib/lucky_luciano/rspec/be_http.rb +32 -0
  75. data/vendor/lucky-luciano/spec/lucky_luciano/resource_spec.rb +276 -0
  76. data/vendor/lucky-luciano/spec/spec_helper.rb +48 -0
  77. data/vendor/lucky-luciano/spec/spec_suite.rb +4 -0
  78. metadata +146 -0
@@ -0,0 +1,14 @@
1
+ module JsTestServer::Server
2
+ DEFAULTS = {
3
+ :host => "0.0.0.0",
4
+ :port => 8080,
5
+ :spec_path => File.expand_path("./spec/javascripts"),
6
+ :root_path => File.expand_path("./public"),
7
+ }
8
+ end
9
+
10
+ dir = File.dirname(__FILE__)
11
+ require "#{dir}/server/runner"
12
+ require "#{dir}/server/resources"
13
+ require "#{dir}/server/views"
14
+ require "#{dir}/server/app"
@@ -0,0 +1,10 @@
1
+ class JsTestServer::Server::App < Sinatra::Base
2
+ set :logging, true
3
+ register(JsTestServer::Server::Resources::WebRoot.route_handler)
4
+ register(JsTestServer::Server::Resources::SpecFile.route_handler)
5
+ register(JsTestServer::Server::Resources::File.route_handler)
6
+ register(JsTestServer::Server::Resources::FrameworkFile.route_handler)
7
+ register(JsTestServer::Server::Resources::RemoteControl.route_handler)
8
+ register(JsTestServer::Server::Resources::ImplementationsDeprecation.route_handler)
9
+ register(JsTestServer::Server::Resources::NotFound.route_handler)
10
+ end
@@ -0,0 +1,14 @@
1
+ dir = File.dirname(__FILE__)
2
+
3
+ module JsTestServer::Server::Resources
4
+ end
5
+
6
+ require "#{dir}/resources/resource"
7
+ require "#{dir}/resources/file"
8
+ require "#{dir}/resources/spec_file"
9
+ require "#{dir}/resources/framework_file"
10
+ require "#{dir}/resources/web_root"
11
+ require "#{dir}/resources/not_found"
12
+ require "#{dir}/resources/remote_control"
13
+
14
+ require "#{dir}/resources/implementations_deprecation"
@@ -0,0 +1,58 @@
1
+ class JsTestServer::Server::Resources::File < JsTestServer::Server::Resources::Resource
2
+ def self.render_file(absolute_path)
3
+ extension = ::File.extname(absolute_path)
4
+ content_type = MIME_TYPES[extension] || 'text/html'
5
+ headers = {
6
+ 'Content-Type' => content_type,
7
+ 'Last-Modified' => ::File.mtime(absolute_path).rfc822
8
+ }
9
+ [200, headers, ::File.read(absolute_path)]
10
+ end
11
+
12
+ map "*"
13
+
14
+ MIME_TYPES = {
15
+ '.html' => 'text/html',
16
+ '.htm' => 'text/html',
17
+ '.js' => 'text/javascript',
18
+ '.css' => 'text/css',
19
+ '.png' => 'image/png',
20
+ '.jpg' => 'image/jpeg',
21
+ '.jpeg' => 'image/jpeg',
22
+ '.gif' => 'image/gif',
23
+ }
24
+
25
+ get "*" do
26
+ do_get
27
+ end
28
+
29
+ def relative_path
30
+ @relative_path ||= request.path_info
31
+ end
32
+
33
+ def absolute_path
34
+ @absolute_path ||= ::File.expand_path("#{root_path}#{relative_path}")
35
+ end
36
+
37
+ protected
38
+
39
+ def do_get
40
+ if ::File.exists?(absolute_path)
41
+ if ::File.directory?(absolute_path)
42
+ render_dir
43
+ else
44
+ render_file
45
+ end
46
+ else
47
+ pass
48
+ end
49
+ end
50
+
51
+ def render_dir
52
+ JsTestServer::Server::Views::Dir.new(:relative_path => relative_path, :absolute_path => absolute_path).to_s
53
+ end
54
+
55
+ def render_file
56
+ self.class.render_file(absolute_path)
57
+ end
58
+ end
@@ -0,0 +1,15 @@
1
+ class JsTestServer::Server::Resources::FrameworkFile < JsTestServer::Server::Resources::File
2
+ map "/framework"
3
+
4
+ get "/?" do
5
+ do_get
6
+ end
7
+
8
+ get "*" do
9
+ do_get
10
+ end
11
+
12
+ def absolute_path
13
+ @absolute_path ||= ::File.expand_path("#{framework_path}#{relative_path.gsub(%r{^/framework}, "")}")
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ class JsTestServer::Server::Resources::ImplementationsDeprecation < JsTestServer::Server::Resources::Resource
2
+ map "/implementations"
3
+
4
+ get "*" do
5
+ new_path = JsTestServer::Server::Resources::File.path("javascripts", *params["splat"])
6
+ [301, {'Location' => new_path}, "This page has been moved to #{new_path}"]
7
+ end
8
+ end
@@ -0,0 +1,25 @@
1
+ class JsTestServer::Server::Resources::NotFound < JsTestServer::Server::Resources::Resource
2
+ include JsTestServer::Server
3
+ map "*"
4
+
5
+ get "/" do
6
+ call
7
+ end
8
+
9
+ put "/" do
10
+ call
11
+ end
12
+
13
+ post "/" do
14
+ call
15
+ end
16
+
17
+ delete "/" do
18
+ call
19
+ end
20
+
21
+ def call
22
+ body = Views::NotFound.new(:message => "File #{request.path_info} not found").to_s
23
+ [ 404, { "Content-Type" => "text/html" }, body ]
24
+ end
25
+ end
@@ -0,0 +1,80 @@
1
+ module JsTestServer
2
+ module Server
3
+ module Resources
4
+ class RemoteControl < JsTestServer::Server::Resources::Resource
5
+ class Queue
6
+ def initialize
7
+ @items = []
8
+ @subscriber = nil
9
+ end
10
+ def push item
11
+ @items << item
12
+ notify_subscriber if @subscriber
13
+ end
14
+ alias :<< :push
15
+ def subscribe &blk
16
+ @subscriber = blk
17
+ notify_subscriber unless @items.empty?
18
+ end
19
+ def unsubscribe
20
+ @subscriber = nil
21
+ end
22
+ def clear
23
+ items, @items = @items, []
24
+ items
25
+ end
26
+ def to_a
27
+ @items
28
+ end
29
+
30
+ protected
31
+
32
+ def notify_subscriber
33
+ @subscriber.call
34
+ unsubscribe
35
+ end
36
+ end
37
+
38
+ class << self
39
+ def queue
40
+ @queue ||= Queue.new
41
+ end
42
+ attr_writer :queue
43
+ end
44
+
45
+ map "/remote_control"
46
+
47
+ get "subscriber" do
48
+ [200, {}, Views::RemoteControlSubscriber.new.to_s]
49
+ end
50
+
51
+ post "commands" do
52
+ self.class.queue << {"javascript" => params["javascript"]}
53
+ [200, {'Content-Type' => "application/json"}, self.class.queue.to_a.to_json]
54
+ end
55
+
56
+ get "commands" do
57
+ if Object.const_defined?(:Thin)
58
+ subscribed = true
59
+ self.class.queue.subscribe do
60
+ subscribed = false
61
+ env[Thin::Request::ASYNC_CALLBACK].call(do_get_commands)
62
+ end
63
+ env[Thin::Request::ASYNC_CLOSE].callback do
64
+ self.class.queue.unsubscribe if subscribed
65
+ end
66
+ throw :async
67
+ else
68
+ do_get_commands
69
+ end
70
+ end
71
+
72
+ protected
73
+ def do_get_commands
74
+ queue_content = self.class.queue.clear
75
+ [200, {'Content-Type' => "application/json"}, queue_content.to_json]
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,12 @@
1
+ class JsTestServer::Server::Resources::Resource < LuckyLuciano::Resource
2
+ protected
3
+
4
+ def spec_path; server.spec_path; end
5
+ def root_path; server.root_path; end
6
+ def framework_path; server.framework_path; end
7
+ def root_url; server.root_url; end
8
+
9
+ def server
10
+ JsTestServer::Configuration
11
+ end
12
+ end
@@ -0,0 +1,47 @@
1
+ class JsTestServer::Server::Resources::SpecFile < JsTestServer::Server::Resources::File
2
+ map "/specs"
3
+
4
+ get "/?" do
5
+ do_get
6
+ end
7
+
8
+ get "*" do
9
+ do_get
10
+ end
11
+
12
+ protected
13
+
14
+ def do_get
15
+ if ::File.exists?(absolute_path)
16
+ if ::File.directory?(absolute_path)
17
+ spec_files = ::Dir["#{absolute_path}/**/*.js"].map do |file|
18
+ ["#{relative_path}#{file.gsub(absolute_path, "")}"]
19
+ end
20
+ get_generated_spec(absolute_path, spec_files)
21
+ else
22
+ super
23
+ end
24
+ elsif ::File.exists?("#{absolute_path}.js")
25
+ get_generated_spec("#{absolute_path}.js", ["#{relative_path}.js"])
26
+ else
27
+ pass
28
+ end
29
+ end
30
+
31
+ def get_generated_spec(real_path, spec_files)
32
+ html = render_spec(spec_files)
33
+ headers = {
34
+ 'Content-Type' => "text/html",
35
+ 'Last-Modified' => ::File.mtime(real_path).rfc822
36
+ }
37
+ [200, headers, html]
38
+ end
39
+
40
+ def render_spec(spec_files)
41
+ JsTestServer.suite_view_class.new(:spec_files => spec_files, :framework_path => framework_path).to_s
42
+ end
43
+
44
+ def absolute_path
45
+ @absolute_path ||= ::File.expand_path("#{spec_path}#{relative_path.gsub(%r{^/specs}, "")}")
46
+ end
47
+ end
@@ -0,0 +1,17 @@
1
+ class JsTestServer::Server::Resources::WebRoot < JsTestServer::Server::Resources::File
2
+ map "/"
3
+
4
+ get("") do
5
+ "<html><head></head><body>Welcome to the Js Test Server. Click the following link to run you <a href=/specs>spec suite</a>.</body></html>"
6
+ end
7
+
8
+ get("*") do
9
+ do_get
10
+ end
11
+
12
+ protected
13
+
14
+ def root_path
15
+ JsTestServer::Configuration.js_test_server_root_path
16
+ end
17
+ end
@@ -0,0 +1,77 @@
1
+ class JsTestServer::Server::Runner
2
+ include JsTestServer::Server
3
+ def cli(*argv)
4
+ opts = Trollop.options(argv) do
5
+ opt(
6
+ :framework_name,
7
+ "The name of the test framework you want to use. e.g. --framework-name=jasmine",
8
+ :type => String,
9
+ :default => DEFAULTS[:framework_name]
10
+ )
11
+ opt(
12
+ :framework_path,
13
+ "The name of the test framework you want to use. e.g. --framework-path=./specs/jasmine_core",
14
+ :type => String,
15
+ :default => DEFAULTS[:framework_path]
16
+ )
17
+ opt(
18
+ :spec_path,
19
+ "The path to the spec files. e.g. --spec-path=./specs",
20
+ :type => String,
21
+ :default => DEFAULTS[:spec_path]
22
+ )
23
+ opt(
24
+ :root_path,
25
+ "The root path of the server. e.g. --root-path=./public",
26
+ :type => String,
27
+ :default => DEFAULTS[:root_path]
28
+ )
29
+ opt(
30
+ :port,
31
+ "The server port",
32
+ :type => Integer,
33
+ :default => DEFAULTS[:port]
34
+ )
35
+ opt(
36
+ :javascript_files,
37
+ "The javascript files under test",
38
+ :type => String,
39
+ :default => ""
40
+ )
41
+ opt(
42
+ :css_files,
43
+ "The css files under test",
44
+ :type => String,
45
+ :default => ""
46
+ )
47
+ end
48
+
49
+ JsTestServer.port = opts[:port]
50
+ JsTestServer.framework_name = opts[:framework_name]
51
+ JsTestServer.framework_path = opts[:framework_path]
52
+ JsTestServer.spec_path = opts[:spec_path]
53
+ JsTestServer.root_path = opts[:root_path]
54
+ suite_view_class = JsTestServer::Configuration.instance.suite_view_class
55
+ suite_view_class.project_js_files.push(*opts[:javascript_files].split(","))
56
+ suite_view_class.project_css_files.push(*opts[:css_files].split(","))
57
+ STDOUT.puts "root-path is #{JsTestServer.root_path}"
58
+ STDOUT.puts "spec-path is #{JsTestServer.spec_path}"
59
+ start
60
+ end
61
+
62
+ def start
63
+ require "thin"
64
+ Thin::Runner.new([
65
+ "--port", JsTestServer.port.to_s,
66
+ "--rackup", File.expand_path(JsTestServer.rackup_path),
67
+ "start"]
68
+ ).run!
69
+ end
70
+
71
+ def standalone_rackup(rack_builder)
72
+ require "sinatra"
73
+
74
+ rack_builder.use JsTestServer::Server::App
75
+ rack_builder.run Sinatra::Application
76
+ end
77
+ end
@@ -0,0 +1 @@
1
+ JsTestServer::Server::Runner.new.standalone_rackup(self)
@@ -0,0 +1,12 @@
1
+ dir = File.dirname(__FILE__)
2
+
3
+ module JsTestServer::Server::Views
4
+ end
5
+
6
+ require "#{dir}/views/page.html"
7
+ require "#{dir}/views/not_found.html"
8
+ require "#{dir}/views/suite.html"
9
+ require "#{dir}/views/dir.html"
10
+ require "#{dir}/views/frameworks"
11
+ require "#{dir}/views/suites"
12
+ require "#{dir}/views/remote_control_subscriber"
@@ -0,0 +1,22 @@
1
+ class JsTestServer::Server::Views::Dir < JsTestServer::Server::Views::Page
2
+ needs :relative_path, :absolute_path
3
+ attr_reader :relative_path, :absolute_path
4
+ protected
5
+
6
+ def body_content
7
+ ul do
8
+ ::Dir.glob("#{absolute_path}/*").inject("") do |html, file|
9
+ li do
10
+ a(
11
+ ::File.basename(file),
12
+ :href => "#{relative_path}/#{::File.basename(file)}".gsub("//", "/")
13
+ )
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ def title_text
20
+ "Contents of #{relative_path}"
21
+ end
22
+ end
@@ -0,0 +1,3 @@
1
+ Dir["#{File.dirname(__FILE__)}/frameworks/*.html.rb"].each do |file|
2
+ require file
3
+ end
@@ -0,0 +1,13 @@
1
+ class JsTestServer::Server::Views::NotFound < JsTestServer::Server::Views::Page
2
+ needs :message
3
+ attr_reader :message
4
+ protected
5
+
6
+ def body_content
7
+ h1 message
8
+ end
9
+
10
+ def title_text
11
+ message
12
+ end
13
+ end