mock_api 0.1.0 → 0.2.0

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: 90079dde3e422cd099d9cf1038ebb395ada91d6637b3137f515b50f48298568b
4
- data.tar.gz: eb7382e061fb65b4cf02b4ec0d5b3c9c9b066c72aefb83a054c67f87a716f507
3
+ metadata.gz: 454465036d05401ec66979ba7b6fb09cee761a03d0fd6ccff3706c7da588a661
4
+ data.tar.gz: 7ba42e505589caaef943bcc6b2210ac8eb4be0fca7ab341b19448d2f5745c0ba
5
5
  SHA512:
6
- metadata.gz: 951fcc075cb569d22ee0d40206e59cd203b3120a96a7a54e45c9cc843995bf063bc4c9cbb3c9078466e1e69e39ed246c8f7f1a15554742a8a9decde7ceea2eea
7
- data.tar.gz: 378db69f81754959e6a740bdb668a535428cb4bab6aa32af2bcd9f8021b4ae23aef3b1e28d232ebb7cf6e684587c4626f9adb2fb115c4c55da7c0ff166a8b04e
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
@@ -1,3 +1,3 @@
1
1
  module MockApi
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/mock_api.rb CHANGED
@@ -1,7 +1,47 @@
1
- require_relative "mock_api/version"
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.hello
5
- puts 'hello'
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.1.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-25 00:00:00.000000000 Z
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: