capybara-jasmine 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,3 @@
1
+ Gemfile.lock
2
+
3
+ capybara-jasmine-*
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
@@ -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,8 @@
1
+ # Gems
2
+ require 'rack'
3
+
4
+ # App
5
+ require_relative 'builder'
6
+ require_relative 'spec_injector'
7
+
8
+ puts "Starting Capybara Jasmine in #{ ENV[ 'RACK_ENV' ]} environment."
@@ -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,3 @@
1
+ require 'app/init'
2
+ require 'shared/helpers'
3
+ require 'shared/matchers'
@@ -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
@@ -0,0 +1,9 @@
1
+ RSpec::Matchers.define :jasmine_success do
2
+ match do |actual|
3
+ ! actual.match /([1-9]|\d{2,}) failures/
4
+ end
5
+
6
+ failure_message do |actual|
7
+ jasmine_result
8
+ end
9
+ 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: []