webmock-resources 0.0.5 → 0.0.6

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.
@@ -1,15 +1,48 @@
1
1
  require "json"
2
2
  require "webmock"
3
-
4
- module WebMock
5
- module Resources
6
- end
7
- end
3
+ require "active_support/inflector"
8
4
 
9
5
  require "webmock-resources/version"
6
+ require "webmock-resources/resource"
10
7
  require "webmock-resources/definition"
11
- require "webmock-resources/factory"
8
+ require "webmock-resources/schema"
9
+ require "webmock-resources/resource_builder"
10
+ require "webmock-resources/resource_storages"
11
+ require "webmock-resources/resource_instance_storage"
12
12
  require "webmock-resources/schema_builder"
13
13
  require "webmock-resources/schema_storage"
14
+ require "webmock-resources/factory"
14
15
  require "webmock-resources/sequence"
16
+ require "webmock-resources/stubber"
17
+
18
+ module WebMock::Resources
19
+
20
+ def self.create resource_name, attributes = {}
21
+ schema = SchemaStorage.instance[resource_name]
22
+ resource_builder = ResourceBuilder.new schema, attributes
23
+ resource_builder.build
24
+ end
25
+
26
+ def self.create_many resource_name, amount, attributes = {}
27
+ amount.times.map do
28
+ create resource_name, attributes
29
+ end
30
+ end
31
+
32
+ def self.define name, &block
33
+ builder = SchemaBuilder.new name
34
+ builder.instance_eval &block
35
+ SchemaStorage.instance[name]= builder.to_hash
36
+ end
37
+
38
+ def self.refresh
39
+ WebMock.reset!
40
+ ResourceStorages.instance.clear
41
+ SchemaStorage.instance.reset_sequences
42
+ SchemaStorage.instance.reload_index_stubs
43
+ end
44
+
45
+ end
46
+
47
+
15
48
 
@@ -1,24 +1,11 @@
1
1
  module WebMock::Resources
2
2
  module Definition
3
- extend WebMock::API
4
3
 
5
4
  def self.define name, &block
6
- builder = SchemaBuilder.new
7
- builder.instance_eval(&block) if block_given?
8
- SchemaStorage[name]= builder.to_hash
9
- n = name
10
- stub_request(:get, "webmock/api/#{name}").to_return status: 200, headers: {'Content-Type' => 'application/json'} do
11
- {:body => JSON.dump(Factory.resource_storage[n])}
12
- end
13
- end
5
+ p "DEPRECATED: please use WebMock::Resources.define instead"
14
6
 
15
- def self.refresh
16
- SchemaStorage.types.each do |type|
17
- stub_request(:get, "webmock/api/#{type}").to_return status: 200, headers: {'Content-Type' => 'application/ json'} do
18
- {:body => JSON.dump(Factory.resource_storage[type])}
19
- end
20
- end
7
+ WebMock::Resources.define name, &block
21
8
  end
22
-
9
+
23
10
  end
24
11
  end
@@ -1,49 +1,16 @@
1
1
  module WebMock::Resources
2
2
  class Factory
3
- extend WebMock::API
4
-
5
- @resources = {}
6
-
3
+
7
4
  def self.create resource_name, attributes = {}
8
- schema = SchemaStorage[resource_name]
9
- resource = schema[:fields].merge(id: schema[:sequence].next).merge(attributes)
10
-
11
- resource.each do |k,v|
12
- resource[k] = v.call(schema[:sequence].curr) if v.is_a? Proc
13
- end
5
+ p "DEPRECATED: please use WebMock::Resources.create instead"
14
6
 
15
- @resources[resource_name] ||= []
16
- @resources[resource_name] << resource
17
-
18
- stub_resource resource_name, resource
19
- schema[:object] ? schema[:object].new(resource) : resource
7
+ WebMock::Resources.create resource_name, attributes
20
8
  end
21
9
 
22
10
  def self.create_many resource_name, amount, attributes = {}
