easypost 2.0.11 → 2.0.12

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ === 2.0.12 2014-07-07
2
+
3
+ * Added Item, Container, and Order resources.
4
+ * Fixed and added a lot of tests.
5
+
6
+
1
7
  === 2.0.11 2013-12-16
2
8
 
3
9
  * Added Event.receive method for parsing events sent by webhook.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- easypost (2.0.10)
4
+ easypost (2.0.11)
5
5
  multi_json (>= 1.0.4, < 2)
6
6
  rest-client (~> 1.4)
7
7
 
@@ -9,8 +9,8 @@ GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
11
  diff-lcs (1.2.4)
12
- mime-types (1.23)
13
- multi_json (1.7.7)
12
+ mime-types (1.25.1)
13
+ multi_json (1.8.4)
14
14
  rest-client (1.6.7)
15
15
  mime-types (>= 1.16)
16
16
  rspec (2.13.0)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.11
1
+ 2.0.12
@@ -21,6 +21,9 @@ require 'easypost/refund'
21
21
  require 'easypost/event'
22
22
  require 'easypost/batch'
23
23
  require 'easypost/tracker'
24
+ require 'easypost/item'
25
+ require 'easypost/container'
26
+ require 'easypost/order'
24
27
 
25
28
  require 'easypost/error'
26
29
 
@@ -0,0 +1,4 @@
1
+ module EasyPost
2
+ class Container < Resource
3
+ end
4
+ end
@@ -0,0 +1,10 @@
1
+ module EasyPost
2
+ class Item < Resource
3
+
4
+ def self.retrieve_reference(params={})
5
+ response, api_key = EasyPost.request(:get, url + '/retrieve_reference', @api_key, params)
6
+ return EasyPost::Util::convert_to_easypost_object(response, api_key) if response
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,19 @@
1
+ module EasyPost
2
+ class Order < Resource
3
+
4
+ def buy(params={})
5
+ if params.instance_of?(EasyPost::Rate)
6
+ temp = params.clone
7
+ params = {}
8
+ params[:carrier] = temp.carrier
9
+ params[:service] = temp.service
10
+ end
11
+
12
+ response, api_key = EasyPost.request(:post, url + '/buy', @api_key, params)
13
+ self.refresh_from(response, @api_key, true)
14
+
15
+ return self
16
+ end
17
+
18
+ end
19
+ end
@@ -1,12 +1,6 @@
1
1
  module EasyPost
2
2
  class Shipment < Resource
3
3
 
4
- def self.track_with_code(params={})
5
- response, api_key = EasyPost.request(:get, url + '/track', @api_key, params)
6
-
7
- return response
8
- end
9
-
10
4
  def get_rates(params={})
11
5
  response, api_key = EasyPost.request(:get, url + '/rates', @api_key, params)
12
6
  self.refresh_from(response, @api_key, true)
@@ -76,7 +70,7 @@ module EasyPost
76
70
  lowest = nil
77
71
 
78
72
  self.get_rates unless self.rates
79
-
73
+
80
74
  if !carriers.is_a?(Array)
81
75
  carriers = carriers.split(',')
82
76
  end
@@ -125,13 +119,13 @@ module EasyPost
125
119
  next
126
120
  end
127
121
 
128
- if lowest == nil || k.rate.to_f < lowest.rate.to_f
122
+ if lowest == nil || k.rate.to_f < lowest.rate.to_f
129
123
  lowest = k
130
124
  end
131
125
  end
132
126
 
133
127
  raise Error.new('No rates found.') if lowest == nil
134
-
128
+
135
129
  return lowest
136
130
  end
137
131
 
@@ -27,6 +27,9 @@ module EasyPost
27
27
  'Event' => Event,
28
28
  'Batch' => Batch,
29
29
  'Tracker' => Tracker,
30
+ 'Item' => Item,
31
+ 'Container' => Container,
32
+ 'Order' => Order,
30
33
  'PostageLabel' => PostageLabel }
31
34
 
