axtro-aws-ses 0.4.4

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.
@@ -0,0 +1,40 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ class BaseTest < Test::Unit::TestCase
4
+ def test_connection_established
5
+ instance = Base.new(:access_key_id => '123', :secret_access_key => 'abc')
6
+
7
+ assert_not_nil instance.instance_variable_get("@http")
8
+ end
9
+
10
+ def test_failed_response
11
+ @base = generate_base
12
+ mock_connection(@base, {:code => 403, :body => %{
13
+ <ErrorResponse>
14
+ <Error>
15
+ <Type>
16
+ Sender
17
+ </Type>
18
+ <Code>
19
+ ValidationError
20
+ </Code>
21
+ <Message>
22
+ Value null at 'message.subject' failed to satisfy constraint: Member must not be null
23
+ </Message>
24
+ </Error>
25
+ <RequestId>
26
+ 42d59b56-7407-4c4a-be0f-4c88daeea257
27
+ </RequestId>
28
+ </ErrorResponse>
29
+ }})
30
+
31
+ assert_raises ResponseError do
32
+ result = @base.request('', {})
33
+ end
34
+
35
+ # assert !result.success?
36
+ # assert result.error?
37
+ # assert result.error.error?
38
+ # assert_equal 'ValidationError', result.error.code
39
+ end
40
+ end
@@ -0,0 +1,120 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ class KerneltExtensionsTest < Test::Unit::TestCase
4
+ class Foo
5
+ include AWS::SES::ExpirableMemoize::InstanceMethods
6
+ extend AWS::SES::ExpirableMemoize::ClassMethods
7
+
8
+ def foo
9
+ __method__
10
+ end
11
+
12
+ def bar
13
+ foo
14
+ end
15
+
16
+ def baz
17
+ bar
18
+ end
19
+ end
20
+
21
+ class Bar
22
+ include AWS::SES::ExpirableMemoize::InstanceMethods
23
+ extend AWS::SES::ExpirableMemoize::ClassMethods
24
+
25
+ def foo
26
+ calling_method
27
+ end
28
+
29
+ def bar
30
+ calling_method
31
+ end
32
+
33
+ def calling_method
34
+ __method__(1)
35
+ end
36
+ end
37
+
38
+ def test___method___works_regardless_of_nesting
39
+ f = Foo.new
40
+ [:foo, :bar, :baz].each do |method|
41
+ assert_equal 'foo', f.send(method)
42
+ end
43
+ end
44
+
45
+ def test___method___depth
46
+ b = Bar.new
47
+ assert_equal 'foo', b.foo
48
+ assert_equal 'bar', b.bar
49
+ end
50
+ end if RUBY_VERSION <= '1.8.7'
51
+
52
+ class ModuleExtensionsTest < Test::Unit::TestCase
53
+ class Foo
54
+ include AWS::SES::ExpirableMemoize::InstanceMethods
55
+ extend AWS::SES::ExpirableMemoize::ClassMethods
56
+
57
+ def foo(reload = false)
58
+ expirable_memoize(reload) do
59
+ Time.now
60
+ end
61
+ end
62
+
63
+ def bar(reload = false)
64
+ expirable_memoize(reload, :baz) do
65
+ Time.now
66
+ end
67
+ end
68
+
69
+ def quux
70
+ Time.now
71
+ end
72
+ memoized :quux
73
+ end
74
+
75
+ def setup
76
+ @instance = Foo.new
77
+ end
78
+
79
+ def test_memoize
80
+ assert !instance_variables_of(@instance).include?('@foo')
81
+ cached_result = @instance.foo
82
+ assert_equal cached_result, @instance.foo
83
+ assert instance_variables_of(@instance).include?('@foo')
84
+ assert_equal cached_result, @instance.send(:instance_variable_get, :@foo)
85
+ assert_not_equal cached_result, new_cache = @instance.foo(:reload)
86
+ assert_equal new_cache, @instance.foo
87
+ assert_equal new_cache, @instance.send(:instance_variable_get, :@foo)
88
+ end
89
+
90
+ def test_customizing_memoize_storage
91
+ assert !instance_variables_of(@instance).include?('@bar')
92
+ assert !instance_variables_of(@instance).include?('@baz')
93
+ cached_result = @instance.bar
94
+ assert !instance_variables_of(@instance).include?('@bar')
95
+ assert instance_variables_of(@instance).include?('@baz')
96
+ assert_equal cached_result, @instance.bar
97
+ assert_equal cached_result, @instance.send(:instance_variable_get, :@baz)
98
+ assert_nil @instance.send(:instance_variable_get, :@bar)
99
+ end
100
+
101
+ def test_memoized
102
+ assert !instance_variables_of(@instance).include?('@quux')
103
+ cached_result = @instance.quux
104
+ assert_equal cached_result, @instance.quux
105
+ assert instance_variables_of(@instance).include?('@quux')
106
+ assert_equal cached_result, @instance.send(:instance_variable_get, :@quux)
107
+ assert_not_equal cached_result, new_cache = @instance.quux(:reload)
108
+ assert_equal new_cache, @instance.quux
109
+ assert_equal new_cache, @instance.send(:instance_variable_get, :@quux)
110
+ end
111
+
112
+ private
113
+ # For 1.9 compatibility
114
+ def instance_variables_of(object)
115
+ object.instance_variables.map do |instance_variable|
116
+ instance_variable.to_s
117
+ end
118
+ end
119
+
120
+ end
@@ -0,0 +1,89 @@
1
+ require 'yaml'
2
+
3
+ module AWS
4
+ module SES
5
+ # When this file is loaded, for each fixture file, a module is created within the Fixtures module
6
+ # with the same name as the fixture file. For each fixture in that fixture file, a singleton method is
7
+ # added to the module with the name of the given fixture, returning the value of the fixture.
8
+ #
9
+ # For example:
10
+ #
11
+ # A fixture in <tt>buckets.yml</tt> named <tt>empty_bucket_list</tt> with value <tt><foo>hi!</foo></tt>
12
+ # would be made available like so:
13
+ #
14
+ # Fixtures::Buckets.empty_bucket_list
15
+ # => "<foo>hi!</foo>"
16
+ #
17
+ # Alternatively you can treat the fixture module like a hash
18
+ #
19
+ # Fixtures::Buckets[:empty_bucket_list]
20
+ # => "<foo>hi!</foo>"
21
+ #
22
+ # You can find out all available fixtures by calling
23
+ #
24
+ # Fixtures.fixtures
25
+ # => ["Buckets"]
26
+ #
27
+ # And all the fixtures contained in a given fixture by calling
28
+ #
29
+ # Fixtures::Buckets.fixtures
30
+ # => ["bucket_list_with_more_than_one_bucket", "bucket_list_with_one_bucket", "empty_bucket_list"]
31
+ module Fixtures
32
+ class << self
33
+ def create_fixtures
34
+ files.each do |file|
35
+ create_fixture_for(file)
36
+ end
37
+ end
38
+
39
+ def create_fixture_for(file)
40
+ fixtures = YAML.load_file(path(file))
41
+ fixture_module = Module.new
42
+
43
+ fixtures.each do |name, value|
44
+ fixture_module.module_eval(<<-EVAL, __FILE__, __LINE__)
45
+ def #{name}
46
+ #{value.inspect}
47
+ end
48
+ module_function :#{name}
49
+ EVAL
50
+ end
51
+
52
+ fixture_module.module_eval(<<-EVAL, __FILE__, __LINE__)
53
+ module_function
54
+
55
+ def fixtures
56
+ #{fixtures.keys.sort.inspect}
57
+ end
58
+
59
+ def [](name)
60
+ send(name) if fixtures.include?(name.to_s)
61
+ end
62
+ EVAL
63
+
64
+ const_set(module_name(file), fixture_module)
65
+ end
66
+
67
+ def fixtures
68
+ constants.sort
69
+ end
70
+
71
+ private
72
+
73
+ def files
74
+ Dir.glob(File.dirname(__FILE__) + '/fixtures/*.yml').map {|fixture| File.basename(fixture)}
75
+ end
76
+
77
+ def module_name(file_name)
78
+ File.basename(file_name, '.*').capitalize
79
+ end
80
+
81
+ def path(file_name)
82
+ File.join(File.dirname(__FILE__), 'fixtures', file_name)
83
+ end
84
+ end
85
+
86
+ create_fixtures
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,56 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda-context'
12
+
13
+ begin
14
+ require 'ruby-debug'
15
+ rescue LoadError
16
+ end
17
+
18
+ require 'flexmock'
19
+ require 'flexmock/test_unit'
20
+
21
+ require File.dirname(__FILE__) + '/mocks/fake_response'
22
+ require File.dirname(__FILE__) + '/fixtures'
23
+
24
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
25
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
26
+ require 'aws/ses'
27
+
28
+ class Test::Unit::TestCase
29
+ require 'net/http'
30
+ require 'net/https'
31
+
32
+ include AWS::SES
33
+
34
+ def mock_connection(object, data = {})
35
+ return_values = case data
36
+ when Hash
37
+ FakeResponse.new(data)
38
+ when Array
39
+ data.map {|hash| FakeResponse.new(hash)}
40
+ else
41
+ abort "Response data for mock connection must be a Hash or an Array. Was #{data.inspect}."
42
+ end
43
+
44
+ connection = flexmock('Net::HTTP.new') do |mock|
45
+ mock.should_receive(:post).and_return(*return_values).at_least.once
46
+ end
47
+
48
+ mock = flexmock(object)
49
+ mock.should_receive(:connection).and_return(connection)
50
+ mock
51
+ end
52
+
53
+ def generate_base
54
+ Base.new(:access_key_id=>'123', :secret_access_key=>'abc')
55
+ end
56
+ end
@@ -0,0 +1,108 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ class InfoTest < Test::Unit::TestCase
4
+ context 'getting send quota' do
5
+ setup do
6
+ @base = generate_base
7
+ end
8
+
9
+ should 'return the correct response on success' do
10
+ mock_connection(@base, :body => %{
11
+ <GetSendQuotaResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
12
+ <GetSendQuotaResult>
13
+ <SentLast24Hours>0.0</SentLast24Hours>
14
+ <Max24HourSend>1000.0</Max24HourSend>
15
+ <MaxSendRate>1.0</MaxSendRate>
16
+ </GetSendQuotaResult>
17
+ <ResponseMetadata>
18
+ <RequestId>abc-123</RequestId>
19
+ </ResponseMetadata>
20
+ </GetSendQuotaResponse>
21
+ })
22
+
23
+ result = @base.quota
24
+ assert result.success?
25
+ assert_equal 'abc-123', result.request_id
26
+ assert_equal '0.0', result.sent_last_24_hours
27
+ assert_equal '1000.0', result.max_24_hour_send
28
+ assert_equal '1.0', result.max_send_rate
29
+ end
30
+ end
31
+
32
+ context 'getting send statistics' do
33
+ setup do
34
+ @base = generate_base
35
+ end
36
+
37
+ should 'return the correct response on success' do
38
+ mock_connection(@base, :body => %{
39
+ <GetSendStatisticsResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
40
+ <GetSendStatisticsResult>
41
+ <SendDataPoints>
42
+ <member>
43
+ <DeliveryAttempts>3</DeliveryAttempts>
44
+ <Timestamp>2011-01-31T15:31:00Z</Timestamp>
45
+ <Rejects>2</Rejects>
46
+ <Bounces>4</Bounces>
47
+ <Complaints>1</Complaints>
48
+ </member>
49
+ <member>
50
+ <DeliveryAttempts>3</DeliveryAttempts>
51
+ <Timestamp>2011-01-31T16:01:00Z</Timestamp>
52
+ <Rejects>0</Rejects>
53
+ <Bounces>0</Bounces>
54
+ <Complaints>0</Complaints>
55
+ </member>
56
+ <member>
57
+ <DeliveryAttempts>1</DeliveryAttempts>
58
+ <Timestamp>2011-01-26T16:31:00Z</Timestamp>
59
+ <Rejects>0</Rejects>
60
+ <Bounces>0</Bounces>
61
+ <Complaints>0</Complaints>
62
+ </member>
63
+ </SendDataPoints>
64
+ </GetSendStatisticsResult>
65
+ <ResponseMetadata>
66
+ <RequestId>abc-123</RequestId>
67
+ </ResponseMetadata>
68
+ </GetSendStatisticsResponse>
69
+ })
70
+
71
+ result = @base.statistics
72
+
73
+ assert result.success?
74
+ assert_equal 'abc-123', result.request_id
75
+
76
+ assert_equal 3, result.data_points.size
77
+
78
+ d = result.data_points.first
79
+
80
+ assert_equal '2', d['Rejects']
81
+ assert_equal '3', d['DeliveryAttempts']
82
+ assert_equal '4', d['Bounces']
83
+ assert_equal '1', d['Complaints']
84
+ end
85
+ end
86
+
87
+
88
+ context 'deleting a verified addressess' do
89
+ setup do
90
+ @base = generate_base
91
+ end
92
+
93
+ should 'return the correct response on success' do
94
+ mock_connection(@base, :body => %{
95
+ <DeleteVerifiedEmailAddressResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
96
+ <ResponseMetadata>
97
+ <RequestId>abc-123</RequestId>
98
+ </ResponseMetadata>
99
+ </DeleteVerifiedEmailAddressResponse>
100
+ })
101
+
102
+ result = @base.addresses.delete('user1@example.com')
103
+
104
+ assert result.success?
105
+ assert_equal 'abc-123', result.request_id
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,26 @@
1
+ module AWS
2
+ module SES
3
+ class FakeResponse
4
+ attr_reader :code, :body, :headers
5
+ def initialize(options = {})
6
+ @code = options.delete(:code) || 200
7
+ @body = options.delete(:body) || ''
8
+ @headers = {'content-type' => 'application/xml'}.merge(options.delete(:headers) || {})
9
+ end
10
+
11
+ # For ErrorResponse
12
+ def response
13
+ body
14
+ end
15
+
16
+ def [](header)
17
+ headers[header]
18
+ end
19
+
20
+ def each(&block)
21
+ headers.each(&block)
22
+ end
23
+ alias_method :each_header, :each
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ class BaseResponseTest < Test::Unit::TestCase
4
+ def setup
5
+ @headers = {'content-type' => 'text/plain', 'date' => Time.now}
6
+ @response = FakeResponse.new()
7
+ @base_response = Response.new('ResponseAction', @response)
8
+ end
9
+
10
+ def test_status_predicates
11
+ response = Proc.new {|code| Response.new('ResponseAction', FakeResponse.new(:code => code))}
12
+ assert response[200].success?
13
+ assert response[300].redirect?
14
+ assert response[400].client_error?
15
+ assert response[500].server_error?
16
+ end
17
+
18
+ def test_headers_passed_along_from_original_response
19
+ assert_equal @response.headers, @base_response.headers
20
+ assert_equal @response['date'], @base_response['date']
21
+ original_headers, new_headers = {}, {}
22
+ @response.headers.each {|k,v| original_headers[k] = v}
23
+ @base_response.each {|k,v| new_headers[k] = v}
24
+ assert_equal original_headers, new_headers
25
+ end
26
+ end