23
- amount.times.map do
24
- create resource_name, attributes
25
- end
26
- end
27
-
28
- def self.stub_resource resource_name, resource
29
- url = "webmock/api/#{resource_name}/#{resource[:id]}"
30
- stub_request(:get, url).to_return body: JSON.dump(resource), status: 200, headers: headers
31
-
32
- end
33
-
34
- def self.headers
35
- {'Content-Type' => 'application/json'}
36
- end
37
-
38
- def self.resource_storage
39
- @resources
40
- end
11
+ p "DEPRECATED: please use WebMock::Resources.create_many instead"
41
12
 
42
- def self.reset
43
- WebMock.reset!
44
- @resources = {}
45
- Definition.refresh
46
- SchemaStorage.reset_sequences
13
+ WebMock::Resources.create_many resource_name, amount, attributes
47
14
  end
48
15
 
49
16
  end
@@ -0,0 +1,9 @@
1
+ module WebMock::Resources
2
+ class Resource
3
+ attr_accessor :id, :attributes
4
+
5
+ def to_hash
6
+ attributes.merge id: id
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,36 @@
1
+ module WebMock::Resources
2
+ class ResourceBuilder
3
+
4
+ def initialize schema, overwrited_attributes = {}
5
+ @schema = schema
6
+ @fields = schema.fields.dup
7
+ @overwrited_attributes = overwrited_attributes
8
+ @resources = ResourceStorages.instance
9
+ end
10
+
11
+ def build
12
+ resource = Resource.new
13
+ resource.id = @schema.sequence.next
14
+ resource.attributes = attributes
15
+ @resources[@schema.type] << resource
16
+ @schema.object ? @schema.object.new(resource.to_hash) : resource.to_hash
17
+ end
18
+
19
+ def attributes
20
+ process_dynamic_fields
21
+ overwrite_attributes
22
+ @fields
23
+ end
24
+
25
+ def process_dynamic_fields
26
+ @fields.each do |k,v|
27
+ @fields[k] = v.call(@schema.sequence.curr) if v.is_a?(Proc)
28
+ end
29
+ end
30
+
31
+ def overwrite_attributes
32
+ @fields.merge!(@overwrited_attributes)
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,21 @@
1
+ module WebMock::Resources
2
+ class ResourceInstanceStorage < Array
3
+
4
+ def initialize resource_type
5
+ @resource_type = resource_type
6
+ end
7
+
8
+ def find id
9
+ super do |resource|
10
+ resource.id == id
11
+ end
12
+ end
13
+
14
+ def << instance
15
+ super instance
16
+
17
+ Stubber.instance.stub_resource @resource_type, instance.id
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,13 @@
1
+ module WebMock::Resources
2
+ class ResourceStorages < Hash
3
+
4
+ def self.instance
5
+ @instance ||= new
6
+ end
7
+
8
+ def [] resource_type
9
+ super(resource_type) || self[resource_type] = ResourceInstanceStorage.new(resource_type)
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,16 @@
1
+ module WebMock::Resources
2
+ class Schema
3
+ attr_accessor :type, :sequence, :object, :fields
4
+
5
+ def initialize type
6
+ @type = type
7
+ @fields = {}
8
+
9
+ reset_sequence
10
+ end
11
+
12
+ def reset_sequence
13
+ @sequence = Sequence.new
14
+ end
15
+ end
16
+ end
@@ -1,23 +1,25 @@
1
1
  module WebMock::Resources
2
2
  class SchemaBuilder
3
- def initialize
4
- @schema = { object: nil, sequence: Sequence.new, fields: {} }
3
+
4
+ def initialize resource_type
5
+ @schema = Schema.new resource_type
6
+ @schema.object = begin
7
+ resource_class = resource_type.to_s.classify
8
+ resource_class.constantize if Object.const_defined? resource_class
9
+ end
5
10
  end
6
11
 
7
- def attribute name, value=nil, &block
8
- if block_given?
9
- @schema[:fields][name] = block
10
- else
11
- @schema[:fields][name] = value
12
- end
12
+ def attribute name, value = nil, &block
13
+ @schema.fields[name] = block_given? ? block : value
13
14
  end
14
15
 
15
16
  def object clazz
16
- @schema[:object] = clazz
17
+ @schema.object = clazz
17
18
  end
