rails-response-dumper 2.0.0 → 3.0.1

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
  SHA256:
3
- metadata.gz: 1f3a97f78890f8b28c7d89704adeb5ff8239c1bddad4dc0aabc50b443dcc075f
4
- data.tar.gz: 6531326b53a3f906ee6bb104e1096404fe9e9213d4bbcfbcc06df34bcc6e1edf
3
+ metadata.gz: 33844c7b9a9480388327762b8a297daab7e464c47933b8559325283aa29fc5b3
4
+ data.tar.gz: 6b8984033d0040101a4577e9a8c9aedfb3bba372510c03655ddbc402eb07e016
5
5
  SHA512:
6
- metadata.gz: e6f6ba4d8eafe2efad495fa2f4ffc1e36e3d735fd6ac96cce293bcc696fc0d5d0cc2a5b989bd6b3ff4ad66f35a19ea178e4b814e0da1e88ba457a0d33d6ee745
7
- data.tar.gz: c0119049c2eaf7b47cf2d0b43450f0a720885fefca895a849d24aba8d855d3bdddf1e09a041a4a615cf1a1e2fdb17ba6babfd94142f3d4c574794339bf62d716
6
+ metadata.gz: 4c4aa80837f7f3ec7d70b5e245692e50ac8d612499deba1d269dc54800bae589aa9143ee33ad2f665b6a647b1a741bb77ffb83acc9aa1b12169150fcd543a796
7
+ data.tar.gz: 033d6714b3e5febebbf5aa063e7a538bda9ae101a4cbef7b196a446c567c5f4b4341bd6dca328f2ba084e8e3a378462b9c8caa909b111545e165de656db703fc
@@ -1,102 +1,12 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- require 'fileutils'
5
- require 'mime/types'
6
-
7
4
  ENV['RAILS_ENV'] ||= 'test'
