and-son 0.1.1 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -5,5 +5,4 @@ gemspec
5
5
 
6
6
  gem 'bundler', '~>1.1'
7
7
  gem 'rake', '~>0.9.2'
8
-
9
8
  gem 'bson_ext'
@@ -2,6 +2,7 @@ require 'ostruct'
2
2
  require 'sanford-protocol'
3
3
  require 'and-son/connection'
4
4
  require 'and-son/response'
5
+ require 'and-son/stored_responses'
5
6
 
6
7
  module AndSon
7
8
 
@@ -31,46 +32,61 @@ module AndSon
31
32
 
32
33
  end
33
34
 
34
- class Client < Struct.new(:host, :port, :version)
35
+ class Client
35
36
  include CallRunnerMethods
36
37
 
37
38
  DEFAULT_TIMEOUT = 60 #seconds
38
39
 
40
+ attr_reader :host, :port, :version, :responses
41
+
42
+ def initialize(host, port, version)
43
+ @host, @port, @version = host, port, version
44
+ @responses = AndSon::StoredResponses.new
45
+ end
46
+
39
47
  # proxy the call method to the call runner
40
48
  def call(*args, &block); self.call_runner.call(*args, &block); end
41
49
 
42
50
  def call_runner
43
51
  # always start with this default CallRunner
44
52
  CallRunner.new({
45
- :host => host,
46
- :port => port,
47
- :version => version,
53
+ :host => host,
54
+ :port => port,
55
+ :version => version,
48
56
  :timeout_value => (ENV['ANDSON_TIMEOUT'] || DEFAULT_TIMEOUT).to_f,
49
- :params_value => {}
57
+ :params_value => {},
58
+ :responses => @responses,
50
59
  })
51
60
  end
52
61
  end
53
62
 
54
- class CallRunner < OpenStruct # {:host, :port, :version, :timeout_value, :params_value}
63
+ class CallRunner < OpenStruct
64
+ # {:host, :port, :version, :timeout_value, :params_value, :responses}
55
65
  include CallRunnerMethods
56
66
 
57
67
  # chain runner methods by returning itself
58
68
  def call_runner; self; end
59
69
 
60
- def call(name, params = {})
70
+ def call(name, params = nil)
71
+ params ||= {}
61
72
  if !params.kind_of?(Hash)
62
- raise ArgumentError, "expected params to be a Hash instead of a #{hash.class}"
73
+ raise ArgumentError, "expected params to be a Hash instead of a #{params.class}"
63
74
  end
75
+ client_response = self.responses.find(name, params) if ENV['ANDSON_TEST_MODE']
76
+ client_response ||= self.call!(name, params)
77
+
78
+ if block_given?
79
+ yield client_response.protocol_response
80
+ else
81
+ client_response.data
82
+ end
83
+ end
84
+
85
+ def call!(name, params)
64
86
  call_params = self.params_value.merge(params)
65
87
  AndSon::Connection.new(host, port).open do |connection|
66
88
  connection.write(Sanford::Protocol::Request.new(version, name, call_params).to_hash)
67
- client_response = AndSon::Response.parse(connection.read(timeout_value))
68
-
69
- if block_given?
70
- yield client_response.protocol_response
71
- else
72
- client_response.data
73
- end
89
+ AndSon::Response.parse(connection.read(timeout_value))
74
90
  end
75
91
  end
76
92
 
@@ -12,7 +12,7 @@ module AndSon
12
12
  protocol_connection = Sanford::Protocol::Connection.new(tcp_socket)
13
13
  yield protocol_connection if block_given?
14
14
  ensure
15
- protocol_connection.close
15
+ protocol_connection.close if protocol_connection
16
16
  end
17
17
 
18
18
  private
@@ -0,0 +1,33 @@
1
+ require 'sanford-protocol'
2
+ require 'and-son/response'
3
+
4
+ module AndSon
5
+
6
+ class StoredResponses
7
+
8
+ RequestData = Struct.new(:name, :params)
9
+
10
+ def initialize
11
+ @hash = {}
12
+ end
13
+
14
+ def add(name, params = nil)
15
+ request_data = RequestData.new(name, params || {})
16
+ response = yield
17
+ if !response.kind_of?(Sanford::Protocol::Response)
18
+ response = Sanford::Protocol::Response.new(200, response)
19
+ end
20
+ @hash[request_data] = AndSon::Response.new(response)
21
+ end
22
+
23
+ def find(name, params = nil)
24
+ @hash[RequestData.new(name, params || {})]
25
+ end
26
+
27
+ def remove(name, params = nil)
28
+ @hash.delete(RequestData.new(name, params || {}))
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -1,3 +1,3 @@
1
1
  module AndSon
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.1"
3
3
  end
@@ -29,6 +29,28 @@ class MakingRequestsTest < Assert::Context
29
29
 
30
30
  end
31
31
 
