Skip to content

Commit 50f2a7c

Browse files
committed
deliveries: implemented client.CancelDelivery
Updates #32 Cancel a delivery by means of the delivery ID. There are limitations however on when a cancellation can be made. See more information at https://developer.uber.com/docs/deliveries/references/api/v1/deliveries-delivery_id-cancel-post * Exhibit: ```go func cancelDelivery() { client, err := uber.NewClientFromOAuth2File("./testdata/.uber/credentials.json") if err != nil { log.Fatal(err) } err := client.CancelDelivery("71a969ca-5359-4334-a7b7-5a1705869c51") if err == nil { log.Printf("Successfully canceled that delivery!") } else { log.Printf("Failed to cancel that delivery, err: %v", err) } } ```
1 parent 3fb04ab commit 50f2a7c

5 files changed

Lines changed: 115 additions & 4 deletions

File tree

README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,3 +396,20 @@ func requestDelivery() {
396396
log.Printf("The confirmation: %+v\n", deliveryConfirmation)
397397
}
398398
```
399+
400+
* Cancel a delivery
401+
```go
402+
func cancelDelivery() {
403+
client, err := uber.NewClientFromOAuth2File("./testdata/.uber/credentials.json")
404+
if err != nil {
405+
log.Fatal(err)
406+
}
407+
408+
err := client.CancelDelivery("71a969ca-5359-4334-a7b7-5a1705869c51")
409+
if err == nil {
410+
log.Printf("Successfully canceled that delivery!")
411+
} else {
412+
log.Printf("Failed to cancel that delivery, err: %v", err)
413+
}
414+
}
415+
```

example_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,3 +419,17 @@ func Example_client_RequestDelivery() {
419419

420420
log.Printf("The confirmation: %+v\n", deliveryConfirmation)
421421
}
422+
423+
func Example_client_CancelDelivery() {
424+
client, err := uber.NewClientFromOAuth2File("./testdata/.uber/credentials.json")
425+
if err != nil {
426+
log.Fatal(err)
427+
}
428+
429+
err := client.CancelDelivery("71a969ca-5359-4334-a7b7-5a1705869c51")
430+
if err == nil {
431+
log.Printf("Successfully canceled that delivery!")
432+
} else {
433+
log.Printf("Failed to cancel that delivery, err: %v", err)
434+
}
435+
}

v1/deliveries.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"errors"
2121
"fmt"
2222
"net/http"
23+
"strings"
2324

2425
"github.com/orijtech/otils"
2526
)
@@ -210,7 +211,7 @@ func (c *Client) RequestDelivery(req *DeliveryRequest) (*DeliveryResponse, error
210211
return nil, err
211212
}
212213

213-
blob, _, err = c.doAuthAndHTTPReq(httpReq)
214+
blob, _, err = c.doHTTPReq(httpReq)
214215
if err != nil {
215216
return nil, err
216217
}
@@ -220,3 +221,22 @@ func (c *Client) RequestDelivery(req *DeliveryRequest) (*DeliveryResponse, error
220221
}
221222
return dRes, nil
222223
}
224+
225+
var errBlankDeliveryID = errors.New("expecting a non-blank deliveryID")
226+
227+
// CancelDelivery cancels a delivery referenced by its ID. There are
228+
// potential cancellation fees associated.
229+
// See https://developer.uber.com/docs/deliveries/faq for more information.
230+
func (c *Client) CancelDelivery(deliveryID string) error {
231+
deliveryID = strings.TrimSpace(deliveryID)
232+
if deliveryID == "" {
233+
return errBlankDeliveryID
234+
}
235+
theURL := fmt.Sprintf("%s/deliveries/%s/cancel", c.baseURL(), deliveryID)
236+
httpReq, err := http.NewRequest("POST", theURL, nil)
237+
if err != nil {
238+
return err
239+
}
240+
_, _, err = c.doHTTPReq(httpReq)
241+
return err
242+
}

v1/rides.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ func (c *Client) RequestRide(rreq *RideRequest) (*Ride, error) {
158158
if err != nil {
159159
return nil, err
160160
}
161-
blob, _, err = c.doAuthAndHTTPReq(req)
161+
blob, _, err = c.doHTTPReq(req)
162162
if err != nil {
163163
return nil, err
164164
}

v1/uber_test.go

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,43 @@ func TestListPaymentMethods(t *testing.T) {
7373
}
7474
}
7575

76-
func TestDeliveryRequest(t *testing.T) {
76+
func TestCancelDelivery(t *testing.T) {
77+
client, err := uber.NewClient(testToken1)
78+
if err != nil {
79+
t.Fatalf("initializing client; %v", err)
80+
}
81+
82+
backend := &tRoundTripper{route: cancelDeliveryRoute}
83+
transport := uberOAuth2.TransportWithBase(testOAuth2Token1, backend)
84+
client.SetHTTPRoundTripper(transport)
85+
86+
tests := [...]struct {
87+
reqID string
88+
wantErr bool
89+
}{
90+
0: {"", true},
91+
1: {" ", true},
92+
2: {reqID: deliveryID1},
93+
}
94+
95+
for i, tt := range tests {
96+
err := client.CancelDelivery(tt.reqID)
97+
gotErr := err != nil
98+
if gotErr != tt.wantErr {
99+
t.Errorf("#%d: gotErr=(%v) wantErr=(%v) err=(%v)", i, gotErr, tt.wantErr, err)
100+
}
101+
}
102+
}
103+
104+
func TestRequestDelivery(t *testing.T) {
77105
client, err := uber.NewClient(testToken1)
78106
if err != nil {
79107
t.Fatalf("initializing client; %v", err)
80108
}
81109

82110
backend := &tRoundTripper{route: deliveryRoute}
83-
client.SetHTTPRoundTripper(backend)
111+
transport := uberOAuth2.TransportWithBase(testOAuth2Token1, backend)
112+
client.SetHTTPRoundTripper(transport)
84113

85114
tests := [...]struct {
86115
req *uber.DeliveryRequest
@@ -918,6 +947,8 @@ func (trt *tRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
918947
return trt.upfrontFareRoundTrip(req)
919948
case deliveryRoute:
920949
return trt.deliveryRoundTrip(req)
950+
case cancelDeliveryRoute:
951+
return trt.cancelDeliveryRoundTrip(req)
921952
default:
922953
return makeResp("Not Found", http.StatusNotFound), nil
923954
}
@@ -1099,8 +1130,36 @@ func deliveryResponsePath(id string) string {
10991130

11001131
const (
11011132
deliveryResponseID1 = "gizmo"
1133+
1134+
deliveryID1 = "4536381f-2e29-40bb-88eb-004682aa332e"
1135+
deliveryID2 = "6ef419ce-1003-456c-8884-836f4d669093"
11021136
)
11031137

1138+
func knownDeliveryID(deliveryID string) bool {
1139+
switch deliveryID {
1140+
case deliveryID1, deliveryID2:
1141+
return true
1142+
default:
1143+
return false
1144+
}
1145+
}
1146+
1147+
func (trt *tRoundTripper) cancelDeliveryRoundTrip(req *http.Request) (*http.Response, error) {
1148+
if badAuthResp, _, err := prescreenAuthAndMethod(req, "POST"); badAuthResp != nil || err != nil {
1149+
return badAuthResp, err
1150+
}
1151+
splits := strings.Split(req.URL.Path, "/")
1152+
if len(splits) != 5 || (splits[2] != "deliveries" || splits[4] != "cancel") {
1153+
resp := makeResp("expecting a path of form: /v1.2/deliveries/<deliveryRequestID>/cancel", http.StatusBadRequest)
1154+
return resp, nil
1155+
}
1156+
deliveryID := splits[3]
1157+
if !knownDeliveryID(deliveryID) {
1158+
return makeResp("unknown deliveryID", http.StatusBadRequest), nil
1159+
}
1160+
return makeResp("204 No content", http.StatusNoContent), nil
1161+
}
1162+
11041163
func (trt *tRoundTripper) deliveryRoundTrip(req *http.Request) (*http.Response, error) {
11051164
if badAuthResp, _, err := prescreenAuthAndMethod(req, "POST"); badAuthResp != nil || err != nil {
11061165
return badAuthResp, err
@@ -1370,4 +1429,5 @@ const (
13701429
upfrontFareRoute = "upfront-fare"
13711430
deliveryRoute = "delivery"
13721431
sandboxTesterRoute = "sandbox-test"
1432+
cancelDeliveryRoute = "cancel-delivery"
13731433
)

0 commit comments

Comments
 (0)