18
19
 
19
20
  def to_hash
20
21
  @schema
21
22
  end
23
+
22
24
  end
23
25
  end
@@ -1,27 +1,30 @@
1
1
  module WebMock::Resources
2
- class SchemaStorage
3
- @resources = {}
2
+ class SchemaStorage < Hash
4
3
 
5
- def self.[]= key, value
6
- @resources[key]= value
4
+ def self.instance
5
+ @instance ||= new
7
6
  end
8
7
 
9
- def self.[] key
10
- @resources[key]
8
+ def []= resource, schema
9
+ stub_resource resource
10
+ super resource, schema
11
11
  end
12
12
 
13
- def self.types
14
- @resources.keys
13
+ def reset_sequences
14
+ each_value do |schema|
15
+ schema.reset_sequence
16
+ end
15
17
  end
16
18
 
17
- def self.clear
18
- @resources = {}
19
+ def stub_resource resource
20
+ Stubber.instance.stub_index resource
19
21
  end
20
22
 
21
- def self.reset_sequences
22
- @resources.each do |k,v|
23
- v[:sequence] = Sequence.new
24
- end
23
+ def reload_index_stubs
24
+ keys.each do |resource|
25
+ stub_resource resource
26
+ end
25
27
  end
28
+
26
29
  end
27
30
  end
@@ -1,7 +1,8 @@
1
1
  module WebMock::Resources
2
2
  class Sequence
3
- def initialize value = 0
4
- @value = value
3
+
4
+ def initialize
5
+ @value = 0
5
6
  end
6
7
 
7
8
  def next
@@ -11,5 +12,6 @@ module WebMock::Resources
11
12
  def curr
12
13
  @value
13
14
  end
15
+
14
16
  end
15
17
  end
@@ -0,0 +1,26 @@
1
+ module WebMock::Resources
2
+ class Stubber
3
+ include WebMock::API
4
+
5
+ def self.instance
6
+ @instance ||= new
7
+ end
8
+
9
+ def stub url, value = nil, &block
10
+ stub_request(:get, url).to_return(status: 200, headers: {'Content-Type' => 'application/json'}) do
11
+ { body: JSON.dump(value || block.call) }
12
+ end
13
+ end
14
+
15
+ def stub_index resource_type
16
+ stub("webmock/api/#{resource_type}") do
17
+ ResourceStorages.instance[resource_type].map(&:to_hash)
18
+ end
19
+ end
20
+
21
+ def stub_resource resource_type, resource_id
22
+ stub("webmock/api/#{resource_type}/#{resource_id}", ResourceStorages.instance[resource_type].find(resource_id).to_hash)
23
+ end
24
+
25
+ end
26
+ end
@@ -1,5 +1,7 @@
1
1
  module WebMock
2
2
  module Resources
3
- VERSION = "0.0.5"
3
+
4
+ VERSION = "0.0.6"
5
+
4
6
  end
5
7
  end
