spassky 0.1.37 → 0.1.38

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -29,15 +29,10 @@ Architecture
29
29
  +-------+ +-------+ +-----+
30
30
  ```
31
31
 
32
-
33
-
34
32
  Developers push JS unit tests to the Spassky server through a command line interface.
35
33
  Multiple devices connected to the central Spassky server will poll the server for a suite of tests.
36
34
  The browser will be redirected to the test page, run the tests, and then are redirected to the idle loop.
37
35
 
38
-
39
-
40
-
41
36
  Installation
42
37
  ------------
43
38
 
@@ -45,8 +40,6 @@ Installation
45
40
  gem install spassky
46
41
  ```
47
42
 
48
-
49
-
50
43
  ![Spassky](https://github.com/BBC/spassky/raw/master/spassky.jpg)
51
44
 
52
45
 
@@ -56,7 +49,7 @@ Usage
56
49
  Start the server:
57
50
 
58
51
  ```
59
- spassky server 9191
52
+ spassky server --port 9191
60
53
  ```
61
54
 
62
55
  Connect test devices by browsing to http://localhost:9191/device/connect on the device. The device will stay in an idle meta refresh loop until it receives a test to run.
@@ -64,25 +57,25 @@ Connect test devices by browsing to http://localhost:9191/device/connect on the
64
57
  Check what devices are connected to the server:
65
58
 
66
59
  ```
67
- spassky devices http://localhost:9191
60
+ spassky devices --server http://localhost:9191
68
61
  ```
69
62
 
70
63
  Run a single html file (the second parameter is the test name):
71
64
 
72
65
  ```
73
- spassky run html_test.html html_test.html http://localhost:9191
66
+ spassky run --pattern html_test.html --test html_test.html --server http://localhost:9191
74
67
  ```
75
68
 
76
69
  Run a test with colour:
77
70
 
78
71
  ```
79
- spassky run html_test.html html_test.html http://localhost:9191 --colour
72
+ spassky run --pattern html_test.html --test html_test.html --server http://localhost:9191 --colour
80
73
  ```
81
74
 
82
75
  Run a directory that contains a test
83
76
 
84
77
  ```
85
- spassky run test_directory html_test.html http://localhost:9191
78
+ spassky run --pattern test_directory --test html_test.html --server http://localhost:9191
86
79
  ```
87
80
 
88
81
  Why?
@@ -97,7 +90,7 @@ Test structure
97
90
  --------------
98
91
  Tests can be either a single html file, or a directory containing multiple files.
99
92
 
100
- If spassky is given a directory, it will pass all files in that directory to that server. The first html file will be used as the test entry point. Any other files in the test directory can be linked to from the html file relatively.
93
+ If spassky is given a directory, it will pass all files in that directory to that server. Any other files in the test directory can be linked to from the html file relatively.
101
94
 
102
95
  ### An example test directory:
103
96
  ```
data/bin/spassky CHANGED
@@ -4,5 +4,34 @@ $:.unshift(File.dirname(__FILE__) + '/../lib') unless $:.include?(File.dirname(_
4
4
  require 'rubygems'
5
5
  require 'spassky'
6
6
  require 'spassky/client/cli'
7
+ require 'trollop'
7
8
 
8
- Commandable.execute(ARGV)
9
+ command = ARGV.shift
10
+
11
+ if command == "run"
12
+ options = Trollop::options do
13
+ opt :pattern, "Test file name or test directory", :type => String
14
+ opt :test, "Test file name", :type => String
15
+ opt :server, "Spassky server", :type => String, :default => Spassky::Client::Cli::DEFAULT_SERVER
16
+ opt :colour, "Output tests results in colour", :default => false
17
+ end
18
+ Spassky::Client::Cli.new.run(options[:pattern], options[:test], options[:server], options[:colour])
19
+ elsif command == "devices"
20
+ options = Trollop::options do
21
+ opt :server, "Spassky server", :type => String, :default => Spassky::Client::Cli::DEFAULT_SERVER
22
+ end
23
+ Spassky::Client::Cli.new.devices(options[:server])
24
+ elsif command == "server"
25
+ options = Trollop::options do
26
+ opt :port, "The port to run the server on", :type => String, :default => Spassky::Client::Cli::DEFAULT_PORT
27
+ end
28
+ Spassky::Client::Cli.new.server(options[:port])
29
+ else
30
+ puts <<-USAGE
31
+ Spassky (version #{Spassky::VERSION})
32
+ Usage:
33
+ spassky run --pattern <pattern> --test <test> [--server <server>] [--colour]
34
+ spassky devices [--server <server>]
35
+ spassky server [--port <port>]
36
+ USAGE
37
+ end
@@ -1,8 +1,9 @@
1
1
  QUnit.done = function(result) {
2
+ var spassky = new Spassky();
2
3
  if (result.failed > 0) {
3
- assert(false, "qunit failed");
4
+ spassky.assert(false, "qunit failed");
4
5
  } else {
5
- assert(true, "qunit passed");
6
+ spassky.assert(true, "qunit passed");
6
7
  }
7
8
  };
8
9
 
@@ -1,8 +1,9 @@
1
1
  QUnit.done = function(result) {
2
+ var spassky = new Spassky();
2
3
  if (result.failed > 0) {
3
- assert(false, "qunit failed");
4
+ spassky.assert(false, "qunit failed");
4
5
  } else {
5
- assert(true, "qunit passed");
6
+ spassky.assert(true, "qunit passed");
6
7
  }
7
8
  };
8
9
 
@@ -21,7 +21,7 @@ Feature: Device Timeout
21
21
  Scenario: One device times out
22
22
  Given a connected mobile device "ipad"
23
23
  When the device disconnects
24
- And I run "spassky run timed-out.html timed-out.html <host>" with the server host
24
+ And I run "spassky run --pattern timed-out.html --test timed-out.html --server <host>" with the server host
25
25
  Then the output should contain:
26
26
  """
27
27
  TIMED OUT timed-out.html on ipad
@@ -7,11 +7,10 @@ Feature: List Connected Devices
7
7
  Given a Wireless Universal Resource FiLe
8
8
  And a connected mobile device "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3"
9
9
  And a connected mobile device "Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10"
10
- When I run "spassky devices <host>" with the server host
10
+ When I run "spassky devices --server <host>" with the server host
11
11
  Then the output should contain exactly:
12
12
  """
13
13
  iPhone (id = apple_iphone_ver1_suba543, mobile_browser = Safari, device_os_version = 1.0)
14
14
  iPad (id = apple_ipad_ver1_sub5312110, mobile_browser = Safari, device_os_version = 3.2)
15
15
 
16
-
17
16
  """
@@ -13,7 +13,7 @@ Feature: Run HTML Tests
13
13
  <body>
14
14
  <h1>A PASSING test!</h1>
15
15
  <script type="text/javascript">
16
- assert(true, 'this test should pass');
16
+ new Spassky().assert(true, 'this test should pass');
17
17
  </script>
18
18
  </body>
19
19
  </html>
@@ -26,7 +26,7 @@ Feature: Run HTML Tests
26
26
  <body>
27
27
  <h1>A FAILING test!</h1>
28
28
  <script type="text/javascript">
29
- assert(false, 'this test should fail');
29
+ new Spassky().assert(false, 'this test should fail');
30
30
  </script>
31
31
  </body>
32
32
  </html>
@@ -34,7 +34,7 @@ Feature: Run HTML Tests
34
34
 
35
35
  Scenario: No connected devices
36
36
  Given I have no connected devices
37
- When I run "spassky run passing.html passing.html <host>" with the server host
37
+ When I run "spassky run --pattern passing.html --test passing.html --server <host>" with the server host
38
38
  Then the output should contain:
39
39
  """
40
40
  There are no connected devices
@@ -43,7 +43,7 @@ Feature: Run HTML Tests
43
43
 
44
44
  Scenario: One device with a user agent that exists in WURFL
45
45
  Given a connected mobile device "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3"
46
- When I run "spassky run passing.html passing.html <host>" with the server host
46
+ When I run "spassky run --pattern passing.html --test passing.html --server <host>" with the server host
47
47
  Then the output should contain:
48
48
  """
49
49
  PASS passing.html on iPhone (id = apple_iphone_ver1_suba543, mobile_browser = Safari, device_os_version = 1.0)
@@ -52,7 +52,7 @@ Feature: Run HTML Tests
52
52
 
53
53
  Scenario: One passing test on one device
54
54
  Given a connected mobile device "blackberry"
55
- When I run "spassky run passing.html passing.html <host>" with the server host
55
+ When I run "spassky run --pattern passing.html --test passing.html --server <host>" with the server host
56
56
  Then the output should contain:
57
57
  """
58
58
  PASS passing.html on blackberry
@@ -62,7 +62,7 @@ Feature: Run HTML Tests
62
62
  Scenario: One passing test on two devices
63
63
  Given a connected mobile device "blackberry"
64
64
  And a connected mobile device "iphone"
65
- When I run "spassky run passing.html passing.html <host>" with the server host
65
+ When I run "spassky run --pattern passing.html --test passing.html --server <host>" with the server host
66
66
  Then the output should contain:
67
67
  """
68
68
  PASS passing.html on blackberry
@@ -75,7 +75,7 @@ Feature: Run HTML Tests
75
75
 
76
76
  Scenario: Failing test
77
77
  Given a connected mobile device "blackberry"
78
- When I run "spassky run failing.html failing.html <host>" with the server host
78
+ When I run "spassky run --pattern failing.html --test failing.html --server <host>" with the server host
79
79
  Then the output should contain:
80
80
  """
81
81
  FAIL failing.html on blackberry
@@ -84,7 +84,7 @@ Feature: Run HTML Tests
84
84
 
85
85
  Scenario: Failing Test with Message
86
86
  Given a connected mobile device "blackberry"
87
- When I run "spassky run failing.html failing.html <host>" with the server host
87
+ When I run "spassky run --pattern failing.html --test failing.html --server <host>" with the server host
88
88
  Then the output should contain:
89
89
  """
90
90
  FAIL failing.html on blackberry
@@ -8,10 +8,11 @@ Feature: Run QUnit Tests
8
8
  Given a file named "qunit_passing/qunit_test/passing.js" with:
9
9
  """
10
10
  QUnit.done = function(result) {
11
+ var spassky = new Spassky();
11
12
  if (result.failed > 0) {
12
- assert(false, "qunit failed");
13
+ spassky.assert(false, "qunit failed");
13
14
  } else {
14
- assert(true, "qunit passed");
15
+ spassky.assert(true, "qunit passed");
15
16
  }
16
17
  };
17
18
 
@@ -32,7 +33,7 @@ Feature: Run QUnit Tests
32
33
  </html>
33
34
  """
34
35
  And a connected mobile device "blackberry"
35
- When I run "spassky run qunit_passing/qunit_test test_suite.html <host>" with the server host
36
+ When I run "spassky run --pattern qunit_passing/qunit_test --test test_suite.html --server <host>" with the server host
36
37
  Then the output should contain:
37
38
  """
38
39
  PASS test_suite.html on blackberry
@@ -43,10 +44,11 @@ Feature: Run QUnit Tests
43
44
  Given a file named "qunit_failing/qunit_test/failing.js" with:
44
45
  """
45
46
  QUnit.done = function(result) {
47
+ var spassky = new Spassky();
46
48
  if (result.failed > 0) {
47
- assert(false, "qunit failed");
49
+ spassky.assert(false, "qunit failed");
48
50
  } else {
49
- assert(true, "qunit passed");
51
+ spassky.assert(true, "qunit passed");
50
52
  }
51
53
  };
52
54
 
@@ -67,7 +69,7 @@ Feature: Run QUnit Tests
67
69
  </html>
68
70
  """
69
71
  And a connected mobile device "blackberry"
70
- When I run "spassky run qunit_failing/qunit_test test_suite.html <host>" with the server host
72
+ When I run "spassky run --pattern qunit_failing/qunit_test --test test_suite.html --server <host>" with the server host
71
73
  Then the output should contain:
72
74
  """
73
75
  FAIL test_suite.html on blackberry
@@ -78,10 +80,11 @@ Feature: Run QUnit Tests
78
80
  Given a file named "qunit_passing/qunit_test/another_directory/passing.js" with:
79
81
  """
80
82
  QUnit.done = function(result) {
83
+ var spassky = new Spassky();
81
84
  if (result.failed > 0) {
82
- assert(false, "qunit failed");
85
+ spassky.assert(false, "qunit failed");
83
86
  } else {
84
- assert(true, "qunit passed");
87
+ spassky.assert(true, "qunit passed");
85
88
  }
86
89
  };
87
90
 
@@ -102,9 +105,31 @@ Feature: Run QUnit Tests
102
105
  </html>
103
106
  """
104
107
  And a connected mobile device "blackberry"
105
- When I run "spassky run qunit_passing/qunit_test test_suite.html <host>" with the server host
108
+ When I run "spassky run --pattern qunit_passing/qunit_test --test test_suite.html --server <host>" with the server host
106
109
  Then the output should contain:
107
110
  """
108
111
  PASS test_suite.html on blackberry
109
112
  """
110
113
  And the exit status should be 0
114
+
115
+ Scenario: Test with a file in a relative path
116
+ Given a file named "test/js/passing.js" with:
117
+ """
118
+ new Spassky().assert(true, "qunit passed");
119
+ """
120
+ And a file named "test/html/suite.html" with:
121
+ """
122
+ <html>
123
+ <head></head>
124
+ <body>
125
+ <script type="text/javascript" src="../js/passing.js"></script>
126
+ </body>
127
+ </html>
128
+ """
129
+ And a connected mobile device "blackberry"
130
+ When I run "spassky run --pattern test --test html/suite.html --server <host>" with the server host
131
+ Then the output should contain:
132
+ """
133
+ PASS html/suite.html on blackberry
134
+ """
135
+ And the exit status should be 0
@@ -4,5 +4,5 @@ Feature: Server
4
4
  I want to be able to type 'spassky server 9393' to launch a server
5
5
 
6
6
  Scenario: Launch Server
7
- Given I run the command "spassky server 9393"
7
+ Given I run the command "spassky server --port 9393"
8
8
  Then it should not crash
@@ -61,8 +61,8 @@ When /^the device disconnects$/ do
61
61
  end
62
62
  end
63
63
 
64
- Given /^I run the command "spassky server 9393"$/ do
65
- @spassky_server_process = ChildProcess.build('./bin/spassky server 9393')
64
+ Given /^I run the command "spassky server --port 9393"$/ do
65
+ @spassky_server_process = ChildProcess.build('./bin/spassky server --port 9393')
66
66
  @spassky_server_process.start
67
67
  end
68
68
 
@@ -10,7 +10,7 @@ Feature: Summary
10
10
  <head></head>
11
11
  <body>
12
12
  <script type="text/javascript">
13
- assert(true, 'this test should pass');
13
+ new Spassky().assert(true, 'this test should pass');
14
14
  </script>
15
15
  </body>
16
16
  </html>
@@ -21,7 +21,7 @@ Feature: Summary
21
21
  <head></head>
22
22
  <body>
23
23
  <script type="text/javascript">
24
- assert(false, 'this test should fail');
24
+ new Spassky().assert(false, 'this test should fail');
25
25
  </script>
26
26
  </body>
27
27
  </html>
@@ -29,5 +29,5 @@ Feature: Summary
29
29
 
30
30
  Scenario: One test passing on all devices
31
31
  Given I have two connected devices
32
- When I run "spassky run passing.html passing.html <host>" with the server host
32
+ When I run "spassky run --pattern passing.html --test passing.html --server <host>" with the server host
33
33
  Then the output should contain "2 passed"
@@ -1,7 +1,6 @@
1
1
  require 'capybara'
2
2
  require 'capybara/dsl'
3
3
  require 'capybara/cucumber'
4
-
5
4
  require 'aruba/cucumber'
6
5
 
7
6
  $:.unshift(File.join(File.dirname(__FILE__), '../../lib'))
@@ -28,4 +27,4 @@ def register_driver_with_user_agent user_agent
28
27
  Capybara.current_driver = user_agent.to_sym
29
28
  end
30
29
 
31
- ENV['PATH'] = "#{File.expand_path(File.dirname(__FILE__) + '/../../bin')}#{File::PATH_SEPARATOR}#{ENV['PATH']}"
30
+ ENV['PATH'] = "#{File.expand_path(File.dirname(__FILE__) + '/../../bin')}#{File::PATH_SEPARATOR}#{ENV['PATH']}"
@@ -5,24 +5,19 @@ require 'spassky/client/device_list_retriever'
5
5
  require 'spassky/client/test_suite_runner'
6
6
  require 'spassky/client/pusher'
7
7
  require 'spassky/client/directory_reader'
8
- require 'commandable'
9
8
 
10
9
  module Spassky::Client
11
10
  class Cli
12
- extend Commandable
13
-
14
11
  DEFAULT_PORT = "9191"
15
12
  DEFAULT_SERVER = "http://localhost:#{DEFAULT_PORT}"
16
13
 
17
- command "run a test"
18
- def run(pattern, test, server = DEFAULT_SERVER, colour = false)
14
+ def run(pattern, test, server = DEFAULT_SERVER, colour = FALSE)
19
15
  writer = colour ? ColouredWriter : DefaultWriter
20
16
  pusher = Pusher.new(server)
21
17
  test_suite_runner = TestSuiteRunner.new(pusher, writer.new(STDOUT), DirectoryReader.new(pattern))
22
18
  test_suite_runner.run_test_suite(pattern, test)
23
19
  end
24
20
 
25
- command "list devices"
26
21
  def devices(server = DEFAULT_SERVER)
27
22
  Spassky::Client::DeviceListRetriever.new(server).get_connected_devices.each do |device|
28
23
  puts device
@@ -30,7 +25,6 @@ module Spassky::Client
30
25
  nil
31
26
  end
32
27
 
33
- command "run the spassky server"
34
28
  def server(port = DEFAULT_PORT)
35
29
  Spassky::Server::App.set :port, port
36
30
  Spassky::Server::App.run!
@@ -2,7 +2,6 @@ require 'restclient'
2
2
 
3
3
  module Spassky::Client
4
4
  class DeviceListRetriever
5
-
6
5
  def initialize(url)
7
6
  @url = url
8
7
  end
@@ -10,6 +9,5 @@ module Spassky::Client
10
9
  def get_connected_devices
11
10
  JSON.parse(RestClient.get(@url + "/devices/list"))
12
11
  end
13
-
14
12
  end
15
13
  end
@@ -2,7 +2,7 @@ require 'sinatra/base'
2
2
  require 'spassky/server/random_string_generator'
3
3
  require 'spassky/server/test_run'
4
4
  require 'spassky/server/device_list'
5
- require 'spassky/server/html_test'
5
+ require 'spassky/server/test_suite_container'
6
6
  require 'spassky/server/device_database'
7
7
 
8
8
  module Spassky::Server
@@ -57,8 +57,7 @@ module Spassky::Server
57
57
  end
58
58
 
59
59
  get "/test_runs/:id/run/:random/*" do
60
- file_name = params[:splat].join("/")
61
- get_test_file_contents params[:id], file_name
60
+ get_test_file_contents
62
61
  end
63
62
 
64
63
  private
@@ -79,8 +78,10 @@ module Spassky::Server
79
78
  JSON.parse(params[:contents])
80
79
  end
81
80
 
82
- def get_test_file_contents test_run_id, file_name
83
- HtmlTest.new(test_run.contents, idle_url, 1).get_file(file_name)
81
+ def get_test_file_contents
82
+ file_name = params[:splat].join("/")
83
+ assert_post_back_url = "/test_runs/#{params[:id]}/run/#{params[:random]}/assert"
84
+ TestSuiteContainer.new(test_run.contents, idle_url, assert_post_back_url, 1).get_file(file_name)
84
85
  end
85
86
 
86
87
  def save_test_result
@@ -1,5 +1,7 @@
1
- function assert(status, message) {
2
- var img = document.createElement('img');
3
- img.setAttribute('src', 'assert?status=' + (status ? 'pass' : 'fail') + '&message=' + escape(message));
4
- document.body.appendChild(img);
5
- }
1
+ function Spassky() {
2
+ this.assert = function(status, message) {
3
+ var img = document.createElement('img');
4
+ img.setAttribute('src', '{ASSERT_POST_BACK_URL}?status=' + (status ? 'pass' : 'fail') + '&message=' + escape(message));
5
+ document.body.appendChild(img);
6
+ }
7
+ }
@@ -45,7 +45,7 @@ module Spassky::Server
45
45
  def uncached_device_identifier user_agent
46
46
  @stored_device_identifiers ||= {}
47
47
  if device = @wurfl[user_agent]
48
- @stored_device_identifiers[user_agent] = "#{device.model_name} (id = #{device.id}, mobile_browser = #{device.mobile_browser}, device_os_version = #{device.device_os_version})"
48
+ @stored_device_identifiers[user_agent] = "#{device.model_name} (id = #{device[:id]}, mobile_browser = #{device.mobile_browser}, device_os_version = #{device.device_os_version})"
49
49
  else
50
50
  @stored_device_identifiers[user_agent] = user_agent
51
51
  end
@@ -1,8 +1,9 @@
1
1
  module Spassky::Server
2
- class HtmlTest
3
- def initialize(contents, url, seconds)
2
+ class TestSuiteContainer
3
+ def initialize(contents, next_url_to_redirect_to, assert_post_back_url, seconds)
4
4
  @contents = contents
5
- @url = url
5
+ @next_url_to_redirect_to = next_url_to_redirect_to
6
+ @assert_post_back_url = assert_post_back_url
6
7
  @seconds = seconds
7
8
  end
8
9
 
@@ -19,11 +20,12 @@ module Spassky::Server
19
20
 
20
21
  def assert_js_script
21
22
  assert_js = File.read(File.join(File.dirname(__FILE__), 'assert.js'))
23
+ assert_js.gsub!("{ASSERT_POST_BACK_URL}", @assert_post_back_url)
22
24
  "<script type=\"text/javascript\">#{assert_js}</script>"
23
25
  end
24
26
 
25
27
  def meta_refresh_tag
26
- "<meta http-equiv=\"refresh\" content=\"#{@seconds}; url='#{@url}'\">"
28
+ "<meta http-equiv=\"refresh\" content=\"#{@seconds}; url='#{@next_url_to_redirect_to}'\">"
27
29
  end
28
30
  end
29
31
  end
@@ -6,12 +6,9 @@ module Spassky
6
6
 
7
7
  def summary
8
8
  statuses = []
9
- {"pass" => "passed", "fail" => "failed", "timed out" => "timed out"}.each do |status, description|
10
- status_count = status_count status
11
- if status_count > 0
12
- statuses << "#{status_count} #{description}"
13
- end
14
- end
9
+ statuses << "#{status_count("pass")} passed" if status_count("pass") > 0
10
+ statuses << "#{status_count("fail")} failed" if status_count("fail") > 0
11
+ statuses << "#{status_count("timed out")} timed out" if status_count("timed out") > 0
15
12
  statuses.join ", "
16
13
  end
17
14
 
@@ -1,3 +1,3 @@
1
1
  module Spassky
2
- VERSION = '0.1.37'
2
+ VERSION = '0.1.38'
3
3
  end
data/spassky.gemspec CHANGED
@@ -23,7 +23,7 @@ Gem::Specification.new do |s|
23
23
  s.add_dependency 'sinatra'
24
24
  s.add_dependency 'rainbow'
25
25
  s.add_dependency 'wurfl-lite'
26
- s.add_dependency 'commandable'
26
+ s.add_dependency 'trollop'
27
27
 
28
28
  s.add_development_dependency 'rake'
29
29
  s.add_development_dependency 'rspec'
@@ -93,52 +93,14 @@ module Spassky::Server
93
93
  end
94
94
 
95
95
  describe "GET /test_runs/:id/run/:random/path/to/file" do
96
- before do
97
- @test_contents = {
98
- "test_file.js" => "some javascript",
99
- "fake_test.html.file" => "don't choose this one",
100
- "test_name.html" => "actual test!",
101
- "directory/another_directory/filename.txt" => "file 1 contents"
102
- }
103
- end
104
-
105
- context "file name is a file" do
106
- it "returns the specified file" do
107
- test = mock(:test, :name => "fake_test.html.file", :contents => @test_contents)
108
- TestRun.stub!(:find).with('123').and_return(test)
109
- get "/test_runs/123/run/random/fake_test.html.file"
110
- last_response.body.should include("don't choose this one")
111
- end
112
- end
113
-
114
- context "with a file that is in a subdirectory" do
115
- it "returns the file" do
116
- test = mock(:test, :name => "test_name", :contents => @test_contents)
117
- TestRun.stub!(:find).and_return(test)
118
- get "/test_runs/123/run/random/directory/another_directory/filename.txt"
119
- last_response.body.should include "file 1 contents"
120
- end
121
- end
122
-
123
- describe "when the test contents includes a </head> tag" do
124
- before do
125
- @test_contents["test_name.html"] = "</head>"
126
- @test = mock(:test, :name => "test_name", :contents => @test_contents)
127
- TestRun.stub!(:find).with('123').and_return(@test)
128
- end
129
-
130
- it "adds a meta-refresh tag to the test contents" do
131
- RandomStringGenerator.stub!(:random_string).and_return("next-iteration")
132
- get "/test_runs/123/run/random/test_name.html"
133
- url = "/device/idle/next-iteration"
134
- last_response.body.should include("<meta http-equiv=\"refresh\" content=\"1; url='#{url}'\"></head>")
135
- end
136
-
137
- it "adds the assert.js script to the head" do
138
- File.stub!(:read).and_return("assert.js!")
139
- get "/test_runs/123/run/random/test_name.html"
140
- last_response.body.should include("<script type=\"text/javascript\">assert.js!</script>")
141
- end
96
+ it "gets the contents of the file" do
97
+ test = mock(:test, :name => "fake_test.html.file", :contents => {})
98
+ TestRun.stub!(:find).with('123').and_return(test)
99
+ html_test = mock(:html_test)
100
+ html_test.stub!(:get_file).and_return("contents")
101
+ TestSuiteContainer.should_receive(:new).with({}, "/device/idle/random-string", "/test_runs/123/run/random/assert", 1).and_return html_test
102
+ get "/test_runs/123/run/random/fake_test.html.file"
103
+ last_response.body.should == "contents"
142
104
  end
143
105
  end
144
106
 
@@ -16,11 +16,6 @@ module Spassky::Server
16
16
  end
17
17
 
18
18
  context ".new" do
19
- it "creates the wurfl directory" do
20
- FileUtils.should_receive(:mkdir_p).with(Spassky::Server::WURFL_DIRECTORY)
21
- DeviceDatabase.new
22
- end
23
-
24
19
  it "loads up the wurfl database" do
25
20
  wurfl = mock(:wurfl).as_null_object
26
21
  WURFL.should_receive(:new).with(Spassky::Server::WURFL_FILE).and_return(wurfl)
@@ -56,7 +51,7 @@ module Spassky::Server
56
51
  it "returns the device identifier" do
57
52
  device = mock(:device)
58
53
  device.stub!(:model_name).and_return "MODEL"
59
- device.stub!(:id).and_return "ID"
54
+ device.stub!(:[]).with(:id).and_return("ID")
60
55
  device.stub!(:mobile_browser).and_return "BROWSER"
61
56
  device.stub!(:device_os_version).and_return "OS_VERSION"
62
57
  wurfl = mock(:wurfl)
@@ -0,0 +1,46 @@
1
+ require "spec_helper"
2
+ require "spassky/server/test_suite_container"
3
+
4
+ module Spassky::Server
5
+ describe TestSuiteContainer do
6
+ before do
7
+ @test_contents = {
8
+ "test_file.js" => "some javascript",
9
+ "fake_test.html.file" => "don't choose this one",
10
+ "test_name.html" => "actual test!",
11
+ "directory/another_directory/filename.txt" => "file 1 contents",
12
+ "example_test.html" => "</head>"
13
+ }
14
+ end
15
+
16
+ context "file name is a file" do
17
+ it "returns the specified file" do
18
+ TestSuiteContainer.new(@test_contents, nil, "", nil).get_file("test_file.js").should == "some javascript"
19
+ end
20
+ end
21
+
22
+ context "with a file that is in a subdirectory" do
23
+ it "returns the file" do
24
+ TestSuiteContainer.new(@test_contents, nil, "", nil).get_file("directory/another_directory/filename.txt").should == "file 1 contents"
25
+ end
26
+ end
27
+
28
+ describe "when the test contents includes a </head> tag" do
29
+ it "adds a meta-refresh tag to the test contents" do
30
+ url = "http://example.org"
31
+ seconds = 23
32
+ TestSuiteContainer.new(@test_contents, url, "", seconds).get_file("example_test.html").should include "<meta http-equiv=\"refresh\" content=\"#{seconds}; url='#{url}'\"></head>"
33
+ end
34
+
35
+ it "adds the assert.js script to the head" do
36
+ File.stub!(:read).and_return("assert.js!")
37
+ TestSuiteContainer.new(@test_contents, nil, "", nil).get_file("example_test.html").should include "<script type=\"text/javascript\">assert.js!</script>"
38
+ end
39
+
40
+ it "injects the assert post back url into assert.js" do
41
+ File.stub!(:read).and_return("assert.js! {ASSERT_POST_BACK_URL}")
42
+ TestSuiteContainer.new(@test_contents, nil, "http://assert.org", nil).get_file("example_test.html").should include "assert.js! http://assert.org"
43
+ end
44
+ end
45
+ end
46
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spassky
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.37
4
+ version: 0.1.38
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,11 +11,11 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2011-09-14 00:00:00.000000000Z
14
+ date: 2011-09-29 00:00:00.000000000Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rest-client
18
- requirement: &70236430903100 !ruby/object:Gem::Requirement
18
+ requirement: &70310251255100 !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
21
  - - ! '>='
@@ -23,10 +23,10 @@ dependencies:
23
23
  version: '0'
24
24
  type: :runtime
25
25
  prerelease: false
26
- version_requirements: *70236430903100
26
+ version_requirements: *70310251255100
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: json
29
- requirement: &70236430902660 !ruby/object:Gem::Requirement
29
+ requirement: &70310251254640 !ruby/object:Gem::Requirement
30
30
  none: false
31
31
  requirements:
32
32
  - - ! '>='
@@ -34,10 +34,10 @@ dependencies:
34
34
  version: '0'
35
35
  type: :runtime
36
36
  prerelease: false
37
- version_requirements: *70236430902660
37
+ version_requirements: *70310251254640
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: sinatra
40
- requirement: &70236430902140 !ruby/object:Gem::Requirement
40
+ requirement: &70310251254120 !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
43
  - - ! '>='
@@ -45,10 +45,10 @@ dependencies:
45
45
  version: '0'
46
46
  type: :runtime
47
47
  prerelease: false
48
- version_requirements: *70236430902140
48
+ version_requirements: *70310251254120
49
49
  - !ruby/object:Gem::Dependency
50
50
  name: rainbow
51
- requirement: &70236430901620 !ruby/object:Gem::Requirement
51
+ requirement: &70310251253620 !ruby/object:Gem::Requirement
52
52
  none: false
53
53
  requirements:
54
54
  - - ! '>='
@@ -56,10 +56,10 @@ dependencies:
56
56
  version: '0'
57
57
  type: :runtime
58
58
  prerelease: false
59
- version_requirements: *70236430901620
59
+ version_requirements: *70310251253620
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: wurfl-lite
62
- requirement: &70236430835860 !ruby/object:Gem::Requirement
62
+ requirement: &70310251252960 !ruby/object:Gem::Requirement
63
63
  none: false
64
64
  requirements:
65
65
  - - ! '>='
@@ -67,10 +67,10 @@ dependencies:
67
67
  version: '0'
68
68
  type: :runtime
69
69
  prerelease: false
70
- version_requirements: *70236430835860
70
+ version_requirements: *70310251252960
71
71
  - !ruby/object:Gem::Dependency
72
- name: commandable
73
- requirement: &70236430833300 !ruby/object:Gem::Requirement
72
+ name: trollop
73
+ requirement: &70310251251840 !ruby/object:Gem::Requirement
74
74
  none: false
75
75
  requirements:
76
76
  - - ! '>='
@@ -78,10 +78,10 @@ dependencies:
78
78
  version: '0'
79
79
  type: :runtime
80
80
  prerelease: false
81
- version_requirements: *70236430833300
81
+ version_requirements: *70310251251840
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: rake
84
- requirement: &70236430832880 !ruby/object:Gem::Requirement
84
+ requirement: &70310251251340 !ruby/object:Gem::Requirement
85
85
  none: false
86
86
  requirements:
87
87
  - - ! '>='
@@ -89,10 +89,10 @@ dependencies:
89
89
  version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
- version_requirements: *70236430832880
92
+ version_requirements: *70310251251340
93
93
  - !ruby/object:Gem::Dependency
94
94
  name: rspec
95
- requirement: &70236430832440 !ruby/object:Gem::Requirement
95
+ requirement: &70310251250800 !ruby/object:Gem::Requirement
96
96
  none: false
97
97
  requirements:
98
98
  - - ! '>='
@@ -100,10 +100,10 @@ dependencies:
100
100
  version: '0'
101
101
  type: :development
102
102
  prerelease: false
103
- version_requirements: *70236430832440
103
+ version_requirements: *70310251250800
104
104
  - !ruby/object:Gem::Dependency
105
105
  name: cucumber
106
- requirement: &70236430831820 !ruby/object:Gem::Requirement
106
+ requirement: &70310251238380 !ruby/object:Gem::Requirement
107
107
  none: false
108
108
  requirements:
109
109
  - - ! '>='
@@ -111,10 +111,10 @@ dependencies:
111
111
  version: '0'
112
112
  type: :development
113
113
  prerelease: false
114
- version_requirements: *70236430831820
114
+ version_requirements: *70310251238380
115
115
  - !ruby/object:Gem::Dependency
116
116
  name: capybara
117
- requirement: &70236430831180 !ruby/object:Gem::Requirement
117
+ requirement: &70310251237700 !ruby/object:Gem::Requirement
118
118
  none: false
119
119
  requirements:
120
120
  - - ! '>='
@@ -122,10 +122,10 @@ dependencies:
122
122
  version: '0'
123
123
  type: :development
124
124
  prerelease: false
125
- version_requirements: *70236430831180
125
+ version_requirements: *70310251237700
126
126
  - !ruby/object:Gem::Dependency
127
127
  name: aruba
128
- requirement: &70236430830500 !ruby/object:Gem::Requirement
128
+ requirement: &70310251237280 !ruby/object:Gem::Requirement
129
129
  none: false
130
130
  requirements:
131
131
  - - ! '>='
@@ -133,10 +133,10 @@ dependencies:
133
133
  version: '0'
134
134
  type: :development
135
135
  prerelease: false
136
- version_requirements: *70236430830500
136
+ version_requirements: *70310251237280
137
137
  - !ruby/object:Gem::Dependency
138
138
  name: fakefs
139
- requirement: &70236430829860 !ruby/object:Gem::Requirement
139
+ requirement: &70310251236860 !ruby/object:Gem::Requirement
140
140
  none: false
141
141
  requirements:
142
142
  - - ! '>='
@@ -144,10 +144,10 @@ dependencies:
144
144
  version: '0'
145
145
  type: :development
146
146
  prerelease: false
147
- version_requirements: *70236430829860
147
+ version_requirements: *70310251236860
148
148
  - !ruby/object:Gem::Dependency
149
149
  name: factory_girl
150
- requirement: &70236430829180 !ruby/object:Gem::Requirement
150
+ requirement: &70310251236420 !ruby/object:Gem::Requirement
151
151
  none: false
152
152
  requirements:
153
153
  - - ! '>='
@@ -155,7 +155,7 @@ dependencies:
155
155
  version: '0'
156
156
  type: :development
157
157
  prerelease: false
158
- version_requirements: *70236430829180
158
+ version_requirements: *70310251236420
159
159
  description: ''
160
160
  email:
161
161
  - andrew.vos@gmail.com
@@ -202,9 +202,9 @@ files:
202
202
  - lib/spassky/server/assert.js
203
203
  - lib/spassky/server/device_database.rb
204
204
  - lib/spassky/server/device_list.rb
205
- - lib/spassky/server/html_test.rb
206
205
  - lib/spassky/server/random_string_generator.rb
207
206
  - lib/spassky/server/test_run.rb
207
+ - lib/spassky/server/test_suite_container.rb
208
208
  - lib/spassky/test_suite_result.rb
209
209
  - lib/spassky/test_suite_result_summariser.rb
210
210
  - lib/spassky/version.rb
@@ -222,6 +222,7 @@ files:
222
222
  - spec/spassky/server/device_list_spec.rb
223
223
  - spec/spassky/server/random_string_generator_spec.rb
224
224
  - spec/spassky/server/test_run_spec.rb
225
+ - spec/spassky/server/test_suite_container_spec.rb
225
226
  - spec/spassky/test_suite_result_spec.rb
226
227
  - spec/spassky/test_suite_result_summariser_spec.rb
227
228
  - spec/spec_helper.rb
@@ -272,6 +273,7 @@ test_files:
272
273
  - spec/spassky/server/device_list_spec.rb
273
274
  - spec/spassky/server/random_string_generator_spec.rb
274
275
  - spec/spassky/server/test_run_spec.rb
276
+ - spec/spassky/server/test_suite_container_spec.rb
275
277
  - spec/spassky/test_suite_result_spec.rb
276
278
  - spec/spassky/test_suite_result_summariser_spec.rb
277
279
  - spec/spec_helper.rb