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 +8 -8
- data/lib/external_services/version.rb +1 -1
- data/lib/external_services.rb +5 -0
- data/lib/rspec/configuration.rb +21 -0
- data/lib/rspec/disabler.rb +39 -0
- data/lib/rspec/helpers.rb +141 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZDYyMjI3YWE3YjYwMzUzN2M3MzE3YzRhY2Y2ZDVlNDcwNWVjOWQwNw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NmM3ZmUzZGEyOThjYTRkNDUzZTJhNmIzMDYwNWZlM2IxZGI2ZDk5Mg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NWVhMTliZDY4NjdjNjQ1ZjhlMjI4ZDMwZDhkZmY3MTEwOGViZGQxYzg5ODEx
|
10
|
+
NWNkMTA1NDhhNGI0Mjg3NTdlZDAxM2NhMDJjYjI2M2ZkZTEzODFlOGVlZTFh
|
11
|
+
MTAyNzE2YmMxYjgyMmYwMTY3MGI0OWU5ZTg4ZGU0MDU2YmE3NjA=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ODkyZTljNjZlMjEwNTE5OGZiZTNjOWQ0ODc2ZjY5YzQzMWU5NmU3MjE2Mjky
|
14
|
+
YzgyZGUyYTg2NDY3ZWRiNjAzNjRkNmQ5YTVlNDQ2YWMwMWFjM2MyMzJjYTYw
|
15
|
+
ODhjZjg4Njk4M2VlM2Y2OWE5N2Q5YjU4MzU2M2FjNjk3YzQ0ZGY=
|
data/lib/external_services.rb
CHANGED
@@ -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.
|
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-
|
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
|