@@ -0,0 +1,6 @@
1
+ class AutoloadedObject
2
+ attr_accessor :name
3
+ def initialize attrs = {}
4
+ self.name = attrs[:name]
5
+ end
6
+ end
@@ -0,0 +1,170 @@
1
+ $LOAD_PATH.unshift './lib'
2
+ $LOAD_PATH.unshift './test'
3
+
4
+ require 'simplecov'
5
+ SimpleCov.start { add_filter 'test' }
6
+
7
+ require 'webmock-resources'
8
+ require 'httparty'
9
+ require 'minitest/autorun'
10
+
11
+ autoload :AutoloadedObject, 'autoloaded_object'
12
+
13
+ class SomeObject
14
+ attr_accessor :name
15
+ def initialize attrs = {}
16
+ self.name = attrs[:name]
17
+ end
18
+ end
19
+
20
+ class ComplexObj
21
+ attr_accessor :name, :registration, :email
22
+ def initialize attrs = {}
23
+ self.name = attrs[:name]
24
+ self.registration = attrs[:registration]
25
+ self.email = attrs[:email]
26
+ end
27
+ end
28
+
29
+ WebMock::Resources.define :returning_hashes do
30
+ attribute :name, 'hash_name'
31
+ end
32
+
33
+ WebMock::Resources.define :returning_objects do
34
+ object SomeObject
35
+ attribute :name, 'object_name'
36
+ end
37
+
38
+ WebMock::Resources.define :using_sequences do
39
+ attribute (:name) { |n| "REG:#{n}" }
40
+ end
41
+
42
+ WebMock::Resources.define :using_simple_proc do
43
+ attribute (:name) { "Vuala!" }
44
+ end
45
+
46
+ WebMock::Resources.define :complex_obj do
47
+ object ComplexObj
48
+ attribute :name, 'bla'
49
+ attribute (:registration) { |n| "REG:#{n}" }
50
+ attribute (:email) { "Email!" }
51
+ end
52
+
53
+ def reset
54
+ WebMock::Resources.refresh
55
+ end
56
+
57
+ def httparty_all resource
58
+ HTTParty.get "http://webmock/api/#{resource}", format: :json
59
+ end
60
+
61
+ def httparty_find resource, id
62
+ HTTParty.get "http://webmock/api/#{resource}/#{id}", format: :json
63
+ end
64
+
65
+ describe WebMock::Resources do
66
+ before { reset }
67
+
68
+ describe 'when no object is defined in define block' do
69
+ before { @resource = WebMock::Resources.create(:returning_hashes) }
70
+
71
+ it 'returns a hash of the created resource if no object defined in define block' do
72
+ @resource.must_be_kind_of Hash
73
+ @resource[:name].must_equal 'hash_name'
74
+ end
75
+
76
+ it 'mocks the index request for the resource type' do
77
+ @return = httparty_all 'returning_hashes'
78
+ @return.must_be_kind_of Array
79
+ @return.size.must_equal 1
80
+ @return.first.must_be_kind_of Hash
81
+ @return.first['id'].must_equal @resource[:id]
82
+ @return.first['name'].must_equal 'hash_name'
83
+ end
84
+
85
+ it 'updates the index request mock upon creation of a new resource' do
86
+ @other_resource = WebMock::Resources.create(:returning_hashes)
87
+
88
+ @return = httparty_all 'returning_hashes'
89
+ @return.must_be_kind_of Array
90
+ @return.size.must_equal 2
91
+ @return.first.must_be_kind_of Hash
92
+ @return.first['id'].must_equal @resource[:id]
93
+ @return.first['name'].must_equal 'hash_name'
94
+ @return.last.must_be_kind_of Hash
95
+ @return.last['id'].must_equal @other_resource[:id]
96
+ @return.last['name'].must_equal 'hash_name'
97
+ end
98
+
99
+ it 'mocks the find request for the resource created' do
100
+ @return = httparty_find 'returning_hashes', 1
101
+ @return.must_be_kind_of Hash
102
+ @return['name'].must_equal 'hash_name'
103
+ end
104
+ end
105
+
106
+ it 'returns an instance of the object defined in define block' do
107
+ @subject = WebMock::Resources.create(:returning_objects)
108
+ @subject.must_be_kind_of SomeObject
109
+ @subject.name.must_equal 'object_name'
110
+ end
111
+
112
+ it 'accepts a sequence' do
113
+ @first_resource = WebMock::Resources.create(:using_sequences)
114
+ @second_resource = WebMock::Resources.create(:using_sequences)
115
+ @first_resource[:name].must_equal 'REG:1'
116
+ @second_resource[:name].must_equal 'REG:2'
117
+ end
118
+
119
+ it 'accepts a proc' do
120
+ @resource = WebMock::Resources.create(:using_simple_proc)
121
+ @resource[:name].must_equal 'Vuala!'
122
+ end
123
+
124
+ it 'feature mashup' do
125
+ @resource = WebMock::Resources.create(:complex_obj)
126
+ @resource.must_be_kind_of ComplexObj
127
+ @resource.name.must_equal 'bla'
128
+ @resource.registration.must_equal 'REG:1'
129
+ @resource.email.must_equal 'Email!'
130
+ end
131
+
132
+ it 'accepts overwritten attributes' do
133
+ @resource = WebMock::Resources.create(:complex_obj, name: 'foobar')
134
+ @resource.must_be_kind_of ComplexObj
135
+ @resource.name.must_equal 'foobar'
136
+ @resource.registration.must_equal 'REG:1'
137
+ @resource.email.must_equal 'Email!'
138
+ end
139
+
140
+ it 'creates many' do
141
+ @resources = WebMock::Resources.create_many(:complex_obj, 2, name: 'foobar')
142
+ @resources.must_be_kind_of Array
143
+ @resources.first.name.must_equal 'foobar'
144
+ @resources.first.registration.must_equal 'REG:1'
145
+ @resources.first.email.must_equal 'Email!'
146
+ @resources.last.name.must_equal 'foobar'
147
+ @resources.last.registration.must_equal 'REG:2'
148
+ @resources.last.email.must_equal 'Email!'
149
+ end
150
+
151
+ WebMock::Resources.define :some_objects do
152
+ attribute :name, 'hash_name'
153
+ end
154
+
155
+ it 'guesses the resource object based on the name' do
156
+ @resource = WebMock::Resources.create(:some_objects, name: 'foobar')
157
+ @resource.must_be_kind_of SomeObject
158
+ end
159
+
160
+
161
+ WebMock::Resources.define :autoloaded_objects do
162
+ attribute :name, 'hash_name'
163
+ end
164
+
165
+ it 'guesses the resource object based on the name when resource object is on autoload' do
166
+ @resource = WebMock::Resources.create(:autoloaded_objects, name: 'foobar')
167
+ @resource.must_be_kind_of AutoloadedObject
168
+ end
169
+
170
+ end
@@ -15,5 +15,9 @@ Gem::Specification.new do |gem|
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = WebMock::Resources::VERSION
17
17
 
