ndr_dev_support 1.1.3 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +9 -2
- data/README.md +19 -1
- data/Rakefile +2 -0
- data/code_safety.yml +31 -11
- data/lib/ndr_dev_support/integration_testing.rb +4 -0
- data/lib/ndr_dev_support/integration_testing/capybara.rb +3 -0
- data/lib/ndr_dev_support/integration_testing/connection_sharing.rb +28 -0
- data/lib/ndr_dev_support/integration_testing/poltergeist.rb +39 -0
- data/lib/ndr_dev_support/integration_testing/screenshot.rb +51 -0
- data/lib/ndr_dev_support/version.rb +1 -1
- data/lib/tasks/audit_code.rake +8 -6
- data/ndr_dev_support.gemspec +8 -0
- metadata +51 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bbf173d8ddfa7d10cb31833d230906bdcc958ba2
|
4
|
+
data.tar.gz: 02683547d2431fb1fb989fd5be52fdfb798b5224
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ebb19d580b52f1aeaa43ca959e29b617d5236c39336bab47f1170ef48683d36ad6d1f478c0d7fe5deeaf5ab9c72bbead8866e00a6c8f0664867105eaca577879
|
7
|
+
data.tar.gz: 4d9bafe9f324abb580db296b3801fd93c7f814f7420f3f661438280c584701b623ad5131f615a4112f87f09defbc823e2e0312407f134033653e3c451fbff98e
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -11,7 +11,7 @@ providing:
|
|
11
11
|
Add this line to your application's Gemfile:
|
12
12
|
|
13
13
|
```ruby
|
14
|
-
gem 'ndr_dev_support', group: :development
|
14
|
+
gem 'ndr_dev_support', group: [:development, :test]
|
15
15
|
```
|
16
16
|
|
17
17
|
And then execute:
|
@@ -64,6 +64,24 @@ To add development support tasks to your project, add this line to your applicat
|
|
64
64
|
require 'ndr_dev_support/tasks'
|
65
65
|
```
|
66
66
|
|
67
|
+
### Integration test environment
|
68
|
+
|
69
|
+
ndr_dev_support bundles a configured Rails integration testing environment. It uses `capybara` and `poltergeist` to drive a PhantomJS headless browser, and includes all necessary configuration (e.g. connection sharing / transactional test support).
|
70
|
+
|
71
|
+
If an integration test errors or fails, `capybara-screenshot` is used to automatically retrieve a full-height screenshot from PhantomJS, which is then stored in `tmp/`.
|
72
|
+
|
73
|
+
Beyond standard Capybara testing DSL, ndr_dev_support bundles some additional functionality:
|
74
|
+
|
75
|
+
* `clear_headless_session!` - causes PhantomJS to reset, simulating a browser restart.
|
76
|
+
* `delete_all_cookies!` - causes PhantomJS to delete all cookies. Helpful for testing AJAX logouts.
|
77
|
+
* `within_screenshot_compatible_window` – similar to `within_window`, but allows failure screenshots to be taken of the failing child window, rather than the spawning parent.
|
78
|
+
|
79
|
+
To use, ensure `phantomjs` is installed, and add the following to your application's `test_helper.rb`
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
require 'ndr_dev_support/integration_testing'
|
83
|
+
```
|
84
|
+
|
67
85
|
## Development
|
68
86
|
|
69
87
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/Rakefile
CHANGED
data/code_safety.yml
CHANGED
@@ -10,8 +10,8 @@ file safety:
|
|
10
10
|
safe_revision: e1ead45a8d1fd525f3a39cc4a87e6c0338c6b879
|
11
11
|
".travis.yml":
|
12
12
|
comments:
|
13
|
-
reviewed_by:
|
14
|
-
safe_revision:
|
13
|
+
reviewed_by: josh.pencheon
|
14
|
+
safe_revision: 35fa869f068ca3250fee611147e49f40f0147d92
|
15
15
|
CODE_OF_CONDUCT.md:
|
16
16
|
comments:
|
17
17
|
reviewed_by: timgentry
|
@@ -26,12 +26,12 @@ file safety:
|
|
26
26
|
safe_revision: c59a45986f8b6d087c8c21b1e889f31f7346da17
|
27
27
|
README.md:
|
28
28
|
comments:
|
29
|
-
reviewed_by:
|
30
|
-
safe_revision:
|
29
|
+
reviewed_by: josh.pencheon
|
30
|
+
safe_revision: 88ac9269eb8f0b44c5920a946708e4715421bcad
|
31
31
|
Rakefile:
|
32
32
|
comments:
|
33
|
-
reviewed_by:
|
34
|
-
safe_revision:
|
33
|
+
reviewed_by: josh.pencheon
|
34
|
+
safe_revision: a601dbd139132f50eb22b1c88d5eda14a465a7c2
|
35
35
|
bin/console:
|
36
36
|
comments:
|
37
37
|
reviewed_by: timgentry
|
@@ -44,6 +44,26 @@ file safety:
|
|
44
44
|
comments:
|
45
45
|
reviewed_by: timgentry
|
46
46
|
safe_revision: c59a45986f8b6d087c8c21b1e889f31f7346da17
|
47
|
+
lib/ndr_dev_support/integration_testing.rb:
|
48
|
+
comments:
|
49
|
+
reviewed_by: josh.pencheon
|
50
|
+
safe_revision: 88ac9269eb8f0b44c5920a946708e4715421bcad
|
51
|
+
lib/ndr_dev_support/integration_testing/capybara.rb:
|
52
|
+
comments:
|
53
|
+
reviewed_by: josh.pencheon
|
54
|
+
safe_revision: 88ac9269eb8f0b44c5920a946708e4715421bcad
|
55
|
+
lib/ndr_dev_support/integration_testing/connection_sharing.rb:
|
56
|
+
comments:
|
57
|
+
reviewed_by: josh.pencheon
|
58
|
+
safe_revision: 88ac9269eb8f0b44c5920a946708e4715421bcad
|
59
|
+
lib/ndr_dev_support/integration_testing/poltergeist.rb:
|
60
|
+
comments:
|
61
|
+
reviewed_by: josh.pencheon
|
62
|
+
safe_revision: 88ac9269eb8f0b44c5920a946708e4715421bcad
|
63
|
+
lib/ndr_dev_support/integration_testing/screenshot.rb:
|
64
|
+
comments:
|
65
|
+
reviewed_by: josh.pencheon
|
66
|
+
safe_revision: 88ac9269eb8f0b44c5920a946708e4715421bcad
|
47
67
|
lib/ndr_dev_support/rubocop/executor.rb:
|
48
68
|
comments:
|
49
69
|
reviewed_by: josh.pencheon
|
@@ -67,20 +87,20 @@ file safety:
|
|
67
87
|
lib/ndr_dev_support/version.rb:
|
68
88
|
comments:
|
69
89
|
reviewed_by: josh.pencheon
|
70
|
-
safe_revision:
|
90
|
+
safe_revision: cc35bc393f1e6b9eb3a93dfe4fa3a9aa90aacbec
|
71
91
|
lib/tasks/audit_code.rake:
|
72
92
|
comments: Identical to the version reviewed by josh.pencheon when contained within
|
73
93
|
ndr_support
|
74
|
-
reviewed_by:
|
75
|
-
safe_revision:
|
94
|
+
reviewed_by: josh.pencheon
|
95
|
+
safe_revision: de404230921fed06cd1669fe673037f827e44610
|
76
96
|
lib/tasks/rubocop.rake:
|
77
97
|
comments:
|
78
98
|
reviewed_by: josh.pencheon
|
79
99
|
safe_revision: 41cf1558f567928faaa1e670a36d941c03c78044
|
80
100
|
ndr_dev_support.gemspec:
|
81
101
|
comments:
|
82
|
-
reviewed_by:
|
83
|
-
safe_revision:
|
102
|
+
reviewed_by: josh.pencheon
|
103
|
+
safe_revision: 88ac9269eb8f0b44c5920a946708e4715421bcad
|
84
104
|
test/ndr_dev_support_test.rb:
|
85
105
|
comments:
|
86
106
|
reviewed_by: timgentry
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module NdrDevSupport
|
2
|
+
module IntegrationTesting
|
3
|
+
# Capybara starts another rails application in a new thread
|
4
|
+
# to test against. For transactional fixtures to work, we need
|
5
|
+
# to share the database connection between threads.
|
6
|
+
#
|
7
|
+
# Derived from: https://gist.github.com/josevalim/470808
|
8
|
+
#
|
9
|
+
module ConnectionSharing
|
10
|
+
def self.prepended(base)
|
11
|
+
base.mattr_accessor :shared_connection
|
12
|
+
|
13
|
+
# Get a connection, and make it shareable:
|
14
|
+
base.shared_connection = base.connection
|
15
|
+
|
16
|
+
base.singleton_class.prepend(ClassMethods)
|
17
|
+
end
|
18
|
+
|
19
|
+
module ClassMethods
|
20
|
+
def connection
|
21
|
+
shared_connection || retrieve_connection
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
ActiveRecord::Base.prepend(NdrDevSupport::IntegrationTesting::ConnectionSharing)
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'capybara/poltergeist'
|
2
|
+
|
3
|
+
module NdrDevSupport
|
4
|
+
module IntegrationTesting
|
5
|
+
module Poltergeist
|
6
|
+
# Additional testing DSL, for phantomjs-specific interactions.
|
7
|
+
module DSL
|
8
|
+
# Instruct phantomjs to clear its session:
|
9
|
+
def clear_headless_session!
|
10
|
+
page.driver.reset!
|
11
|
+
end
|
12
|
+
|
13
|
+
# Get phantomjs to delete all of the cookies
|
14
|
+
# for the current page without resetting:
|
15
|
+
def delete_all_cookies!
|
16
|
+
page.driver.cookies.each do |name, value|
|
17
|
+
page.driver.remove_cookie(name)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
ActionDispatch::IntegrationTest.include(NdrDevSupport::IntegrationTesting::Poltergeist::DSL)
|
26
|
+
|
27
|
+
# Register poltergeist as an available driver for capybara to use:
|
28
|
+
Capybara.register_driver :poltergeist do |app|
|
29
|
+
options = { phantomjs_options: ['--proxy-type=none'], timeout: 60 }
|
30
|
+
|
31
|
+
# If Ruby warn level is high, switch on additional output.
|
32
|
+
options.merge!(debug: true, inspector: true) if $VERBOSE
|
33
|
+
|
34
|
+
Capybara::Poltergeist::Driver.new(app, options)
|
35
|
+
end
|
36
|
+
|
37
|
+
# ...and make it the default:
|
38
|
+
Capybara.default_driver = :poltergeist
|
39
|
+
Capybara.javascript_driver = :poltergeist
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'capybara-screenshot'
|
2
|
+
|
3
|
+
module NdrDevSupport
|
4
|
+
module IntegrationTesting
|
5
|
+
module Screenshot
|
6
|
+
# Allow integration tests to open screenshotable popup windows.
|
7
|
+
module DSL
|
8
|
+
delegate :within_screenshot_compatible_window, to: :page
|
9
|
+
end
|
10
|
+
|
11
|
+
# Adds variant of Capybara's #within_window method, that doesn't return
|
12
|
+
# to the preview window on an exception. This allows us to screenshot
|
13
|
+
# a popup automatically if a test errors/fails whilst it has focus.
|
14
|
+
module SessionExtensions
|
15
|
+
def within_screenshot_compatible_window(window_or_proc)
|
16
|
+
original = current_window
|
17
|
+
|
18
|
+
case window_or_proc
|
19
|
+
when Capybara::Window
|
20
|
+
switch_to_window(window_or_proc) unless original == window_or_proc
|
21
|
+
when Proc
|
22
|
+
switch_to_window { window_or_proc.call }
|
23
|
+
else
|
24
|
+
fail ArgumentError, 'Unsupported window type!'
|
25
|
+
end
|
26
|
+
|
27
|
+
scopes << nil
|
28
|
+
yield
|
29
|
+
@scopes.pop
|
30
|
+
switch_to_window(original)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
if defined?(MiniTest)
|
38
|
+
require 'capybara-screenshot/minitest'
|
39
|
+
ActionDispatch::IntegrationTest.include(Capybara::Screenshot::MiniTestPlugin)
|
40
|
+
else
|
41
|
+
require 'capybara-screenshot/testunit'
|
42
|
+
end
|
43
|
+
|
44
|
+
Capybara::Session.include(NdrDevSupport::IntegrationTesting::Screenshot::SessionExtensions)
|
45
|
+
ActionDispatch::IntegrationTest.include(NdrDevSupport::IntegrationTesting::Screenshot::DSL)
|
46
|
+
|
47
|
+
# Save screenshots to tmp/capybara/... on integration test error/failure:
|
48
|
+
Capybara::Screenshot.register_driver(:poltergeist) do |driver, path|
|
49
|
+
# Take full-height screenshots, rather than just capturing the viewport:
|
50
|
+
driver.render(path, full: true)
|
51
|
+
end
|
data/lib/tasks/audit_code.rake
CHANGED
@@ -1,17 +1,18 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'yaml'
|
3
|
+
|
1
4
|
SAFETY_FILE =
|
2
5
|
if File.exist?('code_safety.yml')
|
3
|
-
'code_safety.yml'
|
6
|
+
Pathname.new('code_safety.yml').expand_path
|
4
7
|
elsif defined?(Rails)
|
5
8
|
Rails.root.join('config', 'code_safety.yml')
|
6
9
|
else
|
7
|
-
'code_safety.yml'
|
10
|
+
Pathname.new('code_safety.yml').expand_path
|
8
11
|
end
|
9
12
|
|
10
13
|
# Temporary overrides to only audit external access files
|
11
14
|
SAFETY_REPOS = [['/svn/era', '/svn/extra/era/external-access']]
|
12
15
|
|
13
|
-
require 'yaml'
|
14
|
-
|
15
16
|
# Parameter max_print is number of entries to print before truncating output
|
16
17
|
# (negative value => print all)
|
17
18
|
def audit_code_safety(max_print = 20, ignore_new = false, show_diffs = false, show_in_priority = false, user_name = 'usr')
|
@@ -50,7 +51,7 @@ def audit_code_safety(max_print = 20, ignore_new = false, show_diffs = false, sh
|
|
50
51
|
puts "Checking for new files in #{safety_repo}"
|
51
52
|
new_files = get_new_files(safety_repo)
|
52
53
|
# Ignore subdirectories, and exclude code_safety.yml by default.
|
53
|
-
new_files.delete_if { |f| f =~ /[\/\\]$/ || f == SAFETY_FILE }
|
54
|
+
new_files.delete_if { |f| f =~ /[\/\\]$/ || Pathname.new(f).expand_path == SAFETY_FILE }
|
54
55
|
new_files.each do |f|
|
55
56
|
next if file_safety.key?(f)
|
56
57
|
file_safety[f] = {
|
@@ -344,7 +345,7 @@ def print_repo_file_diffs(repolatest, repo, fname, user_name, safe_revision)
|
|
344
345
|
cmd = nil
|
345
346
|
case repository_type
|
346
347
|
when 'git'
|
347
|
-
cmd = ['git', '--no-pager', 'diff', '-b', "#{safe_revision}..#{repolatest}", fname]
|
348
|
+
cmd = ['git', '--no-pager', 'diff', '--color', '-b', "#{safe_revision}..#{repolatest}", fname]
|
348
349
|
when 'git-svn', 'svn'
|
349
350
|
cmd = ['svn', 'diff', '-r', "#{safe_revision.to_i}:#{repolatest.to_i}", '-x', '-b', "#{repo}/#{fname}"]
|
350
351
|
end
|
@@ -473,3 +474,4 @@ end
|
|
473
474
|
|
474
475
|
# Prevent building of un-reviewed gems:
|
475
476
|
task build: :'audit:ensure_safe'
|
477
|
+
|
data/ndr_dev_support.gemspec
CHANGED
@@ -18,10 +18,18 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
|
+
spec.required_ruby_version = '>= 2.2'
|
22
|
+
|
23
|
+
# Rubocop dependencies:
|
21
24
|
spec.add_dependency 'rubocop', '0.36.0'
|
22
25
|
spec.add_dependency 'parser'
|
23
26
|
spec.add_dependency 'rainbow'
|
24
27
|
|
28
|
+
# Integration test dependencies:
|
29
|
+
spec.add_dependency 'capybara'
|
30
|
+
spec.add_dependency 'capybara-screenshot'
|
31
|
+
spec.add_dependency 'poltergeist', '>= 1.8.0'
|
32
|
+
|
25
33
|
spec.add_development_dependency 'bundler', '~> 1.7'
|
26
34
|
spec.add_development_dependency 'rake', '~> 10.0'
|
27
35
|
spec.add_development_dependency 'pry'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ndr_dev_support
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- NCRS Development Team
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-06-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubocop
|
@@ -52,6 +52,48 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: capybara
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: capybara-screenshot
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: poltergeist
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 1.8.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.8.0
|
55
97
|
- !ruby/object:Gem::Dependency
|
56
98
|
name: bundler
|
57
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -126,6 +168,11 @@ files:
|
|
126
168
|
- bin/setup
|
127
169
|
- code_safety.yml
|
128
170
|
- lib/ndr_dev_support.rb
|
171
|
+
- lib/ndr_dev_support/integration_testing.rb
|
172
|
+
- lib/ndr_dev_support/integration_testing/capybara.rb
|
173
|
+
- lib/ndr_dev_support/integration_testing/connection_sharing.rb
|
174
|
+
- lib/ndr_dev_support/integration_testing/poltergeist.rb
|
175
|
+
- lib/ndr_dev_support/integration_testing/screenshot.rb
|
129
176
|
- lib/ndr_dev_support/rubocop/executor.rb
|
130
177
|
- lib/ndr_dev_support/rubocop/range_augmenter.rb
|
131
178
|
- lib/ndr_dev_support/rubocop/range_finder.rb
|
@@ -147,7 +194,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
147
194
|
requirements:
|
148
195
|
- - ">="
|
149
196
|
- !ruby/object:Gem::Version
|
150
|
-
version: '
|
197
|
+
version: '2.2'
|
151
198
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
152
199
|
requirements:
|
153
200
|
- - ">="
|
@@ -155,7 +202,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
155
202
|
version: '0'
|
156
203
|
requirements: []
|
157
204
|
rubyforge_project:
|
158
|
-
rubygems_version: 2.5
|
205
|
+
rubygems_version: 2.6.5
|
159
206
|
signing_key:
|
160
207
|
specification_version: 4
|
161
208
|
summary: NDR Developer Support library
|