jasmine_selenium_runner 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.rspec +1 -0
- data/.travis.yml +10 -0
- data/Gemfile +5 -0
- data/LICENSE +20 -0
- data/README.md +104 -0
- data/Rakefile +7 -0
- data/jasmine-selenium-runner.gemspec +28 -0
- data/lib/jasmine/runners/selenium/version.rb +8 -0
- data/lib/jasmine/runners/selenium.rb +65 -0
- data/lib/jasmine_selenium_runner/configure_jasmine.rb +61 -0
- data/lib/jasmine_selenium_runner/firebug/firebug-1.6.2.xpi +0 -0
- data/lib/jasmine_selenium_runner/firebug/firebug-license.txt +30 -0
- data/lib/jasmine_selenium_runner/firebug/firebug.rb +26 -0
- data/lib/jasmine_selenium_runner/railtie.rb +10 -0
- data/lib/jasmine_selenium_runner/tasks/jasmine_selenium_runner.rake +8 -0
- data/lib/jasmine_selenium_runner.rb +16 -0
- data/spec/fixtures/is_in_firefox_spec.js +5 -0
- data/spec/fixtures/is_in_ie_spec.js +5 -0
- data/spec/jasmine_selenium_runner/configure_jasmine_spec.rb +52 -0
- data/spec/selenium_runner_integration_spec.rb +115 -0
- data/spec/spec_helper.rb +22 -0
- metadata +171 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f85e4cefa20dc2a1976e3a56c9ab6f69abaceaf8
|
4
|
+
data.tar.gz: eba4354fd76bc9642d63bb5c33b0adc283dcd21d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b92bb57994b870683782005d394899af5bf11a896659d3c54578b849ea14f55047750e39b32d517988c9d0bf145359719c88ac0c7b27ae7805778fc88bf896e6
|
7
|
+
data.tar.gz: 11a5f427662ff9c31063be536da4988a7b7ab271d8d67410c0e664edd97dfcf8b31211a0b1b9e251d413845e2fa526089486964490f7c2d687a1214451cf5057
|
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.travis.yml
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
before_script:
|
2
|
+
- sh -e /etc/init.d/xvfb start
|
3
|
+
- curl https://gist.github.com/santiycr/5139565/raw/sauce_connect_setup.sh | bash
|
4
|
+
script: DISPLAY=:99.0 bundle exec rake
|
5
|
+
rvm:
|
6
|
+
- 2.0.0
|
7
|
+
env:
|
8
|
+
global:
|
9
|
+
- secure: i8arxYVwMt/vp8a5RugpE+edkCg1G+wQ1WdCbdiKPhDZEcMh6f9vETvcsY9W94xY7yTBNSrZ+jNkz5ZQrGfiq1HllKxSjZBXv0pJ+wyxuFHl7hSib1OCzEImk0lHVryX7A7iO4u1GzZ+jmiVyKL7uEjD6CokphOpwnYpBln8jlg=
|
10
|
+
- secure: UWmQafzVbXw81vu+V8FJdu0ArVSpT/Ya+iFOVksDoatxyuJzS+BRXOjXuOL1mEo6CwpIhxo5Fs+8ALC/K8fTvSRos4hsRdkb38Gddyj5M7fSeICzeBMejUcu+4b1QO98AnN6uRqbFtNgm3c2qx448tLIp4sKKmGNro6lAD+Txew=
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2013 Pivotal Labs
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
7
|
+
the Software without restriction, including without limitation the rights to
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
# Jasmine Selenium Runner [![Build Status](https://travis-ci.org/jasmine/jasmine_selenium_runner.png?branch=master)](https://travis-ci.org/jasmine/jasmine_selenium_runner)
|
2
|
+
|
3
|
+
Runner for building Jasmine builds in Selenium (permitting automatic cross-browser testing).
|
4
|
+
After require-ing, jasmine_selenium_runner automatically sets itself up as the jasmine:ci runner.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile (to test & dev groups):
|
9
|
+
|
10
|
+
gem 'jasmine_selenium_runner'
|
11
|
+
|
12
|
+
And then execute:
|
13
|
+
|
14
|
+
$ bundle
|
15
|
+
|
16
|
+
Or install it yourself as:
|
17
|
+
|
18
|
+
$ gem install jasmine_selenium_runner
|
19
|
+
|
20
|
+
### Basic Usage:
|
21
|
+
|
22
|
+
- In rails, simply `run rake jasmine:ci`, tests should run in firefox.
|
23
|
+
- Outside of rails, you may need to add `require 'jasmine_selenium_runner'` to your Rakefile after jasmine is required.
|
24
|
+
|
25
|
+
### Using w/ Travis (with xvfb):
|
26
|
+
|
27
|
+
You'll want your .travis.yml file to look like the following:
|
28
|
+
|
29
|
+
before_script:
|
30
|
+
- sh -e /etc/init.d/xvfb start
|
31
|
+
script: DISPLAY=:99.0 bundle exec rake jasmine:ci
|
32
|
+
env:
|
33
|
+
global:
|
34
|
+
- JASMINE_BROWSER=firefox
|
35
|
+
|
36
|
+
### Using SauceLabs w/ Travis to run in multiple browsers:
|
37
|
+
|
38
|
+
Create a jasmine_selenium_runner.yml in spec/javascripts/support/ with the following content:
|
39
|
+
|
40
|
+
---
|
41
|
+
use_sauce: <%= ENV['USE_SAUCE'] %>
|
42
|
+
browser: <%= ENV['JASMINE_BROWSER'] %>
|
43
|
+
sauce:
|
44
|
+
name: some-project-name <%= Time.now.to_s %>
|
45
|
+
username: <%= ENV['SAUCE_USERNAME'] %>
|
46
|
+
access_key: <%= ENV['SAUCE_ACCESS_KEY'] %>
|
47
|
+
build: <%= ENV['TRAVIS_BUILD_NUMBER'] || 'Ran locally' %>
|
48
|
+
tags:
|
49
|
+
- <%= ENV['TRAVIS_RUBY_VERSION'] || RUBY_VERSION %>
|
50
|
+
- CI
|
51
|
+
tunnel_identifier: <%= ENV['TRAVIS_JOB_NUMBER'] ? "#{ENV['TRAVIS_JOB_NUMBER']}" : nil %>
|
52
|
+
os: <%= ENV['SAUCE_OS'] %>
|
53
|
+
browser_version: <%= ENV['SAUCE_BROWSER_VERSION'] %>
|
54
|
+
|
55
|
+
Here's a compatible .travis.yml example (Travis has
|
56
|
+
[instructions for secure environment variables](http://about.travis-ci.org/docs/user/build-configuration/#Secure-environment-variables)
|
57
|
+
which you'll want for SAUCE_USERNAME and SAUCE_ACCESS_KEY):
|
58
|
+
|
59
|
+
before_script:
|
60
|
+
- curl https://gist.github.com/santiycr/5139565/raw/sauce_connect_setup.sh | bash
|
61
|
+
script: bundle exec rake jasmine:ci
|
62
|
+
rvm:
|
63
|
+
- 2.0.0
|
64
|
+
env:
|
65
|
+
global:
|
66
|
+
- USE_SAUCE=true
|
67
|
+
- secure: some-secure-env-var
|
68
|
+
- secure: some-other-secure-env-var
|
69
|
+
matrix:
|
70
|
+
include:
|
71
|
+
- env:
|
72
|
+
- JASMINE_BROWSER="firefox"
|
73
|
+
- SAUCE_OS="Linux"
|
74
|
+
- SAUCE_BROWSER_VERSION=''
|
75
|
+
- env:
|
76
|
+
- JASMINE_BROWSER="safari"
|
77
|
+
- SAUCE_OS="OS X 10.8"
|
78
|
+
- SAUCE_BROWSER_VERSION=6
|
79
|
+
- env:
|
80
|
+
- JASMINE_BROWSER="internet explorer"
|
81
|
+
- SAUCE_OS="Windows 8"
|
82
|
+
- SAUCE_BROWSER_VERSION=10
|
83
|
+
- env:
|
84
|
+
- env:
|
85
|
+
- JASMINE_BROWSER="chrome"
|
86
|
+
- SAUCE_OS="Linux"
|
87
|
+
- SAUCE_BROWSER_VERSION=''
|
88
|
+
|
89
|
+
### Using with a custom selenium server
|
90
|
+
|
91
|
+
Create a jasmine_selenium_runner.yml in spec/javascripts/support/ with the following content:
|
92
|
+
|
93
|
+
---
|
94
|
+
selenium_server: <full url to selenium server>
|
95
|
+
browser: <%= ENV['JASMINE_BROWSER'] %>
|
96
|
+
|
97
|
+
## Contributing
|
98
|
+
|
99
|
+
1. Fork it
|
100
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
101
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
102
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
103
|
+
5. Create new Pull Request
|
104
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'jasmine/runners/selenium/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "jasmine_selenium_runner"
|
8
|
+
spec.version = Jasmine::Runners::Selenium::VERSION
|
9
|
+
spec.authors = ["Rajan Agaskar", "Gregg Van Hove" ]
|
10
|
+
spec.email = ["rajan@pivotallabs.com", 'gvanhove@pivotallabs.com']
|
11
|
+
spec.description = %q{Run your jasmine tests in a real live browser!}
|
12
|
+
spec.summary = %q{Run your jasmine tests in a real live browser!}
|
13
|
+
spec.homepage = "http://pivotal.github.com/jasmine/"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency 'rspec'
|
24
|
+
spec.add_development_dependency 'rails'
|
25
|
+
spec.add_dependency 'jasmine', '~> 2.0.0.alpha'
|
26
|
+
spec.add_dependency 'selenium-webdriver', '~> 2.35'
|
27
|
+
spec.add_dependency 'sauce-connect'
|
28
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'selenium-webdriver'
|
2
|
+
|
3
|
+
module Jasmine
|
4
|
+
module Runners
|
5
|
+
class Selenium
|
6
|
+
def initialize(formatter, jasmine_server_url, driver, result_batch_size)
|
7
|
+
@formatter = formatter
|
8
|
+
@jasmine_server_url = jasmine_server_url
|
9
|
+
@driver = driver
|
10
|
+
@result_batch_size = result_batch_size
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
driver.navigate.to jasmine_server_url
|
15
|
+
ensure_connection_established
|
16
|
+
wait_for_suites_to_finish_running
|
17
|
+
|
18
|
+
formatter.format(get_results)
|
19
|
+
formatter.done
|
20
|
+
ensure
|
21
|
+
driver.quit
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
attr_reader :formatter, :config, :driver, :jasmine_server_url, :result_batch_size
|
26
|
+
|
27
|
+
def started?
|
28
|
+
driver.execute_script "return jsApiReporter && jsApiReporter.started"
|
29
|
+
end
|
30
|
+
|
31
|
+
def finished?
|
32
|
+
driver.execute_script "return jsApiReporter && jsApiReporter.finished"
|
33
|
+
end
|
34
|
+
|
35
|
+
def ensure_connection_established
|
36
|
+
started = Time.now
|
37
|
+
until started? do
|
38
|
+
raise "couldn't connect to Jasmine after 60 seconds" if (started + 60 < Time.now)
|
39
|
+
sleep 0.1
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def wait_for_suites_to_finish_running
|
44
|
+
puts "Waiting for suite to finish in browser ..."
|
45
|
+
until finished? do
|
46
|
+
sleep 0.1
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def get_results
|
51
|
+
index = 0
|
52
|
+
spec_results = []
|
53
|
+
|
54
|
+
loop do
|
55
|
+
slice = driver.execute_script("return jsApiReporter.specResults(#{index}, #{result_batch_size})")
|
56
|
+
spec_results << Jasmine::Result.map_raw_results(slice)
|
57
|
+
index += result_batch_size
|
58
|
+
break if slice.size < result_batch_size
|
59
|
+
end
|
60
|
+
spec_results.flatten
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'jasmine'
|
2
|
+
require 'jasmine/runners/selenium'
|
3
|
+
require 'selenium-webdriver'
|
4
|
+
|
5
|
+
module JasmineSeleniumRunner
|
6
|
+
module ConfigureJasmine
|
7
|
+
def self.install_selenium_runner
|
8
|
+
Jasmine.configure do |config|
|
9
|
+
filepath = File.join(Dir.pwd, 'spec', 'javascripts', 'support', 'jasmine_selenium_runner.yml')
|
10
|
+
runner_config = YAML::load(ERB.new(File.read(filepath)).result(binding)) if File.exist?(filepath)
|
11
|
+
runner_config ||= {}
|
12
|
+
config.port = 5555 if runner_config['use_sauce'] #Sauce only proxies certain ports
|
13
|
+
|
14
|
+
config.runner = lambda { |formatter, jasmine_server_url|
|
15
|
+
webdriver = nil
|
16
|
+
browser = runner_config['browser'] || 'firefox'
|
17
|
+
|
18
|
+
if runner_config['use_sauce']
|
19
|
+
sauce_config = runner_config['sauce']
|
20
|
+
|
21
|
+
unless sauce_config['tunnel_identifier']
|
22
|
+
require 'sauce/connect'
|
23
|
+
Sauce::Connect.connect!
|
24
|
+
end
|
25
|
+
|
26
|
+
username = sauce_config.fetch('username')
|
27
|
+
key = sauce_config.fetch('access_key')
|
28
|
+
driver_url = "http://#{username}:#{key}@localhost:4445/wd/hub"
|
29
|
+
|
30
|
+
capabilities = {
|
31
|
+
:name => sauce_config['name'],
|
32
|
+
:platform => sauce_config['os'],
|
33
|
+
:version => sauce_config['browser_version'],
|
34
|
+
:build => sauce_config['build'],
|
35
|
+
:tags => sauce_config['tags'],
|
36
|
+
:browserName => browser,
|
37
|
+
'tunnel-identifier' => sauce_config['tunnel_identifier']
|
38
|
+
}
|
39
|
+
|
40
|
+
webdriver = Selenium::WebDriver.for :remote, :url => driver_url, :desired_capabilities => capabilities
|
41
|
+
elsif runner_config['selenium_server']
|
42
|
+
webdriver = Selenium::WebDriver.for :remote, :url => runner_config['selenium_server'], :desired_capabilities => browser.to_sym
|
43
|
+
else
|
44
|
+
|
45
|
+
selenium_options = {}
|
46
|
+
if browser == 'firefox-firebug'
|
47
|
+
require File.join(File.dirname(__FILE__), 'firebug/firebug')
|
48
|
+
(profile = Selenium::WebDriver::Firefox::Profile.new)
|
49
|
+
profile.enable_firebug
|
50
|
+
selenium_options[:profile] = profile
|
51
|
+
end
|
52
|
+
webdriver = Selenium::WebDriver.for(browser.to_sym, selenium_options)
|
53
|
+
end
|
54
|
+
|
55
|
+
Jasmine::Runners::Selenium.new(formatter, jasmine_server_url, webdriver, runner_config['batch_config_size'] || 50)
|
56
|
+
}
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
Binary file
|
@@ -0,0 +1,30 @@
|
|
1
|
+
Software License Agreement (BSD License)
|
2
|
+
|
3
|
+
Copyright (c) 2007, Parakey Inc.
|
4
|
+
All rights reserved.
|
5
|
+
|
6
|
+
Redistribution and use of this software in source and binary forms, with or without modification,
|
7
|
+
are permitted provided that the following conditions are met:
|
8
|
+
|
9
|
+
* Redistributions of source code must retain the above
|
10
|
+
copyright notice, this list of conditions and the
|
11
|
+
following disclaimer.
|
12
|
+
|
13
|
+
* Redistributions in binary form must reproduce the above
|
14
|
+
copyright notice, this list of conditions and the
|
15
|
+
following disclaimer in the documentation and/or other
|
16
|
+
materials provided with the distribution.
|
17
|
+
|
18
|
+
* Neither the name of Parakey Inc. nor the names of its
|
19
|
+
contributors may be used to endorse or promote products
|
20
|
+
derived from this software without specific prior
|
21
|
+
written permission of Parakey Inc.
|
22
|
+
|
23
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
|
24
|
+
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
25
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
26
|
+
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
27
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
28
|
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
29
|
+
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
30
|
+
OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'selenium/webdriver'
|
2
|
+
|
3
|
+
class Selenium::WebDriver::Firefox::Profile
|
4
|
+
def self.firebug_version
|
5
|
+
'1.6.2'
|
6
|
+
end
|
7
|
+
|
8
|
+
def enable_firebug(version = nil)
|
9
|
+
version ||= Selenium::WebDriver::Firefox::Profile.firebug_version
|
10
|
+
add_extension(File.expand_path("../firebug-#{version}.xpi", __FILE__))
|
11
|
+
|
12
|
+
# Prevent "Welcome!" tab
|
13
|
+
self["extensions.firebug.currentVersion"] = "999"
|
14
|
+
|
15
|
+
# Enable for all sites.
|
16
|
+
self["extensions.firebug.allPagesActivation"] = "on"
|
17
|
+
|
18
|
+
# Enable all features.
|
19
|
+
['console', 'net', 'script'].each do |feature|
|
20
|
+
self["extensions.firebug.#{feature}.enableSites"] = true
|
21
|
+
end
|
22
|
+
|
23
|
+
# Open by default.
|
24
|
+
self["extensions.firebug.previousPlacement"] = 1
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
def safe_gem_check(gem_name, version_string)
|
2
|
+
if Gem::Specification.respond_to?(:find_by_name)
|
3
|
+
Gem::Specification.find_by_name(gem_name, version_string)
|
4
|
+
elsif Gem.respond_to?(:available?)
|
5
|
+
Gem.available?(gem_name, version_string)
|
6
|
+
end
|
7
|
+
rescue Gem::LoadError
|
8
|
+
false
|
9
|
+
end
|
10
|
+
|
11
|
+
if safe_gem_check('rails', '>= 3')
|
12
|
+
require File.join('jasmine_selenium_runner', 'railtie')
|
13
|
+
else
|
14
|
+
require File.join('jasmine_selenium_runner', 'configure_jasmine.rb')
|
15
|
+
JasmineSeleniumRunner::ConfigureJasmine.install_selenium_runner
|
16
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'yaml'
|
3
|
+
require 'selenium-webdriver'
|
4
|
+
require 'jasmine_selenium_runner/configure_jasmine'
|
5
|
+
|
6
|
+
describe "Configuring jasmine" do
|
7
|
+
|
8
|
+
class FakeConfig
|
9
|
+
attr_accessor :port, :runner
|
10
|
+
end
|
11
|
+
|
12
|
+
def configure
|
13
|
+
Dir.stub(:pwd).and_return(working_dir)
|
14
|
+
Jasmine.stub(:configure).and_yield(fake_config)
|
15
|
+
JasmineSeleniumRunner::ConfigureJasmine.install_selenium_runner
|
16
|
+
end
|
17
|
+
|
18
|
+
def stub_config_file(config_obj)
|
19
|
+
config_path = File.join(working_dir, 'spec', 'javascripts', 'support', 'jasmine_selenium_runner.yml')
|
20
|
+
File.stub(:exist?).with(config_path).and_return(true)
|
21
|
+
File.stub(:read).with(config_path).and_return(YAML.dump(config_obj))
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:working_dir) { 'hi' }
|
25
|
+
let(:fake_config) { FakeConfig.new }
|
26
|
+
|
27
|
+
context "when a custom selenium server is specified" do
|
28
|
+
before do
|
29
|
+
stub_config_file 'selenium_server' => 'http://example.com/selenium/stuff'
|
30
|
+
configure
|
31
|
+
end
|
32
|
+
|
33
|
+
it "make a webdriver pointing to the custom server" do
|
34
|
+
Selenium::WebDriver.should_receive(:for).with(:remote, hash_including(url: 'http://example.com/selenium/stuff'))
|
35
|
+
fake_config.runner.call(nil, nil)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context "when the user wants firebug installed" do
|
40
|
+
before do
|
41
|
+
stub_config_file 'browser' => 'firefox-firebug'
|
42
|
+
configure
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should create a firebug profile and pass that to WebDriver" do
|
46
|
+
profile = double(:profile, enable_firebug: nil)
|
47
|
+
Selenium::WebDriver::Firefox::Profile.stub(:new).and_return(profile)
|
48
|
+
Selenium::WebDriver.should_receive(:for).with('firefox-firebug'.to_sym, {profile: profile})
|
49
|
+
fake_config.runner.call(nil, nil)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'tmpdir'
|
3
|
+
require 'jasmine'
|
4
|
+
require 'json'
|
5
|
+
require 'net/http'
|
6
|
+
|
7
|
+
describe Jasmine::Runners::Selenium do
|
8
|
+
let(:file_helper) { FileHelper.new }
|
9
|
+
it "permits rake jasmine:ci task to be run using Selenium" do
|
10
|
+
in_temp_dir do |dir, project_root|
|
11
|
+
File.open(File.join(dir, 'Gemfile'), 'w') do |file|
|
12
|
+
file.write <<-GEMFILE
|
13
|
+
source 'https://rubygems.org'
|
14
|
+
gem 'jasmine_selenium_runner', :path => '#{project_root}'
|
15
|
+
gem 'jasmine', :git => 'https://github.com/pivotal/jasmine-gem.git'
|
16
|
+
GEMFILE
|
17
|
+
end
|
18
|
+
Bundler.with_clean_env do
|
19
|
+
`bundle`
|
20
|
+
`bundle exec jasmine init`
|
21
|
+
`bundle exec jasmine examples`
|
22
|
+
FileUtils.cp(File.join(project_root, 'spec', 'fixtures', 'is_in_firefox_spec.js'), File.join(dir, 'spec', 'javascripts'))
|
23
|
+
ci_output = `bundle exec rake -E "require 'jasmine_selenium_runner'" --trace jasmine:ci`
|
24
|
+
ci_output.should =~ /[1-9][0-9]* specs, 0 failures/
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it "permits rake jasmine:ci task to be run using Sauce", :sauce => true do
|
30
|
+
in_temp_dir do |dir, project_root|
|
31
|
+
File.open(File.join(dir, 'Gemfile'), 'w') do |file|
|
32
|
+
file.write <<-GEMFILE
|
33
|
+
source 'https://rubygems.org'
|
34
|
+
gem 'jasmine_selenium_runner', :path => '#{project_root}'
|
35
|
+
gem 'jasmine', :git => 'https://github.com/pivotal/jasmine-gem.git'
|
36
|
+
GEMFILE
|
37
|
+
end
|
38
|
+
Bundler.with_clean_env do
|
39
|
+
`bundle`
|
40
|
+
`bundle exec jasmine init`
|
41
|
+
`bundle exec jasmine examples`
|
42
|
+
File.open(File.join(dir, 'spec', 'javascripts', 'support', 'jasmine_selenium_runner.yml'), 'w') do |file|
|
43
|
+
file.write <<-YAML
|
44
|
+
---
|
45
|
+
use_sauce: true
|
46
|
+
browser: "internet explorer"
|
47
|
+
result_batch_size: 25
|
48
|
+
sauce:
|
49
|
+
name: "jasmine_selenium_runner <%= Time.now.to_s %>"
|
50
|
+
username: #{ENV['SAUCE_USERNAME']}
|
51
|
+
access_key: #{ENV['SAUCE_ACCESS_KEY']}
|
52
|
+
build: #{ENV['TRAVIS_BUILD_NUMBER'] || 'Ran locally'}
|
53
|
+
tags:
|
54
|
+
- #{ENV['TRAVIS_RUBY_VERSION'] || RUBY_VERSION}
|
55
|
+
- CI
|
56
|
+
tunnel_identifier: #{ENV['TRAVIS_JOB_NUMBER'] ? %Q("#{ENV['TRAVIS_JOB_NUMBER']}") : nil}
|
57
|
+
os: "Windows 8"
|
58
|
+
browser_version: 10
|
59
|
+
YAML
|
60
|
+
end
|
61
|
+
|
62
|
+
FileUtils.cp(File.join(project_root, 'spec', 'fixtures', 'is_in_ie_spec.js'), File.join(dir, 'spec', 'javascripts'))
|
63
|
+
|
64
|
+
test_start_time = Time.now.to_i
|
65
|
+
uri = URI.parse "https://saucelabs.com/rest/v1/#{ENV['SAUCE_USERNAME']}/jobs?from=#{test_start_time}"
|
66
|
+
job_list_request = Net::HTTP::Get.new(uri)
|
67
|
+
job_list_request.basic_auth(ENV['SAUCE_USERNAME'], ENV['SAUCE_ACCESS_KEY'])
|
68
|
+
before = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
|
69
|
+
http.request(job_list_request)
|
70
|
+
end
|
71
|
+
JSON.parse(before.body).should == []
|
72
|
+
ci_output = %x{bundle exec rake -E "require 'jasmine_selenium_runner'" --trace jasmine:ci}
|
73
|
+
ci_output.should =~ (/[1-9][0-9]* specs, 0 failures/)
|
74
|
+
after = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
|
75
|
+
http.request(job_list_request)
|
76
|
+
end
|
77
|
+
JSON.parse(after.body).should_not be_empty
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def bundle_install
|
83
|
+
tries_remaining = 3
|
84
|
+
while tries_remaining > 0
|
85
|
+
puts `NOKOGIRI_USE_SYSTEM_LIBRARIES=true bundle install --path vendor;`
|
86
|
+
if $?.success?
|
87
|
+
tries_remaining = 0
|
88
|
+
else
|
89
|
+
tries_remaining -= 1
|
90
|
+
puts "\n\nBundle failed, trying #{tries_remaining} more times\n\n"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
it "works with the rails asset pipeline" do
|
96
|
+
in_temp_dir do |dir, project_root|
|
97
|
+
`rails new rails-test`
|
98
|
+
Dir.chdir File.join(dir, 'rails-test')
|
99
|
+
File.open('Gemfile', 'a') { |f|
|
100
|
+
f.puts "gem 'jasmine', :git => 'https://github.com/pivotal/jasmine-gem.git'"
|
101
|
+
f.puts "gem 'jasmine_selenium_runner', :path => '#{project_root}'"
|
102
|
+
}
|
103
|
+
|
104
|
+
Bundler.with_clean_env do
|
105
|
+
bundle_install
|
106
|
+
`bundle exec rails g jasmine:install`
|
107
|
+
`bundle exec rails g jasmine:examples`
|
108
|
+
FileUtils.cp(File.join(project_root, 'spec', 'fixtures', 'is_in_firefox_spec.js'), File.join(dir, 'rails-test', 'spec', 'javascripts'))
|
109
|
+
output = `bundle exec rake jasmine:ci`
|
110
|
+
output.should =~ /[1-9]\d* specs, 0 failures/
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'jasmine_selenium_runner'
|
3
|
+
|
4
|
+
RSpec.configure do |config|
|
5
|
+
config.before(:each, :sauce => true) do
|
6
|
+
unless ENV["SAUCE_USERNAME"] && ENV["SAUCE_ACCESS_KEY"]
|
7
|
+
pending "skipping sauce tests because SAUCE_USERNAME and SAUCE_ACCESS_KEY aren't set"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def in_temp_dir
|
13
|
+
project_root = File.expand_path(File.join('..', '..'), __FILE__)
|
14
|
+
Dir.mktmpdir do |tmp_dir|
|
15
|
+
begin
|
16
|
+
Dir.chdir tmp_dir
|
17
|
+
yield tmp_dir, project_root
|
18
|
+
ensure
|
19
|
+
Dir.chdir project_root
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,171 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jasmine_selenium_runner
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Rajan Agaskar
|
8
|
+
- Gregg Van Hove
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-09-27 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bundler
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ~>
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '1.3'
|
21
|
+
type: :development
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ~>
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '1.3'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: rake
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: rspec
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: rails
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: jasmine
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ~>
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 2.0.0.alpha
|
77
|
+
type: :runtime
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ~>
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 2.0.0.alpha
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: selenium-webdriver
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ~>
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '2.35'
|
91
|
+
type: :runtime
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ~>
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '2.35'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: sauce-connect
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - '>='
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
type: :runtime
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
description: Run your jasmine tests in a real live browser!
|
113
|
+
email:
|
114
|
+
- rajan@pivotallabs.com
|
115
|
+
- gvanhove@pivotallabs.com
|
116
|
+
executables: []
|
117
|
+
extensions: []
|
118
|
+
extra_rdoc_files: []
|
119
|
+
files:
|
120
|
+
- .gitignore
|
121
|
+
- .rspec
|
122
|
+
- .travis.yml
|
123
|
+
- Gemfile
|
124
|
+
- LICENSE
|
125
|
+
- README.md
|
126
|
+
- Rakefile
|
127
|
+
- jasmine-selenium-runner.gemspec
|
128
|
+
- lib/jasmine/runners/selenium.rb
|
129
|
+
- lib/jasmine/runners/selenium/version.rb
|
130
|
+
- lib/jasmine_selenium_runner.rb
|
131
|
+
- lib/jasmine_selenium_runner/configure_jasmine.rb
|
132
|
+
- lib/jasmine_selenium_runner/firebug/firebug-1.6.2.xpi
|
133
|
+
- lib/jasmine_selenium_runner/firebug/firebug-license.txt
|
134
|
+
- lib/jasmine_selenium_runner/firebug/firebug.rb
|
135
|
+
- lib/jasmine_selenium_runner/railtie.rb
|
136
|
+
- lib/jasmine_selenium_runner/tasks/jasmine_selenium_runner.rake
|
137
|
+
- spec/fixtures/is_in_firefox_spec.js
|
138
|
+
- spec/fixtures/is_in_ie_spec.js
|
139
|
+
- spec/jasmine_selenium_runner/configure_jasmine_spec.rb
|
140
|
+
- spec/selenium_runner_integration_spec.rb
|
141
|
+
- spec/spec_helper.rb
|
142
|
+
homepage: http://pivotal.github.com/jasmine/
|
143
|
+
licenses:
|
144
|
+
- MIT
|
145
|
+
metadata: {}
|
146
|
+
post_install_message:
|
147
|
+
rdoc_options: []
|
148
|
+
require_paths:
|
149
|
+
- lib
|
150
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
151
|
+
requirements:
|
152
|
+
- - '>='
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
version: '0'
|
155
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - '>='
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
requirements: []
|
161
|
+
rubyforge_project:
|
162
|
+
rubygems_version: 2.0.5
|
163
|
+
signing_key:
|
164
|
+
specification_version: 4
|
165
|
+
summary: Run your jasmine tests in a real live browser!
|
166
|
+
test_files:
|
167
|
+
- spec/fixtures/is_in_firefox_spec.js
|
168
|
+
- spec/fixtures/is_in_ie_spec.js
|
169
|
+
- spec/jasmine_selenium_runner/configure_jasmine_spec.rb
|
170
|
+
- spec/selenium_runner_integration_spec.rb
|
171
|
+
- spec/spec_helper.rb
|