qlive-rspec 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +0 -1
- data/README.md +22 -19
- data/lib/qlive/matchers.rb +1 -1
- data/lib/qlive/runner.rb +10 -23
- data/lib/qlive-rspec/version.rb +1 -1
- data/lib/qlive-rspec.rb +0 -5
- data/qlive-rspec.gemspec +4 -4
- data/spec/dummy/Gemfile +14 -15
- data/spec/dummy/README.md +1 -0
- data/spec/dummy/spec/qunits/adding_todos/long_list_qlive.rb +14 -0
- data/spec/dummy/spec/qunits/adding_todos/short_list_qlive.rb +14 -0
- data/spec/dummy/spec/qunits/adding_todos/test-ajax-creation.js +1 -1
- data/spec/dummy/spec/qunits/qunit_support/qunit-logger.js +1 -1
- data/spec/dummy/spec/qunits/qunit_support/wait-for.js +2 -1
- data/spec/qunits_spec.rb +1 -0
- data/spec/spec_helper.rb +2 -1
- metadata +47 -20
- data/spec/dummy/spec/qunits/adding_todos/adding_todos_qlive.rb +0 -13
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -5,23 +5,22 @@ This builds on the [qlive-rails](https://github.com/proxv/qlive-rails) gem. If y
|
|
5
5
|
this gem will let you run your qlive tests in both a browser and headlessly as an rspec example/test.
|
6
6
|
|
7
7
|
|
8
|
-
|
9
|
-
If this doesn't work for you, it should be possible to incorporate your qlive tests into other automated testing
|
10
|
-
or continuous integration enviornments (eg, with a selenium-related library.)
|
8
|
+
## Installation
|
11
9
|
|
12
10
|
|
11
|
+
### PhantomJS and Poltergeist
|
13
12
|
|
14
|
-
|
13
|
+
Qlive-rspec depends on the [Poltergeist gem](https://github.com/jonleighton/poltergeist),
|
14
|
+
which uses [PhantomJS](http://phantomjs.org/) as its headless webkit browser.
|
15
15
|
|
16
16
|
|
17
|
+
You will need to install PhantomJS. Up-to-date binaries are usually available
|
18
|
+
for [download](http://phantomjs.org/download.html) so it is a pretty easy install.
|
17
19
|
|
18
|
-
* Install webkit-qt and xvfb on your system. Eg:
|
19
|
-
<pre>sudo aptitude install libqt4-dev xvfb</pre>
|
20
20
|
|
21
|
-
|
21
|
+
### Gemfile
|
22
22
|
|
23
|
-
|
24
|
-
* Add qlive-rails and qlive-rspec to your Gemfile as follows:
|
23
|
+
Add poltergeist, qlive-rails, and qlive-rspec to your Gemfile as follows:
|
25
24
|
|
26
25
|
```ruby
|
27
26
|
group :test, :development do
|
@@ -29,12 +28,16 @@ note: See [capybara-webkit](https://github.com/thoughtbot/capybara-webkit) and [
|
|
29
28
|
end
|
30
29
|
|
31
30
|
group :test do
|
32
|
-
gem '
|
33
|
-
gem 'qlive-rspec'
|
31
|
+
gem 'poltergeist', '~> 1.1'
|
32
|
+
gem 'qlive-rspec', '~> 0.4.0'
|
34
33
|
end
|
35
34
|
```
|
36
35
|
|
37
|
-
|
36
|
+
|
37
|
+
### Routes
|
38
|
+
|
39
|
+
Mount the engine in routes.rb:
|
40
|
+
|
38
41
|
|
39
42
|
```ruby
|
40
43
|
if Rails.env != 'production'
|
@@ -53,7 +56,7 @@ create ``spec/qunits/qunits_spec.rb``:
|
|
53
56
|
require "spec_helper.rb"
|
54
57
|
include Qlive::Runner
|
55
58
|
|
56
|
-
Capybara.current_driver = :
|
59
|
+
Capybara.current_driver = :poltergeist
|
57
60
|
|
58
61
|
describe "qunits" do
|
59
62
|
run_qlive
|
@@ -61,8 +64,12 @@ create ``spec/qunits/qunits_spec.rb``:
|
|
61
64
|
```
|
62
65
|
|
63
66
|
|
64
|
-
*
|
65
|
-
|
67
|
+
* Your qunit tests will now run as a normal rspec example:
|
68
|
+
``rspec spec/qunits``
|
69
|
+
|
70
|
+
|
71
|
+
* Tip: you can run just specific qlive suites using the rspec --example option and the qlive suite name. Eg: Running qunits for just the suite Posts::AsUserQlive could be run with:
|
72
|
+
``rspec spec/qunits --example 'posts/as_user'``
|
66
73
|
|
67
74
|
|
68
75
|
## Sauce
|
@@ -156,10 +163,6 @@ Qlive.setup[:before_suites] lambda { my_setup_code }
|
|
156
163
|
Qlive.setup[:after_suites] lambda { my_teardown_code }
|
157
164
|
</pre>
|
158
165
|
|
159
|
-
* Optionally set xvfb/headless gem to a custom configuration hash with: ``Qlive.setup[:headless_config] = my_settings_hash``
|
160
|
-
|
161
|
-
* Optionally disable xvfb with ``Qlive.setup[:start_xvfb] = false`` if you plan on configuring it externally
|
162
|
-
|
163
166
|
* Optionally change per-page timeout in seconds with: ``Qlive.setup[:capybara_wait_time] = 30``
|
164
167
|
|
165
168
|
* Optionally pass in ``:before_each`` and ``:after_each`` proc/lambda in ``run_qlive`` (called in qunits_spec.rb)
|
data/lib/qlive/matchers.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Qlive
|
2
2
|
module Matchers
|
3
3
|
def self.add_matchers
|
4
|
-
::RSpec::Matchers.define :pass_qunit_tests do |failure_text|
|
4
|
+
::RSpec::Matchers.define :pass_qunit_tests do |suite, failure_text|
|
5
5
|
match do |page_actual|
|
6
6
|
url = page_actual.current_url
|
7
7
|
passed = page_actual.find('#qunit-testresult .passed').text.to_i rescue 0
|
data/lib/qlive/runner.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
require 'capybara/rspec'
|
2
|
-
require 'headless' # https://github.com/leonid-shevtsov/headless
|
3
2
|
require 'qlive/matchers'
|
4
3
|
require "#{Qlive::Engine.root}/app/helpers/qlive/suites_helper.rb"
|
5
4
|
|
6
|
-
|
7
5
|
module Qlive
|
8
6
|
module Runner
|
9
7
|
|
@@ -16,31 +14,26 @@ module Qlive
|
|
16
14
|
|
17
15
|
# todo: support suite selection by allowing directory and path names, not just suite names. (both absolute and relative to base_path)
|
18
16
|
desired_suites_by_name = args[:suites] || Qlive::Registry.find_suites.keys
|
19
|
-
describe "qlive", :type => :
|
17
|
+
describe "qlive", :type => :feature do
|
20
18
|
before(:all) do
|
21
19
|
Qlive.setup[:before_suites].call if Qlive.setup[:before_suites]
|
22
|
-
|
23
|
-
@headless = ::Headless.new(Qlive.setup[:headless_config])
|
24
|
-
@headless.start
|
25
|
-
end
|
26
|
-
end
|
20
|
+
end
|
27
21
|
|
28
|
-
desired_suites_by_name.
|
22
|
+
desired_suites_by_name.each_with_index do |desired_suite, ndx|
|
29
23
|
suite = resolve_suite(desired_suite)
|
30
24
|
raise "Could not find qlive suite for: #{desired_suite}" unless suite
|
31
|
-
|
25
|
+
|
26
|
+
describe "suite ##{ndx + 1} '#{suite.suite_name}'" do
|
32
27
|
extend Qlive::SuitesHelper
|
33
28
|
|
34
|
-
def visit_qunit_page(
|
29
|
+
def visit_qunit_page(suite, href)
|
35
30
|
using_wait_time(Qlive.setup[:capybara_wait_time]) do # perhaps let individual suites override this value
|
36
|
-
Qlive.logger.info "Qlive sending capybara to run '#{suite_name}' on #{href}"
|
31
|
+
Qlive.logger.info "Qlive sending capybara to run '#{suite.suite_name}' on #{href}"
|
37
32
|
visit href
|
38
33
|
page.html.should_not be_nil
|
39
|
-
page.
|
40
|
-
page.evaluate_script('!!window.qunitComplete')
|
41
|
-
end
|
34
|
+
page.find("#qlive-complete")
|
42
35
|
failure_text = page.evaluate_script("$('li.fail li.fail').text();")
|
43
|
-
page.should pass_qunit_tests(failure_text)
|
36
|
+
page.should pass_qunit_tests(suite, failure_text)
|
44
37
|
end
|
45
38
|
end
|
46
39
|
|
@@ -52,7 +45,7 @@ module Qlive
|
|
52
45
|
|
53
46
|
hrefs_for_suite(suite).each do |href|
|
54
47
|
it "should pass qunit tests when visiting: #{href}" do
|
55
|
-
visit_qunit_page(suite
|
48
|
+
visit_qunit_page(suite, href)
|
56
49
|
end
|
57
50
|
end
|
58
51
|
|
@@ -64,17 +57,11 @@ module Qlive
|
|
64
57
|
|
65
58
|
after(:all) do
|
66
59
|
Qlive.setup[:after_suites].call if Qlive.setup[:after_suites]
|
67
|
-
if @headless
|
68
|
-
puts "\nGetting rough with headless webkit_server. In the event of a fatal IO error, use your judgement regarding calling the police."
|
69
|
-
@headless.destroy
|
70
|
-
end
|
71
60
|
end
|
72
|
-
|
73
61
|
end
|
74
62
|
end
|
75
63
|
|
76
64
|
def resolve_suite(desired_suite)
|
77
|
-
#todo: if it ends in .rb, check for the file, and use the path to get the suite
|
78
65
|
Qlive::Registry.build_suite(desired_suite)
|
79
66
|
end
|
80
67
|
end
|
data/lib/qlive-rspec/version.rb
CHANGED
data/lib/qlive-rspec.rb
CHANGED
@@ -3,10 +3,5 @@ require "qlive/runner"
|
|
3
3
|
|
4
4
|
|
5
5
|
module QliveRspec
|
6
|
-
Qlive.setup[:start_xvfb] = true unless Qlive.setup.has_key?(:start_xvfb)
|
7
|
-
Qlive.setup[:headless_config] = {
|
8
|
-
:display => 99
|
9
|
-
# :destroy_at_exit => true, :reuse => false
|
10
|
-
}
|
11
6
|
Qlive.setup[:capybara_wait_time] = 30
|
12
7
|
end
|
data/qlive-rspec.gemspec
CHANGED
@@ -15,9 +15,9 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = QliveRspec::VERSION
|
17
17
|
|
18
|
-
gem.add_dependency "qlive-rails", "~> 0.
|
19
|
-
gem.add_dependency "rspec-rails", "~> 2.
|
20
|
-
gem.add_dependency "
|
21
|
-
gem.add_development_dependency "rspec-rails", "~> 2.
|
18
|
+
gem.add_dependency "qlive-rails", "~> 0.4.0"
|
19
|
+
gem.add_dependency "rspec-rails", "~> 2.11"
|
20
|
+
gem.add_dependency "poltergeist", "~> 1.1"
|
21
|
+
gem.add_development_dependency "rspec-rails", "~> 2.11"
|
22
22
|
gem.add_development_dependency "factory_girl_rails", "~> 3.5"
|
23
23
|
end
|
data/spec/dummy/Gemfile
CHANGED
@@ -1,31 +1,30 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
gem 'rails', '
|
4
|
-
gem 'sqlite3'
|
5
|
-
gem 'haml-rails'
|
3
|
+
gem 'rails', '3.2.12'
|
4
|
+
gem 'sqlite3', '1.3.7'
|
5
|
+
gem 'haml-rails', '0.3.4'
|
6
6
|
|
7
7
|
group :assets do
|
8
|
-
gem 'sass-rails',
|
9
|
-
gem 'coffee-rails', '
|
10
|
-
gem 'uglifier', '
|
8
|
+
gem 'sass-rails', '3.2.5'
|
9
|
+
gem 'coffee-rails', '3.2.2'
|
10
|
+
gem 'uglifier', '1.0.3'
|
11
11
|
end
|
12
12
|
|
13
|
-
gem 'jquery-rails'
|
14
|
-
gem 'backbone-on-rails'
|
13
|
+
gem 'jquery-rails', '2.0.2'
|
14
|
+
gem 'backbone-on-rails', '0.9.2.1'
|
15
15
|
|
16
16
|
group :development do
|
17
17
|
end
|
18
18
|
|
19
|
+
qlive_gems_path = File.expand_path('../../../..', __FILE__)
|
20
|
+
|
19
21
|
group :test, :development do
|
20
22
|
gem 'factory_girl_rails', '3.5.0'
|
21
|
-
gem 'qlive
|
22
|
-
|
23
|
+
gem 'qlive', :path => "#{qlive_gems_path}/qlive"
|
24
|
+
gem 'qlive-rails', :path => "#{qlive_gems_path}/qlive-rails", :require => 'qlive/engine'
|
23
25
|
end
|
24
26
|
|
25
27
|
group :test do
|
26
|
-
gem 'rspec-rails', '
|
27
|
-
gem '
|
28
|
-
gem 'headless', '~> 0.2'
|
29
|
-
gem 'qlive', :path => "#{ENV['PROXV_REPOS']}/qlive/gems/qlive" # tmp - del
|
30
|
-
gem 'qlive-rspec', :path => File.expand_path('../../..', __FILE__)
|
28
|
+
gem 'rspec-rails', '2.11.0'
|
29
|
+
gem 'poltergeist', '1.1.0'
|
31
30
|
end
|
data/spec/dummy/README.md
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
module AddingTodos
|
2
|
+
class ShortListQlive
|
3
|
+
include Qlive::Suite
|
4
|
+
|
5
|
+
def pages_to_test
|
6
|
+
[ '/#colors/blue', '/#colors/brown' ]
|
7
|
+
end
|
8
|
+
|
9
|
+
def before_each_suite(rack_request)
|
10
|
+
Todo.destroy(Todo.all.map(&:id))
|
11
|
+
4.times { FactoryGirl.create(:todo) }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -2,7 +2,7 @@ $(document).ready(function() {
|
|
2
2
|
module("test-ajax-creation.js");
|
3
3
|
|
4
4
|
asyncTest("create new todo item", 2, function() {
|
5
|
-
waitFor('items load', function() {
|
5
|
+
waitFor('items to load', function() {
|
6
6
|
return $('#todo-list li').length > 3;
|
7
7
|
}).then(function() {
|
8
8
|
var startCount = $('#todo-list li').length;
|
@@ -1,4 +1,4 @@
|
|
1
|
-
var DEFAULT_MAX_DURATION =
|
1
|
+
var DEFAULT_MAX_DURATION = 8000;
|
2
2
|
|
3
3
|
window.waitFor = function(title, checkFn, opts) {
|
4
4
|
var qunitCurrent = QUnit.config.current; // something is clearing this. Not yet sure why.
|
@@ -43,4 +43,5 @@ function failQunit(msg) {
|
|
43
43
|
ok(false, msg);
|
44
44
|
start();
|
45
45
|
window.qunitComplete = true;
|
46
|
+
window.endQlive && window.endQlive();
|
46
47
|
}
|
data/spec/qunits_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -2,6 +2,7 @@ ENV["RAILS_ENV"] = 'test'
|
|
2
2
|
ENV["DUMMY_HOME"] = dummy_home = File.expand_path("../dummy", __FILE__)
|
3
3
|
require File.expand_path("#{dummy_home}/config/environment.rb", __FILE__)
|
4
4
|
require 'rspec/rails'
|
5
|
+
require 'capybara/poltergeist'
|
5
6
|
|
6
7
|
Dir["#{dummy_home}/spec/spec_support/**/*.rb"].each {|f| require f} # I don't care about Windows
|
7
8
|
|
@@ -9,5 +10,5 @@ RSpec.configure do |config|
|
|
9
10
|
config.use_transactional_fixtures = false
|
10
11
|
end
|
11
12
|
|
12
|
-
Capybara.default_driver = :
|
13
|
+
Capybara.default_driver = :poltergeist
|
13
14
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qlive-rspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,55 +9,75 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-03-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: qlive-rails
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0.
|
21
|
+
version: 0.4.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.4.0
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: rspec-rails
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ~>
|
31
36
|
- !ruby/object:Gem::Version
|
32
|
-
version: '2.
|
37
|
+
version: '2.11'
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '2.11'
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
38
|
-
requirement:
|
47
|
+
name: poltergeist
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ~>
|
42
52
|
- !ruby/object:Gem::Version
|
43
|
-
version: '
|
53
|
+
version: '1.1'
|
44
54
|
type: :runtime
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.1'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: rspec-rails
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ~>
|
53
68
|
- !ruby/object:Gem::Version
|
54
|
-
version: '2.
|
69
|
+
version: '2.11'
|
55
70
|
type: :development
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '2.11'
|
58
78
|
- !ruby/object:Gem::Dependency
|
59
79
|
name: factory_girl_rails
|
60
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
61
81
|
none: false
|
62
82
|
requirements:
|
63
83
|
- - ~>
|
@@ -65,7 +85,12 @@ dependencies:
|
|
65
85
|
version: '3.5'
|
66
86
|
type: :development
|
67
87
|
prerelease: false
|
68
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '3.5'
|
69
94
|
description: Run qlive-rails qunit javascript tests headlessly alongside your normal
|
70
95
|
rspec integration examples
|
71
96
|
email:
|
@@ -145,7 +170,8 @@ files:
|
|
145
170
|
- spec/dummy/script/test
|
146
171
|
- spec/dummy/spec/factories/todo_lists.rb
|
147
172
|
- spec/dummy/spec/factories/todos.rb
|
148
|
-
- spec/dummy/spec/qunits/adding_todos/
|
173
|
+
- spec/dummy/spec/qunits/adding_todos/long_list_qlive.rb
|
174
|
+
- spec/dummy/spec/qunits/adding_todos/short_list_qlive.rb
|
149
175
|
- spec/dummy/spec/qunits/adding_todos/test-ajax-creation.js
|
150
176
|
- spec/dummy/spec/qunits/qunit_support/qunit-logger.js
|
151
177
|
- spec/dummy/spec/qunits/qunit_support/qunit-starter.js
|
@@ -177,7 +203,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
177
203
|
version: '0'
|
178
204
|
requirements: []
|
179
205
|
rubyforge_project:
|
180
|
-
rubygems_version: 1.8.
|
206
|
+
rubygems_version: 1.8.25
|
181
207
|
signing_key:
|
182
208
|
specification_version: 3
|
183
209
|
summary: Run qlive-rails qunit javascript tests headlessly alongside your normal rspec
|
@@ -243,7 +269,8 @@ test_files:
|
|
243
269
|
- spec/dummy/script/test
|
244
270
|
- spec/dummy/spec/factories/todo_lists.rb
|
245
271
|
- spec/dummy/spec/factories/todos.rb
|
246
|
-
- spec/dummy/spec/qunits/adding_todos/
|
272
|
+
- spec/dummy/spec/qunits/adding_todos/long_list_qlive.rb
|
273
|
+
- spec/dummy/spec/qunits/adding_todos/short_list_qlive.rb
|
247
274
|
- spec/dummy/spec/qunits/adding_todos/test-ajax-creation.js
|
248
275
|
- spec/dummy/spec/qunits/qunit_support/qunit-logger.js
|
249
276
|
- spec/dummy/spec/qunits/qunit_support/qunit-starter.js
|