32
35
  prefixes = { 'adr' => Address,
@@ -40,6 +43,9 @@ module EasyPost
40
43
  'evt' => Event,
41
44
  'batch' => Batch,
42
45
  'trk' => Tracker,
46
+ 'item' => Item,
47
+ 'container' => Container,
48
+ 'order' => Order,
43
49
  'pl' => PostageLabel }
44
50
 
45
51
  case response
@@ -1,36 +1,26 @@
1
- require 'easypost'
2
- EasyPost.api_key = 'cueqNZUb3ldeWTNX7MU3Mel8UXtaAMUi'
1
+ require 'spec_helper'
3
2
 
4
3
  describe EasyPost::Address do
5
4
  describe '#create' do
6
5
  it 'creates an address object' do
7
- address = EasyPost::Address.create(
8
- :name => 'Sawyer Bateman',
9
- :street1 => '1A Larkspur Cres.',
10
- :city => 'St. Albert',
11
- :state => 'AB',
12
- :zip => 't8n2m4',
13
- :country => 'CA'
14
- )
6
+ address = EasyPost::Address.create(ADDRESS[:california])
7
+
15
8
  expect(address).to be_an_instance_of(EasyPost::Address)
16
- expect(address.name).to eq('Sawyer Bateman')
9
+ expect(address.company).to eq('EasyPost')
17
10
  end
18
11
  end
12
+
19
13
  describe '#verify' do
20
14
  it 'verifies an address with message' do
21
- address = EasyPost::Address.create(
22
- :company => 'Simpler Postage Inc',
23
- :street1 => '388 Townsend Street',
24
- :city => 'San Francisco',
25
- :state => 'CA',
26
- :zip => '94107'
27
- )
28
- expect(address.company).to eq('Simpler Postage Inc')
29
- expect(address.street1).to eq('388 Townsend Street')
15
+ address = EasyPost::Address.create(ADDRESS[:california].reject {|k,v| k == :street2})
16
+
17
+ expect(address.company).to eq('EasyPost')
18
+ expect(address.street1).to eq('164 Townsend Street')
30
19
  expect(address.city).to eq('San Francisco')
31
20
  expect(address.state).to eq('CA')
32
21
  expect(address.zip).to eq('94107')
33
22
  expect(address.country).to eq('US')
23
+ expect(address.street2).to be_nil
34
24
 
35
25
  verified_address = address.verify()
36
26
  expect(verified_address).to be_an_instance_of(EasyPost::Address)
@@ -38,21 +28,9 @@ describe EasyPost::Address do
38
28
  end
39
29
 
40
30
  it 'verifies an address without message' do
41
- address = EasyPost::Address.create(
42
- :company => 'Simpler Postage Inc',
43
- :street1 => '388 Townsend Street',
44
- :street2 => 'Apt 20',
45
- :city => 'San Francisco',
46
- :state => 'CA',
47
- :zip => '94107'
48
- )
49
- expect(address.company).to eq('Simpler Postage Inc')
50
- expect(address.street1).to eq('388 Townsend Street')
51
- expect(address.street2).to eq('Apt 20')
52
- expect(address.city).to eq('San Francisco')
53
- expect(address.state).to eq('CA')
54
- expect(address.zip).to eq('94107')
55
- expect(address.country).to eq('US')
31
+ address = EasyPost::Address.create(ADDRESS[:california])
32
+
33
+ expect(address.street2).to be
56
34
 
57
35
  verified_address = address.verify()
58
36
  expect(verified_address).to be_an_instance_of(EasyPost::Address)
@@ -64,9 +42,9 @@ describe EasyPost::Address do
64
42
  :company => 'Simpler Postage Inc',
65
43
  :street1 => '388 Junk Teerts',
66
44
  :street2 => 'Apt 20',
67
- :city => 'San Francisco',
68
- :state => 'CA',
69
- :zip => '941abc07'
45
+ :city => 'San Francisco',
46
+ :state => 'CA',
47
+ :zip => '941abc07'
70
48
  )
71
49
 
72
50
  expect { verified_address = address.verify() }.to raise_error(EasyPost::Error, /Address Not Found./)
@@ -4,42 +4,21 @@ describe EasyPost::Batch do
4
4
 
