Skip to content

Commit ccc730e

Browse files
authored
Merge pull request #265 from amadeus4dev/hotel-booking-v2
Add support for Hotel Booking v2
2 parents 2a25b36 + 6446889 commit ccc730e

File tree

10 files changed

+459
-1
lines changed

10 files changed

+459
-1
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,9 @@ HotelOfferSearch offer = amadeus.shopping.hotelOfferSearch("QF3MNOBDQ8").get();
420420
// The body can be a String version of your JSON or a JsonObject
421421
HotelBooking[] hotel = amadeus.booking.hotelBookings.post(body);
422422

423+
// Hotel Booking v2
424+
HotelOrder hotel = amadeus.booking.hotelOrders.post(body);
425+
423426
// Hotel Ratings / Sentiments
424427
HotelSentiment[] hotelSentiments = amadeus.ereputation.hotelSentiments.get(Params.with("hotelIds", "ELONMFS,ADNYCCTB"));
425428

src/main/java/com/amadeus/Booking.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.amadeus.booking.FlightOrder;
44
import com.amadeus.booking.FlightOrders;
55
import com.amadeus.booking.HotelBookings;
6+
import com.amadeus.booking.HotelOrders;
67

78
public class Booking {
89
private Amadeus client;
@@ -31,6 +32,14 @@ public class Booking {
3132
*/
3233
public HotelBookings hotelBookings;
3334

35+
/**
36+
* <p>
37+
* A namespaced client for the
38+
* <code>/v2/booking/hotelOrders</code> endpoints.
39+
* </p>
40+
*/
41+
public HotelOrders hotelOrders;
42+
3443
/**
3544
* Constructor.
3645
* @hide
@@ -39,6 +48,7 @@ public Booking(Amadeus client) {
3948
this.client = client;
4049
this.flightOrders = new FlightOrders(client);
4150
this.hotelBookings = new HotelBookings(client);
51+
this.hotelOrders = new HotelOrders(client);
4252
}
4353

4454
public FlightOrder flightOrder(String flightOrderId) {
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package com.amadeus.booking;
2+
3+
import com.amadeus.Amadeus;
4+
import com.amadeus.Response;
5+
import com.amadeus.exceptions.ResponseException;
6+
import com.amadeus.resources.HotelOrder;
7+
import com.amadeus.resources.Resource;
8+
import com.google.gson.JsonObject;
9+
10+
/**
11+
* <p>
12+
* A namespaced client for the
13+
* <code>/v2/booking/hotel-orders</code> endpoints.
14+
* </p>
15+
*
16+
* <p>
17+
* Access via the Amadeus client object.
18+
* </p>
19+
*
20+
* <pre>
21+
* Amadeus amadeus = Amadeus.builder(API_KEY, API_SECRET).build();
22+
* amadeus.booking.HotelOrders;</pre>
23+
*/
24+
public class HotelOrders {
25+
private Amadeus client;
26+
27+
/**
28+
* Constructor.
29+
*
30+
* @hide
31+
*/
32+
public HotelOrders(Amadeus client) {
33+
this.client = client;
34+
}
35+
36+
/**
37+
* <p>
38+
* The Hotel Booking API allows you to perform hotel booking.
39+
* </p>
40+
*
41+
* <pre>
42+
* amadeus.booking.hotelOrders.post(body);</pre>
43+
*
44+
* @param body the parameters to send to the API as a JSonObject
45+
* @return an API resource
46+
* @throws ResponseException when an exception occurs
47+
*/
48+
public HotelOrder post(JsonObject body) throws ResponseException {
49+
Response response = client.post("/v2/booking/hotel-orders", body);
50+
return (HotelOrder) Resource.fromObject(response, HotelOrder.class);
51+
}
52+
53+
/**
54+
* <p>
55+
* The Hotel Booking API allows you to perform hotel booking.
56+
* </p>
57+
*
58+
* <pre>
59+
* amadeus.booking.hotelOrders.post(body);</pre>
60+
*
61+
* @param body the parameters to send to the API as a String
62+
* @return an API resource
63+
* @throws ResponseException when an exception occurs
64+
*/
65+
public HotelOrder post(String body) throws ResponseException {
66+
Response response = client.post("/v2/booking/hotel-orders", body);
67+
return (HotelOrder) Resource.fromObject(response, HotelOrder.class);
68+
}
69+
70+
/**
71+
* Convenience method for calling <code>post</code> without any parameters.
72+
*
73+
* @see HotelBookings#post()
74+
*/
75+
public HotelOrder post() throws ResponseException {
76+
return post((String) null);
77+
}
78+
}

src/main/java/com/amadeus/resources/FlightOrder.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public static class Traveler {
4848

4949
@AllArgsConstructor
5050
@NoArgsConstructor
51+
5152
@ToString
5253
public static class Name {
5354

src/main/java/com/amadeus/resources/Hotel.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.amadeus.resources;
22

3-
import com.google.gson.annotations.SerializedName;
43
import lombok.Getter;
54
import lombok.ToString;
65

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package com.amadeus.resources;
2+
3+
import com.amadeus.resources.HotelOfferSearch.Offer;
4+
import lombok.Getter;
5+
import lombok.ToString;
6+
7+
/**
8+
* An HotelOrder object as returned by the Hotel Booking v2 API.
9+
* @see com.amadeus.booking.HotelOrders#get()
10+
*/
11+
@ToString
12+
public class HotelOrder extends Resource {
13+
private @Getter String self;
14+
private @Getter String type;
15+
private @Getter String id;
16+
private @Getter HotelBooking[] hotelBookings;
17+
private @Getter AssociatedRecord[] associatedRecords;
18+
private @Getter Guest[] guests;
19+
20+
protected HotelOrder() {}
21+
22+
@ToString
23+
public static class HotelBooking {
24+
private @Getter String type;
25+
private @Getter String id;
26+
private @Getter String bookingStatus;
27+
private @Getter RoomAssociation[] roomAssociations;
28+
private @Getter Offer hotelOffer;
29+
private @Getter Hotel hotel;
30+
31+
protected HotelBooking() {}
32+
}
33+
34+
@ToString
35+
public static class RoomAssociation {
36+
private @Getter String hotelOfferId;
37+
private GuestReference[] guestReferences;
38+
private @Getter String specialRequest;
39+
40+
protected RoomAssociation() {}
41+
}
42+
43+
@ToString
44+
public static class GuestReference {
45+
private @Getter String guestReference;
46+
private @Getter String hotelLoyaltyId;
47+
48+
protected GuestReference() {}
49+
}
50+
51+
@ToString
52+
public static class Guest {
53+
private @Getter int tid;
54+
private @Getter int id;
55+
private @Getter FrequentTraveler[] frequentTraveler;
56+
private @Getter String phone;
57+
private @Getter String email;
58+
private @Getter String title;
59+
private @Getter String firstName;
60+
private @Getter String lastName;
61+
private @Getter Integer childAge;
62+
63+
protected Guest() {}
64+
}
65+
66+
@ToString
67+
public static class FrequentTraveler {
68+
private @Getter String airlineCode;
69+
private @Getter String frequentTravelerId;
70+
71+
protected FrequentTraveler() {}
72+
}
73+
74+
@ToString
75+
public static class AssociatedRecord {
76+
private @Getter String reference;
77+
private @Getter String originSystemCode;
78+
79+
protected AssociatedRecord() {}
80+
}
81+
82+
@ToString
83+
public static class Hotel {
84+
private @Getter String hotelId;
85+
private @Getter String chainCode;
86+
private @Getter String name;
87+
private @Getter String self;
88+
89+
protected Hotel() {}
90+
}
91+
}

src/test/java/com/amadeus/NamespaceTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.amadeus.booking.FlightOrder;
1111
import com.amadeus.booking.FlightOrders;
1212
import com.amadeus.booking.HotelBookings;
13+
import com.amadeus.booking.HotelOrders;
1314
import com.amadeus.ereputation.HotelSentiments;
1415
import com.amadeus.exceptions.ResponseException;
1516
import com.amadeus.location.analytics.CategoryRatedAreas;
@@ -27,6 +28,7 @@
2728
import com.amadeus.referencedata.locations.hotels.ByGeocode;
2829
import com.amadeus.referencedata.locations.hotels.ByHotels;
2930
import com.amadeus.referencedata.urls.CheckinLinks;
31+
import com.amadeus.resources.HotelOrder;
3032
import com.amadeus.resources.TransferCancellation;
3133
import com.amadeus.schedule.Flights;
3234
import com.amadeus.shopping.Activities;
@@ -95,6 +97,7 @@ public class NamespaceTest {
9597
assertNotNull(client.airport.predictions.onTime);
9698
assertNotNull(client.booking.flightOrder("XXX"));
9799
assertNotNull(client.booking.hotelBookings);
100+
assertNotNull(client.booking.hotelOrders);
98101
assertNotNull(client.schedule.flights);
99102
assertNotNull(client.travel.tripParser);
100103
assertNotNull(client.airport.directDestinations);
@@ -674,6 +677,20 @@ public void testHotelBookings() throws ResponseException {
674677
assertNotNull(hotel.post(body));
675678
}
676679

680+
@Test
681+
public void testHotelOrders() throws ResponseException {
682+
// Test Trip Parser
683+
Mockito.when(client.post("/v2/booking/hotel-orders", (String) null))
684+
.thenReturn(singleResponse);
685+
Mockito.when(client.post("/v2/booking/hotel-orders", body))
686+
.thenReturn(singleResponse);
687+
Mockito.when(client.post("/v2/booking/hotel-orders", jsonObject))
688+
.thenReturn(singleResponse);
689+
HotelOrders hotelOrder = new HotelOrders(client);
690+
assertNotNull(hotelOrder.post());
691+
assertNotNull(hotelOrder.post(body));
692+
}
693+
677694
@Test
678695
public void testTripParser() throws ResponseException {
679696
// Test Trip Parser
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package com.amadeus.booking;
2+
3+
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
4+
import static com.github.tomakehurst.wiremock.client.WireMock.post;
5+
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
6+
import static org.junit.jupiter.api.Assertions.assertNotNull;
7+
8+
import com.amadeus.Amadeus;
9+
import com.amadeus.exceptions.ResponseException;
10+
import com.amadeus.resources.HotelOrder;
11+
import com.github.tomakehurst.wiremock.WireMockServer;
12+
import com.google.gson.JsonObject;
13+
import com.google.gson.JsonParser;
14+
import java.io.File;
15+
import java.io.IOException;
16+
import java.nio.file.Files;
17+
import org.junit.jupiter.api.AfterEach;
18+
import org.junit.jupiter.api.BeforeEach;
19+
import org.junit.jupiter.api.Test;
20+
21+
// https://developers.amadeus.com/self-service/category/hotels/api-doc/hotel-booking
22+
public class HotelOrdersIT {
23+
24+
WireMockServer wireMockServer;
25+
26+
private Amadeus amadeus;
27+
28+
/**
29+
* In every tests, we will authenticate.
30+
*/
31+
@BeforeEach
32+
public void setup() {
33+
wireMockServer = new WireMockServer(8080);
34+
wireMockServer.start();
35+
36+
// API at https://developers.amadeus.com/self-service/apis-docs/guides/authorization-262
37+
String address = "/v1/security/oauth2/token"
38+
+ "?grant_type=client_credentials&client_secret=DEMO&client_id=DEMO";
39+
wireMockServer.stubFor(post(urlEqualTo(address))
40+
.willReturn(aResponse().withHeader("Content-Type", "application/json")
41+
.withStatus(200)
42+
.withBodyFile("auth_ok.json")));
43+
44+
amadeus = Amadeus
45+
.builder("DEMO", "DEMO")
46+
.setHost("localhost")
47+
.setPort(8080)
48+
.setSsl(false)
49+
.setLogLevel("debug")
50+
.build();
51+
}
52+
53+
@AfterEach
54+
public void teardown() {
55+
wireMockServer.stop();
56+
}
57+
58+
@Test
59+
public void given_client_when_call_hotel_orders_with_params_then_ok()
60+
throws ResponseException, IOException {
61+
62+
// Given
63+
String address = "/v2/booking/hotel-orders";
64+
65+
wireMockServer.stubFor(post(urlEqualTo(address))
66+
.willReturn(aResponse().withHeader("Content-Type", "application/json")
67+
.withStatus(200)
68+
.withBodyFile("hotel_orders_response_ok.json")));
69+
70+
71+
JsonObject request = getRequestFromResources("hotel_orders_request_ok.json");
72+
73+
// When
74+
HotelOrder result = amadeus.booking.hotelOrders.post(request);
75+
76+
// Then
77+
assertNotNull(result);
78+
}
79+
80+
private JsonObject getRequestFromResources(String jsonFile) throws IOException {
81+
82+
final String folder = "__files/";
83+
84+
ClassLoader classLoader = getClass().getClassLoader();
85+
File file = new File(classLoader.getResource(folder + jsonFile).getFile());
86+
String jsonString = new String(Files.readAllBytes(file.toPath()));
87+
88+
return new JsonParser().parse(jsonString).getAsJsonObject();
89+
}
90+
91+
private File getFileRequestFromResources(String jsonFile) throws IOException {
92+
93+
final String folder = "__files/";
94+
95+
ClassLoader classLoader = getClass().getClassLoader();
96+
return new File(classLoader.getResource(folder + jsonFile).getFile());
97+
}
98+
99+
}

0 commit comments

Comments
 (0)