external_services 0.1.0 → 0.1.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,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YTA5YzliMjZkZmUyYTY3ZTMzNzEwYTA0NGUxNWEwYjgyYTc4ZmFkOA==
4
+ ZDYyMjI3YWE3YjYwMzUzN2M3MzE3YzRhY2Y2ZDVlNDcwNWVjOWQwNw==
5
5
  data.tar.gz: !binary |-
6
- MDk4MGE0ZWFjMTYzNzMyZDFiOTEyNTFjMmY5OGVlYmRlYmJiMjQwOA==
6
+ NmM3ZmUzZGEyOThjYTRkNDUzZTJhNmIzMDYwNWZlM2IxZGI2ZDk5Mg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZTJmNmZmMjY1NTQ3MWNjNjIwYjM2ZWQyNmRkNDdkNDcwMjcxOGRhMTM2Yjc2
10
- YThhODk2OGYyODZkZDlmZmM2MzRiMGNmNGQ0YmZjZDAxZjljNWE0ZGU2YmM3
11
- ZGYzNDFjYmUyOWZkMTAxNzg1MjBmYTdiMzQxZjY5MjgzNzUxMzc=
9
+ NWVhMTliZDY4NjdjNjQ1ZjhlMjI4ZDMwZDhkZmY3MTEwOGViZGQxYzg5ODEx
10
+ NWNkMTA1NDhhNGI0Mjg3NTdlZDAxM2NhMDJjYjI2M2ZkZTEzODFlOGVlZTFh
11
+ MTAyNzE2YmMxYjgyMmYwMTY3MGI0OWU5ZTg4ZGU0MDU2YmE3NjA=
12
12
  data.tar.gz: !binary |-
13
- N2Q5NjJlZjAyMmFmM2RhOWNjZTIyYTRkOGVhOWQ5ODZiZGMyMDE3MTJiZWUy
14
- YThiZDMwMjQwZmQ3YzU0OThmMTRmY2VkY2Y1ZmZiNDQyMmM4NTNiNGMwZjVm
15
- OGU1YWFmMGU5MWMyZmEwNjhjNTg3ODI4NjZlNDYyZTkyOTEyMzc=
13
+ ODkyZTljNjZlMjEwNTE5OGZiZTNjOWQ0ODc2ZjY5YzQzMWU5NmU3MjE2Mjky
14
+ YzgyZGUyYTg2NDY3ZWRiNjAzNjRkNmQ5YTVlNDQ2YWMwMWFjM2MyMzJjYTYw
15
+ ODhjZjg4Njk4M2VlM2Y2OWE5N2Q5YjU4MzU2M2FjNjk3YzQ0ZGY=
@@ -1,3 +1,3 @@
1
1
  module ExternalServices
2
- VERSION = '0.1.0'.freeze
2
+ VERSION = '0.1.1'.freeze
3
3
  end
@@ -6,6 +6,11 @@ require 'external_services/api'
6
6
  require 'generators/install_generator'
7
7
  require 'generators/service_generator'
8
8
 
9
+ if defined?(::RSpec)
10
+ require 'rspec/configuration'
11
+ require 'rspec/helpers'
12
+ end
13
+
9
14
  Dir[File.join(File.expand_path('lib/external_services'), 'api', '*.rb')].each do |api|
10
15
  require api
11
16
  end