5
5
  describe '#create' do
6
6
  it 'creates a batch object' do
7
- from_address = EasyPost::Address.create(
8
- :name => "Benchmark Merchandising",
9
- :street1 => "329 W 18th Street",
10
- :city => "Chicago",
11
- :state => "IL",
12
- :zip => "60616"
13
- )
14
- to_address = EasyPost::Address.create(
15
- :street1 => "902 Broadway 4th Floor",
16
- :city => "New York",
17
- :state => "NY",
18
- :zip => "10010"
19
- )
20
- parcel = EasyPost::Parcel.create(
21
- :weight => 7.2,
22
- :height => 2,
23
- :width => 7.5,
24
- :length => 10.5
25
- )
26
-
27
7
  batch = EasyPost::Batch.create({
28
8
  :shipment => [{
29
- :from_address => from_address,
30
- :to_address => to_address,
31
- :parcel => parcel
9
+ :from_address => ADDRESS[:california],
10
+ :to_address => ADDRESS[:missouri],
11
+ :parcel => PARCEL[:dimensions]
32
12
  }, {
33
- :from_address => from_address,
34
- :to_address => to_address,
35
- :parcel => parcel,
36
- :reference => 'refnum9173'
13
+ :from_address => ADDRESS[:california],
14
+ :to_address => ADDRESS[:canada],
15
+ :parcel => PARCEL[:dimensions],
37
16
  }],
38
- :reference => "abc-123"
39
- })
17
+ :reference => "batch123456789"
18
+ })
40
19
  expect(batch).to be_an_instance_of(EasyPost::Batch)
41
20
  expect(batch.num_shipments).to eq(2)
42
- expect(batch.reference).to eq("abc-123")
21
+ expect(batch.reference).to eq("batch123456789")
43
22
  expect(batch.state).to eq("creating")
44
23
 
45
24
  # sleeps_left = 10
@@ -57,46 +36,21 @@ describe EasyPost::Batch do
57
36
 
58
37
  describe '#create_and_buy' do
59
38
  it 'creates a batch object and delayed jobs for purchasing the postage_labels' do