32
+ class WithStoredResponsesTest < MakingRequestsTest
33
+ desc "is stored with and-son and with testing ENV var set"
34
+ setup do
35
+ ENV['ANDSON_TEST_MODE'] = 'yes'
36
+ end
37
+ teardown do
38
+ ENV.delete('ANDSON_TEST_MODE')
39
+ end
40
+
41
+ should "return the registered response" do
42
+ client = AndSon.new('localhost', 12000, 'v1')
43
+ client.responses.add('echo', 'message' => 'test'){ 'test' }
44
+
45
+ client.call('echo', 'message' => 'test') do |response|
46
+ assert_equal 200, response.code
47
+ assert_equal nil, response.status.message
48
+ assert_equal 'test', response.data
49
+ end
50
+ end
51
+
52
+ end
53
+
32
54
  class AuthorizeTest < MakingRequestsTest
33
55
  setup do
34
56
  @fake_server.add_handler('v1', 'authorize_it') do |params|
@@ -0,0 +1,82 @@
1
+ require 'assert'
2
+
3
+ class AndSon::StoredResponses
4
+
5
+ class BaseTest < Assert::Context
6
+ desc "AndSon::StoredResponses"
7
+ setup do
8
+ @responses = AndSon::StoredResponses.new
9
+ end
10
+ subject{ @responses }
11
+
12
+ should have_instance_methods :add, :remove, :find
13
+
14
+ end
15
+
16
+ class AddTest < BaseTest
17
+ desc "add"
18
+
19
+ should "allow adding responses given an name and optional params" do
20
+ subject.add('test', { 'id' => 1 }) do
21
+ Sanford::Protocol::Response.new([ 404, 'not found' ])
22
+ end
23
+ response = subject.find('test', { 'id' => 1 }).protocol_response
24
+
25
+ assert_equal 404, response.code
26
+ assert_equal 'not found', response.status.message
27
+ assert_equal nil, response.data
28
+
29
+ subject.add('test'){ Sanford::Protocol::Response.new([ 404, 'not found' ]) }
30
+ response = subject.find('test').protocol_response
31
+
32
+ assert_equal 404, response.code
33
+ assert_equal 'not found', response.status.message
34
+ assert_equal nil, response.data
35
+ end
36
+
37
+ should "default the response as a 200 when only given response data" do
38
+ subject.add('test'){ true }
39
+ response = subject.find('test').protocol_response
40
+
41
+ assert_equal 200, response.code
42
+ assert_equal nil, response.status.message
43
+ assert_equal true, response.data
44
+ end
45
+
46
+ end
47
+
48
+ class FindTest < BaseTest
49
+ desc "find"
50
+ setup do
51
+ @responses.add('test', { 'id' => 1 }){ true }
52
+ @responses.add('test'){ true }
53
+ end
54
+
55
+ should "allow finding a response given a name and optional params" do
56
+ response = subject.find('test', { 'id' => 1 }).protocol_response
57
+ assert_equal true, response.data
58
+
59
+ response = subject.find('test').protocol_response
60
+ assert_equal true, response.data
61
+ end
62
+
63
+ end
64
+
65
+ class RemoveTest < BaseTest
66
+ desc "remove"
67
+ setup do
68
+ @responses.add('test', { 'id' => 1 }){ true }
69
+ @responses.add('test'){ true }
70
+ end
71
+
72
+ should "remove responses given a name and optional params" do
73
+ subject.remove('test', { 'id' => 1 })
74
+ assert_nil subject.find('test', { 'id' => 1 })
75
+
76
+ subject.remove('test')
77
+ assert_nil subject.find('test')
78
+ end
79
+
80
+ end
81
+
82
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: and-son
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 21
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
+ - 2
8
9
  - 1
9
- - 1
10
- version: 0.1.1
10
+ version: 0.2.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Collin Redding
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2012-11-30 00:00:00 Z
19
+ date: 2013-02-05 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  prerelease: false
@@ -85,6 +85,7 @@ files:
85
85
  - lib/and-son/connection.rb
86
86
  - lib/and-son/exceptions.rb
87
87
  - lib/and-son/response.rb
88
+ - lib/and-son/stored_responses.rb
88
89
  - lib/and-son/version.rb
89
90
  - test/helper.rb
90
91
  - test/support/fake_server.rb
@@ -92,6 +93,7 @@ files:
92
93
  - test/unit/and-son_test.rb
93
94
  - test/unit/client_test.rb
94
95
  - test/unit/response_test.rb
96
+ - test/unit/stored_responses_test.rb
95
97
  homepage: https://github.com/redding/and-son
96
98
  licenses: []
97
99
 
@@ -132,3 +134,4 @@ test_files:
132
134
  - test/unit/and-son_test.rb
133
135
  - test/unit/client_test.rb
134
136
  - test/unit/response_test.rb
137
+ - test/unit/stored_responses_test.rb