mock_api 0.1.0 → 0.2.0
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 +4 -4
- data/lib/mock_api/runner.rb +58 -0
- data/lib/mock_api/store.rb +47 -0
- data/lib/mock_api/version.rb +1 -1
- data/lib/mock_api.rb +43 -3
- metadata +19 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 454465036d05401ec66979ba7b6fb09cee761a03d0fd6ccff3706c7da588a661
|
4
|
+
data.tar.gz: 7ba42e505589caaef943bcc6b2210ac8eb4be0fca7ab341b19448d2f5745c0ba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 98c2286140ccb4afcae8eb7cf4baac8e09c56d29944ca8547292d58cd9ae863a597b2d7825d58a009d72f6d41a5e353c66135c96789b8a945daa9b4a826f0f55
|
7
|
+
data.tar.gz: 1057bce5ebe4a1a8242dfd979e2a23258f3d866898008be5fbd0a0f9ac8c2e7469dc1b934dc2f923b704440f0377479e28c1a4e9d62e681b09dfa7f0cbc02ae7
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module MockApi
|
2
|
+
class Runner
|
3
|
+
def initialize(url:, server:, store: nil)
|
4
|
+
@url = Regexp.new(url)
|
5
|
+
@server = server
|
6
|
+
@store = store
|
7
|
+
extend(store.mixin) unless store.nil?
|
8
|
+
end
|
9
|
+
|
10
|
+
def run(url = @url)
|
11
|
+
if defined?(::WebMock)
|
12
|
+
WebMock.stub_request(:any, url).to_rack(@server)
|
13
|
+
else
|
14
|
+
raise 'MockApi requires WebMock to be installed. ' \
|
15
|
+
'Check out the setup guide at https://github.com/davidtkramer/mock_api#quick-start.'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def reset
|
20
|
+
@store&.reset
|
21
|
+
end
|
22
|
+
|
23
|
+
def hooks
|
24
|
+
this = self
|
25
|
+
Module.new do
|
26
|
+
define_singleton_method :included do |klass|
|
27
|
+
klass.class_eval do
|
28
|
+
if klass.method_defined?(:before_setup) # minitest
|
29
|
+
klass.define_method(:before_setup) do
|
30
|
+
super()
|
31
|
+
this.run
|
32
|
+
end
|
33
|
+
elsif respond_to?(:setup) # rails
|
34
|
+
setup { this.run }
|
35
|
+
elsif respond_to?(:before) # rspec
|
36
|
+
before { this.run }
|
37
|
+
else
|
38
|
+
raise "Unable to initialize MockApi setup hook in #{klass}"
|
39
|
+
end
|
40
|
+
|
41
|
+
if klass.method_defined?(:before_teardown) # minitest
|
42
|
+
klass.define_method(:before_teardown) do
|
43
|
+
super()
|
44
|
+
this.reset
|
45
|
+
end
|
46
|
+
elsif respond_to?(:teardown) # rails
|
47
|
+
teardown { this.reset }
|
48
|
+
elsif respond_to?(:after) # rspec
|
49
|
+
after { this.reset }
|
50
|
+
else
|
51
|
+
raise "Unable to initialize MockApi teardown hook in #{klass}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module MockApi
|
2
|
+
class Store
|
3
|
+
def initialize(*entity_types)
|
4
|
+
@store = {}
|
5
|
+
@entity_types = entity_types
|
6
|
+
entity_types.each do |entity_type|
|
7
|
+
@store[entity_type] = Repository.new([])
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def add(entity_type, entity)
|
12
|
+
@store[entity_type].add(entity)
|
13
|
+
end
|
14
|
+
|
15
|
+
def [](entity_type)
|
16
|
+
@store[entity_type]
|
17
|
+
end
|
18
|
+
|
19
|
+
def reset
|
20
|
+
@store.transform_values! { Repository.new([]) }
|
21
|
+
end
|
22
|
+
|
23
|
+
def mixin
|
24
|
+
store = @store
|
25
|
+
entity_types = @entity_types
|
26
|
+
Module.new do
|
27
|
+
define_singleton_method :included do |klass|
|
28
|
+
entity_types.each do |entity_type|
|
29
|
+
klass.define_method(entity_type) { store[entity_type] }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
define_singleton_method :extended do |klass|
|
33
|
+
entity_types.each do |entity_type|
|
34
|
+
klass.define_singleton_method(entity_type) { store[entity_type] }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class Repository < SimpleDelegator
|
41
|
+
def add(entity)
|
42
|
+
push(entity)
|
43
|
+
entity
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/mock_api/version.rb
CHANGED
data/lib/mock_api.rb
CHANGED
@@ -1,7 +1,47 @@
|
|
1
|
-
require_relative
|
1
|
+
require_relative 'mock_api/version'
|
2
|
+
require_relative 'mock_api/runner'
|
3
|
+
require_relative 'mock_api/store'
|
2
4
|
|
3
5
|
module MockApi
|
4
|
-
def self.
|
5
|
-
|
6
|
+
def self.included(klass)
|
7
|
+
klass.extend(ClassMethods)
|
8
|
+
class << klass
|
9
|
+
attr_accessor :runner, :store
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module ClassMethods
|
14
|
+
def mock(&block)
|
15
|
+
definition = MockDefinition.new
|
16
|
+
definition.instance_exec(&block)
|
17
|
+
self.store = Store.new(*definition.entity_types) unless definition.entity_types.nil?
|
18
|
+
self.runner = Runner.new(url: definition._url, server: self, store: store)
|
19
|
+
extend(store.mixin)
|
20
|
+
include(store.mixin)
|
21
|
+
end
|
22
|
+
|
23
|
+
def hooks
|
24
|
+
runner.hooks
|
25
|
+
end
|
26
|
+
|
27
|
+
def reset
|
28
|
+
runner.reset
|
29
|
+
end
|
30
|
+
|
31
|
+
def run(url = nil)
|
32
|
+
url.nil? ? runner.run : runner.run(url)
|
33
|
+
end
|
34
|
+
|
35
|
+
class MockDefinition
|
36
|
+
attr_reader :_url, :entity_types
|
37
|
+
|
38
|
+
def url(url)
|
39
|
+
@_url = url
|
40
|
+
end
|
41
|
+
|
42
|
+
def store(*entity_types)
|
43
|
+
@entity_types = entity_types
|
44
|
+
end
|
45
|
+
end
|
6
46
|
end
|
7
47
|
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mock_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Kramer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-09-
|
12
|
-
dependencies:
|
11
|
+
date: 2022-09-30 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sinatra
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.2.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.2.2
|
13
27
|
description: A library for building mock APIs in tests
|
14
28
|
email:
|
15
29
|
- david.kramer@redtailtechnology.com
|
@@ -18,6 +32,8 @@ extensions: []
|
|
18
32
|
extra_rdoc_files: []
|
19
33
|
files:
|
20
34
|
- lib/mock_api.rb
|
35
|
+
- lib/mock_api/runner.rb
|
36
|
+
- lib/mock_api/store.rb
|
21
37
|
- lib/mock_api/version.rb
|
22
38
|
homepage: https://github.com/davidtkramer/mock_api
|
23
39
|
licenses:
|