Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

# master

- Add support for `reservations_requests` endpoint.

## 1.2.0

- Add support for `restore` action for `rental_urls`.
Expand Down
2 changes: 2 additions & 0 deletions lib/bookingsync/api/client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
require "bookingsync/api/client/rental_cancelation_policy_items"
require "bookingsync/api/client/rentals_contents_overrides"
require "bookingsync/api/client/rental_urls"
require "bookingsync/api/client/reservations_requests"
require "bookingsync/api/client/review_replies"
require "bookingsync/api/client/reviews"
require "bookingsync/api/client/seasons"
Expand Down Expand Up @@ -104,6 +105,7 @@ class Client
include BookingSync::API::Client::RentalCancelationPolicyItems
include BookingSync::API::Client::RentalsContentsOverrides
include BookingSync::API::Client::RentalUrls
include BookingSync::API::Client::ReservationsRequests
include BookingSync::API::Client::ReviewReplies
include BookingSync::API::Client::Reviews
include BookingSync::API::Client::Seasons
Expand Down
56 changes: 56 additions & 0 deletions lib/bookingsync/api/client/reservations_requests.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
module BookingSync::API
class Client
module ReservationsRequests
# List reservations requests
#
# Returns reservations requests for the current account.
# @param options [Hash] A customizable set of query options.
# @option options [Array] fields: List of fields to be fetched.
# @return [Array<BookingSync::API::Resource>] Array of reservations requests.
# @see http://developers.bookingsync.com/reference/endpoints/reservations_requests/#list-reservations-requests
def reservations_requests(options = {}, &block)
paginate "reservations/requests", options, &block
end

# Get a single reservations request
#
# @param id [BookingSync::API::Resource|Integer] Reservations request or ID
# of the reservations request.
# @param options [Hash] A customizable set of query options.
# @option options [Array] fields: List of fields to be fetched.
# @return [BookingSync::API::Resource]
def reservations_request(id, options = {})
get("reservations/requests/#{id}", options).pop
end

# Create a new reservations request
#
# @param options [Hash] Reservations request attributes.
# @return [BookingSync::API::Resource] Newly created reservations request.
def create_reservation_request(options = {})
post("reservations/requests", requests: [options]).pop
end

# Edit a reservations request
#
# @param id [BookingSync::API::Resource|Integer] Reservations request or ID of
# the reservations request to be updated.
# @param options [Hash] Reservations request attributes to be updated.
# @return [BookingSync::API::Resource] Updated reservations request on success,
# exception is raised otherwise.
def patch_reservation_request(id, options = {})
patch("reservations/requests/#{id}", requests: [options]).pop
end

# Delete a reservations request
#
# Soft-cancels the given reservations request.
# @param id [BookingSync::API::Resource|Integer] Reservations request or ID of
# the reservations request to be deleted.
# @return [NilClass] Returns nil on success.
def delete_reservation_request(id)
delete "reservations/requests/#{id}"
end
end
end
end
97 changes: 97 additions & 0 deletions spec/bookingsync/api/client/reservations_requests_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
require "spec_helper"

describe BookingSync::API::Client::ReservationsRequests do
let(:client) { BookingSync::API::Client.new(test_access_token) }

before { |ex| @casette_base_path = casette_path(casette_dir, ex.metadata) }

describe ".reservations_requests", :vcr do
it "returns reservations requests" do
expect(client.reservations_requests).not_to be_empty
assert_requested :get, bs_url("reservations/requests")
end

describe "pagination" do
context "with auto_paginate: true" do
it "returns all reservations requests joined from many requests" do
requests = client.reservations_requests(per_page: 2, auto_paginate: true)
expect(requests.size).to eq(4)
end
end
end
end

describe ".reservations_request", :vcr do
let(:prefetched_reservations_request_id) {
find_resource("#{@casette_base_path}_reservations_requests/returns_reservations_requests.yml", "requests")[:id]
}

it "returns a single reservations request" do
reservations_request = client.reservations_request(prefetched_reservations_request_id)
expect(reservations_request.id).to eq prefetched_reservations_request_id
end
end

describe ".create_reservation_request", :vcr do
let(:attributes) do
{
conversation_id: 123,
rental_id: 456,
client_id: 789,
booking_id: 101,
expires_at: "2026-06-25T12:00:00Z",
booking_payload: {
start_date: "2026-07-01",
end_date: "2026-07-08",
adults: 2,
children: 0,
final_price: "950.00",
currency: "EUR"
}
}
end

it "creates a new reservations request" do
client.create_reservation_request(attributes)
assert_requested :post, bs_url("reservations/requests"),
body: { requests: [attributes] }.to_json
end

it "returns newly created reservations request" do
VCR.use_cassette("BookingSync_API_Client_ReservationsRequests/_create_reservation_request/creates_a_new_reservations_request") do
reservations_request = client.create_reservation_request(attributes)
expect(reservations_request.links.rental).to eq(456)
expect(reservations_request.expires_at).to eq(Time.parse("2026-06-25T12:00:00Z"))
end
end
end

describe ".patch_reservation_request", :vcr do
let(:created_reservations_request_id) {
find_resource("#{@casette_base_path}_create_reservation_request/creates_a_new_reservations_request.yml", "requests")[:id]
}

it "updates given reservations request by ID" do
client.patch_reservation_request(created_reservations_request_id, expires_at: "2026-07-01T12:00:00Z")
assert_requested :patch, bs_url("reservations/requests/#{created_reservations_request_id}"),
body: { requests: [{ expires_at: "2026-07-01T12:00:00Z" }] }.to_json
end

it "returns updated reservations request" do
VCR.use_cassette("BookingSync_API_Client_ReservationsRequests/_patch_reservation_request/updates_given_reservations_request_by_ID") do
reservations_request = client.patch_reservation_request(created_reservations_request_id, expires_at: "2026-07-01T12:00:00Z")
expect(reservations_request).to be_kind_of(BookingSync::API::Resource)
expect(reservations_request.expires_at).to eq(Time.parse("2026-07-01T12:00:00Z"))
end
end
end

describe ".delete_reservation_request", :vcr do
let(:reservations_request_id_to_be_deleted) { 60 }

it "deletes given reservations request" do
expect(client.delete_reservation_request(reservations_request_id_to_be_deleted)).to be_nil
assert_requested :delete, bs_url("reservations/requests/#{reservations_request_id_to_be_deleted}")
end
end
end

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading