jasmine-selenium-sauce 1.1.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +1 -0
- data/CHANGELOG.md +16 -0
- data/README.md +65 -44
- data/jasmine-selenium-sauce.gemspec +5 -4
- data/lib/jasmine-selenium-sauce.rb +19 -1
- data/lib/jasmine-selenium-sauce/drivers/selenium_browser_driver.rb +0 -2
- data/lib/jasmine-selenium-sauce/drivers/selenium_saucelabs_driver.rb +0 -2
- data/lib/jasmine-selenium-sauce/local_sauce_config.rb +19 -0
- data/lib/jasmine-selenium-sauce/tasks/jasmine_selenium_sauce.rake +16 -0
- data/lib/jasmine-selenium-sauce/tasks/rake_browser_runner.rb +1 -1
- data/lib/jasmine-selenium-sauce/tasks/rake_local_sauce_runner.rb +22 -0
- data/lib/jasmine-selenium-sauce/tasks/rake_sauce_runner.rb +1 -1
- data/lib/jasmine-selenium-sauce/version.rb +1 -1
- data/lib/localtunnel_patch.rb +28 -0
- data/spec/fixtures/config_fixtures.rb +79 -0
- data/spec/fixtures/vcr_cassettes/jasmine_browser_success.yml +8 -8
- data/spec/fixtures/vcr_cassettes/jasmine_local_saucelabs_failures.yml +352 -0
- data/spec/fixtures/vcr_cassettes/jasmine_local_saucelabs_success.yml +340 -0
- data/spec/fixtures/vcr_cassettes/jasmine_saucelabs_failures.yml +55 -52
- data/spec/fixtures/vcr_cassettes/jasmine_saucelabs_success.yml +43 -41
- data/spec/jasmine-selenium-sauce/browser_config_spec.rb +41 -0
- data/spec/jasmine-selenium-sauce/drivers/selenium_browser_driver_spec.rb +1 -0
- data/spec/jasmine-selenium-sauce/local_sauce_config_spec.rb +61 -0
- data/spec/jasmine-selenium-sauce/sauce_config_spec.rb +3 -70
- data/spec/jasmine-selenium-sauce/selenium_runner_spec.rb +3 -3
- data/spec/jasmine-selenium-sauce_spec.rb +67 -36
- data/spec/support/reporter_fake.rb +2 -2
- data/spec/vcr_helper.rb +8 -1
- metadata +50 -70
- data/lib/jasmine-selenium-sauce/drivers.rb +0 -4
data/.travis.yml
CHANGED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
## 1.2.0
|
2
|
+
|
3
|
+
- Added rake task for running jasmine suite through SauceLabs against localhost using a tunnel
|
4
|
+
- Compatible with Ruby 1.8.7
|
5
|
+
|
6
|
+
## 1.1.1
|
7
|
+
|
8
|
+
- Minor cleanup
|
9
|
+
|
10
|
+
## 1.1.0
|
11
|
+
|
12
|
+
- Added rake task that supports running jasmine suite using local browser
|
13
|
+
|
14
|
+
## 1.0.0
|
15
|
+
|
16
|
+
- Initial release supporting running jasmine suite using SauceLabs
|
data/README.md
CHANGED
@@ -2,26 +2,24 @@
|
|
2
2
|
|
3
3
|
# Jasmine::Sauce::Ci
|
4
4
|
|
5
|
-
Rake tasks for running your Jasmine suite via a local
|
5
|
+
Rake tasks for running your Jasmine suite via a local browser or through SauceLabs using the
|
6
6
|
[Selenium Webdriver](http://seleniumhq.org/projects/webdriver/).
|
7
7
|
|
8
|
-
Can be used in your CI builds to enable running Jasmine suites.
|
8
|
+
Can be used in your CI builds to enable running Jasmine suites. The Jasmine results are reported using RSpec to make
|
9
|
+
parsing easy.
|
9
10
|
|
10
|
-
|
11
|
+
# Installation
|
11
12
|
|
12
13
|
Add this line to your application's Gemfile:
|
13
14
|
|
14
15
|
gem 'jasmine-selenium-sauce'
|
15
16
|
|
16
|
-
|
17
|
+
# Running Jasmine via SauceLabs
|
17
18
|
|
18
|
-
|
19
|
+
## Remote Jasmine Server
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
$ gem install jasmine-selenium-sauce
|
23
|
-
|
24
|
-
## Running Jasmine via SauceLabs
|
21
|
+
When you want to run a Jasmine suite hosted on a publicly available host. Uses Selenium to connect to SauceLabs, and
|
22
|
+
requests a browser instance to run your suite.
|
25
23
|
|
26
24
|
rake jasmine:sauce
|
27
25
|
|
@@ -29,68 +27,91 @@ Or install it yourself as:
|
|
29
27
|
|
30
28
|
Requires the following environment variables to be set:
|
31
29
|
|
32
|
-
|
30
|
+
```shell
|
31
|
+
SAUCELABS_URL=http://username:password@ondemand.saucelabs.com:80/wd/hub
|
32
|
+
```
|
33
|
+
- URL for Saucelabs with your credentials included
|
34
|
+
|
35
|
+
```shell
|
36
|
+
JASMINE_URL=http://my.server.com/jasmine
|
37
|
+
```
|
38
|
+
- Where your Jasmine tests are hosted
|
33
39
|
|
34
|
-
|
40
|
+
```shell
|
41
|
+
SAUCE_BROWSER=chrome
|
42
|
+
```
|
43
|
+
- Which browser SauceLabs should use to run your tests
|
35
44
|
|
36
|
-
|
45
|
+
## Local Jasmine Server behind a Firewall
|
37
46
|
|
38
|
-
|
47
|
+
When you want to run a Jasmine suite hosted on an internal host. Uses [LocalTunnel](http://progrium.com/localtunnel/)
|
48
|
+
to make localhost available through a tunnel. It then uses Selenium to connect to SauceLabs, and requests a
|
49
|
+
browser instance to run your suite.
|
39
50
|
|
40
|
-
|
51
|
+
rake jasmine:local_sauce
|
41
52
|
|
42
|
-
|
53
|
+
### Required Environment Variables
|
43
54
|
|
44
|
-
|
55
|
+
Requires the following environment variables to be set:
|
45
56
|
|
46
|
-
|
57
|
+
```shell
|
58
|
+
SAUCELABS_URL=http://username:password@ondemand.saucelabs.com:80/wd/hub
|
59
|
+
```
|
60
|
+
- URL for Saucelabs with your credentials included
|
47
61
|
|
48
|
-
|
62
|
+
```shell
|
63
|
+
JASMINE_PORT=3000
|
64
|
+
```
|
65
|
+
- Port on localhost where jasmine tests are located
|
49
66
|
|
50
|
-
|
67
|
+
```shell
|
68
|
+
SAUCE_BROWSER=chrome
|
69
|
+
```
|
70
|
+
- Which browser SauceLabs should use to run your tests
|
51
71
|
|
52
|
-
|
72
|
+
## Optional Configuration
|
53
73
|
|
54
|
-
|
74
|
+
### RSpec
|
55
75
|
|
56
|
-
|
76
|
+
```shell
|
77
|
+
JASMINE_SPEC_FORMAT=documentation
|
78
|
+
```
|
79
|
+
- Allows you to control the format of the RSpec report
|
57
80
|
|
58
|
-
|
81
|
+
### Additional Sauce Labs Configuration
|
59
82
|
|
60
83
|
See [sauce_config.rb](https://github.com/darend/jasmine-selenium-sauce/tree/master/lib/jasmine-selenium-sauce/sauce_config.rb)
|
61
84
|
|
62
|
-
|
85
|
+
# Running Jasmine via local browser
|
63
86
|
|
64
87
|
rake jasmine:browser
|
65
88
|
|
66
|
-
|
89
|
+
## Required Environment Variables
|
67
90
|
|
68
91
|
Requires the following environment variables to be set:
|
69
92
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
JASMINE_URL=http://my.server.com/jasmine
|
75
|
-
|
76
|
-
#### LOCAL_BROWSER
|
77
|
-
|
78
|
-
Which browser that will be used to run your tests. Selenium may require a driver be installed depending the driver. See
|
79
|
-
the Selenium documentation for more details.
|
80
|
-
|
81
|
-
LOCAL_BROWSER=firefox
|
93
|
+
```shell
|
94
|
+
JASMINE_URL=http://my.server.com/jasmine
|
95
|
+
```
|
96
|
+
- Where your Jasmine tests are hosted
|
82
97
|
|
98
|
+
```shell
|
99
|
+
LOCAL_BROWSER=firefox
|
100
|
+
```
|
101
|
+
- Which browser that will be used to run your tests. Selenium may require a driver be installed depending the driver. See
|
102
|
+
the Selenium documentation for more details
|
83
103
|
See [Which browsers does WebDriver support?](http://code.google.com/p/selenium/wiki/FrequentlyAskedQuestions#Q:_Which_browsers_does_WebDriver_support?).
|
84
104
|
|
85
|
-
|
86
|
-
|
87
|
-
#### RSpec
|
105
|
+
## Optional Configuration
|
88
106
|
|
89
|
-
|
107
|
+
### RSpec
|
90
108
|
|
91
|
-
|
109
|
+
```shell
|
110
|
+
JASMINE_SPEC_FORMAT=documentation
|
111
|
+
```
|
112
|
+
- Allows you to control the format of the RSpec report
|
92
113
|
|
93
|
-
|
114
|
+
# Contributing
|
94
115
|
|
95
116
|
1. Fork it
|
96
117
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
@@ -2,10 +2,10 @@
|
|
2
2
|
require File.expand_path('../lib/jasmine-selenium-sauce/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
|
-
gem.authors = ["Daren"]
|
5
|
+
gem.authors = ["Daren Desjardins"]
|
6
6
|
gem.email = ["darend@gmail.com"]
|
7
|
-
gem.description = %q{Rake tasks for running your Jasmine suite via a local
|
8
|
-
gem.summary = %q{Rake tasks for running your Jasmine suite via a local
|
7
|
+
gem.description = %q{Rake tasks for running your Jasmine suite via a local browser or through SauceLabs}
|
8
|
+
gem.summary = %q{Rake tasks for running your Jasmine suite via a local browser or through SauceLabs. Can be used in your CI builds to enable running Jasmine suites}
|
9
9
|
gem.homepage = "https://github.com/darend/jasmine-selenium-sauce"
|
10
10
|
|
11
11
|
gem.files = `git ls-files`.split($\)
|
@@ -23,6 +23,7 @@ Gem::Specification.new do |gem|
|
|
23
23
|
gem.add_development_dependency 'rb-fsevent'
|
24
24
|
gem.add_development_dependency 'vcr'
|
25
25
|
|
26
|
+
gem.add_dependency 'localtunnel', "~> 0.3"
|
26
27
|
gem.add_dependency 'rspec', ">= 2.0"
|
27
|
-
gem.add_dependency 'selenium-webdriver'
|
28
|
+
gem.add_dependency 'selenium-webdriver', "> 2.0.0"
|
28
29
|
end
|
@@ -3,8 +3,14 @@ require 'jasmine-selenium-sauce/jasmine_results'
|
|
3
3
|
require 'jasmine-selenium-sauce/rspec_reporter'
|
4
4
|
require 'jasmine-selenium-sauce/browser_config'
|
5
5
|
require 'jasmine-selenium-sauce/sauce_config'
|
6
|
+
require 'jasmine-selenium-sauce/local_sauce_config'
|
6
7
|
require 'jasmine-selenium-sauce/selenium_runner'
|
7
|
-
require 'jasmine-selenium-sauce/drivers'
|
8
|
+
require 'jasmine-selenium-sauce/drivers/selenium_driver'
|
9
|
+
require 'jasmine-selenium-sauce/drivers/selenium_browser_driver'
|
10
|
+
require 'jasmine-selenium-sauce/drivers/selenium_saucelabs_driver'
|
11
|
+
|
12
|
+
require 'localtunnel/tunnel'
|
13
|
+
require 'localtunnel_patch'
|
8
14
|
|
9
15
|
module Jasmine
|
10
16
|
module Sauce
|
@@ -12,13 +18,25 @@ module Jasmine
|
|
12
18
|
|
13
19
|
class Main
|
14
20
|
def self.run_via_saucelabs(sauce_config, reporter = RspecReporter.new)
|
21
|
+
puts "Using SauceLabs to run Jasmine suite located at #{sauce_config.jasmine_server_url}"
|
15
22
|
driver = SeleniumSauceLabsDriver.new(sauce_config)
|
16
23
|
selenium_runner = SeleniumRunner.new(driver)
|
17
24
|
results = selenium_runner.run(sauce_config.jasmine_server_url)
|
18
25
|
reporter.report(results)
|
19
26
|
end
|
20
27
|
|
28
|
+
def self.run_local_via_saucelabs(local_sauce_config, reporter = RspecReporter.new)
|
29
|
+
puts "Establishing tunnel to port #{local_sauce_config.jasmine_server_port}"
|
30
|
+
tunnel = LocalTunnel::Tunnel.new(local_sauce_config.jasmine_server_port,nil)
|
31
|
+
response = tunnel.register_tunnel
|
32
|
+
tunnel.start_tunnel do
|
33
|
+
ENV['JASMINE_URL'] = "http://#{response['host']}/jasmine"
|
34
|
+
run_via_saucelabs(local_sauce_config, reporter)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
21
38
|
def self.run_via_browser(browser_config, reporter = RspecReporter.new)
|
39
|
+
puts "Running Jasmine suite against #{browser_config.jasmine_server_url} using #{browser_config.browser}"
|
22
40
|
driver = SeleniumBrowserDriver.new(browser_config.browser)
|
23
41
|
selenium_runner = SeleniumRunner.new(driver)
|
24
42
|
results = selenium_runner.run(browser_config.jasmine_server_url)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Jasmine
|
2
|
+
module Sauce
|
3
|
+
module CI
|
4
|
+
|
5
|
+
class LocalSauceConfig < SauceConfig
|
6
|
+
|
7
|
+
def validate
|
8
|
+
raise ArgumentError.new("SAUCELABS_URL was not set") unless saucelabs_server_url
|
9
|
+
raise ArgumentError.new("JASMINE_PORT was not set") unless jasmine_server_port
|
10
|
+
raise ArgumentError.new("SAUCE_BROWSER was not set") unless browser
|
11
|
+
end
|
12
|
+
|
13
|
+
def jasmine_server_port
|
14
|
+
ENV['JASMINE_PORT']
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -14,6 +14,20 @@ namespace :jasmine do
|
|
14
14
|
Rake::Task["jasmine_sauce_runner"].invoke
|
15
15
|
end
|
16
16
|
|
17
|
+
desc "Run Jasmine via SauceLabs against localhost using a tunnel"
|
18
|
+
task :local_sauce do
|
19
|
+
require "rspec/core/rake_task"
|
20
|
+
|
21
|
+
RSpec::Core::RakeTask.new(:jasmine_local_sauce_runner) do |t|
|
22
|
+
t.rspec_opts = ["--colour", "--format", ENV['JASMINE_SPEC_FORMAT'] || "progress"]
|
23
|
+
t.verbose = true
|
24
|
+
runner_path = File.expand_path(File.join(File.dirname(__FILE__), "rake_local_sauce_runner.rb"))
|
25
|
+
t.pattern = [runner_path]
|
26
|
+
end
|
27
|
+
|
28
|
+
Rake::Task["jasmine_local_sauce_runner"].invoke
|
29
|
+
end
|
30
|
+
|
17
31
|
desc "Run Jasmine via local browser"
|
18
32
|
task :browser do
|
19
33
|
require "rspec/core/rake_task"
|
@@ -27,4 +41,6 @@ namespace :jasmine do
|
|
27
41
|
|
28
42
|
Rake::Task["jasmine_browser_runner"].invoke
|
29
43
|
end
|
44
|
+
|
45
|
+
|
30
46
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../../jasmine-selenium-sauce')
|
2
|
+
|
3
|
+
begin
|
4
|
+
config = Jasmine::Sauce::CI::LocalSauceConfig.new
|
5
|
+
config.validate
|
6
|
+
Jasmine::Sauce::CI::Main.run_local_via_saucelabs(config)
|
7
|
+
rescue ArgumentError => e
|
8
|
+
STDERR << "\nError: #{e.message}\n\n"
|
9
|
+
STDERR << "The following environment variables are required:\n"
|
10
|
+
STDERR << "\n"
|
11
|
+
STDERR << " SAUCELABS_URL - Your SauceLabs OnDemand URL with Basic Auth (http://username:password@ondemand.saucelabs.com:80/wd/hub)\n"
|
12
|
+
STDERR << " JASMINE_PORT - Port on localhost where server is running\n"
|
13
|
+
STDERR << " SAUCE_BROWSER - Which Browser SauceLabs should use\n"
|
14
|
+
STDERR << "\n"
|
15
|
+
exit -1
|
16
|
+
rescue StandardError => e
|
17
|
+
STDERR << "\nError: #{e.message}\n\n"
|
18
|
+
if e.message.include?("jsApiReporter is not defined")
|
19
|
+
STDERR << "Unable to find Jasmine tests, ensure server is running and #{config.jasmine_server_url} is correct\n\n"
|
20
|
+
end
|
21
|
+
exit -1
|
22
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class LocalTunnel::Tunnel
|
2
|
+
|
3
|
+
#
|
4
|
+
# Replace sleep call in start_tunnel with a yield to a block to be executed
|
5
|
+
# once the tunnel is established.
|
6
|
+
#
|
7
|
+
def start_tunnel
|
8
|
+
port = @port
|
9
|
+
tunnel = @tunnel
|
10
|
+
gateway = Net::SSH::Gateway.new(tunnel['host'], tunnel['user'])
|
11
|
+
gateway.open_remote(port.to_i, '127.0.0.1', tunnel['through_port'].to_i) do |rp,rh|
|
12
|
+
puts " " << tunnel['banner'] if tunnel.has_key? 'banner'
|
13
|
+
puts " Port #{port} is now publicly accessible from http://#{tunnel['host']} ..."
|
14
|
+
begin
|
15
|
+
yield
|
16
|
+
rescue Interrupt
|
17
|
+
gateway.close_remote(rp, rh)
|
18
|
+
exit
|
19
|
+
end
|
20
|
+
end
|
21
|
+
rescue Net::SSH::AuthenticationFailed
|
22
|
+
possible_key = Dir[File.expand_path('~/.ssh/*.pub')].first
|
23
|
+
puts " Failed to authenticate. If this is your first tunnel, you need to"
|
24
|
+
puts " upload a public key using the -k option. Try this:\n\n"
|
25
|
+
puts " localtunnel -k #{possible_key ? possible_key : '~/path/to/key'} #{port}"
|
26
|
+
exit
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
|
2
|
+
shared_examples_for "overridable configuration setting" do |env_setting, default|
|
3
|
+
context "when not specified" do
|
4
|
+
it { should eq(default) }
|
5
|
+
end
|
6
|
+
|
7
|
+
context "when specified" do
|
8
|
+
let(:value) { "random value" }
|
9
|
+
before { ENV[env_setting] = value }
|
10
|
+
after { ENV.delete(env_setting) }
|
11
|
+
it { should eq(value) }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
shared_examples_for "jasmine server url" do
|
16
|
+
describe "#jasmine_server_url" do
|
17
|
+
let(:url) { "http://my.host.com/jasmine" }
|
18
|
+
before { ENV['JASMINE_URL'] = url }
|
19
|
+
after { ENV.delete('JASMINE_URL') }
|
20
|
+
its(:jasmine_server_url) { should eq(url)}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
shared_examples_for "sauce config" do
|
25
|
+
|
26
|
+
include_context "jasmine server url"
|
27
|
+
|
28
|
+
describe "#saucelabs_server_url" do
|
29
|
+
let(:url) { "http://user:password@ondemand.saucelabs.com:80/wd/hub" }
|
30
|
+
before { ENV['SAUCELABS_URL'] = url }
|
31
|
+
after { ENV.delete('SAUCELABS_URL') }
|
32
|
+
its(:saucelabs_server_url) { should eq(url)}
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "#sauce_browser" do
|
36
|
+
let(:browser) { "Chrome" }
|
37
|
+
before { ENV['SAUCE_BROWSER'] = browser }
|
38
|
+
after { ENV.delete('SAUCE_BROWSER') }
|
39
|
+
its(:browser) { should eq(browser)}
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#sauce_platform" do
|
43
|
+
context "when not specified" do
|
44
|
+
its(:platform) { should eq(:VISTA) }
|
45
|
+
end
|
46
|
+
|
47
|
+
context "when specified" do
|
48
|
+
let(:platform) { "WIN_7" }
|
49
|
+
before { ENV['SAUCE_PLATFORM'] = platform }
|
50
|
+
after { ENV.delete('SAUCE_PLATFORM') }
|
51
|
+
its(:platform) { should eq(platform.to_sym) }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "#browser_version" do
|
56
|
+
subject { under_test.browser_version }
|
57
|
+
it_behaves_like "overridable configuration setting", 'SAUCE_BROWSER_VERSION', nil
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "#record_screenshots" do
|
61
|
+
subject { under_test.record_screenshots }
|
62
|
+
it_behaves_like "overridable configuration setting", 'SAUCE_SCREENSHOTS', false
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "#record_video" do
|
66
|
+
subject { under_test.record_video }
|
67
|
+
it_behaves_like "overridable configuration setting", 'SAUCE_VIDEO', false
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "#idle_timeout" do
|
71
|
+
subject { under_test.idle_timeout }
|
72
|
+
it_behaves_like "overridable configuration setting", 'SAUCE_IDLE_TIMEOUT', 90
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "#max_duration" do
|
76
|
+
subject { under_test.max_duration }
|
77
|
+
it_behaves_like "overridable configuration setting", 'SAUCE_MAX_DURATION', 180
|
78
|
+
end
|
79
|
+
end
|