ndr_dev_support 1.1.3 → 1.2.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.
- 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
|