60
- from_address = EasyPost::Address.create(
61
- :name => "Benchmark Merchandising",
62
- :street1 => "329 W 18th Street",
63
- :city => "Chicago",
64
- :state => "IL",
65
- :zip => "60616"
66
- )
67
- to_address = EasyPost::Address.create(
68
- :name => "Don Juan",
69
- :street1 => "902 Broadway 4th Floor",
70
- :city => "New York",
71
- :state => "NY",
72
- :zip => "10010"
73
-
74
- )
75
- parcel = EasyPost::Parcel.create(
76
- :weight => 7.2,
77
- :height => 2,
78
- :width => 7.5,
79
- :length => 10.5
80
- )
81
-
82
- batch = EasyPost::Batch.create_and_buy({:shipment =>
83
- [
84
- {
85
- :from_address => from_address,
86
- :to_address => to_address,
87
- :parcel => parcel,
88
- :carrier => 'USPS',
89
- :service => 'Priority'
90
- },
91
- {
92
- :from_address => from_address,
93
- :to_address => to_address,
94
- :parcel => parcel,
95
- :reference => 'refnum9173',
96
- :carrier => 'UPS',
97
- :service => '2ndDayAir'
98
- }
99
- ]
39
+ batch = EasyPost::Batch.create({
40
+ :shipment => [{
41
+ :from_address => ADDRESS[:california],
42
+ :to_address => ADDRESS[:missouri],
43
+ :parcel => PARCEL[:dimensions],
44
+ :carrier => "usps",
45
+ :service => "priority"
46
+ }, {
47
+ :from_address => ADDRESS[:california],
48
+ :to_address => ADDRESS[:canada],
49
+ :parcel => PARCEL[:dimensions],
50
+ :carrier => "usps",
51
+ :service => "prioritymailinternational"
52
+ }],
53
+ :reference => "batch123456789"
100
54
  })
101
55
  expect(batch).to be_an_instance_of(EasyPost::Batch)
102
56
  expect(batch.state).to eq("creating")
@@ -0,0 +1,87 @@
1
+ require 'spec_helper'
2
+
3
+ describe EasyPost::Container do
4
+
5
+ describe '#create' do
6
+ it 'creates a container object' do
7
+ container = EasyPost::Container.create(
8
+ name: "Spec Box 1",
9
+ length: 6.2,
10
+ width: 12.8,
11
+ height: 13.5,
12
+ max_weight: 40.55,
13
+ reference: "SPECBOX",
14
+ )
15
+ expect(container).to be_an_instance_of(EasyPost::Container)
16
+ expect(container.max_weight).to eq(40.55)
17
+ end
18
+
19
+ it 'fails to create a container object' do
20
+ expect { EasyPost::Container.create(
21
+ name: "Missing dimension",
22
+ length: 6,
23
+ width: 12,
24
+ max_weight: 40
25
+ ) }.to raise_exception(EasyPost::Error, /Invalid request, if one dimension is provided all three are required./)
26
+ end
27
+
28
+ it 'creates a container object with default values' do
29
+ container = EasyPost::Container.create(name: "Defaults Box")
30
+ expect(container).to be_an_instance_of(EasyPost::Container)
31
+ expect(container.id).to be
32
+ expect(container.name).to eq("Defaults Box")
33
+ expect(container.length).to eq(0.0)
34
+ expect(container.width).to eq(0.0)
35
+ expect(container.height).to eq(0.0)
36
+ expect(container.max_weight).to eq(0.0)
37
+ expect(container.type).to eq("BOX")
38
+ end
39
+ end
40
+
41
+ describe '#retrieve' do
42
+ it 'retrieves a user created container by public_id' do
43
+ container_1 = EasyPost::Container.create(
44
+ name: "My Box",
45
+ length: 6.2,
46
+ width: 12.8,
47
+ height: 13.5,
48
+ max_weight: 40.55,
49
+ reference: "SPECBOX",
50
+ type: "BAG",
51
+ )
52
+ container_2 = EasyPost::Container.retrieve(container_1.id)
53
+
54
+ expect(container_1).to be_an_instance_of(EasyPost::Container)
55
+ expect(container_2).to be_an_instance_of(EasyPost::Container)
56
+ expect(container_2.id).to eq(container_1.id)
57
+ expect(container_1.type).to eq("BAG")
58
+ end
59
+
60
+ it 'retrieves a user created container by reference' do
61
+ container_1 = EasyPost::Container.create(
62
+ name: "Spec Box 2",
63
+ length: 6.2,
64
+ width: 12.8,
65
+ height: 133.94,
66
+ max_weight: 40.55,
67
+ reference: "SPECBOX4",
68
+ )
69
+ container_2 = EasyPost::Container.retrieve("SPECBOX4")
70
+
71
+ expect(container_1).to be_an_instance_of(EasyPost::Container)
72
+ expect(container_2).to be_an_instance_of(EasyPost::Container)
73
+ expect(container_2.height).to eq(container_1.height)
74
+ expect(container_1.type).to eq("BOX")
75
+ end
76
+
77
+ it 'retrieves global containers' do
78
+ container_1 = EasyPost::Container.retrieve("container_USPSFR03")
79
+ container_2 = EasyPost::Container.retrieve("container_USPSFR02")
80
+
81
+ expect(container_1).to be_an_instance_of(EasyPost::Container)
82
+ expect(container_2).to be_an_instance_of(EasyPost::Container)
83
+ expect(container_1.reference).to eq(container_2.reference)
84
+ end
85
+ end
86
+
87
+ end
@@ -0,0 +1,170 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'fedex domestic' do
4
+ before(:all) do
5
+ @rates = {}
6
+ end
7
+
8
+ it 'buys a commercial ground label' do
9
+ shipment = EasyPost::Shipment.create(
10
+ :to_address => ADDRESS[:california],
11
+ :from_address => ADDRESS[:missouri],
12
+ :parcel => PARCEL[:dimensions]
13
+ )
14
+ shipment.buy(:rate => shipment.lowest_rate("fedex", "FEDEX_GROUND"))
15
+ label = open(shipment.postage_label.label_url)
16
+
17
+ expect(shipment).to be_an_instance_of(EasyPost::Shipment)
18
+ expect(shipment.selected_rate).to be_an_instance_of(EasyPost::Rate)
19
+ expect(shipment.selected_rate.service).to eq("FEDEX_GROUND")
20
+ expect(shipment.postage_label.label_url).to end_with(".png")
21
+ expect(shipment.tracking_code).to start_with("8000")
22
+ expect(label.size).to be > 5000
23
+
24
+ @rates[:commercial] = shipment.selected_rate
25
+ end
26
+
27
+ it 'buys a residential ground label' do
28
+ shipment = EasyPost::Shipment.create(
29
+ :to_address => ADDRESS[:california],
30
+ :from_address => ADDRESS[:missouri],
31
+ :parcel => PARCEL[:dimensions],
32
+ :options => {:residential_to_address => true}
33
+ )
34
+ shipment.buy(:rate => shipment.lowest_rate("fedex", "GROUND_HOME_DELIVERY"))
35
+ label = open(shipment.postage_label.label_url)
36
+
37
+ expect(shipment.selected_rate.service).to eq("GROUND_HOME_DELIVERY")
38
+ expect(shipment.tracking_code).to start_with("8000")
39
+ expect(label.size).to be > 5000
40
+
41
+ @rates[:residential] = shipment.selected_rate
42
+ end
43
+
44
+ it 'buys a ground evening delivery label' do
45
+ shipment = EasyPost::Shipment.create(
46
+ :to_address => ADDRESS[:california],
47
+ :from_address => ADDRESS[:missouri],
48
+ :parcel => PARCEL[:dimensions],
49
+ :options => {:residential_to_address => true,
50
+ :delivery_time_preference => "evening"}
51
+ )
52
+ shipment.buy(:rate => shipment.lowest_rate("fedex", "GROUND_HOME_DELIVERY"))
53
+
54
+ expect(shipment.postage_label.label_url).to end_with(".png")
55
+
56
+ @rates[:residential_evening] = shipment.selected_rate
57
+ end
58
+
59
+ it 'raises error without recipient phone number' do
60
+ shipment = EasyPost::Shipment.create(
61
+ :to_address => ADDRESS[:california_no_phone],
62
+ :from_address => ADDRESS[:missouri],
63
+ :parcel => PARCEL[:dimensions]
64
+ )
65
+
66
+ expect { shipment.buy(rate: shipment.lowest_rate("fedex")) }.to raise_error(EasyPost::Error, /Unable to buy FedEx shipment without recipient phone number./)
67
+ end
68
+
69
+ it 'buys a label for an alcoholic shipment with epl2 label' do
70
+ shipment = EasyPost::Shipment.create(
71
+ :to_address => ADDRESS[:california],
72
+ :from_address => ADDRESS[:missouri],
73
+ :parcel => PARCEL[:dimensions],
74
+ :options => {
75
+ :alcohol => 1,
76
+ :label_format => "epl2"
77
+ }
78
+ )
79
+ shipment.buy(:rate => shipment.lowest_rate("fedex", "PRIORITY_OVERNIGHT"))
80
+
81
+ expect(shipment.postage_label.label_url).to end_with(".epl2")
82
+ end
83
+
84
+ it 'buys a label for a ground cod shipment' do
85
+ shipment = EasyPost::Shipment.create(
86
+ :to_address => ADDRESS[:california],
87
+ :from_address => ADDRESS[:missouri],
88
+ :parcel => PARCEL[:dimensions]
89
+ )
90
+ shipment_cod = EasyPost::Shipment.create(
91
+ :to_address => ADDRESS[:california],
92
+ :from_address => ADDRESS[:missouri],
93
+ :parcel => PARCEL[:dimensions],
94
+ :options => {cod_amount: 19.99}
95
+ )
96
+ shipment_cod.buy(rate: shipment_cod.lowest_rate("fedex", "FEDEX_GROUND"))
97
+
98
+ expect(shipment.lowest_rate("fedex", "FEDEX_GROUND").rate.to_f).to be < (shipment_cod.lowest_rate("fedex", "FEDEX_GROUND").rate.to_f)
99
+ expect(shipment.lowest_rate("fedex", "PRIORITY_OVERNIGHT").rate.to_f).to be < (shipment_cod.lowest_rate("fedex", "PRIORITY_OVERNIGHT").rate.to_f)
100
+ expect(shipment_cod.postage_label.label_url).to be
101
+ end
102
+
103
+ it 'buys a label for a ground multi-parcel cod shipment' do
104
+ order = EasyPost::Order.create(
105
+ to_address: ADDRESS[:california],
106
+ from_address: ADDRESS[:missouri],
107
+ shipments: [{
108
+ parcel: {length: 8, width: 6, height: 4, weight: 12},
109
+ options: {cod_amount: 14.99}
110
+ },{
111
+ parcel: {length: 8, width: 6, height: 4, weight: 12},
112
+ options: {cod_amount: 18.75}
113
+ }]
114
+ )
115
+ order.buy(carrier: "fedex", service: "FEDEX_GROUND")
116
+
117
+ expect(order).to be_an_instance_of(EasyPost::Order)
118
+ expect(order.shipments.first).to be_an_instance_of(EasyPost::Shipment)
119
+ expect(order.shipments[0].postage_label.label_url).to be
120
+ expect(order.shipments[1].postage_label.label_url).to be
121
+ end
122
+
123
+ it 'buys a label for an express cod shipment' do
124
+ shipment = EasyPost::Shipment.create(
125
+ :to_address => ADDRESS[:california],
126
+ :from_address => ADDRESS[:missouri],
127
+ :parcel => PARCEL[:dimensions]
128
+ )
129
+ shipment_cod = EasyPost::Shipment.create(
130
+ :to_address => ADDRESS[:california],
131
+ :from_address => ADDRESS[:missouri],
132
+ :parcel => PARCEL[:dimensions],
133
+ :options => {cod_amount: 19.99}
134
+ )
135
+ shipment_cod.buy(rate: shipment_cod.lowest_rate("fedex", "PRIORITY_OVERNIGHT"))
136
+
137
+ expect(shipment.lowest_rate("fedex", "FEDEX_GROUND").rate.to_f).to be < (shipment_cod.lowest_rate("fedex", "FEDEX_GROUND").rate.to_f)
138
+ expect(shipment.lowest_rate("fedex", "PRIORITY_OVERNIGHT").rate.to_f).to be < (shipment_cod.lowest_rate("fedex", "PRIORITY_OVERNIGHT").rate.to_f)
139
+ expect(shipment_cod.postage_label.label_url).to be
140
+ end
141
+
142
+ it 'buys a label for an express multi-parcel cod shipment' do
143
+ order = EasyPost::Order.create(
144
+ to_address: ADDRESS[:california],
145
+ from_address: ADDRESS[:missouri],
146
+ shipments: [{
147
+ parcel: {length: 8, width: 6, height: 4, weight: 12},
148
+ options: {cod_amount: 14.99}
149
+ },{
150
+ parcel: {length: 8, width: 6, height: 4, weight: 12},
151
+ options: {cod_amount: 18.75}
152
+ }]
153
+ )
154
+ order.buy(carrier: "fedex", service: "PRIORITY_OVERNIGHT")
155
+
156
+ expect(order).to be_an_instance_of(EasyPost::Order)
157
+ expect(order.shipments.first).to be_an_instance_of(EasyPost::Shipment)
158
+ expect(order.shipments[0].postage_label.label_url).to be
159
+ expect(order.shipments[1].postage_label.label_url).to be
160
+ end
161
+
162
+ after(:all) do
163
+ begin
164
+ expect(@rates[:residential_evening].rate.to_i).to be > @rates[:residential].rate.to_i
165
+ expect(@rates[:residential].rate.to_i).to be > @rates[:commercial].rate.to_i
166
+ rescue
167
+ end
168
+ end
169
+
170
+ end