rails-response-dumper 3.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: 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