vacuum 0.1.3 → 0.2.0.pre

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.
Files changed (41) hide show
  1. data/README.md +69 -27
  2. data/lib/vacuum/endpoint/base.rb +58 -0
  3. data/lib/vacuum/endpoint/mws.rb +59 -0
  4. data/lib/vacuum/endpoint/product_advertising.rb +34 -0
  5. data/lib/vacuum/mws.rb +8 -0
  6. data/lib/vacuum/product_advertising.rb +7 -0
  7. data/lib/vacuum/request/base.rb +96 -0
  8. data/lib/vacuum/request/mws.rb +24 -0
  9. data/lib/vacuum/request/product_advertising.rb +90 -0
  10. data/lib/vacuum/request/signature/authentication.rb +32 -0
  11. data/lib/vacuum/request/signature/builder.rb +70 -0
  12. data/lib/vacuum/request/utils.rb +24 -0
  13. data/lib/vacuum/response/base.rb +57 -0
  14. data/lib/vacuum/response/mws.rb +7 -0
  15. data/lib/vacuum/response/product_advertising.rb +19 -0
  16. data/lib/vacuum/response/utils.rb +48 -0
  17. data/lib/vacuum/version.rb +1 -1
  18. data/lib/vacuum.rb +31 -11
  19. data/spec/fixtures/{http_response → product_advertising} +0 -0
  20. data/spec/spec_helper.rb +5 -4
  21. data/spec/support/shared_examples/endpoint.rb +43 -0
  22. data/spec/support/shared_examples/request.rb +95 -0
  23. data/spec/support/shared_examples/response.rb +51 -0
  24. data/spec/vacuum/endpoint/base_spec.rb +19 -0
  25. data/spec/vacuum/endpoint/mws_spec.rb +47 -0
  26. data/spec/vacuum/endpoint/product_advertising_spec.rb +25 -0
  27. data/spec/vacuum/request/base_spec.rb +22 -0
  28. data/spec/vacuum/request/mws_spec.rb +26 -0
  29. data/spec/vacuum/request/product_advertising_spec.rb +104 -0
  30. data/spec/vacuum/request/signature/authentication_spec.rb +30 -0
  31. data/spec/vacuum/request/signature/builder_spec.rb +76 -0
  32. data/spec/vacuum/request/utils_spec.rb +23 -0
  33. data/spec/vacuum/response/base_spec.rb +38 -0
  34. data/spec/vacuum/response/product_advertising_spec.rb +57 -0
  35. data/spec/vacuum/response/utils_spec.rb +42 -0
  36. metadata +107 -21
  37. data/lib/vacuum/em.rb +0 -21
  38. data/lib/vacuum/request.rb +0 -119
  39. data/lib/vacuum/response.rb +0 -63
  40. data/spec/vacuum/request_spec.rb +0 -130
  41. data/spec/vacuum/response_spec.rb +0 -80