8
- require "#{Dir.pwd}/config/environment"
9
-
10
- class ResponseDumper
11
- include ActionDispatch::Integration::Runner
12
-
13
- attr_reader :expected_status_code
14
-
15
- def self.inherited(subclass)
16
- super
17
- dumpers << subclass
18
- end
19
-
20
- def self.dumpers
21
- @dumpers ||= []
22
- end
23
-
24
- def self.reset_models(*models)
25
- @reset_models ||= []
26
- @reset_models += models
27
- end
28
-
29
- def self.reset_models!
30
- reset_models.each do |model|
31
- model.connection.exec_query "TRUNCATE #{model.quoted_table_name} RESTART IDENTITY CASCADE"
32
- end
33
- end
34
-
35
- # Delegates to `Rails.application`.
36
- def app
37
- Rails.application
38
- end
39
-
40
- def expect_status_code!(status_code)
41
- @expected_status_code = Rack::Utils::SYMBOL_TO_STATUS_CODE[status_code]
42
- end
43
-
44
- def responses
45
- @responses ||= []
46
- end
47
-
48
- [:get, :post, :patch, :put, :head, :delete].each do |method|
49
- module_eval <<~RUBY, __FILE__, __LINE__ + 1
50
- def #{method}(...)
51
- result = super
52
- self.responses << response
53
- result
54
- end
55
- RUBY
56
- end
57
- end
58
-
59
- def run_dumps
60
- dumps_dir = Rails.root.join('dumps')
61
- FileUtils.rm_rf dumps_dir
62
- FileUtils.mkdir_p dumps_dir
63
-
64
- Dir[Rails.root.join('dumpers/**/*.rb')].each { |f| require f }
65
-
66
- ResponseDumper.dumpers.each do |klass|
67
- klass.instance_methods.each do |method|
68
- next unless method.start_with?('dump_')
69
-
70
- klass.reset_models!
71
-
72
- dumper = klass.new
73
- ActiveRecord::Base.transaction do
74
- dumper.expect_status_code!(:ok)
75
- dumper.send(method)
76
- raise ActiveRecord::Rollback
77
- end
78
-
79
- klass_path = klass.name.underscore
80
- dumper_dir = "#{dumps_dir}/#{klass_path}/#{method}"
81
- FileUtils.mkdir_p dumper_dir
82
-
83
- dumper.responses.each_with_index do |response, index|
84
- unless response.status == dumper.expected_status_code
85
- raise <<~ERROR.squish
86
- Dumped response has unexpected status code #{response.status} #{response.status_message}
87
- (expected #{dumper.expected_status_code})
88
- ERROR
89
- end
90
-
91
- mime = response.content_type.split(/ *; */).first
92
- extension = MIME::Types[mime].first.preferred_extension
93
- File.write("#{dumper_dir}/#{index}.#{extension}", response.body)
94
- end
95
- end
96
- end
97
- end
5
+ require 'rails_response_dumper'
98
6
 
99
7
  # Prevent database truncation if the environment is production.
100
8
  abort 'The Rails environment is running in production mode!' if Rails.env.production?
101
- ActiveRecord::Migration.maintain_test_schema!
102
- run_dumps
9
+ ActiveRecord::Migration.maintain_test_schema! if defined?(ActiveRecord::Base)
10
+
11
+ runner = RailsResponseDumper::Runner.new
12
+ runner.run_dumps
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/module/delegation'
4
+ require_relative 'dump_block'
5
+
6
+ module RailsResponseDumper
7
+ class Defined
8
+ attr_accessor :name, :klass
9
+
10
+ delegate :include, to: :klass
11
+
12
+ def self.dumpers
13
+ @dumpers ||= []
14
+ end
15
+
16
+ def initialize(name, &block)
17
+ self.name = name
18
+ self.klass = Class.new(ResponseDumper)
19
+
20
+ instance_eval(&block)
21
+
22
+ self.class.dumpers << self
23
+ end
24
+
25
+ def dump(name, status_code: :ok, &block)
26
+ blocks << DumpBlock.new(name, Rack::Utils::SYMBOL_TO_STATUS_CODE[status_code], block)
27
+ end
28
+
29
+ def blocks
30
+ @blocks ||= []
31
+ end
32
+
33
+ def reset_models(*models)
34
+ @reset_models ||= []
35
+ @reset_models += models
36
+ end
37
+
38
+ def reset_models!
39
+ reset_models.each do |model|
40
+ model.connection.exec_query <<~SQL.squish
41
+ TRUNCATE #{model.quoted_table_name} RESTART IDENTITY CASCADE
42
+ SQL
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsResponseDumper
4
+ DumpBlock = Struct.new('DumpBlock', :name, :expected_status_code, :block)
5
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mime/types'
4
+ require_relative 'defined'
5
+
6
+ module RailsResponseDumper
7
+ class Runner
8
+ def run_dumps
9
+ dumps_dir = Rails.root.join('dumps')
10
+ FileUtils.rm_rf dumps_dir
11
+ FileUtils.mkdir_p dumps_dir
12
+
13
+ Dir[Rails.root.join('dumpers/**/*.rb')].each { |f| require f }
14
+
15
+ RailsResponseDumper::Defined.dumpers.each do |defined|
16
+ defined.blocks.each do |dump_block|
17
+ defined.reset_models!
18
+
19
+ dumper = defined.klass.new
20
+ dumper.mock_setup
21
+ begin
22
+ rollback_after do
23
+ dumper.instance_eval(&dump_block.block)
24
+ end
25
+ ensure
26
+ dumper.mock_teardown
27
+ end
28
+
29
+ klass_path = defined.name.underscore
30
+ dumper_dir = "#{dumps_dir}/#{klass_path}/#{dump_block.name}"
31
+ FileUtils.mkdir_p dumper_dir
32
+
33
+ dumper.responses.each_with_index do |response, index|
34
+ unless response.status == dump_block.expected_status_code
35
+ raise <<~ERROR.squish
36
+ #{defined.name}.#{dump_block.name} has unexpected status
37
+ code #{response.status} #{response.status_message}
38
+ (expected #{dump_block.expected_status_code})
39
+ ERROR
40
+ end
41
+
42
+ mime = response.content_type.split(/ *; */).first
43
+ extension = MIME::Types[mime].first.preferred_extension
44
+ File.write("#{dumper_dir}/#{index}.#{extension}", response.body)
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def rollback_after
53
+ if defined?(ActiveRecord::Base)
54
+ ActiveRecord::Base.transaction do
55
+ yield
56
+ raise ActiveRecord::Rollback
57
+ end
58
+ else
59
+ # ActiveRecord is not installed.
60
+ yield
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'rails_response_dumper/runner'
4
+ require_relative 'response_dumper'
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "#{Dir.pwd}/config/environment"
4
+ require 'rspec/mocks'
5
+
6
+ class ResponseDumper
7
+ include ActionDispatch::Integration::Runner
8
+ include ActiveSupport::Testing::TimeHelpers
9
+ include RSpec::Mocks::ExampleMethods
10
+
11
+ def self.define(name, &block)
12
+ RailsResponseDumper::Defined.new(name, &block)
13
+ end
14
+
15
+ # Delegates to `Rails.application`.
16
+ def app
17
+ Rails.application
18
+ end
19
+
20
+ def responses
21
+ @responses ||= []
22
+ end
23
+
24
+ def mock_setup
25
+ RSpec::Mocks.setup
26
+ end
27
+
28
+ def mock_teardown
29
+ RSpec::Mocks.verify
30
+ ensure
31
+ RSpec::Mocks.teardown
32
+ end
33
+
34
+ %i[get post patch put head delete].each do |method|
35
+ module_eval <<~RUBY, __FILE__, __LINE__ + 1
36
+ def #{method}(...)
37
+ result = super
38
+ self.responses << response
39
+ result
40
+ end
41
+ RUBY
42
+ end
43
+
44
+ # The list of methods is too long to be useful so shorten to just the class
45
+ # name.
46
+ def inspect
47
+ "#<#{self.class.name}>"
48
+ end
49
+ end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-response-dumper
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 3.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pioneer Valley Books
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-03 00:00:00.000000000 Z
11
+ date: 2022-03-29 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mime-types
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rails
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -30,23 +44,42 @@ dependencies:
30
44
  - - "<"
31
45
  - !ruby/object:Gem::Version
32
46
  version: '8'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec-mocks
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.0'
33
61
  description: |
34
62
  Rails Response Dumper is a library and command line tool to dump HTTP
35
63
  responses from a Rails application to the file system. These responses can
36
64
  then be consumed by other tools for testing and verification purposes.
37
- email:
65
+ email:
38
66
  executables:
39
67
  - rails-response-dumper
40
68
  extensions: []
41
69
  extra_rdoc_files: []
42
70
  files:
43
71
  - bin/rails-response-dumper
72
+ - lib/rails_response_dumper.rb
73
+ - lib/rails_response_dumper/defined.rb
74
+ - lib/rails_response_dumper/dump_block.rb
75
+ - lib/rails_response_dumper/runner.rb
76
+ - lib/response_dumper.rb
44
77
  homepage: https://github.com/Pioneer-Valley-Books/rails-response-dumper
45
78
  licenses:
46
79
  - MIT
47
80
  metadata:
48
81
  rubygems_mfa_required: 'true'
49
- post_install_message:
82
+ post_install_message:
50
83
  rdoc_options: []
51
84
  require_paths:
52
85
  - lib
@@ -61,8 +94,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
61
94
  - !ruby/object:Gem::Version
62
95
  version: '0'
63
96
  requirements: []
64
- rubygems_version: 3.2.22
65
- signing_key:
97
+ rubygems_version: 3.3.7
98
+ signing_key:
66
99
  specification_version: 4
67
100
  summary: Dump HTTP responses from a Rails application to the file system
68
101
  test_files: []