@@ -0,0 +1,21 @@
1
+ module ExternalServices
2
+ module RSpec
3
+ module Configuration
4
+ extend ActiveSupport::Concern
5
+
6
+ def add_external_service(name)
7
+ Disabler.add_external_service name
8
+
9
+ mod = Module.new do
10
+ define_method :"describe_#{name}_api" do |object:, **kwargs, &blk|
11
+ describe_external_service_api(object: object, api_name: name, **kwargs, &blk)
12
+ end
13
+ end
14
+
15
+ self.extend mod
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ RSpec::Core::Configuration.send(:include, ExternalServices::RSpec::Configuration)
@@ -0,0 +1,39 @@
1
+ module ExternalServices
2
+ module RSpec
3
+ module Disabler
4
+ mattr_accessor :external_services
5
+
6
+ module_function
7
+
8
+ def add_external_service(name)
9
+ self.external_services ||= []
10
+ self.external_services << name.to_sym unless self.external_services.include? name.to_sym
11
+ end
12
+
13
+ def disable_external_services(except: [])
14
+ except = [except] unless except.is_a?(Array)
15
+ except = except.map(&:to_sym)
16
+
17
+ external_services.each do |name|
18
+ next if name.in? except
19
+
20
+ ::ActiveRecord::Base.descendants.each do |klass|
21
+ set_external_service_disabled_value klass, name, true
22
+ end
23
+ end
24
+ end
25
+
26
+ def enable_external_services
27
+ external_services.each do |name|
28
+ ::ActiveRecord::Base.descendants.each do |klass|
29
+ set_external_service_disabled_value klass, name, false
30
+ end
31
+ end
32
+ end
33
+
34
+ def set_external_service_disabled_value(klass, service, value)
35
+ klass.send("#{service}_api_disabled=", value) if klass.respond_to?("#{service}_api_disabled")
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,141 @@
1
+ require 'rspec/disabler'
2
+
3
+ module ExternalServices
4
+ module RSpec
5
+ module Helpers
6
+ extend ActiveSupport::Concern
7
+
8
+ module ClassMethods
9
+ def disable_external_services(except = [])
10
+ before :all do
11
+ ExternalServices::RSpec::Disabler.disable_external_services except: except
12
+ end
13
+
14
+ after :all do
15
+ ExternalServices::RSpec::Disabler.enable_external_services
16
+ end
17
+ end
18
+
19
+ # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
20
+
21
+ def describe_external_service_api(object:, api_name:, **kwargs, &blk)
22
+ action_class = kwargs[:action_class] || "ExternalServices::ApiActions::#{api_name.to_s.camelize}".constantize
23
+ methods = [:create, :update, :destroy]
24
+ methods -= [kwargs[:except]].flatten if kwargs[:except]
25
+ methods &= [kwargs[:only]].flatten if kwargs[:only]
26
+
27
+ describe action_class.to_s do
28
+ before :all do
29
+ Disabler.enable_external_services
30
+ Disabler.disable_external_services except: [api_name]
31
+ end
32
+
33
+ after :all do
34
+ Disabler.enable_external_services
35
+ end
36
+
37
+ before do
38
+ @api_object = case object
39
+ when Symbol
40
+ send(object)
41
+ else
42
+ instance_exec(&object)
43
+ end
44
+ @action_class = action_class
45
+ @id_key = kwargs[:id_key].try(:to_s) || "#{api_name.to_s.underscore}_id"
46
+ @methods = kwargs[:methods] || { create: :post, update: :put, destroy: :delete }
47
+
48
+ perform_unprocessed_actions
49
+ end
50
+
51
+ if :create.in? methods
52
+ it 'creates action on create' do
53
+ expect_api_action_on_create
54
+ end
55
+ end
56
+
57
+ if :update.in? methods
58
+ it 'creates action on update' do
59
+ @api_object.send("#{@id_key}=", SecureRandom.hex)
60
+ @api_object.save
61
+
62
+ expect_api_action_on_update(@api_object)
63
+ end
64
+ end
65
+
66
+ if :destroy.in? methods
67
+ it 'creates action on delete' do
68
+ if @api_object.respond_to?(:descendants)
69
+ @api_object.reload.descendants.each(&:delete)
70
+ end
71
+ @api_object.destroy
72
+ expect_api_action_on_destroy(@api_object)
73
+ end
74
+ end
75
+
76
+ if kwargs[:descendants_identifier_check]
77
+ it 'create actions for all descendants on identifier change' do
78
+ @api_object.update_attributes! identifier: "#{@api_object.identifier}1"
79
+
80
+ @api_object.descendants.each do |c|
81
+ expect_api_action_on_update(c)
82
+ end
83
+ end
84
+ end
85
+
86
+ instance_exec(&blk) if block_given?
87
+ end
88
+
89
+ # rubocop:enable Metrics/MethodLength, Metrics/AbcSize, Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
90
+ end
91
+ end
92
+
93
+ def remove_api_actions(api_name)
94
+ "ExternalServices::ApiActions::#{api_name.to_s.camelize}".constantize.delete_all
95
+ end
96
+
97
+ def expect_api_action_on_create(obj = nil)
98
+ expect_api_action(initiator: obj, method: @methods[:create])
99
+ end
100
+
101
+ def expect_api_action_on_update(obj = nil)
102
+ expect_api_action(initiator: obj, method: @methods[:update])
103
+ end
104
+
105
+ def expect_api_action_on_destroy(obj = nil)
106
+ expect_api_action(initiator: obj, method: @methods[:destroy])
107
+ end
108
+
109
+ def expect_api_action(params)
110
+ params[:initiator] ||= @api_object
111
+ expectation = params.delete(:expectation)
112
+ expectation = true if expectation.nil?
113
+ count = params.delete(:count)
114
+ data = params.delete(:data) || {}
115
+
116
+ actions = @action_class.where(params).select do |a|
117
+ data.select { |k, v| a.data[k.to_s] != v }.empty?
118
+ end
119
+
120
+ if count
121
+ expect(actions.count).send expectation ? 'to' : 'not_to', eq(count)
122
+ else
123
+ expect(actions.any?).to eq(expectation)
124
+ end
125
+ end
126
+
127
+ def unexpect_api_action(params)
128
+ expect_api_action(params.merge(expectation: false))
129
+ end
130
+
131
+ def perform_unprocessed_actions
132
+ @action_class.unprocessed.each(&:execute!)
133
+ @api_object.reload
134
+ end
135
+ end
136
+ end
137
+ end
138
+
139
+ RSpec.configure do |config|
140
+ config.include ExternalServices::RSpec::Helpers
141
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: external_services
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergey Gnuskov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-07-29 00:00:00.000000000 Z
11
+ date: 2016-08-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -78,6 +78,9 @@ files:
78
78
  - lib/generators/templates/services/api_action.rb
79
79
  - lib/generators/templates/services/api_job.rb
80
80
  - lib/generators/templates/services/model.rb
81
+ - lib/rspec/configuration.rb
82
+ - lib/rspec/disabler.rb
83
+ - lib/rspec/helpers.rb
81
84
  homepage: https://github.com/flant/external_services
82
85
  licenses:
83
86
  - MIT