rails-response-dumper 3.0.0 → 3.0.1

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
  SHA256:
3
- metadata.gz: e614c816d07245148905af373aea3ffcd3eb0ea4f36b2ae3c045833cca28b25f
4
- data.tar.gz: b1443b1b9222b316137dc5f38318a8f67b9e4788dff16d4b6bc5149521746e60
3
+ metadata.gz: 33844c7b9a9480388327762b8a297daab7e464c47933b8559325283aa29fc5b3
4
+ data.tar.gz: 6b8984033d0040101a4577e9a8c9aedfb3bba372510c03655ddbc402eb07e016
5
5
  SHA512:
6
- metadata.gz: 9bedc8a4c060064f0f4c9c5687312e19cb8d52ec4c47332a643371d8baefd047bc02a0878e54d5423e48b5e7fecfa3312d4689643bea5740944d9589cf86a534
7
- data.tar.gz: 5dc5f5ee9d8247c84a7278497f53ffe3e54e40de9b2edf36f620a6623b1d8b5f42301d5d6afaee3c44cb925376a9ddae3a82dc94fc360141d4fe65fe043b5714
6
+ metadata.gz: 4c4aa80837f7f3ec7d70b5e245692e50ac8d612499deba1d269dc54800bae589aa9143ee33ad2f665b6a647b1a741bb77ffb83acc9aa1b12169150fcd543a796
7
+ data.tar.gz: 033d6714b3e5febebbf5aa063e7a538bda9ae101a4cbef7b196a446c567c5f4b4341bd6dca328f2ba084e8e3a378462b9c8caa909b111545e165de656db703fc
@@ -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,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-response-dumper
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pioneer Valley Books
@@ -69,6 +69,11 @@ extensions: []
69
69
  extra_rdoc_files: []
70
70
  files:
71
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
72
77
  homepage: https://github.com/Pioneer-Valley-Books/rails-response-dumper
73
78
  licenses:
74
79
  - MIT