webmock-resources 0.0.5 → 0.0.6

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