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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2b2f915258a3f3f168328b951e3eeb994ee319ba
4
- data.tar.gz: 645d0844ed7125193c2796f79d5a4cf33c1dec70
3
+ metadata.gz: bbf173d8ddfa7d10cb31833d230906bdcc958ba2
4
+ data.tar.gz: 02683547d2431fb1fb989fd5be52fdfb798b5224
5
5
  SHA512:
6
- metadata.gz: fac14a11fb811aae9b2c0e03c8027efb985eaa68f65f9575543f2c72cb629a119ed371d869e747af519183f0001cf038e3bb00afe461295aaaec320f48b63513
7
- data.tar.gz: 46318f642050c869aab20e2d6b02ac902e82a5ade663142b9db0eeb86427231ac7d99124d33b321ce9265464eecb1e99cb998eca14c8c352763af5318fc5d40c
6
+ metadata.gz: ebb19d580b52f1aeaa43ca959e29b617d5236c39336bab47f1170ef48683d36ad6d1f478c0d7fe5deeaf5ab9c72bbead8866e00a6c8f0664867105eaca577879
7
+ data.tar.gz: 4d9bafe9f324abb580db296b3801fd93c7f814f7420f3f661438280c584701b623ad5131f615a4112f87f09defbc823e2e0312407f134033653e3c451fbff98e
data/.travis.yml CHANGED
@@ -1,4 +1,11 @@
1
1
  language: ruby
2
+
2
3
  rvm:
3
- - 2.3.0
4
- before_install: gem install bundler -v 1.11.2
4
+ - 2.2.5
5
+ - 2.3.1
6
+
7
+ sudo: false
8
+
9
+ cache: bundler
10
+
11
+ before_script: "bundle update"
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
@@ -6,6 +6,8 @@ Rake::TestTask.new(:test) do |t|
6
6
  t.libs << 'test'
7
7
  t.libs << 'lib'
8
8
  t.test_files = FileList['test/**/*_test.rb']
9
+ t.verbose = false
10
+ t.warning = false
9
11
  end
10
12
 
11
13
  desc 'Run tests'
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: joshpencheon
14
- safe_revision: 303ce774decdc5e19ce99051e4c94246313564d7
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: joshpencheon
30
- safe_revision: 13cdf4eec8ea311ea480a90a3ba325a386db94e0
29
+ reviewed_by: josh.pencheon
30
+ safe_revision: 88ac9269eb8f0b44c5920a946708e4715421bcad
31
31
  Rakefile:
32
32
  comments:
33
- reviewed_by: joshpencheon
34
- safe_revision: c59a45986f8b6d087c8c21b1e889f31f7346da17
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: 3f4e55cee33c956405ab82e55b76914be0770577
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: timgentry
75
- safe_revision: 0d56ba443b2cddca5ba2d96ea61ec6f2b898436d
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: joshpencheon
83
- safe_revision: d61f29be0444859c092f4c0599cc48f5bea8f0ac
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,4 @@
1
+ require 'ndr_dev_support/integration_testing/capybara'
2
+ require 'ndr_dev_support/integration_testing/connection_sharing'
3
+ require 'ndr_dev_support/integration_testing/poltergeist'
4
+ require 'ndr_dev_support/integration_testing/screenshot'
@@ -0,0 +1,3 @@
1
+ require 'capybara/rails'
2
+
3
+ ActionDispatch::IntegrationTest.include(Capybara::DSL)
@@ -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
@@ -2,5 +2,5 @@
2
2
  # This defines the NdrDevSupport version. If you change it, rebuild and commit the gem.
3
3
  # Use "rake build" to build the gem, see rake -T for all bundler rake tasks (and our own).
4
4
  module NdrDevSupport
5
- VERSION = '1.1.3'.freeze
5
+ VERSION = '1.2.0'.freeze
6
6
  end
@@ -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
+
@@ -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.1.3
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-02-08 00:00:00.000000000 Z
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: '0'
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.1
205
+ rubygems_version: 2.6.5
159
206
  signing_key:
160
207
  specification_version: 4
161
208
  summary: NDR Developer Support library