aus_post_api 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +7 -0
  5. data/Gemfile.lock +37 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +147 -0
  8. data/Rakefile +32 -0
  9. data/aus_post_api.gemspec +14 -0
  10. data/lib/aus_post_api.rb +7 -0
  11. data/lib/aus_post_api/dce.rb +15 -0
  12. data/lib/aus_post_api/dce/endpoint.rb +80 -0
  13. data/lib/aus_post_api/dce/validate_australian_address.rb +12 -0
  14. data/lib/aus_post_api/endpoint.rb +66 -0
  15. data/lib/aus_post_api/endpoint/attributes.rb +54 -0
  16. data/lib/aus_post_api/pac.rb +83 -0
  17. data/lib/aus_post_api/pac/country.rb +9 -0
  18. data/lib/aus_post_api/pac/domestic_letter_size.rb +9 -0
  19. data/lib/aus_post_api/pac/domestic_letter_thickness.rb +9 -0
  20. data/lib/aus_post_api/pac/domestic_letter_weight.rb +9 -0
  21. data/lib/aus_post_api/pac/domestic_parcel_size.rb +9 -0
  22. data/lib/aus_post_api/pac/domestic_parcel_type.rb +9 -0
  23. data/lib/aus_post_api/pac/domestic_parcel_weight.rb +9 -0
  24. data/lib/aus_post_api/pac/domestic_postcode_search.rb +12 -0
  25. data/lib/aus_post_api/pac/endpoint.rb +76 -0
  26. data/lib/aus_post_api/pac/international_letter_weight.rb +9 -0
  27. data/lib/aus_post_api/pac/international_parcel_weight.rb +9 -0
  28. data/lib/aus_post_api/pac/postage_letter_domestic_calculate.rb +12 -0
  29. data/lib/aus_post_api/pac/postage_letter_domestic_service.rb +11 -0
  30. data/lib/aus_post_api/pac/postage_letter_international_calculate.rb +12 -0
  31. data/lib/aus_post_api/pac/postage_letter_international_service.rb +11 -0
  32. data/lib/aus_post_api/pac/postage_parcel_domestic_calculate.rb +13 -0
  33. data/lib/aus_post_api/pac/postage_parcel_domestic_service.rb +12 -0
  34. data/lib/aus_post_api/pac/postage_parcel_international_calculate.rb +12 -0
  35. data/lib/aus_post_api/pac/postage_parcel_international_service.rb +11 -0
  36. data/lib/aus_post_api/uri_handler.rb +35 -0
  37. data/spec/aus_post_api/dce/endpoint_spec.rb +86 -0
  38. data/spec/aus_post_api/dce/validate_australian_address_spec.rb +18 -0
  39. data/spec/aus_post_api/dce_spec.rb +33 -0
  40. data/spec/aus_post_api/endpoint/attributes_spec.rb +35 -0
  41. data/spec/aus_post_api/endpoint_spec.rb +43 -0
  42. data/spec/aus_post_api/pac/country_spec.rb +8 -0
  43. data/spec/aus_post_api/pac/domestic_letter_size_spec.rb +8 -0
  44. data/spec/aus_post_api/pac/domestic_letter_thickness_spec.rb +8 -0
  45. data/spec/aus_post_api/pac/domestic_letter_weight_spec.rb +8 -0
  46. data/spec/aus_post_api/pac/domestic_parcel_size_spec.rb +8 -0
  47. data/spec/aus_post_api/pac/domestic_parcel_type_spec.rb +8 -0
  48. data/spec/aus_post_api/pac/domestic_parcel_weight_spec.rb +8 -0
  49. data/spec/aus_post_api/pac/endpoint_spec.rb +109 -0
  50. data/spec/aus_post_api/pac/international_letter_weight_spec.rb +8 -0
  51. data/spec/aus_post_api/pac/international_parcel_weight_spec.rb +8 -0
  52. data/spec/aus_post_api/pac/postage_letter_domestic_calculate_spec.rb +19 -0
  53. data/spec/aus_post_api/pac/postage_letter_domestic_service_spec.rb +15 -0
  54. data/spec/aus_post_api/pac/postage_letter_international_calculate_spec.rb +20 -0
  55. data/spec/aus_post_api/pac/postage_letter_international_service_spec.rb +13 -0
  56. data/spec/aus_post_api/pac/postage_parcel_domestic_calculate_spec.rb +24 -0
  57. data/spec/aus_post_api/pac/postage_parcel_domestic_service_spec.rb +17 -0
  58. data/spec/aus_post_api/pac/postage_parcel_international_calculate_spec.rb +15 -0
  59. data/spec/aus_post_api/pac/postage_parcel_international_service_spec.rb +8 -0
  60. data/spec/aus_post_api/pac/postcode_search_spec.rb +17 -0
  61. data/spec/aus_post_api/pac_spec.rb +101 -0
  62. data/spec/aus_post_api/uri_handler_spec.rb +14 -0
  63. data/spec/shared_examples/shared_examples_for_endpoint_classes.rb +37 -0
  64. data/spec/spec_helper.rb +41 -0
  65. metadata +136 -0
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ describe AusPostAPI::DCE::Endpoint do
4
+ describe "Implementation" do
5
+ context "no `api_uri` method is defined" do
6
+ it "should raise an error" do
7
+ dce_endpoint = Class.new(AusPostAPI::DCE::Endpoint).new({}, dce_config)
8
+
9
+ expect { dce_endpoint.uri }.to(
10
+ raise_error(AusPostAPI::DCE::Endpoint::ImplementationError)
11
+ )
12
+ end
13
+ end
14
+
15
+ context "an `api_uri` method is defined" do
16
+ it "should not raise an error" do
17
+ dce_endpoint = Class.new(AusPostAPI::DCE::Endpoint) do
18
+ def api_uri
19
+ 'api_uri'
20
+ end
21
+ end.new({}, dce_config)
22
+
23
+ expect { dce_endpoint.uri }.to_not raise_error
24
+ end
25
+ end
26
+ end
27
+
28
+ describe "Configuration" do
29
+ before do
30
+ stub_const('DCEEndpoint', Class.new(AusPostAPI::DCE::Endpoint) {
31
+ def api_uri; 'api_uri'; end
32
+ })
33
+ end
34
+
35
+ describe "Format" do
36
+ context "no format is provided" do
37
+ it "should raise an error" do
38
+ no_format_config = dce_config
39
+ no_format_config.delete(:FORMAT)
40
+
41
+ dce_endpoint = DCEEndpoint.new({}, no_format_config)
42
+
43
+ expect { dce_endpoint.uri }.to(
44
+ raise_error(AusPostAPI::DCE::Endpoint::NoFormatProvidedError)
45
+ )
46
+ end
47
+ end
48
+
49
+ context "an invalid format is provided" do
50
+ it "should raise an error" do
51
+ dce_endpoint = DCEEndpoint.new({}, dce_config.merge(FORMAT: :invalid))
52
+
53
+ expect { dce_endpoint.uri }.to(
54
+ raise_error(AusPostAPI::DCE::Endpoint::InvalidFormatError)
55
+ )
56
+ end
57
+ end
58
+ end
59
+
60
+ context "no USERNAME is provided" do
61
+ it "should raise an error" do
62
+ no_username_config = dce_config
63
+ no_username_config.delete(:USERNAME)
64
+
65
+ dce_endpoint = DCEEndpoint.new({}, no_username_config)
66
+
67
+ expect { dce_endpoint.headers }.to(
68
+ raise_error(AusPostAPI::DCE::Endpoint::NoHeaderProvidedError)
69
+ )
70
+ end
71
+ end
72
+
73
+ context "no PASSWORD is provided" do
74
+ it "should raise an error" do
75
+ no_password_config = dce_config
76
+ no_password_config.delete(:PASSWORD)
77
+
78
+ dce_endpoint = DCEEndpoint.new({}, no_password_config)
79
+
80
+ expect { dce_endpoint.headers }.to(
81
+ raise_error(AusPostAPI::DCE::Endpoint::NoHeaderProvidedError)
82
+ )
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe AusPostAPI::DCE::ValidateAustralianAddress do
4
+ skip "There are no test credentials for this endpoint" do
5
+ let(:required_attributes) {
6
+ {
7
+ addressline1: '111',
8
+ suburb: "Melbourne",
9
+ postcode: "3000",
10
+ state: "VIC",
11
+ country: "AU"
12
+ }
13
+ }
14
+ let(:optional_attributes) { { addressline2: 'Bourke St' } }
15
+
16
+ it_behaves_like 'an endpoint'
17
+ end
18
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.shared_examples_for "a DCE endpoint wrapper" do |wrapped_api_class|
4
+ let(:api_instance) { instance_double(wrapped_api_class) }
5
+ let(:api_method) { convert_class_to_method(wrapped_api_class) }
6
+ let(:params) { { test: :param } }
7
+ let(:config) { { test: :config } }
8
+
9
+ it "should call execute on the appropriate api class" do
10
+ expect(wrapped_api_class).to receive(:new).with(params, config) { api_instance }
11
+ expect(api_instance).to receive(:execute)
12
+
13
+ AusPostAPI::DCE.new(config).send(api_method, params)
14
+ end
15
+ end
16
+
17
+ def convert_class_to_method(klass)
18
+ klass = klass.to_s.gsub(/AusPostAPI::DCE/, '')
19
+
20
+ # underscores -> camel case
21
+ klass
22
+ .to_s
23
+ .gsub(/.*::/, '')
24
+ .split(/(?=[A-Z])/)
25
+ .map(&:downcase)
26
+ .join('_')
27
+ end
28
+
29
+ describe AusPostAPI::DCE do
30
+ describe "#validate_australian_address" do
31
+ it_behaves_like 'a DCE endpoint wrapper', AusPostAPI::DCE::ValidateAustralianAddress
32
+ end
33
+ end
@@ -0,0 +1,35 @@
1
+ require_relative "../../../lib/aus_post_api/endpoint/attributes"
2
+
3
+ describe "Including the attributes module on a class" do
4
+ it "should allow attributes to be specified using the required_attributes method" do
5
+ test = Class.new do
6
+ include AusPostAPI::Endpoint::Attributes
7
+
8
+ required_attributes :one, :two
9
+ end.new
10
+
11
+ expect(test.required_attributes).to eql([:one, :two])
12
+
13
+ test.one = 1
14
+ test.two = 2
15
+
16
+ expect(test.one).to eql(1)
17
+ expect(test.two).to eql(2)
18
+ end
19
+
20
+ it "should allow attributes to be specified using the optional_attributes method" do
21
+ test = Class.new do
22
+ include AusPostAPI::Endpoint::Attributes
23
+
24
+ optional_attributes :one, :two
25
+ end.new
26
+
27
+ expect(test.optional_attributes).to eql([:one, :two])
28
+
29
+ test.one = 1
30
+ test.two = 2
31
+
32
+ expect(test.one).to eql(1)
33
+ expect(test.two).to eql(2)
34
+ end
35
+ end
@@ -0,0 +1,43 @@
1
+ require_relative '../../lib/aus_post_api/endpoint'
2
+
3
+ describe AusPostAPI::Endpoint do
4
+ before do
5
+ stub_const "NullUriHandler", Class.new { def self.call(uri, headers); nil; end }
6
+ stub_const "AusPost::API::Attributes", Module.new
7
+ end
8
+
9
+ describe "#execute" do
10
+ context "no `uri` or `headers` methods defined" do
11
+ it "should raise an error" do
12
+ test = AusPostAPI::Endpoint.new({}, {}, NullUriHandler)
13
+
14
+ expect { test.execute }.to raise_error(
15
+ AusPostAPI::Endpoint::ImplementationError
16
+ )
17
+ end
18
+ end
19
+
20
+ context "only the `uri` method defined" do
21
+ it "should raise an error" do
22
+ test = AusPostAPI::Endpoint.new({}, {}, NullUriHandler)
23
+
24
+ def test.uri; "uri"; end
25
+
26
+ expect { test.execute }.to raise_error(
27
+ AusPostAPI::Endpoint::ImplementationError
28
+ )
29
+ end
30
+ end
31
+
32
+ context "both the `uri` and the `headers` method defined" do
33
+ it "should not raise an error" do
34
+ test = AusPostAPI::Endpoint.new({}, {}, NullUriHandler)
35
+
36
+ def test.uri; "uri"; end
37
+ def test.headers; "headers"; end
38
+
39
+ expect { test.execute }.to_not raise_error
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe AusPostAPI::PAC::Country do
4
+ let(:required_attributes) { {} }
5
+ let(:optional_attributes) { {} }
6
+
7
+ it_behaves_like 'an endpoint'
8
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe AusPostAPI::PAC::DomesticLetterSize do
4
+ let(:required_attributes) { {} }
5
+ let(:optional_attributes) { {} }
6
+
7
+ it_behaves_like 'an endpoint'
8
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe AusPostAPI::PAC::DomesticLetterThickness do
4
+ let(:required_attributes) { {} }
5
+ let(:optional_attributes) { {} }
6
+
7
+ it_behaves_like 'an endpoint'
8
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe AusPostAPI::PAC::DomesticLetterWeight do
4
+ let(:required_attributes) { {} }
5
+ let(:optional_attributes) { {} }
6
+
7
+ it_behaves_like 'an endpoint'
8
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe AusPostAPI::PAC::DomesticParcelSize do
4
+ let(:required_attributes) { {} }
5
+ let(:optional_attributes) { {} }
6
+
7
+ it_behaves_like 'an endpoint'
8
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe AusPostAPI::PAC::DomesticParcelType do
4
+ let(:required_attributes) { {} }
5
+ let(:optional_attributes) { {} }
6
+
7
+ it_behaves_like 'an endpoint'
8
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe AusPostAPI::PAC::DomesticLetterSize do
4
+ let(:required_attributes) { {} }
5
+ let(:optional_attributes) { {} }
6
+
7
+ it_behaves_like 'an endpoint'
8
+ end
@@ -0,0 +1,109 @@
1
+ require 'spec_helper'
2
+
3
+ describe AusPostAPI::PAC::Endpoint do
4
+ describe "Implementation" do
5
+ context "no `api_uri` method is defined" do
6
+ it "should raise an error" do
7
+ pac_endpoint = Class.new(AusPostAPI::PAC::Endpoint).new({}, json_config)
8
+
9
+ expect { pac_endpoint.uri }.to(
10
+ raise_error(AusPostAPI::PAC::Endpoint::ImplementationError)
11
+ )
12
+ end
13
+ end
14
+
15
+ context "an `api_uri` method is defined" do
16
+ it "should not raise an error" do
17
+ pac_endpoint = Class.new(AusPostAPI::PAC::Endpoint) do
18
+ def api_uri
19
+ 'api_uri'
20
+ end
21
+ end.new({}, json_config)
22
+
23
+ expect { pac_endpoint.uri }.to_not raise_error
24
+ end
25
+ end
26
+ end
27
+
28
+ describe "Configuration" do
29
+ before do
30
+ stub_const('PACEndpoint', Class.new(AusPostAPI::PAC::Endpoint) {
31
+ def api_uri; 'api_uri'; end
32
+ })
33
+ end
34
+
35
+ context "no format is provided" do
36
+ it "should raise an error" do
37
+ no_format_config = json_config
38
+ no_format_config.delete(:FORMAT)
39
+
40
+ pac_endpoint = PACEndpoint.new({}, no_format_config)
41
+
42
+ expect { pac_endpoint.uri }.to(
43
+ raise_error(AusPostAPI::PAC::Endpoint::NoFormatProvidedError)
44
+ )
45
+ end
46
+ end
47
+
48
+ context "an invalid format is provided" do
49
+ it "should raise an error" do
50
+ pac_endpoint = PACEndpoint.new({}, json_config.merge(FORMAT: :invalid))
51
+
52
+ expect { pac_endpoint.uri }.to(
53
+ raise_error(AusPostAPI::PAC::Endpoint::InvalidFormatError)
54
+ )
55
+ end
56
+ end
57
+
58
+ context "no PAC_AUTH_KEY is provided" do
59
+ context "the TEST config is false" do
60
+ it "should raise an error" do
61
+ no_auth_key_config = json_config.merge(TEST: false)
62
+ no_auth_key_config.delete(:PAC_AUTH_KEY)
63
+
64
+ pac_endpoint = PACEndpoint.new({}, no_auth_key_config)
65
+
66
+ expect { pac_endpoint.headers }.to(
67
+ raise_error(AusPostAPI::PAC::Endpoint::NoAuthKeyProvidedError)
68
+ )
69
+ end
70
+ end
71
+
72
+ context "the TEST config is true" do
73
+ it "should not raise an error" do
74
+ no_auth_key_config = json_config.merge(TEST: true)
75
+ no_auth_key_config.delete(:PAC_AUTH_KEY)
76
+
77
+ pac_endpoint = PACEndpoint.new({}, no_auth_key_config)
78
+
79
+ expect { pac_endpoint.headers }.to_not raise_error
80
+ end
81
+ end
82
+ end
83
+
84
+ context "a PAC_AUTH_KEY is provided" do
85
+ context "the TEST config is false" do
86
+ it "should not raise an error" do
87
+ no_auth_key_config =
88
+
89
+ pac_endpoint = PACEndpoint.new({}, json_config.merge(
90
+ TEST: false, PAC_AUTH_KEY: :abc
91
+ ))
92
+
93
+ expect { pac_endpoint.headers }.to_not raise_error
94
+ end
95
+ end
96
+
97
+ context "the TEST config is true" do
98
+ it "should not raise an error" do
99
+
100
+ pac_endpoint = PACEndpoint.new({}, json_config.merge(
101
+ TEST: true, PAC_AUTH_KEY: :abc
102
+ ))
103
+
104
+ expect { pac_endpoint.headers }.to_not raise_error
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe AusPostAPI::PAC::InternationalLetterWeight do
4
+ let(:required_attributes) { {} }
5
+ let(:optional_attributes) { {} }
6
+
7
+ it_behaves_like 'an endpoint'
8
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe AusPostAPI::PAC::InternationalParcelWeight do
4
+ let(:required_attributes) { {} }
5
+ let(:optional_attributes) { {} }
6
+
7
+ it_behaves_like 'an endpoint'
8
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe AusPostAPI::PAC::PostageLetterDomesticCalculate do
4
+ let(:required_attributes) {
5
+ {
6
+ service_code: 'AUS_LETTER_REGULAR_LARGE',
7
+ weight: 100
8
+ }
9
+ }
10
+ let(:optional_attributes) {
11
+ {
12
+ option_code: 'AUS_SERVICE_OPTION_REGISTERED_POST',
13
+ suboption_code: 'AUS_SERVICE_OPTION_DELIVERY_CONFIRMATION',
14
+ extra_cover: 1000,
15
+ }
16
+ }
17
+
18
+ it_behaves_like 'an endpoint'
19
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe AusPostAPI::PAC::PostageLetterDomesticService do
4
+ let(:required_attributes) {
5
+ {
6
+ length: 100,
7
+ width: 100,
8
+ thickness: 20,
9
+ weight: 100
10
+ }
11
+ }
12
+ let(:optional_attributes) { {} }
13
+
14
+ it_behaves_like 'an endpoint'
15
+ end