external_services 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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