qlive-rspec 0.1.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/.gitignore +9 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +77 -0
- data/Rakefile +2 -0
- data/lib/qlive-rspec.rb +12 -0
- data/lib/qlive-rspec/version.rb +3 -0
- data/lib/qlive/matchers.rb +28 -0
- data/lib/qlive/rspec.rb +74 -0
- data/qlive-rspec.gemspec +24 -0
- data/spec/dummy/Gemfile +29 -0
- data/spec/dummy/README.md +19 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/images/rails.png +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +25 -0
- data/spec/dummy/app/assets/javascripts/backbone_on_rails_todo.js.coffee +11 -0
- data/spec/dummy/app/assets/javascripts/collections/todos.js.coffee +5 -0
- data/spec/dummy/app/assets/javascripts/models/todo.js.coffee +3 -0
- data/spec/dummy/app/assets/javascripts/routers/todo_app_router.js.coffee +14 -0
- data/spec/dummy/app/assets/javascripts/views/todo_app/todo_app.js.coffee +29 -0
- data/spec/dummy/app/assets/javascripts/views/todos/todo.js.coffee +12 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/assets/stylesheets/todos.scss +45 -0
- data/spec/dummy/app/assets/templates/todo_list/index.jst.eco +11 -0
- data/spec/dummy/app/assets/templates/todos/index.jst.eco +1 -0
- data/spec/dummy/app/controllers/application_controller.rb +10 -0
- data/spec/dummy/app/controllers/todo_list_controller.rb +11 -0
- data/spec/dummy/app/controllers/todos_controller.rb +18 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/helpers/todos_helper.rb +2 -0
- data/spec/dummy/app/mailers/.gitkeep +0 -0
- data/spec/dummy/app/models/todo.rb +12 -0
- data/spec/dummy/app/models/todo_list.rb +9 -0
- data/spec/dummy/app/views/layouts/application.html.erb +19 -0
- data/spec/dummy/app/views/todo_list/index.html.erb +11 -0
- data/spec/dummy/app/views/todos/create.html.erb +2 -0
- data/spec/dummy/app/views/todos/index.html.erb +2 -0
- data/spec/dummy/app/views/todos/new.html.erb +2 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +59 -0
- data/spec/dummy/config/boot.rb +6 -0
- data/spec/dummy/config/database.yml +20 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +67 -0
- data/spec/dummy/config/environments/test.rb +37 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +15 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20120317122010_create_todos.rb +14 -0
- data/spec/dummy/db/schema.rb +29 -0
- data/spec/dummy/db/seeds.rb +7 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/doc/README_FOR_APP +2 -0
- data/spec/dummy/lib/assets/.gitkeep +0 -0
- data/spec/dummy/lib/tasks/.gitkeep +0 -0
- data/spec/dummy/log/.gitkeep +0 -0
- data/spec/dummy/log/development.log +7086 -0
- data/spec/dummy/log/test.log +460 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/public/robots.txt +5 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/dummy/script/test +1 -0
- data/spec/dummy/spec/factories/todo_lists.rb +7 -0
- data/spec/dummy/spec/factories/todos.rb +14 -0
- data/spec/dummy/spec/qunits/.DS_Store +0 -0
- data/spec/dummy/spec/qunits/adding_todos/adding_todos_qlive.rb +13 -0
- data/spec/dummy/spec/qunits/adding_todos/ajax-creation.js +18 -0
- data/spec/dummy/spec/qunits/qunit_support/qlive_helper.rb +0 -0
- data/spec/dummy/spec/qunits/qunit_support/qunit-starter.js +6 -0
- data/spec/dummy/spec/qunits/qunit_support/wait-for.js +24 -0
- data/spec/dummy/tmp/cache/assets/C5B/9C0/sprockets%2Faa69c6a6967552862782c17a264616f0 +0 -0
- data/spec/dummy/tmp/cache/assets/C85/B80/sprockets%2F98af874023c7cc2924ae87e605711532 +0 -0
- data/spec/dummy/tmp/cache/assets/C9A/C40/sprockets%2F729f761526e6c21ed96511f7277fe982 +0 -0
- data/spec/dummy/tmp/cache/assets/C9F/9A0/sprockets%2F1db451c19d955625f00aa51437df3152 +0 -0
- data/spec/dummy/tmp/cache/assets/CA5/800/sprockets%2F353700484461b1229e7cfb7b7c0ce640 +0 -0
- data/spec/dummy/tmp/cache/assets/CAB/1F0/sprockets%2F5bc32b49750b54325270c34377ede81e +0 -0
- data/spec/dummy/tmp/cache/assets/CAF/6B0/sprockets%2F2b7b92f831e2b43c590ca91b62708395 +0 -0
- data/spec/dummy/tmp/cache/assets/CBB/2E0/sprockets%2F9f57f2f115170a931f96bdb689312b94 +0 -0
- data/spec/dummy/tmp/cache/assets/CC1/EC0/sprockets%2Fe6256cd8969bf71b9e18729e631072a2 +0 -0
- data/spec/dummy/tmp/cache/assets/CD4/C30/sprockets%2Fd166012e1da02d12697c2ee0f574f690 +0 -0
- data/spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/CDC/F50/sprockets%2F614a5858458b9422d8e266fbaa6310ab +0 -0
- data/spec/dummy/tmp/cache/assets/CDF/CB0/sprockets%2Fd6f984ec9cf105b484172a66c00f0561 +0 -0
- data/spec/dummy/tmp/cache/assets/CFF/170/sprockets%2F4af4a5f916847c198f92a79e8f04287f +0 -0
- data/spec/dummy/tmp/cache/assets/D0D/830/sprockets%2F15213ba08baca38d909585e736bb9f44 +0 -0
- data/spec/dummy/tmp/cache/assets/D10/F10/sprockets%2F349a7d73940a1643fb3de693ca7cd244 +0 -0
- data/spec/dummy/tmp/cache/assets/D11/2F0/sprockets%2F36fc2e765d9cc09c50c0e55b1933a737 +0 -0
- data/spec/dummy/tmp/cache/assets/D26/620/sprockets%2F6926777d652a664ceb5aa28666efa7c9 +0 -0
- data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/D3E/F10/sprockets%2F75dd8ecd20427d22139517ae9f25ee2a +0 -0
- data/spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/dummy/tmp/cache/assets/D4E/F70/sprockets%2Fcf5cf57efa2c53a409b80285278e5f77 +0 -0
- data/spec/dummy/tmp/cache/assets/D52/090/sprockets%2F826a9bb15e4093dd94d248d9f90f9ed2 +0 -0
- data/spec/dummy/tmp/cache/assets/D53/7D0/sprockets%2F43c0246147f6192dfffbf8f68d793a6e +0 -0
- data/spec/dummy/tmp/cache/assets/D53/E30/sprockets%2Fffde997b0d35826e3175caa159968dc4 +0 -0
- data/spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/D5B/1B0/sprockets%2F36c7e9792a69fd67c686a16e382b5ffa +0 -0
- data/spec/dummy/tmp/cache/assets/D68/7D0/sprockets%2Fde9b9f45d0b5fa19cf672371102a1f0f +0 -0
- data/spec/dummy/tmp/cache/assets/D6F/C80/sprockets%2F69d138071bef8c9a34324bfdf2fd530d +0 -0
- data/spec/dummy/tmp/cache/assets/D71/020/sprockets%2Fe303c90d58293dcd7eb29d633c9cb54a +0 -0
- data/spec/dummy/tmp/cache/assets/D76/C40/sprockets%2F5dc3f2334568fee3c23c086463fefa8c +0 -0
- data/spec/dummy/tmp/cache/assets/D82/AD0/sprockets%2F042cc68bc2ce132b356c704abfaf107a +0 -0
- data/spec/dummy/tmp/cache/assets/D89/0B0/sprockets%2F7c8dc9875c0c22e89fdc595cdd9605f2 +0 -0
- data/spec/dummy/tmp/cache/assets/D8E/A00/sprockets%2Ff89d78b78be9a45cf7e944a57c82b26c +0 -0
- data/spec/dummy/tmp/cache/assets/D90/690/sprockets%2Fce78782d3fc61622015a80c2acc6cdba +0 -0
- data/spec/dummy/tmp/cache/assets/D99/330/sprockets%2Fe2a2a8724fee0fb701e358ee266cda62 +0 -0
- data/spec/dummy/tmp/cache/assets/D99/B80/sprockets%2Fc608b81fe3a10ffee85e0b63e9ca9201 +0 -0
- data/spec/dummy/tmp/cache/assets/DB0/B80/sprockets%2F96f6192adc54bf98a98d6fa190ebb74b +0 -0
- data/spec/dummy/tmp/cache/assets/DC6/AD0/sprockets%2Fcfcccca451e28002deb96721d94e25ce +0 -0
- data/spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/DE6/CE0/sprockets%2F6fda7e975c6df54bffda6598f431e5d1 +0 -0
- data/spec/dummy/tmp/cache/assets/DFD/350/sprockets%2Fdbea6b4a1f0b88258c29c6836bcca6ed +0 -0
- data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/E39/3B0/sprockets%2F9ae1c4c883d1dd6fc84cdbf1ff55d44f +0 -0
- data/spec/dummy/tmp/cache/sass/3a7aef2f892362e6596155ab72cedacbd9a1a7ed/todos.scssc +0 -0
- data/spec/dummy/tmp/cache/sass/3ac4a8f3985b4a79a98fc03388b5ded5e9bdc4aa/todos.scssc +0 -0
- data/spec/dummy/vendor/assets/javascripts/.gitkeep +0 -0
- data/spec/dummy/vendor/assets/stylesheets/.gitkeep +0 -0
- data/spec/dummy/vendor/plugins/.gitkeep +0 -0
- data/spec/qunits_spec.rb +7 -0
- data/spec/spec_helper.rb +14 -0
- metadata +365 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Copyright (c) 2012 TODO: Write your name
|
|
2
|
+
|
|
3
|
+
MIT License
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Qlive-Rspec
|
|
2
|
+
|
|
3
|
+
Run qlive-rails qunit javascript tests headlessly alongside your normal rspec integration examples.
|
|
4
|
+
|
|
5
|
+
This builds on the [qlive-rails](https://github.com/proxv/qlive-rails) gem. If you are using Ruby on Rails and rspec,
|
|
6
|
+
this gem will let you run your qlive tests in both a browser and headlessly as an rspec example/test.
|
|
7
|
+
|
|
8
|
+
Qlive-rspec has relatively heavy dependencies: virtual X11 frame buffer, headless webkit, capybara, and rspec.
|
|
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.)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
* Install webkit-qt and xvfb on your system. Eg:
|
|
17
|
+
<pre>sudo aptitude install libqt4-dev xvfb</pre>
|
|
18
|
+
|
|
19
|
+
note: more detailed instructions at [capybara-webkit](https://github.com/thoughtbot/capybara-webkit) and [headless](https://github.com/leonid-shevtsov/headless) gems.
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
* Add qlive-rails and qlive-rspec to your Gemfile as follows:
|
|
23
|
+
|
|
24
|
+
```ruby
|
|
25
|
+
group :test, :development do
|
|
26
|
+
gem 'qlive-rails', :require => 'qlive/engine'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
group :test do
|
|
30
|
+
gem 'qlive-rspec'
|
|
31
|
+
end
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
* As in qlive-rails, mount the engine in routes.rb:
|
|
35
|
+
|
|
36
|
+
```ruby
|
|
37
|
+
if Rails.env == 'development'
|
|
38
|
+
mount Qlive::Engine => '/qlive'
|
|
39
|
+
end
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
## Usage
|
|
46
|
+
|
|
47
|
+
### qunits_spec.rb
|
|
48
|
+
|
|
49
|
+
* After you have your [qlive suites](https://github.com/proxv/qlive/wiki/qlive-suites) working in a browser,
|
|
50
|
+
create ``spec/qunits/qunits_spec.rb``:
|
|
51
|
+
|
|
52
|
+
```ruby
|
|
53
|
+
require "my_spec_helper.rb"
|
|
54
|
+
|
|
55
|
+
describe "qunits" do
|
|
56
|
+
include Qlive::RSpec
|
|
57
|
+
end
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
* It will now run as a normal rspec example:
|
|
62
|
+
<pre>rspec spec/qunits</pre>
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
### Configuration
|
|
66
|
+
|
|
67
|
+
* Optionally run setup/teardown code before and after the qlive tests are run.
|
|
68
|
+
<pre>
|
|
69
|
+
Qlive.setup[:before_suites] lambda { my_setup_code }
|
|
70
|
+
Qlive.setup[:after_suites] lambda { my_teardown_code }
|
|
71
|
+
</pre>
|
|
72
|
+
|
|
73
|
+
* Optionally set xvfb/headless gem to a custom configuration hash with: ``Qlive.setup[:headless_config] = my_settings_hash``
|
|
74
|
+
|
|
75
|
+
* Optionally disable xvfb with ``Qlive.setup[:start_xvfb] = false`` if you plan on configuring it externally
|
|
76
|
+
|
|
77
|
+
* Optionally change per-page timeout in seconds with: ``Qlive.setup[:capybara_wait_time] = 30``
|
data/Rakefile
ADDED
data/lib/qlive-rspec.rb
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require "qlive-rspec/version"
|
|
2
|
+
require "qlive/rspec"
|
|
3
|
+
|
|
4
|
+
|
|
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
|
+
Qlive.setup[:capybara_wait_time] = 30
|
|
12
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module Qlive
|
|
2
|
+
module Matchers
|
|
3
|
+
def self.add_matchers
|
|
4
|
+
::RSpec::Matchers.define :pass_qunit_tests do |failure_text|
|
|
5
|
+
match do |page_actual|
|
|
6
|
+
url = page_actual.current_url
|
|
7
|
+
passed = page_actual.find('#qunit-testresult .passed').text.to_i rescue 0
|
|
8
|
+
failed = page_actual.find('#qunit-testresult .failed').text.to_i rescue 1
|
|
9
|
+
Qlive.logger.info "#{url } passed: #{passed}, failed: #{failed}"
|
|
10
|
+
|
|
11
|
+
failed == 0 && passed > 0
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
failure_message_for_should do |page_actual|
|
|
15
|
+
"qunit failure text: #{failure_text}"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
failure_message_for_should_not do |page_actual|
|
|
19
|
+
"expected qunit test to fail but all passed."
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
description do
|
|
23
|
+
"pass qunit tests"
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
data/lib/qlive/rspec.rb
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
require 'capybara/rspec'
|
|
2
|
+
require 'headless' # https://github.com/leonid-shevtsov/headless
|
|
3
|
+
require 'qlive/matchers'
|
|
4
|
+
require "#{Qlive::Engine.root}/app/helpers/qlive/suites_helper.rb"
|
|
5
|
+
|
|
6
|
+
module Qlive
|
|
7
|
+
module RSpec
|
|
8
|
+
|
|
9
|
+
describe "qlive" do
|
|
10
|
+
Qlive::Matchers.add_matchers
|
|
11
|
+
|
|
12
|
+
it "should define all qlive suites" do
|
|
13
|
+
# nested it/describe hackery explained: Rails.root path is needed before we can programmatically declare
|
|
14
|
+
# qunit examples, but it is not available until the examples start running. This hacky workaround nests the
|
|
15
|
+
# describe examples and example group that we want in another "it" declaration. todo: investigate better rspec integration
|
|
16
|
+
|
|
17
|
+
Qlive.setup[:base_path] ||= "#{Rails.root}/spec/qunits"
|
|
18
|
+
Qlive.setup[:logger] ||= Rails.logger
|
|
19
|
+
Qlive::Registry.find_suites
|
|
20
|
+
|
|
21
|
+
describe "pages", :type => :request do
|
|
22
|
+
extend Qlive::SuitesHelper
|
|
23
|
+
|
|
24
|
+
def visit_qunit_page(suite_name, href)
|
|
25
|
+
using_wait_time(Qlive.setup[:capybara_wait_time]) do # perhaps let suites override this value
|
|
26
|
+
Qlive.logger.info "Qlive sending capybara to run '#{suite_name}' on #{href}"
|
|
27
|
+
visit href
|
|
28
|
+
page.html.should_not be_nil
|
|
29
|
+
page.wait_until(Qlive.setup[:capybara_wait_time]) do # hmmmm
|
|
30
|
+
page.evaluate_script('!!window.qunitComplete')
|
|
31
|
+
end
|
|
32
|
+
failure_text = page.evaluate_script("$('li.fail li.fail').text();")
|
|
33
|
+
page.should pass_qunit_tests(failure_text)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
Qlive::Registry.suites.values.each do |suite_meta|
|
|
38
|
+
load suite_meta[:path]
|
|
39
|
+
suite = Qlive::Registry.build_suite(suite_meta[:name])
|
|
40
|
+
hrefs_for_suite(suite).each do |href|
|
|
41
|
+
it "should pass qunit tests when visiting: #{href}" do
|
|
42
|
+
visit_qunit_page(suite.name, href)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
before(:all) do
|
|
48
|
+
Qlive.setup[:before_suites].call if Qlive.setup[:before_suites]
|
|
49
|
+
if Qlive.setup[:start_xvfb]
|
|
50
|
+
@headless = ::Headless.new(Qlive.setup[:headless_config])
|
|
51
|
+
@headless.start
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
before(:each) do
|
|
56
|
+
page.reset!
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
after(:all) do
|
|
60
|
+
puts "\nGetting rough with headless webkit_server. In the event of a fatal IO error, use your judgement regarding calling the police."
|
|
61
|
+
@headless.destroy if @headless
|
|
62
|
+
if Qlive.setup[:after_suites]
|
|
63
|
+
Qlive.setup[:after_suites].call
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
data/qlive-rspec.gemspec
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
require File.expand_path('../lib/qlive-rspec/version', __FILE__)
|
|
3
|
+
|
|
4
|
+
Gem::Specification.new do |gem|
|
|
5
|
+
gem.authors = ["ProxV"]
|
|
6
|
+
gem.email = ["support@proxv.com"]
|
|
7
|
+
gem.summary = "Run qlive-rails qunit javascript tests headlessly alongside your normal rspec integration examples"
|
|
8
|
+
gem.description = gem.summary
|
|
9
|
+
gem.homepage = "https://github.com/proxv/qlive-rspec/"
|
|
10
|
+
|
|
11
|
+
gem.files = `git ls-files`.split($\)
|
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
|
14
|
+
gem.name = "qlive-rspec"
|
|
15
|
+
gem.require_paths = ["lib"]
|
|
16
|
+
gem.version = QliveRSpec::VERSION
|
|
17
|
+
|
|
18
|
+
gem.add_dependency "qlive-rails", "~> 0.1.2"
|
|
19
|
+
gem.add_dependency "capybara-webkit", "0.10.0"
|
|
20
|
+
gem.add_dependency "rspec-rails", "~> 2.8.1"
|
|
21
|
+
gem.add_dependency "headless", "~> 0.3"
|
|
22
|
+
gem.add_development_dependency "rspec-rails", "~> 2.8.0"
|
|
23
|
+
gem.add_development_dependency "factory_girl_rails", "~> 3.5.0"
|
|
24
|
+
end
|
data/spec/dummy/Gemfile
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
source 'https://rubygems.org'
|
|
2
|
+
|
|
3
|
+
gem 'rails', '~> 3.2.3'
|
|
4
|
+
gem 'sqlite3'
|
|
5
|
+
gem 'haml-rails'
|
|
6
|
+
|
|
7
|
+
group :assets do
|
|
8
|
+
gem 'sass-rails', '~> 3.2.3'
|
|
9
|
+
gem 'coffee-rails', '~> 3.2.1'
|
|
10
|
+
gem 'uglifier', '>= 1.0.3'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
gem 'jquery-rails'
|
|
14
|
+
gem 'backbone-on-rails'
|
|
15
|
+
|
|
16
|
+
group :development do
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
group :test, :development do
|
|
20
|
+
gem 'factory_girl_rails', '3.5.0'
|
|
21
|
+
gem 'qlive-rails', :require => 'qlive/engine' # https://github.com/proxv/qlive
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
group :test do
|
|
25
|
+
gem 'rspec-rails', '~> 2.8.1'
|
|
26
|
+
gem 'capybara-webkit', '0.10.0'
|
|
27
|
+
gem 'headless', '~> 0.2'
|
|
28
|
+
gem 'qlive-rspec', :path => File.expand_path('../../..', __FILE__)
|
|
29
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
|
|
2
|
+
# Dummy App
|
|
3
|
+
|
|
4
|
+
I randomly grabbed a demo app that uses rails and backbone:
|
|
5
|
+
https://github.com/mulderp/Backbone-on-Rails-todoDemo
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
## Run dummy app qlive suites in browser
|
|
9
|
+
```
|
|
10
|
+
cd qlive-rspec/spec/dummy
|
|
11
|
+
rails s
|
|
12
|
+
http://localhost/qlive
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Run dummy app qlive suites headlessly
|
|
16
|
+
```
|
|
17
|
+
rspec spec/qunits
|
|
18
|
+
```
|
|
19
|
+
|
data/spec/dummy/Rakefile
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
#!/usr/bin/env rake
|
|
2
|
+
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
|
3
|
+
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
|
4
|
+
|
|
5
|
+
require File.expand_path('../config/application', __FILE__)
|
|
6
|
+
|
|
7
|
+
BackboneOnRailsTodo::Application.load_tasks
|
|
Binary file
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
|
2
|
+
// listed below.
|
|
3
|
+
//
|
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
|
5
|
+
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
|
|
6
|
+
//
|
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
|
8
|
+
// the compiled file.
|
|
9
|
+
//
|
|
10
|
+
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
|
|
11
|
+
// GO AFTER THE REQUIRES BELOW.
|
|
12
|
+
//
|
|
13
|
+
//= require jquery
|
|
14
|
+
//= require jquery_ujs
|
|
15
|
+
//= require underscore
|
|
16
|
+
//= require backbone
|
|
17
|
+
|
|
18
|
+
//= require backbone_on_rails_todo
|
|
19
|
+
|
|
20
|
+
//= require_tree ../templates
|
|
21
|
+
//= require_tree ./models
|
|
22
|
+
//= require_tree ./collections
|
|
23
|
+
//= require_tree ./views
|
|
24
|
+
//= require_tree ./routers
|
|
25
|
+
//= require_tree .
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
class BackboneOnRailsTodo.Routers.TodoApp extends Backbone.Router
|
|
2
|
+
routes:
|
|
3
|
+
'': 'index'
|
|
4
|
+
'colors/:color': 'index'
|
|
5
|
+
|
|
6
|
+
initialize: ->
|
|
7
|
+
@todos = new BackboneOnRailsTodo.Collections.Todos()
|
|
8
|
+
@todos.fetch()
|
|
9
|
+
|
|
10
|
+
index: (color) ->
|
|
11
|
+
view = new BackboneOnRailsTodo.Views.TodoApp({collection: @todos})
|
|
12
|
+
$('#todo-list').html(view.render().el)
|
|
13
|
+
$('<style>#todo-list li { color: ' + (color || 'green') + ';}</style>').appendTo('body')
|
|
14
|
+
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
class BackboneOnRailsTodo.Views.TodoApp extends Backbone.View
|
|
2
|
+
|
|
3
|
+
el: $('#todoapp')
|
|
4
|
+
|
|
5
|
+
initialize: ->
|
|
6
|
+
@collection.on('reset', @addAll, this)
|
|
7
|
+
@collection.on('add', this.addOne, this)
|
|
8
|
+
$('#new-todo').on "keypress", {collection: @collection}, @keyTodoInput
|
|
9
|
+
|
|
10
|
+
addAll: ->
|
|
11
|
+
@collection.each(@addOne)
|
|
12
|
+
|
|
13
|
+
addOne: (todo) ->
|
|
14
|
+
console.log(todo)
|
|
15
|
+
view = new BackboneOnRailsTodo.Views.Todo({model: todo})
|
|
16
|
+
$("#todo-list").append(view.render().el)
|
|
17
|
+
|
|
18
|
+
createTodo: (event) ->
|
|
19
|
+
event.preventDefault()
|
|
20
|
+
BackboneOnRailsTodo.Collections.Todos.create content: $('#new-todo-content').val()
|
|
21
|
+
|
|
22
|
+
keyTodoInput: (e) ->
|
|
23
|
+
# console.log(event.type, event.keyCode)
|
|
24
|
+
return if (e.keyCode != 13)
|
|
25
|
+
return if (!this.value)
|
|
26
|
+
console.log(e.data.collection)
|
|
27
|
+
|
|
28
|
+
e.data.collection.create content: this.value
|
|
29
|
+
this.value = ''
|