jasmine-selenium-sauce 1.1.1 → 1.2.0
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.
- 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
|