mirage 3.0.0.alpha.6 → 3.0.0.alpha.7

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.
data/README.md CHANGED
@@ -39,6 +39,60 @@ if there was a more appropriate template.
39
39
 
40
40
  Litteral matchers are worth more in the scoring process than regex based ones for example.
41
41
  #### What's new in the Client:
42
+ ##### 1. Template Models
43
+ Perhaps the biggest addition to the client. Simply mixin Mirage::Template::Model in to a class, give it a method called body and there you have it... a class that can be used to put objects straight on to Mirage.
44
+
45
+ * All the methods you find on a standard response can then be used at the class level to set defaults.
46
+
47
+ * Add builder methods to your class using the builder_methods class method.
48
+
49
+ **Example Usage:** (See rdoc for full details)
50
+
51
+ class UserProfile
52
+ extend Mirage::Template::Model
53
+
54
+ endpoint '/users'
55
+ http_method :get
56
+ status 200
57
+ content_type 'application/json'
58
+
59
+ builder_methods :firstname, :lastname, :age
60
+
61
+ def body
62
+ {firstname: firstname, lastname: lastname, age: age}.to_json
63
+ end
64
+ end
65
+
66
+
67
+ Mirage::Client.new.put UserProfile.new.firstname('Joe').lastname('blogs')
68
+
69
+ ##### Client interface
70
+ The client interface has been overhauled to make it more usable. It supports a couple of different ways of specifying a template
71
+ to let to specify templates in the style that best suites your code. The block in the examples is executed in the scope of the template
72
+ object itself so any method in it can be called. The template is also passed in to the block if you prefer to to call the methods
73
+ on a variable.
74
+
75
+ **Example Usage:** (See rdoc for full details)
76
+
77
+ mirage = Mirage::Client.new
78
+ mirage.put('/users') do
79
+ status 201
80
+ http_method :put
81
+ body 'response'
82
+
83
+ required_body_content << 'Abracadabra'
84
+ required_headers['Header'] = 'value'
85
+
86
+ delay 1.5
87
+ end
88
+
89
+ # Template Model classes can be customised in exactly the same way
90
+
91
+ mirage.put UserProfile.new do
92
+ status 404
93
+ required_parameters[:name] = /joe.*/
94
+ end
95
+
42
96
 
43
97
  ### 2.4.0
44
98
  ---------
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.0.0.alpha.6
1
+ 3.0.0.alpha.7
@@ -12,6 +12,7 @@ module Mirage
12
12
 
13
13
  include HTTParty
14
14
  include Model::InstanceMethods
15
+ include Model::CommonMethods
15
16
 
16
17
  class << self
17
18
  alias_method :backedup_get, :get
@@ -41,5 +42,13 @@ module Mirage
41
42
  template
42
43
  end
43
44
  end
45
+
46
+ def initialize *args
47
+ endpoint = args.first
48
+
49
+ raise ArgumentError, "You must specify a string endpoint as the first argument" unless endpoint && endpoint.is_a?(String)
50
+ super *args
51
+
52
+ end
44
53
  end
45
54
  end
@@ -1,6 +1,5 @@
1
-
2
1
  require 'client/helpers/method_builder'
3
- require 'client/template/model/class_methods'
2
+ require 'client/template/model/common_methods'
4
3
  require 'client/template/model/instance_methods'
5
4
 
6
5
  module Mirage
@@ -9,14 +8,31 @@ module Mirage
9
8
 
10
9
  class << self
11
10
  def extended clazz
12
- clazz.extend(ClassMethods)
11
+ clazz.extend(CommonMethods)
12
+ clazz.extend(Helpers::MethodBuilder)
13
13
  clazz.send(:include, HTTParty)
14
+ clazz.send(:include, CommonMethods)
14
15
  clazz.send(:include, InstanceMethods)
15
16
 
17
+
16
18
  mod = Module.new do
17
19
  def initialize *args
