capybara-jasmine 0.1.1
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.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/README.md +47 -0
- data/capybara-jasmine.gemspec +21 -0
- data/lib/app/builder.rb +14 -0
- data/lib/app/init.rb +8 -0
- data/lib/app/spec_injector.rb +64 -0
- data/lib/capybara-jasmine.rb +3 -0
- data/lib/shared/helpers.rb +105 -0
- data/lib/shared/matchers.rb +9 -0
- metadata +164 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d329c6afd030f3b24a86c22282f2638c4f500ad9
|
4
|
+
data.tar.gz: a3073f19a000cb39244a65bed05597f56904ae06
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2a2c46648589239195cecae10fb20ed356d9aba19f1f27c768e6743d912f84fdcaf99736a7abbbdb5443fc7ea82c79788551e297ecb10ebcd3f56e65ce5818fd
|
7
|
+
data.tar.gz: 193c05ce450da03bd757f6ecd6467171811cc8ceef3de66bdaab14cf28154cc51abc7ce27a389e29af4d31552e4bc952e3e7a5973f12e4638c4f09f2f8b26824
|
data/.gitignore
ADDED
data/README.md
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# Capybara-Jasmine
|
2
|
+
|
3
|
+
This gem uses Capybara to run Jasmine specs. Request a page once, run many JS specs. Works with RSpec and [Jasmine AJAX](https://github.com/jasmine/jasmine-ajax).
|
4
|
+
|
5
|
+
##Why?
|
6
|
+
Capybara is a powerful tool, but I find it very tedious and slow, especially for JS testing. This is mostly due to the fact that loading a page for each spec is very time consuming.
|
7
|
+
|
8
|
+
Being able to write Jasmine specs and run them with the RSpec suite is flexible and fast: write Capybara specs for simple things, but Jasmine is perfect for JS unit tests, on-page JS functionality and AJAX requests.
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
1. Add to your Gemfile:`gem 'capybara-jasmine'`
|
12
|
+
2. Add to the bottom of your spec helper:
|
13
|
+
`require './spec/jasmine/jasmine_helper'
|
14
|
+
`
|
15
|
+
3. Create a jasmine folder within spec folder.
|
16
|
+
2. Create a `jasmine_helper.rb` in the jasmine folder. See Capybara-Jasmine Demo App for inspiration.
|
17
|
+
2. Create a features folder and put an RSpec spec in it.
|
18
|
+
2. Create a js folder and put your JS specs in it.
|
19
|
+
1. Capybara-Jasmine is a Rack app that will call your app. Name your app "app" or allow it to respond to "app".
|
20
|
+
|
21
|
+
## How it Works
|
22
|
+
Each Jasmine spec file must be selected within the RSpec spec:
|
23
|
+
|
24
|
+
specify 'Index Page' do
|
25
|
+
run_specs 'IndexPageSpec'
|
26
|
+
visit '/'
|
27
|
+
|
28
|
+
In this example, we will load the index page run the JS specs `IndexPageSpecs` against it.
|
29
|
+
|
30
|
+
You can specify multiple Jasmine spec files on one Capybara visit:
|
31
|
+
|
32
|
+
run_specs 'IndexPageSpec, NavigationSpec'
|
33
|
+
visit '/'
|
34
|
+
|
35
|
+
Capybara-Jasmine uses with RSpec and WebKit.
|
36
|
+
|
37
|
+
**JS helpers:**
|
38
|
+
|
39
|
+
1. Fill in a form field. Takes a finder and a value:
|
40
|
+
`fillIn( '#emailField', 'joe@example.com' )`
|
41
|
+
|
42
|
+
1. Click Submit:
|
43
|
+
`clickSubmit()`
|
44
|
+
|
45
|
+
1. Click link or button. Takes a finder:
|
46
|
+
`Click('#logo');`
|
47
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'capybara-jasmine'
|
3
|
+
s.version = '0.1.1'
|
4
|
+
s.date = '2015-05-03'
|
5
|
+
s.summary = 'Run Jasmine specs with Capybara.'
|
6
|
+
s.description = 'This gem allows you to run Jasmine specs with Capybara for a Rack app.'
|
7
|
+
s.authors = ['George Ulmer']
|
8
|
+
s.email = 'george@boost-media.com'
|
9
|
+
s.files = `git ls-files`.split($/)
|
10
|
+
s.homepage = 'http://rubygems.org/gems/capybara-jasmine'
|
11
|
+
s.license = 'MIT'
|
12
|
+
|
13
|
+
s.add_dependency 'rack', ['1.6.0']
|
14
|
+
s.add_dependency 'rspec', ['3.2']
|
15
|
+
s.add_dependency 'rack-test', ['0.6.3']
|
16
|
+
s.add_dependency 'guard', ['2.12']
|
17
|
+
s.add_dependency 'capybara', ['2.4.4']
|
18
|
+
s.add_dependency 'capybara-webkit', ['1.5.0']
|
19
|
+
s.add_dependency 'selenium-webdriver', ['2.45.0']
|
20
|
+
s.add_dependency 'awesome_print', ['1.6.1']
|
21
|
+
end
|
data/lib/app/builder.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
def capybara_app
|
2
|
+
Rack::Builder.new do
|
3
|
+
use SpecInjector
|
4
|
+
use Rack::Static, urls:[ '/jasmine' ], root:'spec'
|
5
|
+
use Rack::Static, urls:[ '/capybara-jasmine-files' ], root:gem_dir
|
6
|
+
|
7
|
+
run app
|
8
|
+
end.to_app
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
def gem_dir
|
13
|
+
File.join(File.dirname(File.expand_path(__FILE__)), '../../lib')
|
14
|
+
end
|
data/lib/app/init.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
class SpecInjector
|
2
|
+
def initialize app
|
3
|
+
@app = app
|
4
|
+
end
|
5
|
+
|
6
|
+
def call env
|
7
|
+
@env = env
|
8
|
+
|
9
|
+
status, headers, response = @app.call( env )
|
10
|
+
|
11
|
+
if status != 200
|
12
|
+
puts red( "capybara-jasmine HTTP request error: #{ status } #{ env[ 'PATH_INFO' ] }")
|
13
|
+
else
|
14
|
+
# puts green( "capybara-jasmine HTTP request success: #{ status } #{ env[ 'PATH_INFO' ] }")
|
15
|
+
end
|
16
|
+
|
17
|
+
if headers[ 'Content-Type' ] && headers[ 'Content-Type' ].include?( 'text/html' )
|
18
|
+
body = body_for( response )
|
19
|
+
|
20
|
+
headers[ 'Content-Length' ] = body.length.to_s
|
21
|
+
|
22
|
+
[ status, headers, [ body ]]
|
23
|
+
else
|
24
|
+
[ status, headers, response ]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def specs
|
29
|
+
return [] if @env[ 'HTTP_X_SPECS' ].nil?
|
30
|
+
|
31
|
+
@env[ 'HTTP_X_SPECS' ].split( ',' ).map( &:strip )
|
32
|
+
end
|
33
|
+
|
34
|
+
def body_for response
|
35
|
+
body = ''
|
36
|
+
|
37
|
+
response.each{| p | body += p.gsub( '<head>', "<head>#{ jasmine_requires }#{ header_specs }" )}
|
38
|
+
|
39
|
+
body
|
40
|
+
end
|
41
|
+
|
42
|
+
def header_specs
|
43
|
+
"\n" + specs.map do |spec|
|
44
|
+
"<script src='/jasmine/js/#{ spec }.js'></script>"
|
45
|
+
end.join( "\n" ) + "\n"
|
46
|
+
end
|
47
|
+
|
48
|
+
def jasmine_requires_files
|
49
|
+
[
|
50
|
+
'vendor/jquery.2.1.3.min.js',
|
51
|
+
'jasmine_lib/jasmine.js' ,
|
52
|
+
'jasmine_lib/jasmine-html.js',
|
53
|
+
'jasmine_lib/boot.js',
|
54
|
+
'jasmine_lib/mock-ajax.js',
|
55
|
+
'js/SharedHelpers.js'
|
56
|
+
]
|
57
|
+
end
|
58
|
+
|
59
|
+
def jasmine_requires
|
60
|
+
"\n" + jasmine_requires_files.map do |f|
|
61
|
+
"<script src='/capybara-jasmine-files/#{ f }'></script>"
|
62
|
+
end.join( "\n" )
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
def run_specs specs
|
2
|
+
page.driver.header 'Content-Type', 'text/html'
|
3
|
+
page.driver.header 'X-Specs', specs
|
4
|
+
end
|
5
|
+
|
6
|
+
def display_js_errors
|
7
|
+
return unless Capybara.current_driver.match /webkit/
|
8
|
+
|
9
|
+
if page.driver.error_messages.any?
|
10
|
+
puts red 'Javascript errors:'
|
11
|
+
else
|
12
|
+
puts cyan 'No Javascript errors.'
|
13
|
+
end
|
14
|
+
|
15
|
+
page.driver.error_messages.each do |m|
|
16
|
+
puts red( " #{ filename_for m[ :source ]}: Line #{ m[ :line_number ]}: #{ m[ :message ]}" )
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def filename_for url
|
21
|
+
url.gsub /https?:\/\/.*?\//, ''
|
22
|
+
end
|
23
|
+
|
24
|
+
def display_js_console
|
25
|
+
return unless Capybara.current_driver == :webkit
|
26
|
+
|
27
|
+
if page.driver.console_messages.any?
|
28
|
+
puts magenta( "Javascript console:")
|
29
|
+
end
|
30
|
+
|
31
|
+
page.driver.console_messages.each do |m|
|
32
|
+
puts magenta( " #{ filename_for m[ :source ]}: Line #{ m[ :line_number ]}: #{ m[ :message ]}" )
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def display_jasmine_specs
|
37
|
+
puts cyan( jasmine_suites )
|
38
|
+
color_print jasmine_result
|
39
|
+
end
|
40
|
+
|
41
|
+
def jasmine_result
|
42
|
+
result = js_html.match( /\d+\s+specs?,\s+\d+\s+failures?/ ).to_s
|
43
|
+
|
44
|
+
if result.match /,\s+0 failure/
|
45
|
+
"Jasmine Success: #{ result }"
|
46
|
+
else
|
47
|
+
"Jasmine Failure: #{ result }\n" + jasmine_failures
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def jasmine_failures
|
52
|
+
html_doc = Nokogiri::HTML( js_html )
|
53
|
+
html_doc.css( 'div .result-message' )
|
54
|
+
.map{|div| " #{ div.text }"}
|
55
|
+
.join( "\n" )
|
56
|
+
end
|
57
|
+
|
58
|
+
def jasmine_suites
|
59
|
+
html_doc = Nokogiri::HTML( js_html )
|
60
|
+
html_doc.css( 'div .suite' ).map do | suite |
|
61
|
+
suite.at_css( '.suite-detail' ).text +
|
62
|
+
suite.css( 'ul.specs' ).map{| spec | "\n #{ spec.text }"}.join
|
63
|
+
end.join
|
64
|
+
end
|
65
|
+
|
66
|
+
def js_html
|
67
|
+
page.evaluate_script( 'document.documentElement.outerHTML' )
|
68
|
+
end
|
69
|
+
|
70
|
+
def color_print text
|
71
|
+
unless text.match /failure/
|
72
|
+
puts red( "Jasmine specs failed to run for #{ self.inspect }." )
|
73
|
+
return
|
74
|
+
end
|
75
|
+
|
76
|
+
if text.match /,\s+0 failures/
|
77
|
+
puts cyan( text )
|
78
|
+
else
|
79
|
+
puts red( text )
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def colorize color_code, text
|
84
|
+
"\e[#{color_code}m#{text}\e[0m"
|
85
|
+
end
|
86
|
+
|
87
|
+
def red text
|
88
|
+
colorize 31, text
|
89
|
+
end
|
90
|
+
|
91
|
+
def green text
|
92
|
+
colorize 32, text
|
93
|
+
end
|
94
|
+
|
95
|
+
def blue text
|
96
|
+
colorize 34, text
|
97
|
+
end
|
98
|
+
|
99
|
+
def magenta text
|
100
|
+
colorize 35, text
|
101
|
+
end
|
102
|
+
|
103
|
+
def cyan text
|
104
|
+
colorize 36, text
|
105
|
+
end
|
metadata
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: capybara-jasmine
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- George Ulmer
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-05-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rack
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.6.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.6.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rack-test
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.6.3
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.6.3
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: guard
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.12'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '2.12'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: capybara
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 2.4.4
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 2.4.4
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: capybara-webkit
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 1.5.0
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 1.5.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: selenium-webdriver
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 2.45.0
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 2.45.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: awesome_print
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 1.6.1
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 1.6.1
|
125
|
+
description: This gem allows you to run Jasmine specs with Capybara for a Rack app.
|
126
|
+
email: george@boost-media.com
|
127
|
+
executables: []
|
128
|
+
extensions: []
|
129
|
+
extra_rdoc_files: []
|
130
|
+
files:
|
131
|
+
- ".gitignore"
|
132
|
+
- README.md
|
133
|
+
- capybara-jasmine.gemspec
|
134
|
+
- lib/app/builder.rb
|
135
|
+
- lib/app/init.rb
|
136
|
+
- lib/app/spec_injector.rb
|
137
|
+
- lib/capybara-jasmine.rb
|
138
|
+
- lib/shared/helpers.rb
|
139
|
+
- lib/shared/matchers.rb
|
140
|
+
homepage: http://rubygems.org/gems/capybara-jasmine
|
141
|
+
licenses:
|
142
|
+
- MIT
|
143
|
+
metadata: {}
|
144
|
+
post_install_message:
|
145
|
+
rdoc_options: []
|
146
|
+
require_paths:
|
147
|
+
- lib
|
148
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
154
|
+
requirements:
|
155
|
+
- - ">="
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
158
|
+
requirements: []
|
159
|
+
rubyforge_project:
|
160
|
+
rubygems_version: 2.4.5
|
161
|
+
signing_key:
|
162
|
+
specification_version: 4
|
163
|
+
summary: Run Jasmine specs with Capybara.
|
164
|
+
test_files: []
|