18
+ gem.add_dependency "activesupport"
18
19
  gem.add_dependency "webmock"
20
+ gem.add_development_dependency "minitest"
21
+ gem.add_development_dependency "simplecov"
22
+ gem.add_development_dependency "httparty"
19
23
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webmock-resources
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-05 00:00:00.000000000 Z
12
+ date: 2012-06-28 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
14
30
  - !ruby/object:Gem::Dependency
15
31
  name: webmock
16
32
  requirement: !ruby/object:Gem::Requirement
@@ -27,6 +43,54 @@ dependencies:
27
43
  - - ! '>='
28
44
  - !ruby/object:Gem::Version
29
45
  version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: minitest
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: simplecov
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: httparty
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
30
94
  description: Remote resource definition for tests/specs
31
95
  email:
32
96
  - marcello.m.albuquerque@gmail.com
@@ -42,10 +106,18 @@ files:
42
106
  - lib/webmock-resources.rb
43
107
  - lib/webmock-resources/definition.rb
44
108
  - lib/webmock-resources/factory.rb
109
+ - lib/webmock-resources/resource.rb
110
+ - lib/webmock-resources/resource_builder.rb
111
+ - lib/webmock-resources/resource_instance_storage.rb
112
+ - lib/webmock-resources/resource_storages.rb
113
+ - lib/webmock-resources/schema.rb
45
114
  - lib/webmock-resources/schema_builder.rb
46
115
  - lib/webmock-resources/schema_storage.rb
47
116
  - lib/webmock-resources/sequence.rb
117
+ - lib/webmock-resources/stubber.rb
48
118
  - lib/webmock-resources/version.rb
119
+ - test/autoloaded_object.rb
120
+ - test/integration_test.rb
49
121
  - webmock-resources.gemspec
50
122
  homepage: ''
51
123
  licenses: []
@@ -67,8 +139,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
67
139
  version: '0'
68
140
  requirements: []
69
141
  rubyforge_project:
70
- rubygems_version: 1.8.23
142
+ rubygems_version: 1.8.24
71
143
  signing_key:
72
144
  specification_version: 3
73
145
  summary: Remote resource definition for tests/specs
74
- test_files: []
146
+ test_files:
147
+ - test/autoloaded_object.rb
148
+ - test/integration_test.rb