18
- super self.class.endpoint, ''
19
- status self.class.status if self.class.status
20
+
21
+ super *args
22
+ [:content_type,
23
+ :http_method,
24
+ :default,
25
+ :status,
26
+ :delay,
27
+ :required_parameters,
28
+ :required_body_content,
29
+ :required_headers,
30
+ :headers,
31
+ :endpoint, :delay].each do |attribute|
32
+ eval("#{attribute} self.class.#{attribute} if self.class.#{attribute}")
33
+ end
34
+
35
+
20
36
  end
21
37
  end
22
38
 
@@ -0,0 +1,26 @@
1
+ module Mirage
2
+
3
+ class Template
4
+ module Model
5
+ module CommonMethods
6
+ extend Helpers::MethodBuilder
7
+
8
+ builder_methods :content_type,
9
+ :http_method,
10
+ :default,
11
+ :status,
12
+ :delay,
13
+ :required_parameters,
14
+ :required_body_content,
15
+ :required_headers,
16
+ :headers,
17
+ :endpoint,
18
+ :body
19
+
20
+ alias value body
21
+ end
22
+
23
+ end
24
+ end
25
+
26
+ end
@@ -3,11 +3,17 @@ module Mirage
3
3
  module Model
4
4
  module InstanceMethods
5
5
  extend Helpers::MethodBuilder
6
+ include CommonMethods
6
7
 
7
- def initialize endpoint, response, default_config=Template::Configuration.new
8
- @endpoint = endpoint
8
+ def initialize *args
9
+ if args.last.is_a?(Template::Configuration)
10
+ default_config = args.delete_at(-1)
11
+ else
12
+ default_config = Template::Configuration.new
13
+ end
14
+
15
+ @endpoint, @body = *args
9
16
  @content_type = default_config.content_type
10
- @value = response
11
17
  @http_method = default_config.http_method
12
18
  @status = default_config.status
13
19
  @delay = default_config.delay
@@ -18,20 +24,10 @@ module Mirage
18
24
  @default = default_config.default
19
25
  end
20
26
 
21
- builder_method :content_type,
22
- :http_method,
23
- :default,
24
- :status,
25
- :delay,
26
- :required_parameters,
27
- :required_body_content,
28
- :required_headers,
29
- :endpoint,
30
- :id,
27
+ builder_method :id,
31
28
  :url,
32
- :requests_url,
33
- :headers,
34
- :value
29
+ :requests_url
30
+
35
31
 
36
32
  def create
37
33
  @id = self.class.put("#{@endpoint}", :body => self.to_json, :headers => {'content-type' => 'application/json'})['id']
@@ -47,7 +43,7 @@ module Mirage
47
43
  def to_json