@@ -1,130 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Vacuum
4
- describe Request do
5
- let(:req) do
6
- Request.new :locale => :us,
7
- :key => 'foo',
8
- :secret => 'bar',
9
- :tag => 'baz'
10
- end
11
-
12
- describe ".new" do
13
- it 'raises an error if key is missing' do
14
- expect do
15
- Request.new :secret => 'foo',
16
- :tag => 'bar'
17
- end.to raise_error MissingKey
18
- end
19
-
20
- it 'raises an error if secret is missing' do
21
- expect do
22
- Request.new :key => 'foo',
23
- :tag => 'bar'
24
- end.to raise_error MissingSecret
25
- end
26
-
27
- it 'raises an error if tag is missing' do
28
- expect do
29
- Request.new :key => 'foo',
30
- :secret => 'bar'
31
- end.to raise_error MissingTag
32
- end
33
-
34
- it 'raises an error if locale is not valid' do
35
- expect do
36
- Request.new :key => 'foo',
37
- :secret => 'bar',
38
- :tag => 'baz',
39
- :locale => 'bad'
40
- end.to raise_error BadLocale
41
- end
42
- end
43
-
44
- describe '#build' do
45
- it 'merges parameters into the query' do
46
- req.build 'Key' => 'value'
47
- req.params['Key'].should eql 'value'
48
- end
49
-
50
- it 'casts values to string' do
51
- req.build 'Key' => 1
52
- req.params['Key'].should eql '1'
53
-
54
- req.build 'Key' => ['foo', 'bar']
55
- req.params['Key'].should eql 'foo,bar'
56
- end
57
-
58
- it 'returns self' do
59
- req.build({}).should eql req
60
- end
61
- end
62
-
63
- describe '#build!' do
64
- it 'clears existing query' do
65
- req.build 'Key' => 'value'
66
- req.params.should have_key 'Key'
67
-
68
- req.build!.params.should_not have_key 'Key'
69
- end
70
- end
71
-
72
- describe '#get' do
73
- it 'returns a response' do
74
- req.get.should be_a Response
75
- end
76
- end
77
-
78
- describe '#params' do
79
- it 'includes shared request parameters' do
80
- req.params['Service'].should eql 'AWSECommerceService'
81
- end
82
-
83
- it 'includes credentials' do
84
- req.params.should have_key 'AWSAccessKeyId'
85
- req.params.should have_key 'AssociateTag'
86
- end
87
-
88
- it 'includes a timestamp' do
89
- req.params['Timestamp'].should =~ /^\d+-\d+-\d+T\d+:\d+:\d+Z$/
90
- end
91
-
92
- context 'when no API version is given' do
93
- it 'includes the current API version' do
94
- req.params['Version'].should eql Request::CURRENT_API_VERSION
95
- end
96
- end
97
-
98
- context 'when an API version is given' do
99
- it 'includes the given API version' do
100
- req.build 'Version' => '1'
101
- req.params['Version'].should eql '1'
102
- end
103
- end
104
- end
105
-
106
- describe '#url' do
107
- it 'builds a URL' do
108
- req.url.should be_a URI::HTTP
109
- end
110
-
111
- it 'canonicalizes the request parameters' do
112
- req.url.query.should match /\w+=\w+&/
113
- end
114
-
115
- it 'sorts the request parameters' do
116
- req.build 'A' => 1
117
- req.url.query.should match /^A=1&/
118
- end
119
-
120
- it 'URL-encodes values' do
121
- req.build 'Key' => 'foo,bar'
122
- req.url.query.should match /foo%2Cbar/
123
- end
124
-
125
- it 'is signed' do
126
- req.url.query.should match /&Signature=/
127
- end
128
- end
129
- end
130
- end
@@ -1,80 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Vacuum
4
- describe Response do
5
- let(:res) do
6
- body = File.read(File.expand_path('../../fixtures/http_response', __FILE__))
7
- Response.new(body, '200')
8
- end
9
-
10
- describe '#errors' do
11
- it 'returns an array of errors' do
12
- res.body = <<-EOF.gsub!(/>\s+</, '><').strip!
13
- <?xml version=\"1.0\" ?>
14
- <Response xmlns="http://example.com">
15
- <Errors>
16
- <Error>foo</Error>
17
- </Errors>
18
- </Response>
19
- EOF
20
-
21
- res.errors.should =~ ['foo']
22
- end
23
- end
24
-
25
- describe '#find' do
26
- it 'returns an array of matching nodes' do
27
- res.find('ASIN').should_not be_empty
28
- end
29
-
30
- it 'yields matches to a block if given one' do
31
- titles = res.find('Item') { |item| item['ItemAttributes']['Title'] }
32
- titles.count.should eql 2
33
- titles.each { |title| title.should be_a String }
34
- end
35
- end
36
-
37
- describe '#has_errors?' do
38
- context 'when response does not contain any errors' do
39
- it 'returns false' do
40
- res.stub!(:errors).and_return([])
41
- res.should_not have_errors
42
- end
43
- end
44
-
45
- context 'when response contains errors' do
46
- it 'returns true' do
47
- res.stub!(:errors).and_return([1])
48
- res.should have_errors
49
- end
50
- end
51
- end
52
-
53
- describe '#to_hash' do
54
- it 'casts response to a hash' do
55
- res.to_hash.should be_a Hash
56
- end
57
- end
58
-
59
- describe '#valid?' do
60
- context 'when HTTP status is OK' do
61
- it 'returns true' do
62
- res.should be_valid
63
- end
64
- end
65
-
66
- context 'when HTTP status is not OK' do
67
- it 'returns false' do
68
- res.code = 403
69
- res.should_not be_valid
70
- end
71
- end
72
- end
73
-
74
- describe '#xml' do
75
- it 'returns a Nokogiri document' do
76
- res.xml.should be_an_instance_of Nokogiri::XML::Document
77
- end
78
- end
79
- end
80
- end