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 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