48
44
  {
49
45
  :response => {
50
- :body => Base64.encode64(value),
46
+ :body => Base64.encode64(body),
51
47
  :status => status,
52
48
  :default => default,
53
49
  :content_type => content_type,
data/mirage.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "mirage"
8
- s.version = "3.0.0.alpha.6"
8
+ s.version = "3.0.0.alpha.7"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Leon Davis"]
12
- s.date = "2013-04-28"
12
+ s.date = "2013-04-30"
13
13
  s.description = "Mirage aids testing of your applications by hosting mock responses so that your applications do not have to talk to real endpoints. Its accessible via HTTP and has a RESTful interface."
14
14
  s.executables = ["mirage"]
15
15
  s.extra_rdoc_files = [
@@ -65,7 +65,7 @@ Gem::Specification.new do |s|
65
65
  "lib/mirage/client/template.rb",
66
66
  "lib/mirage/client/template/configuration.rb",
67
67
  "lib/mirage/client/template/model.rb",
68
- "lib/mirage/client/template/model/class_methods.rb",
68
+ "lib/mirage/client/template/model/common_methods.rb",
69
69
  "lib/mirage/client/template/model/instance_methods.rb",
70
70
  "lib/mirage/client/templates.rb",
71
71
  "mirage.gemspec",
@@ -87,7 +87,7 @@ Gem::Specification.new do |s|
87
87
  "spec/client/requests_spec.rb",
88
88
  "spec/client/runner_spec.rb",
89
89
  "spec/client/template/configuration_spec.rb",
90
- "spec/client/template/model/class_methods_spec.rb",
90
+ "spec/client/template/model/common_methods_spec.rb",
91
91
  "spec/client/template/model/instance_methods_spec.rb",
92
92
  "spec/client/template/model_spec.rb",
93
93
  "spec/client/template_spec.rb",
@@ -62,16 +62,18 @@ describe Mirage::Client do
62
62
  mirage.templates(1).should == mock_template
63
63
  end
64
64
 
65
- it "should put a response on mirage by passing args on to template's put method " do
66
- endpoint, value, block = 'greeting', 'hello', Proc.new{}
65
+ describe 'put' do
66
+ it "should put a response on mirage by passing args on to template's put method " do
67
+ endpoint, value, block = 'greeting', 'hello', Proc.new{}
67
68
 
68
- templates_mock = mock('templates')
69
- Templates.should_receive(:new).and_return(templates_mock)
69
+ templates_mock = mock('templates')
70
+ Templates.should_receive(:new).and_return(templates_mock)
70
71
 
71
72
  templates_mock.should_receive(:put).with(endpoint, value, &block)
72
73
 
73
- mirage = Client.new
74
- mirage.put endpoint, value, &block
74
+ mirage = Client.new
75
+ mirage.put endpoint, value, &block
76
+ end
75
77
  end
76
78
  end
77
79
 
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+ describe 'CommonMethods' do
3
+ let!(:model) do
4
+ Class.new do
5
+ include Template::Model::CommonMethods
6
+ end
7
+ end
8
+
9
+ let!(:instance) do
10
+ model.new '', ''
11
+ end
12
+ it 'should provide methods for customising the model' do
13
+ instance.methods.should include(:content_type,
14
+ :http_method,
15
+ :default,
16
+ :status,
17
+ :delay,
18
+ :required_parameters,
19
+ :required_body_content,
20
+ :required_headers,
21
+ :endpoint,
22
+ :headers,
23
+ :body)
24
+ end
25
+ end
@@ -13,24 +13,15 @@ describe Template::Model::InstanceMethods do
13
13
  model.new '', ''
14
14
  end
15
15
 
16
- it 'should provide methods for customising the model' do
17
- instance.methods.should include(:content_type,
18
- :http_method,
19
- :default,
20
- :status,
21
- :delay,
22
- :required_parameters,
23
- :required_body_content,
24
- :required_headers,
25
- :endpoint,
26
- :id,
27
- :url,
28
- :requests_url,
29
- :headers,
30
- :value)
31
- end
32
16
 
33
17
  context 'initialize' do
18
+
19
+ it 'requires an endpoint' do
20
+ endpoint = 'value'
21
+ instance = model.new endpoint
22
+ instance.endpoint.should == endpoint
23
+ end
24
+
34
25
  it 'requires an endpoint and value to be provided' do
35
26
  endpoint, value = 'endpoint', 'value'
36
27
  instance = model.new endpoint, value
@@ -50,6 +41,12 @@ describe Template::Model::InstanceMethods do
50
41
  instance.http_method.should == config.http_method
51
42
  instance.status.should == config.status
52
43
  instance.default.should == config.default
44
+
45
+ instance = model.new 'endpoint', config
46
+ instance.content_type.should == config.content_type
47
+ instance.http_method.should == config.http_method
48
+ instance.status.should == config.status
49
+ instance.default.should == config.default
53
50
  end
54
51
  end
55
52
 
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Template::Model do
4
- let(:endpoint){'endpoint'}
4
+ let(:endpoint) { 'endpoint' }
5
5
  let!(:test_class) do
6
6
  Class.new do
7
7
  extend Template::Model
@@ -14,9 +14,13 @@ describe Template::Model do
14
14
  end
15
15
  end
16
16
  context 'class' do
17
- it 'should extend ClassMethods and MethodBuilder' do
18
- test_class.is_a?(Template::Model::ClassMethods).should == true
17
+ it 'should extend MethodBuilder and CommonMethods' do
19
18
  test_class.is_a?(Helpers::MethodBuilder).should == true
19
+ test_class.is_a?(Template::Model::CommonMethods).should == true
20
+ end
21
+
22
+ it 'should include Instance methods' do
23
+ test_class.is_a?(Template::Model::CommonMethods).should == true
20
24
  end
21
25
 
22
26
  context 'inherited constructor' do
@@ -47,24 +51,69 @@ describe Template::Model do
47
51
  test_class.ancestors.should include(HTTParty)
48
52
  end
49
53
 
50
- it 'provides a method for customising the endpoint of all instances' do
51
- endpoint = 'endpoint'
52
- test_class.endpoint endpoint
53
- test_class.new.endpoint.should == endpoint
54
- end
54
+ describe 'defaults' do
55
+
56
+ it 'should be default the endpoint' do
57
+ endpoint = 'endpoint'
58
+ test_class.endpoint endpoint
59
+ test_class.new.endpoint.should == endpoint
60
+ end
55
61
 
56
- describe 'default status' do
57
- it 'sets the status of instances if set' do
62
+ it 'should be default the status' do
58
63
  status = 404
59
64
  test_class.status status
60
65
  test_class.new.status.should == status
61
66
  end
62
67
 
63
- it 'status of instances retain the global default if status is not set at the class level' do
64
- test_class.new.status.should == 200
68
+ it 'should be default the content-type' do
69
+ content_type = 'application/json'
70
+ test_class.content_type content_type
71
+ test_class.new.content_type.should == content_type
65
72
  end
66
73
 
74
+ it 'should be default the http_method' do
75
+ method = :post
76
+ test_class.http_method method
77
+ test_class.new.http_method.should == method
78
+ end
79
+
80
+ it 'should be default the default status' do
81
+ default = true
82
+ test_class.default default
83
+ test_class.new.default.should == default
84
+ end
85
+
86
+ it 'should be default the required parameters' do
87
+ required_parameters = {name: 'joe'}
88
+ test_class.required_parameters required_parameters
89
+ test_class.new.required_parameters.should == required_parameters
90
+ end
91
+
92
+ it 'should be default the required headers' do
93
+ headers = {name: 'joe'}
94
+ test_class.required_headers headers
95
+ test_class.new.required_headers.should == headers
96
+ end
97
+
98
+ it 'should be default the required body content' do
99
+ content = ['content']
100
+ test_class.required_body_content content
101
+ test_class.new.required_body_content.should == content
102
+ end
103
+
104
+ it 'should be default the headers' do
105
+ headers = {name: 'joe'}
106
+ test_class.headers headers
107
+ test_class.new.headers.should == headers
108
+ end
109
+
110
+ it 'should be default the delay' do
111
+ delay = 4
112
+ test_class.delay delay
113
+ test_class.new.delay.should == delay
114
+ end
67
115
  end
116
+
68
117
  end
69
118
 
70
119
  end
@@ -66,6 +66,16 @@ describe Mirage::Template do
66
66
  end
67
67
  end
68
68
 
69
+ describe 'initialize' do
70
+ it 'throws and exception if an endpoint is not supplied as the first parameter' do
71
+ expect{Template.new}.to raise_error(ArgumentError)
72
+ end
73
+
74
+ it 'throws and exception if first argument is not a string' do
75
+ expect{Template.new(:endpoint)}.to raise_error(ArgumentError)
76
+ end
77
+ end
78
+
69
79
 
70
80
  describe 'creating' do
71
81
  json = "reponse json"
data/test.rb CHANGED
@@ -1,50 +1,19 @@
1
1
  require './lib/mirage/client'
2
- #
3
- #class ServiceNowResponse
4
- # extend Mirage::Template::Model
5
- #
6
- # endpoint 'service_now'
7
- #
8
- # builder_methods :this,:that
9
- #
10
- # def value
11
- # "my value : #{this}, #{that}"
12
- # end
13
- #end
14
- #
15
- Mirage.stop
16
- mirage = Mirage.start
17
- #mirage.put ServiceNowResponse.new.this('foo').that('bar')
18
- #mirage.put ServiceNowResponse.new.this('foo').that('bar').required_body_content(%w(hello world))
19
- #mirage.put ServiceNowResponse.new.this('foo').that('bar').required_parameters({:name => 'leon'})
20
-
21
- require 'ostruct'
22
- class UserServiceProfile
2
+ class UserProfile
23
3
  extend Mirage::Template::Model
24
4
 
25
- endpoint 'Users'
5
+ endpoint '/users'
6
+ http_method :get
7
+ status 200
8
+ content_type 'application/json'
9
+ required_body_content %w(leon davis)
26
10
 
27
- def initialize persona
28
- super
29
- required_parameters[:token] = persona.token
30
- @persona = persona
31
- end
11
+ builder_methods :firstname, :lastname, :age
32
12
 
33
- def value
34
- {name: @persona.name}.to_json
13
+ def body
14
+ {firstname: firstname, lastname: lastname, age: age}.to_json
35
15
  end
36
16
  end
37
17
 
38
- leon = OpenStruct.new(
39
- :name => 'leon',
40
- :token => '1234'
41
- )
42
-
43
- mirage.clear
44
-
45
-
46
- leons_user_profile = UserServiceProfile.new leon
47
- mirage.put leons_user_profile do
48
- status 404
49
- method :get
50
- end
18
+ mirage = Mirage.start
19
+ mirage.put UserProfile.new.firstname('leon').lastname('davis').age(30)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mirage
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0.alpha.6
4
+ version: 3.0.0.alpha.7
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-28 00:00:00.000000000 Z
12
+ date: 2013-04-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sinatra
@@ -294,7 +294,7 @@ files:
294
294
  - lib/mirage/client/template.rb
295
295
  - lib/mirage/client/template/configuration.rb
296
296
  - lib/mirage/client/template/model.rb
297
- - lib/mirage/client/template/model/class_methods.rb
297
+ - lib/mirage/client/template/model/common_methods.rb
298
298
  - lib/mirage/client/template/model/instance_methods.rb
299
299
  - lib/mirage/client/templates.rb
300
300
  - mirage.gemspec
@@ -316,7 +316,7 @@ files:
316
316
  - spec/client/requests_spec.rb
317
317
  - spec/client/runner_spec.rb
318
318
  - spec/client/template/configuration_spec.rb
319
- - spec/client/template/model/class_methods_spec.rb
319
+ - spec/client/template/model/common_methods_spec.rb
320
320
  - spec/client/template/model/instance_methods_spec.rb
321
321
  - spec/client/template/model_spec.rb
322
322
  - spec/client/template_spec.rb
@@ -349,7 +349,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
349
349
  version: '0'
350
350
  segments:
351
351
  - 0
352
- hash: -2788995362471982437
352
+ hash: 817642380514883205
353
353
  required_rubygems_version: !ruby/object:Gem::Requirement
354
354
  none: false
355
355
  requirements:
@@ -1,11 +0,0 @@
1
- module Mirage
2
- class Template
3
- module Model
4
- module ClassMethods
5
- extend Helpers::MethodBuilder
6
- include Helpers::MethodBuilder
7
- builder_method :endpoint, :status
8
- end
9
- end
10
- end
11
- end
@@ -1,19 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Template::Model::ClassMethods do
4
- context 'class methods' do
5
-
6
- it 'should provide a method for setting the endpoint for the class' do
7
- endpoint = 'endpoint'
8
- model_class = Class.new do
9
- extend Template::Model::ClassMethods
10
-
11
- endpoint endpoint
12
- end
13
-
14
- model_class.endpoint.should == endpoint
15
- end
16
-
17
- end
18
-
19
- end