isaacfeliu-aws-s3 0.4.0

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/test/fixtures.rb ADDED
@@ -0,0 +1,89 @@
1
+ require 'yaml'
2
+
3
+ module AWS
4
+ module S3
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,89 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class LoggingStatusReadingTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @disabled = logging_status(:logging_disabled)
7
+ @enabled = logging_status(:logging_enabled)
8
+ @new_status = Logging::Status.new('target_bucket' => 'foo', 'target_prefix' => 'access-log-')
9
+ end
10
+
11
+ def test_logging_enabled?
12
+ assert !@disabled.logging_enabled?
13
+ assert !@new_status.logging_enabled?
14
+ assert @enabled.logging_enabled?
15
+ end
16
+
17
+ def test_passing_in_prefix_and_bucket
18
+ assert_equal 'foo', @new_status.target_bucket
19
+ assert_equal 'access-log-', @new_status.target_prefix
20
+ assert !@new_status.logging_enabled?
21
+ end
22
+
23
+ private
24
+ def logging_status(fixture)
25
+ Logging::Status.new(Parsing::XmlParser.new(Fixtures::Logging[fixture.to_s]))
26
+ end
27
+ end
28
+
29
+ class LoggingStatusWritingTest < LoggingStatusReadingTest
30
+ def setup
31
+ super
32
+ @disabled = Logging::Status.new(Parsing::XmlParser.new(@disabled.to_xml))
33
+ @enabled = Logging::Status.new(Parsing::XmlParser.new(@enabled.to_xml))
34
+ end
35
+ end
36
+
37
+ class LogTest < Test::Unit::TestCase
38
+ def test_value_converted_to_log_lines
39
+ log_object = S3Object.new
40
+ log_object.value = Fixtures::Logs.simple_log.join
41
+ log = Logging::Log.new(log_object)
42
+ assert_nothing_raised do
43
+ log.lines
44
+ end
45
+
46
+ assert_equal 2, log.lines.size
47
+ assert_kind_of Logging::Log::Line, log.lines.first
48
+ assert_equal 'marcel', log.lines.first.bucket
49
+ end
50
+ end
51
+
52
+ class LogLineTest < Test::Unit::TestCase
53
+ def setup
54
+ @line = Logging::Log::Line.new(Fixtures::Loglines.bucket_get)
55
+ end
56
+
57
+ def test_field_accessors
58
+ expected_results = {
59
+ :owner => Owner.new('id' => 'bb2041a25975c3d4ce9775fe9e93e5b77a6a9fad97dc7e00686191f3790b13f1'),
60
+ :bucket => 'marcel',
61
+ :time => Time.parse('11/14/2006 06:36:48 +0000'),
62
+ :remote_ip => '67.165.183.125',
63
+ :request_id => '8B5297D428A05432',
64
+ :requestor => Owner.new('id' => 'bb2041a25975c3d4ce9775fe9e93e5b77a6a9fad97dc7e00686191f3790b13f1'),
65
+ :operation => 'REST.GET.BUCKET',
66
+ :key => nil,
67
+ :request_uri => 'GET /marcel HTTP/1.1',
68
+ :http_status => 200,
69
+ :error_code => nil,
70
+ :bytes_sent => 4534,
71
+ :object_size => nil,
72
+ :total_time => 398,
73
+ :turn_around_time => 395,
74
+ :referrer => nil,
75
+ :user_agent => nil
76
+ }
77
+
78
+ expected_results.each do |field, expected|
79
+ assert_equal expected, @line.send(field)
80
+ end
81
+
82
+ assert_equal expected_results, @line.attributes
83
+ end
84
+
85
+ def test_user_agent
86
+ line = Logging::Log::Line.new(Fixtures::Loglines.browser_get)
87
+ assert_equal 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0', line.user_agent
88
+ end
89
+ end
@@ -0,0 +1,217 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class ObjectTest < Test::Unit::TestCase
4
+ def setup
5
+ bucket = Bucket.new(Parsing::XmlParser.new(Fixtures::Buckets.bucket_with_one_key))
6
+ @object = bucket.objects.first
7
+ end
8
+
9
+ def test_header_settings_reader_and_writer
10
+ S3Object.in_test_mode do
11
+ headers = {'content-type' => 'text/plain'}
12
+ S3Object.request_returns :headers => headers
13
+
14
+ assert_nothing_raised do
15
+ @object.content_type
16
+ end
17
+
18
+ assert_equal 'text/plain', @object.content_type
19
+
20
+ assert_nothing_raised do
21
+ @object.content_type = 'image/jpg'
22
+ end
23
+
24
+ assert_equal 'image/jpg', @object.content_type
25
+
26
+ assert_raises(NoMethodError) do
27
+ @object.non_existant_header_setting
28
+ end
29
+ end
30
+ end
31
+
32
+ def test_key_name_validation
33
+ assert_raises(InvalidKeyName) do
34
+ S3Object.create(nil, '', 'marcel')
35
+ end
36
+
37
+ assert_raises(InvalidKeyName) do
38
+ huge_name = 'a' * 1500
39
+ S3Object.create(huge_name, '', 'marcel')
40
+ end
41
+ end
42
+
43
+ def test_content_type_inference
44
+ [
45
+ ['foo.jpg', {}, 'image/jpeg'],
46
+ ['foo.txt', {}, 'text/plain'],
47
+ ['foo', {}, nil],
48
+ ['foo.asdf', {}, nil],
49
+ ['foo.jpg', {:content_type => nil}, nil],
50
+ ['foo', {:content_type => 'image/jpg'}, 'image/jpg'],
51
+ ['foo.jpg', {:content_type => 'image/png'}, 'image/png'],
52
+ ['foo.asdf', {:content_type => 'image/jpg'}, 'image/jpg']
53
+ ].each do |key, options, content_type|
54
+ S3Object.send(:infer_content_type!, key, options)
55
+ assert_equal content_type, options[:content_type]
56
+ end
57
+ end
58
+
59
+ def test_object_has_owner
60
+ assert_kind_of Owner, @object.owner
61
+ end
62
+
63
+ def test_owner_attributes_are_accessible
64
+ owner = @object.owner
65
+ assert owner.id
66
+ assert owner.display_name
67
+ assert_equal 'bb2041a25975c3d4ce9775fe9e93e5b77a6a9fad97dc7e00686191f3790b13f1', owner.id
68
+ assert_equal 'mmolina@onramp.net', owner.display_name
69
+ end
70
+
71
+ def test_only_valid_attributes_accessible
72
+ assert_raises(NoMethodError) do
73
+ @object.owner.foo
74
+ end
75
+ end
76
+
77
+ def test_fetching_object_value_generates_value_object
78
+ S3Object.in_test_mode do
79
+ S3Object.request_returns :body => 'hello!'
80
+ value = S3Object.value('foo', 'bar')
81
+ assert_kind_of S3Object::Value, value
82
+ assert_equal 'hello!', value
83
+ end
84
+ end
85
+
86
+ def test_fetching_file_by_name_raises_when_heuristic_fails
87
+ S3Object.request_always_returns :body => Fixtures::Buckets.bucket_with_one_key do
88
+ assert_raises(NoSuchKey) do
89
+ S3Object.find('not_tongue_overload.jpg', 'marcel_molina')
90
+ end
91
+
92
+ object = nil # Block scoping
93
+ assert_nothing_raised do
94
+ object = S3Object.find('tongue_overload.jpg', 'marcel_molina')
95
+ end
96
+ assert_kind_of S3Object, object
97
+ assert_equal 'tongue_overload.jpg', object.key
98
+ end
99
+ end
100
+
101
+ def test_about
102
+ S3Object.in_test_mode do
103
+ headers = {'content-size' => '12345', 'date' => Time.now.httpdate, 'content-type' => 'application/xml'}
104
+ S3Object.request_returns :headers => headers
105
+ about = S3Object.about('foo', 'bar')
106
+ assert_kind_of S3Object::About, about
107
+ assert_equal headers, about
108
+
109
+ S3Object.request_returns :code => 404
110
+ assert_raises(NoSuchKey) do
111
+ S3Object.about('foo', 'bar')
112
+ end
113
+ end
114
+ end
115
+
116
+ def test_exists?
117
+ S3Object.in_test_mode do
118
+ S3Object.request_returns :code => 404
119
+ assert_equal false, S3Object.exists?('foo', 'bar')
120
+
121
+ S3Object.request_returns :code => 200
122
+ assert_equal true, S3Object.exists?('foo', 'bar')
123
+ end
124
+ end
125
+
126
+ def test_s3object_equality
127
+ Bucket.in_test_mode do
128
+ Bucket.request_returns :body => Fixtures::Buckets.bucket_with_more_than_one_key
129
+ file1, file2 = Bucket.objects('does not matter')
130
+ assert file1 == file1
131
+ assert file2 == file2
132
+ assert !(file1 == file2) # /!\ Parens required /!\
133
+ end
134
+ end
135
+
136
+ def test_inspect
137
+ S3Object.in_test_mode do
138
+ S3Object.request_returns :body => Fixtures::Buckets.bucket_with_one_key
139
+ object = S3Object.find('tongue_overload.jpg', 'bucket does not matter')
140
+ assert object.path
141
+ assert_nothing_raised { object.inspect }
142
+ assert object.inspect[object.path]
143
+ end
144
+ end
145
+
146
+ def test_etag
147
+ S3Object.in_test_mode do
148
+ S3Object.request_returns :body => Fixtures::Buckets.bucket_with_one_key
149
+ file = S3Object.find('tongue_overload.jpg', 'bucket does not matter')
150
+ assert file.etag
151
+ assert_equal 'f21f7c4e8ea6e34b268887b07d6da745', file.etag
152
+ end
153
+ end
154
+
155
+ def test_fetching_information_about_an_object_that_does_not_exist_raises_no_such_key
156
+ S3Object.in_test_mode do
157
+ S3Object.request_returns :body => '', :code => 404
158
+ assert_raises(NoSuchKey) do
159
+ S3Object.about('asdfasdfasdfas-this-does-not-exist', 'bucket does not matter')
160
+ end
161
+ end
162
+ end
163
+ end
164
+
165
+ class MetadataTest < Test::Unit::TestCase
166
+ def setup
167
+ @metadata = S3Object::Metadata.new(Fixtures::Headers.headers_including_one_piece_of_metadata)
168
+ end
169
+
170
+ def test_only_metadata_is_extracted
171
+ assert @metadata.to_headers.size == 1
172
+ assert @metadata.to_headers['x-amz-meta-test']
173
+ assert_equal 'foo', @metadata.to_headers['x-amz-meta-test']
174
+ end
175
+
176
+ def test_setting_new_metadata_normalizes_name
177
+ @metadata[:bar] = 'baz'
178
+ assert @metadata.to_headers.include?('x-amz-meta-bar')
179
+ @metadata['baz'] = 'quux'
180
+ assert @metadata.to_headers.include?('x-amz-meta-baz')
181
+ @metadata['x-amz-meta-quux'] = 'whatever'
182
+ assert @metadata.to_headers.include?('x-amz-meta-quux')
183
+ end
184
+
185
+ def test_clobbering_existing_header
186
+ @metadata[:bar] = 'baz'
187
+ assert_equal 'baz', @metadata.to_headers['x-amz-meta-bar']
188
+ @metadata[:bar] = 'quux'
189
+ assert_equal 'quux', @metadata.to_headers['x-amz-meta-bar']
190
+ @metadata['bar'] = 'foo'
191
+ assert_equal 'foo', @metadata.to_headers['x-amz-meta-bar']
192
+ @metadata['x-amz-meta-bar'] = 'bar'
193
+ assert_equal 'bar', @metadata.to_headers['x-amz-meta-bar']
194
+ end
195
+
196
+ def test_invalid_metadata
197
+ @metadata[:invalid_header] = ' ' * (S3Object::Metadata::SIZE_LIMIT + 1)
198
+ assert_raises InvalidMetadataValue do
199
+ @metadata.to_headers
200
+ end
201
+ end
202
+ end
203
+
204
+ class ValueTest < Test::Unit::TestCase
205
+ def setup
206
+ @response = FakeResponse.new(:body => 'hello there')
207
+ @value = S3Object::Value.new(@response)
208
+ end
209
+
210
+ def test_value_is_set_to_response_body
211
+ assert_equal @response.body, @value
212
+ end
213
+
214
+ def test_response_is_accessible_from_value_object
215
+ assert_equal @response, @value.response
216
+ end
217
+ end
@@ -0,0 +1,66 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class TypecastingTest < Test::Unit::TestCase
4
+ # Make it easier to call methods in tests
5
+ Parsing::Typecasting.public_instance_methods.each do |method|
6
+ Parsing::Typecasting.send(:module_function, method)
7
+ end
8
+
9
+ def test_array_with_one_element_that_is_a_hash
10
+ value = [{'Available' => 'true'}]
11
+ assert_equal [{'available' => true}], Parsing::Typecasting.typecast(value)
12
+ end
13
+
14
+ def test_hash_with_one_key_whose_value_is_an_array
15
+ value = {
16
+ 'Bucket' =>
17
+ [
18
+ {'Available' => 'true'}
19
+ ]
20
+ }
21
+
22
+ expected = {
23
+ 'bucket' =>
24
+ [
25
+ {'available' => true}
26
+ ]
27
+ }
28
+ assert_equal expected, Parsing::Typecasting.typecast(value)
29
+ end
30
+
31
+ end
32
+
33
+ class XmlParserTest < Test::Unit::TestCase
34
+ def test_bucket_is_always_forced_to_be_an_array_unless_empty
35
+ one_bucket = Parsing::XmlParser.new(Fixtures::Buckets.bucket_list_with_one_bucket)
36
+ more_than_one = Parsing::XmlParser.new(Fixtures::Buckets.bucket_list_with_more_than_one_bucket)
37
+
38
+ [one_bucket, more_than_one].each do |bucket_list|
39
+ assert_kind_of Array, bucket_list['buckets']['bucket']
40
+ end
41
+
42
+ no_buckets = Parsing::XmlParser.new(Fixtures::Buckets.empty_bucket_list)
43
+ assert no_buckets.has_key?('buckets')
44
+ assert_nil no_buckets['buckets']
45
+ end
46
+
47
+ def test_bucket_contents_are_forced_to_be_an_array_unless_empty
48
+ one_key = Parsing::XmlParser.new(Fixtures::Buckets.bucket_with_one_key)
49
+ more_than_one = Parsing::XmlParser.new(Fixtures::Buckets.bucket_with_more_than_one_key)
50
+ [one_key, more_than_one].each do |bucket_with_contents|
51
+ assert_kind_of Array, bucket_with_contents['contents']
52
+ end
53
+
54
+ no_keys = Parsing::XmlParser.new(Fixtures::Buckets.empty_bucket)
55
+ assert !no_keys.has_key?('contents')
56
+ end
57
+
58
+ def test_policy_grants_are_always_an_array
59
+ policy = Parsing::XmlParser.new(Fixtures::Policies.policy_with_one_grant)
60
+ assert_kind_of Array, policy['access_control_list']['grant']
61
+ end
62
+
63
+ def test_empty_xml_response_is_not_parsed
64
+ assert_equal({}, Parsing::XmlParser.new(''))
65
+ end
66
+ end