bookingsync-api 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/Gemfile +2 -1
- data/Guardfile +3 -6
- data/README.md +11 -3
- data/bookingsync-api.gemspec +2 -2
- data/lib/bookingsync/api.rb +0 -2
- data/lib/bookingsync/api/client.rb +151 -54
- data/lib/bookingsync/api/client/amenities.rb +22 -0
- data/lib/bookingsync/api/client/billing_addresses.rb +22 -0
- data/lib/bookingsync/api/client/bookings.rb +7 -9
- data/lib/bookingsync/api/client/bookings_payments.rb +22 -0
- data/lib/bookingsync/api/client/clients.rb +43 -0
- data/lib/bookingsync/api/client/destinations.rb +22 -0
- data/lib/bookingsync/api/client/inquiries.rb +2 -2
- data/lib/bookingsync/api/client/payments.rb +53 -0
- data/lib/bookingsync/api/client/periods.rb +54 -0
- data/lib/bookingsync/api/client/photos.rb +22 -0
- data/lib/bookingsync/api/client/rates.rb +23 -0
- data/lib/bookingsync/api/client/rates_rules.rb +22 -0
- data/lib/bookingsync/api/client/rates_tables.rb +53 -0
- data/lib/bookingsync/api/client/rental_agreements.rb +50 -0
- data/lib/bookingsync/api/client/rentals.rb +39 -1
- data/lib/bookingsync/api/client/reviews.rb +31 -0
- data/lib/bookingsync/api/client/seasons.rb +53 -0
- data/lib/bookingsync/api/client/special_offers.rb +54 -0
- data/lib/bookingsync/api/relation.rb +87 -0
- data/lib/bookingsync/api/resource.rb +58 -0
- data/lib/bookingsync/api/response.rb +79 -0
- data/lib/bookingsync/api/serializer.rb +100 -0
- data/lib/bookingsync/api/version.rb +1 -1
- data/spec/bookingsync/api/client/amenities_spec.rb +12 -0
- data/spec/bookingsync/api/client/billing_addresses_spec.rb +12 -0
- data/spec/bookingsync/api/client/billings_payments_spec.rb +12 -0
- data/spec/bookingsync/api/client/bookings_spec.rb +10 -8
- data/spec/bookingsync/api/client/clients_spec.rb +55 -0
- data/spec/bookingsync/api/client/destinations_spec.rb +12 -0
- data/spec/bookingsync/api/client/inquiries_spec.rb +1 -1
- data/spec/bookingsync/api/client/payments_spec.rb +56 -0
- data/spec/bookingsync/api/client/periods_spec.rb +61 -0
- data/spec/bookingsync/api/client/photos_spec.rb +12 -0
- data/spec/bookingsync/api/client/rates_rules_spec.rb +13 -0
- data/spec/bookingsync/api/client/rates_spec.rb +12 -0
- data/spec/bookingsync/api/client/rates_tables_spec.rb +59 -0
- data/spec/bookingsync/api/client/rental_agreements_spec.rb +64 -0
- data/spec/bookingsync/api/client/rentals_spec.rb +56 -6
- data/spec/bookingsync/api/client/reviews_spec.rb +33 -0
- data/spec/bookingsync/api/client/seasons_spec.rb +61 -0
- data/spec/bookingsync/api/client/special_offers_spec.rb +63 -0
- data/spec/bookingsync/api/client_spec.rb +31 -10
- data/spec/bookingsync/api/relation_spec.rb +72 -0
- data/spec/bookingsync/api/resource_spec.rb +79 -0
- data/spec/bookingsync/api/response_spec.rb +66 -0
- data/spec/cassettes/BookingSync_API_Client_Amenities/_amenities/returns_amenities.yml +72 -0
- data/spec/cassettes/BookingSync_API_Client_BillingAddresses/_billing_addresses/returns_billing_addresses.yml +65 -0
- data/spec/cassettes/BookingSync_API_Client_Bookings/_bookings/pagination/with_a_block/yields_block_with_batch_of_bookings.yml +12 -12
- data/spec/cassettes/BookingSync_API_Client_Bookings/_bookings/pagination/with_auto_paginate_true/returns_all_bookings_joined_from_many_requests.yml +12 -12
- data/spec/cassettes/BookingSync_API_Client_Bookings/_bookings/pagination/with_per_page_setting/returns_limited_number_of_bookings.yml +3 -3
- data/spec/cassettes/BookingSync_API_Client_Bookings/_clients/returns_clients.yml +66 -0
- data/spec/cassettes/BookingSync_API_Client_Bookings/_create_booking/creates_a_booking.yml +1 -1
- data/spec/cassettes/BookingSync_API_Client_Bookings/_create_client/creates_a_new_client.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_Bookings/_edit_booking/updates_given_booking_by_ID.yml +18 -14
- data/spec/cassettes/BookingSync_API_Client_Bookings/_edit_client/updates_given_client_by_ID.yml +62 -0
- data/spec/cassettes/BookingSync_API_Client_BookingsPayments/_bookings_payments/returns_bookings_payments.yml +65 -0
- data/spec/cassettes/BookingSync_API_Client_Destinations/_destinations/returns_destinations.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_Inquiries/_create_inquiry/creates_a_new_inquiry.yml +1 -1
- data/spec/cassettes/BookingSync_API_Client_Inquiries/_inquiries/returns_inquiries.yml +1 -1
- data/spec/cassettes/BookingSync_API_Client_Payments/_cancel_payment/cancels_given_payment.yml +57 -0
- data/spec/cassettes/BookingSync_API_Client_Payments/_create_payment/creates_a_new_payment.yml +63 -0
- data/spec/cassettes/BookingSync_API_Client_Payments/_edit_payment/updates_given_payment_by_ID.yml +61 -0
- data/spec/cassettes/BookingSync_API_Client_Payments/_payments/returns_payments.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_Periods/_create_period/creates_a_new_period.yml +63 -0
- data/spec/cassettes/BookingSync_API_Client_Periods/_delete_period/deletes_given_period.yml +70 -0
- data/spec/cassettes/BookingSync_API_Client_Periods/_edit_period/updates_given_period_by_ID.yml +61 -0
- data/spec/cassettes/BookingSync_API_Client_Periods/_periods/returns_periods.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_Photos/_photos/returns_photos.yml +72 -0
- data/spec/cassettes/BookingSync_API_Client_Rates/_rates/returns_rates.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_RatesRules/_rates_rules/returns_rates_rules.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_RatesTables/_create_rates_table/creates_a_new_rates_table.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_RatesTables/_delete_rates_table/deletes_given_rates_table.yml +57 -0
- data/spec/cassettes/BookingSync_API_Client_RatesTables/_edit_rates_table/updates_given_rates_table_by_ID.yml +62 -0
- data/spec/cassettes/BookingSync_API_Client_RatesTables/_rates_tables/returns_rates_tables.yml +74 -0
- data/spec/cassettes/BookingSync_API_Client_RentalAgreements/_create_rental_agreement/creates_a_new_rental_agreement.yml +63 -0
- data/spec/cassettes/BookingSync_API_Client_RentalAgreements/_create_rental_agreement_for_booking/creates_a_new_rental_agreement.yml +63 -0
- data/spec/cassettes/BookingSync_API_Client_RentalAgreements/_create_rental_agreement_for_rental/creates_a_new_rental_agreement.yml +63 -0
- data/spec/cassettes/BookingSync_API_Client_RentalAgreements/_rental_agreements/returns_rental_agreements.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_Rentals/_cancel_rental/cancels_given_rental.yml +57 -0
- data/spec/cassettes/BookingSync_API_Client_Rentals/_create_rental/creates_a_new_rental.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_Rentals/_edit_rental/updates_given_rental_by_ID.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_Rentals/_rental/returns_a_single_rental.yml +67 -0
- data/spec/cassettes/BookingSync_API_Client_Rentals/_rentals/links/returns_associated_photos.yml +152 -0
- data/spec/cassettes/BookingSync_API_Client_Rentals/_rentals/links/returns_links_to_associated_resources.yml +91 -0
- data/spec/cassettes/BookingSync_API_Client_Rentals/_rentals/returns_rentals.yml +45 -20
- data/spec/cassettes/BookingSync_API_Client_Reviews/_create_review/creates_a_new_review.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_Reviews/_reviews/returns_reviews.yml +83 -0
- data/spec/cassettes/BookingSync_API_Client_Seasons/_create_season/creates_a_new_season.yml +64 -0
- data/spec/cassettes/BookingSync_API_Client_Seasons/_delete_season/deletes_given_season.yml +57 -0
- data/spec/cassettes/BookingSync_API_Client_Seasons/_edit_season/updates_given_season_by_ID.yml +62 -0
- data/spec/cassettes/BookingSync_API_Client_Seasons/_seasons/returns_seasons.yml +74 -0
- data/spec/cassettes/BookingSync_API_Client_SpecialOffers/_create_special_offer/creates_a_new_special_offer.yml +63 -0
- data/spec/cassettes/BookingSync_API_Client_SpecialOffers/_delete_special_offer/deletes_given_special_offer.yml +57 -0
- data/spec/cassettes/BookingSync_API_Client_SpecialOffers/_edit_special_offer/updates_given_special_offer_by_ID.yml +61 -0
- data/spec/cassettes/{BookingSync_API_Client_Rentals/_rentals/with_specified_fields_in_options/returns_rentals_with_filtered_fields.yml → BookingSync_API_Client_SpecialOffers/_special_offers/returns_special_offers.yml} +17 -10
- data/spec/spec_helper.rb +1 -0
- metadata +143 -7
- data/lib/bookingsync/ext/resource.rb +0 -9
@@ -5,16 +5,66 @@ describe BookingSync::API::Client::Rentals do
|
|
5
5
|
|
6
6
|
describe ".rentals", :vcr do
|
7
7
|
it "returns rentals" do
|
8
|
-
expect(client.rentals).not_to
|
8
|
+
expect(client.rentals).not_to be_empty
|
9
9
|
assert_requested :get, bs_url("rentals")
|
10
10
|
end
|
11
11
|
|
12
|
-
|
13
|
-
it "returns
|
14
|
-
|
15
|
-
expect(
|
16
|
-
assert_requested :get, bs_url("rentals?fields=name")
|
12
|
+
describe "links" do
|
13
|
+
it "returns associated photos" do
|
14
|
+
rental = client.rentals.first
|
15
|
+
expect(rental.photos).not_to be_empty
|
17
16
|
end
|
18
17
|
end
|
19
18
|
end
|
19
|
+
|
20
|
+
describe ".rental", :vcr do
|
21
|
+
it "returns a single rental" do
|
22
|
+
rental = client.rental(2)
|
23
|
+
expect(rental.name).to eql("0 est")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe ".create_rental", :vcr do
|
28
|
+
let(:attributes) { {
|
29
|
+
name: "New rental",
|
30
|
+
sleeps: 2
|
31
|
+
} }
|
32
|
+
|
33
|
+
it "creates a new rental" do
|
34
|
+
client.create_rental(attributes)
|
35
|
+
assert_requested :post, bs_url("rentals"),
|
36
|
+
body: { rentals: [attributes] }.to_json
|
37
|
+
end
|
38
|
+
|
39
|
+
it "returns newly created rental" do
|
40
|
+
VCR.use_cassette('BookingSync_API_Client_Rentals/_create_rental/creates_a_new_rental') do
|
41
|
+
rental = client.create_rental(attributes)
|
42
|
+
expect(rental.name).to eql("New rental")
|
43
|
+
expect(rental.sleeps).to eql(2)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe ".edit_rental", :vcr do
|
49
|
+
it "updates given rental by ID" do
|
50
|
+
client.edit_rental(2, name: 'Updated Rental name')
|
51
|
+
assert_requested :put, bs_url("rentals/2"),
|
52
|
+
body: { rentals: [{ name: 'Updated Rental name' }] }.to_json
|
53
|
+
end
|
54
|
+
|
55
|
+
it "returns updated rental" do
|
56
|
+
VCR.use_cassette('BookingSync_API_Client_Rentals/_edit_rental/updates_given_rental_by_ID') do
|
57
|
+
rental = client.edit_rental(2, name: 'Updated Rental name')
|
58
|
+
expect(rental).to be_kind_of(BookingSync::API::Resource)
|
59
|
+
expect(rental.name).to eq('Updated Rental name')
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe ".cancel_rental", :vcr do
|
65
|
+
it "cancels given rental" do
|
66
|
+
client.cancel_rental(4)
|
67
|
+
assert_requested :delete, bs_url("rentals/4")
|
68
|
+
end
|
69
|
+
end
|
20
70
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe BookingSync::API::Client::Reviews do
|
4
|
+
let(:client) { BookingSync::API::Client.new(test_access_token) }
|
5
|
+
|
6
|
+
describe ".reviews", :vcr do
|
7
|
+
it "returns reviews" do
|
8
|
+
expect(client.reviews).not_to be_empty
|
9
|
+
assert_requested :get, bs_url("reviews")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe ".create_review", :vcr do
|
14
|
+
let(:attributes) {{
|
15
|
+
comment: "Awesome place",
|
16
|
+
rating: 5
|
17
|
+
}}
|
18
|
+
|
19
|
+
it "creates a new review" do
|
20
|
+
client.create_review(1, attributes)
|
21
|
+
assert_requested :post, bs_url("reviews"),
|
22
|
+
body: { booking_id: 1, reviews: [attributes] }.to_json
|
23
|
+
end
|
24
|
+
|
25
|
+
it "returns newly created review" do
|
26
|
+
VCR.use_cassette('BookingSync_API_Client_Reviews/_create_review/creates_a_new_review') do
|
27
|
+
review = client.create_review(1, attributes)
|
28
|
+
expect(review.comment).to eql(attributes[:comment])
|
29
|
+
expect(review.rating).to eql(attributes[:rating])
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe BookingSync::API::Client::Seasons do
|
4
|
+
|
5
|
+
let(:client) { BookingSync::API::Client.new(test_access_token) }
|
6
|
+
|
7
|
+
describe ".seasons", :vcr do
|
8
|
+
it "returns seasons" do
|
9
|
+
expect(client.seasons).not_to be_empty
|
10
|
+
assert_requested :get, bs_url("seasons")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe ".create_season", :vcr do
|
15
|
+
let(:attributes) {{
|
16
|
+
name: "New season",
|
17
|
+
ratio: 0.2,
|
18
|
+
minimum_stay: 4
|
19
|
+
}}
|
20
|
+
|
21
|
+
it "creates a new season" do
|
22
|
+
client.create_season(13, attributes)
|
23
|
+
assert_requested :post, bs_url("seasons"),
|
24
|
+
body: { rates_table_id: 13, seasons: [attributes] }.to_json
|
25
|
+
end
|
26
|
+
|
27
|
+
it "returns newly created season" do
|
28
|
+
VCR.use_cassette('BookingSync_API_Client_Seasons/_create_season/creates_a_new_season') do
|
29
|
+
season = client.create_season(13, attributes)
|
30
|
+
expect(season.name).to eql(attributes[:name])
|
31
|
+
expect(season.minimum_stay).to eql(attributes[:minimum_stay])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe ".edit_season", :vcr do
|
37
|
+
let(:attributes) {
|
38
|
+
{ name: "Updated season" }
|
39
|
+
}
|
40
|
+
it "updates given season by ID" do
|
41
|
+
client.edit_season(6, attributes)
|
42
|
+
assert_requested :put, bs_url("seasons/6"),
|
43
|
+
body: { seasons: [attributes] }.to_json
|
44
|
+
end
|
45
|
+
|
46
|
+
it "returns updated season" do
|
47
|
+
VCR.use_cassette('BookingSync_API_Client_Seasons/_edit_season/updates_given_season_by_ID') do
|
48
|
+
season = client.edit_season(6, attributes)
|
49
|
+
expect(season).to be_kind_of(BookingSync::API::Resource)
|
50
|
+
expect(season.name).to eq(attributes[:name])
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe ".delete_season", :vcr do
|
56
|
+
it "deletes given season" do
|
57
|
+
client.delete_season(10)
|
58
|
+
assert_requested :delete, bs_url("seasons/10")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe BookingSync::API::Client::SpecialOffers do
|
4
|
+
let(:client) { BookingSync::API::Client.new(test_access_token) }
|
5
|
+
|
6
|
+
describe ".special_offers", :vcr do
|
7
|
+
it "returns special_offers" do
|
8
|
+
expect(client.special_offers).not_to be_empty
|
9
|
+
assert_requested :get, bs_url("special_offers")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe ".create_special_offer", :vcr do
|
14
|
+
let(:attributes) {
|
15
|
+
{
|
16
|
+
name: "New special offer",
|
17
|
+
start_at: '2014-04-28',
|
18
|
+
end_at: '2014-05-28',
|
19
|
+
discount: 5
|
20
|
+
}
|
21
|
+
}
|
22
|
+
|
23
|
+
it "creates a new special_offer" do
|
24
|
+
client.create_special_offer(12, attributes)
|
25
|
+
assert_requested :post, bs_url("special_offers"),
|
26
|
+
body: { rental_id: 12, special_offers: [attributes] }.to_json
|
27
|
+
end
|
28
|
+
|
29
|
+
it "returns newly created special_offer" do
|
30
|
+
VCR.use_cassette('BookingSync_API_Client_SpecialOffers/_create_special_offer/creates_a_new_special_offer') do
|
31
|
+
special_offer = client.create_special_offer(12, attributes)
|
32
|
+
expect(special_offer.name).to eql(attributes[:name])
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe ".edit_special_offer", :vcr do
|
38
|
+
let(:attributes) {
|
39
|
+
{ name: 'Updated special offer' }
|
40
|
+
}
|
41
|
+
|
42
|
+
it "updates given special_offer by ID" do
|
43
|
+
client.edit_special_offer(3, attributes)
|
44
|
+
assert_requested :put, bs_url("special_offers/3"),
|
45
|
+
body: { special_offers: [attributes] }.to_json
|
46
|
+
end
|
47
|
+
|
48
|
+
it "returns updated special_offer" do
|
49
|
+
VCR.use_cassette('BookingSync_API_Client_SpecialOffers/_edit_special_offer/updates_given_special_offer_by_ID') do
|
50
|
+
special_offer = client.edit_special_offer(3, attributes)
|
51
|
+
expect(special_offer).to be_kind_of(BookingSync::API::Resource)
|
52
|
+
expect(special_offer.name).to eq(attributes[:name])
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe ".delete_special_offer", :vcr do
|
58
|
+
it "deletes given special_offer" do
|
59
|
+
client.delete_special_offer(4)
|
60
|
+
assert_requested :delete, bs_url("special_offers/4")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -62,34 +62,55 @@ describe BookingSync::API::Client do
|
|
62
62
|
end
|
63
63
|
|
64
64
|
describe "#request" do
|
65
|
+
context "on response which responds to :resources" do
|
66
|
+
it "returns an array of resources" do
|
67
|
+
stub_get("resource", body: {resources: [{name: "Megan"}]}.to_json)
|
68
|
+
resources = client.request(:get, "resource")
|
69
|
+
expect(resources).to be_kind_of(Array)
|
70
|
+
expect(resources.first.name).to eq("Megan")
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "on response which doesn't respond to :resources" do
|
75
|
+
it "returns response" do
|
76
|
+
stub_get("resource", status: 204)
|
77
|
+
response = double(BookingSync::API::Response)
|
78
|
+
allow(client).to receive(:call) { response }
|
79
|
+
resources = client.request(:get, "resource")
|
80
|
+
expect(resources).to eql(response)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe "#call" do
|
65
86
|
before { VCR.turn_off! }
|
66
87
|
it "authenticates the request with OAuth token" do
|
67
88
|
ENV["ACCESS_TOKEN"] = nil
|
68
89
|
stub_get("resource")
|
69
|
-
client.get
|
90
|
+
client.call(:get, "resource")
|
70
91
|
assert_requested :get, bs_url("resource"),
|
71
92
|
headers: {"Authorization" => "Bearer fake-access-token"}
|
72
93
|
end
|
73
94
|
|
74
95
|
it "requests proper accept header for JSON API" do
|
75
96
|
stub_get("resource")
|
76
|
-
client.get
|
97
|
+
client.call(:get, "resource")
|
77
98
|
assert_requested :get, bs_url("resource"),
|
78
99
|
headers: {"Accept" => "application/vnd.api+json"}
|
79
100
|
end
|
80
101
|
|
81
102
|
it "requests sends data with JSON API content type" do
|
82
103
|
stub_post("resource")
|
83
|
-
client.post
|
104
|
+
client.call(:post, "resource")
|
84
105
|
assert_requested :post, bs_url("resource"),
|
85
106
|
headers: {"Content-Type" => "application/vnd.api+json"}
|
86
107
|
end
|
87
108
|
|
88
|
-
it "returns
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
expect(
|
109
|
+
it "returns an Response object of resources" do
|
110
|
+
attributes = {resources: [{name: "Megan"}]}
|
111
|
+
stub_post("resource", body: attributes.to_json)
|
112
|
+
response = client.call(:post, "resource", attributes)
|
113
|
+
expect(response).to be_kind_of(BookingSync::API::Response)
|
93
114
|
end
|
94
115
|
|
95
116
|
context "API returns 401" do
|
@@ -109,9 +130,9 @@ describe BookingSync::API::Client do
|
|
109
130
|
end
|
110
131
|
|
111
132
|
context "API returns 204 No Content" do
|
112
|
-
it "returns
|
133
|
+
it "returns nil" do
|
113
134
|
stub_get("resource", status: 204)
|
114
|
-
expect(client.get("resource")).to
|
135
|
+
expect(client.get("resource")).to be_nil
|
115
136
|
end
|
116
137
|
end
|
117
138
|
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe BookingSync::API::Relation do
|
4
|
+
before { VCR.turn_off! }
|
5
|
+
let(:client) { BookingSync::API::Client.new(test_access_token,
|
6
|
+
base_url: "http://example.com") }
|
7
|
+
let(:links) { {"foo.photos" => "http://example.com/photos/{foo.photos}"} }
|
8
|
+
let(:relation) { BookingSync::API::Relation.new(client, :"foo.photos",
|
9
|
+
"http://example.com/photos/{foo.photos}") }
|
10
|
+
|
11
|
+
describe ".from_links" do
|
12
|
+
it "returns a hash of relations" do
|
13
|
+
relations = BookingSync::API::Relation.from_links(client, links)
|
14
|
+
expect(relations.size).to eql(1)
|
15
|
+
expect(relations).to be_kind_of(Hash)
|
16
|
+
expect(relations["foo.photos"]).to be_kind_of(BookingSync::API::Relation)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe ".from_link" do
|
21
|
+
it "returns a single relation" do
|
22
|
+
relation = BookingSync::API::Relation.from_link(client, :example,
|
23
|
+
href: "https://example.com/photos")
|
24
|
+
expect(relation).to be_kind_of(BookingSync::API::Relation)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "#call" do
|
29
|
+
let(:client) { double(BookingSync::API::Client) }
|
30
|
+
|
31
|
+
it "makes HTTP request using API client" do
|
32
|
+
url_template = Addressable::Template.new("http://example.com/photos/{foo.photos}")
|
33
|
+
expect(client).to receive(:call).with(:get, url_template, nil, {})
|
34
|
+
relation.call
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "#get" do
|
39
|
+
it "makes a HTTP GET using call on relation" do
|
40
|
+
url_template = Addressable::Template.new("http://example.com/photos/{foo.photos}")
|
41
|
+
expect(relation).to receive(:call).with({fields: [:name, :description], method: :get})
|
42
|
+
relation.get(fields: [:name, :description])
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
describe "#name" do
|
48
|
+
it "returns relation name" do
|
49
|
+
expect(relation.name).to eq(:"foo.photos")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "#href_template" do
|
54
|
+
it "returns relation's URL template" do
|
55
|
+
url_template = Addressable::Template.new("http://example.com/photos/{foo.photos}")
|
56
|
+
expect(relation.href_template).to eq(url_template)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "#href" do
|
61
|
+
it "returns relation's URL" do
|
62
|
+
expect(relation.href).to eq("http://example.com/photos/")
|
63
|
+
end
|
64
|
+
|
65
|
+
context "when options given" do
|
66
|
+
it "returns relation's URL expanded" do
|
67
|
+
url = relation.href("foo.photos" => [1, 2, 100])
|
68
|
+
expect(url).to eq("http://example.com/photos/1,2,100")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe BookingSync::API::Resource do
|
4
|
+
let(:links) { {photos: [9, 10]} }
|
5
|
+
let(:resource) {
|
6
|
+
client = BookingSync::API::Client.new(test_access_token,
|
7
|
+
base_url: "http://foo.com")
|
8
|
+
BookingSync::API::Resource.new(client,
|
9
|
+
{
|
10
|
+
name: "foo", width: 700,
|
11
|
+
links: links,
|
12
|
+
details: {count: 1},
|
13
|
+
id: 10
|
14
|
+
},
|
15
|
+
{
|
16
|
+
:"foo.photos" => "http://foo.com/photos/{foo.photos}",
|
17
|
+
:"foo.bars" => "http://foo.com/bars/{foo.bars}"
|
18
|
+
},
|
19
|
+
"foo"
|
20
|
+
)
|
21
|
+
}
|
22
|
+
|
23
|
+
describe "processing values" do
|
24
|
+
it "makes data accessible" do
|
25
|
+
expect(resource.name).to eql("foo")
|
26
|
+
expect(resource.width).to eql(700)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "makes nested data accessible" do
|
30
|
+
expect(resource.details.count).to eql(1)
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "#_resources_key" do
|
34
|
+
it "returns resources_key" do
|
35
|
+
expect(resource._resources_key).to eql("foo")
|
36
|
+
end
|
37
|
+
|
38
|
+
context "for nested resource" do
|
39
|
+
it "returns nil" do
|
40
|
+
expect(resource.details._resources_key).to be_nil
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "associations" do
|
47
|
+
before { VCR.turn_off! }
|
48
|
+
it "fetches an association based on links" do
|
49
|
+
stub_request(:get, "http://foo.com/photos/9,10")
|
50
|
+
.to_return(body: {photos: [{file: 'a.jpg'}]}.to_json)
|
51
|
+
expect(resource.photos).to eql([{:file => "a.jpg"}])
|
52
|
+
end
|
53
|
+
|
54
|
+
context "when there are not associated ids" do
|
55
|
+
let(:links) { {photos: []} }
|
56
|
+
it "returns an empty array" do
|
57
|
+
expect(resource.photos).to eql([])
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "association doesn't exist" do
|
62
|
+
it "raises NoMethodError" do
|
63
|
+
expect { resource.pphotos }.to raise_error(NoMethodError)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
it "passes query option to request" do
|
68
|
+
stub_request(:get, "http://foo.com/photos/9,10?fields=description")
|
69
|
+
.to_return(body: {photos: [{file: 'a.jpg'}]}.to_json)
|
70
|
+
resource.photos(fields: :description)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "#to_s" do
|
75
|
+
it "returns resource id" do
|
76
|
+
expect("#{resource}").to eq("10")
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|