quicktravel_client 3.6.1 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. checksums.yaml +5 -5
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +6 -3
  4. data/CHANGELOG.md +36 -3
  5. data/README.md +1 -1
  6. data/gemfiles/rails6.gemfile +8 -0
  7. data/lib/quick_travel.rb +4 -0
  8. data/lib/quick_travel/adapter.rb +19 -81
  9. data/lib/quick_travel/address.rb +4 -2
  10. data/lib/quick_travel/adjustment.rb +3 -2
  11. data/lib/quick_travel/background_check.rb +4 -2
  12. data/lib/quick_travel/bed_configuration.rb +3 -2
  13. data/lib/quick_travel/bed_requirement.rb +3 -2
  14. data/lib/quick_travel/booking.rb +11 -1
  15. data/lib/quick_travel/cache.rb +24 -5
  16. data/lib/quick_travel/checkout.rb +1 -1
  17. data/lib/quick_travel/client.rb +9 -0
  18. data/lib/quick_travel/contact.rb +4 -1
  19. data/lib/quick_travel/init_from_hash.rb +58 -1
  20. data/lib/quick_travel/package.rb +13 -0
  21. data/lib/quick_travel/passenger.rb +7 -2
  22. data/lib/quick_travel/passenger_price_break.rb +3 -2
  23. data/lib/quick_travel/passenger_split.rb +5 -0
  24. data/lib/quick_travel/passenger_type.rb +1 -1
  25. data/lib/quick_travel/product_configuration.rb +1 -1
  26. data/lib/quick_travel/products/base.rb +4 -4
  27. data/lib/quick_travel/property.rb +2 -1
  28. data/lib/quick_travel/property_facility.rb +3 -2
  29. data/lib/quick_travel/reservation.rb +5 -1
  30. data/lib/quick_travel/resource.rb +12 -3
  31. data/lib/quick_travel/resource_category.rb +5 -1
  32. data/lib/quick_travel/resource_group.rb +9 -0
  33. data/lib/quick_travel/room_facility.rb +3 -2
  34. data/lib/quick_travel/route.rb +1 -1
  35. data/lib/quick_travel/route_stop.rb +18 -2
  36. data/lib/quick_travel/service.rb +3 -2
  37. data/lib/quick_travel/version.rb +1 -1
  38. data/quicktravel_client.gemspec +6 -5
  39. data/spec/adapter_spec.rb +36 -5
  40. data/spec/booking_spec.rb +24 -6
  41. data/spec/clients_spec.rb +42 -0
  42. data/spec/discounts_spec.rb +21 -21
  43. data/spec/package_spec.rb +24 -0
  44. data/spec/passenger_type_spec.rb +1 -1
  45. data/spec/product_configuration_spec.rb +11 -0
  46. data/spec/product_spec.rb +5 -5
  47. data/spec/region_spec.rb +2 -2
  48. data/spec/reservation_spec.rb +22 -6
  49. data/spec/spec_helper.rb +6 -3
  50. data/spec/support/cassettes/accommodation_reserve.yml +119 -53
  51. data/spec/support/cassettes/basic_product_scheduled_trips.yml +22 -34
  52. data/spec/support/cassettes/basic_product_scheduled_trips_multi_sector.yml +22 -28
  53. data/spec/support/cassettes/basic_product_scheduled_trips_unbookable.yml +12 -12
  54. data/spec/support/cassettes/booking_activate.yml +31 -30
  55. data/spec/support/cassettes/booking_cancel.yml +31 -30
  56. data/spec/support/cassettes/booking_create.yml +17 -16
  57. data/spec/support/cassettes/booking_create_accommodation.yml +64 -0
  58. data/spec/support/cassettes/booking_documents.yml +12 -12
  59. data/spec/support/cassettes/booking_non_existant.yml +11 -11
  60. data/spec/support/cassettes/booking_price_changes.yml +22 -18
  61. data/spec/support/cassettes/booking_show.yml +16 -15
  62. data/spec/support/cassettes/booking_update.yml +31 -29
  63. data/spec/support/cassettes/booking_with_comments.yml +119 -0
  64. data/spec/support/cassettes/booking_with_documents.yml +41 -38
  65. data/spec/support/cassettes/booking_with_nested_attributes.yml +70 -64
  66. data/spec/support/cassettes/booking_with_price_changes.yml +30 -27
  67. data/spec/support/cassettes/checkout_client_token.yml +14 -14
  68. data/spec/support/cassettes/client_templates.yml +120 -0
  69. data/spec/support/cassettes/countries.yml +18 -94
  70. data/spec/support/cassettes/country_all.yml +18 -94
  71. data/spec/support/cassettes/create_reservation_fail.yml +11 -11
  72. data/spec/support/cassettes/create_reservation_with_booking.yml +18 -17
  73. data/spec/support/cassettes/locations.yml +15 -15
  74. data/spec/support/cassettes/opal_modern_pay_failed_booking.yml +64 -0
  75. data/spec/support/cassettes/opal_modern_pay_failed_create.yml +61 -0
  76. data/spec/support/cassettes/opal_modern_pay_failed_update.yml +59 -0
  77. data/spec/support/cassettes/opal_modern_pay_successful_booking.yml +64 -0
  78. data/spec/support/cassettes/opal_modern_pay_successful_response.yml +61 -0
  79. data/spec/support/cassettes/opal_modern_pay_successful_update_response.yml +61 -0
  80. data/spec/support/cassettes/opal_pay.yml +61 -0
  81. data/spec/support/cassettes/opal_pay_booking.yml +64 -0
  82. data/spec/support/cassettes/package_show.yml +83 -0
  83. data/spec/support/cassettes/package_show_product_type.yml +80 -0
  84. data/spec/support/cassettes/passenger_all.yml +14 -14
  85. data/spec/support/cassettes/payment_info.yml +12 -12
  86. data/spec/support/cassettes/price_quote.yml +23 -23
  87. data/spec/support/cassettes/product_date_range_bookability.yml +35 -49
  88. data/spec/support/cassettes/product_show.yml +16 -18
  89. data/spec/support/cassettes/product_show_as_agent.yml +17 -23
  90. data/spec/support/cassettes/product_type_all.yml +19 -15
  91. data/spec/support/cassettes/product_type_resource_categories.yml +12 -12
  92. data/spec/support/cassettes/product_type_resource_categories_tickets.yml +15 -15
  93. data/spec/support/cassettes/product_type_routes.yml +17 -17
  94. data/spec/support/cassettes/property.yml +19 -19
  95. data/spec/support/cassettes/property_types.yml +15 -15
  96. data/spec/support/cassettes/region_show.yml +14 -14
  97. data/spec/support/cassettes/reservation_resource.yml +64 -0
  98. data/spec/support/cassettes/reservation_with_extra_picks.yml +63 -63
  99. data/spec/support/cassettes/resource_category_all.yml +15 -15
  100. data/spec/support/cassettes/resource_category_all_for_product_type_8.yml +14 -14
  101. data/spec/support/cassettes/resource_fare_bases.yml +21 -24
  102. data/spec/support/cassettes/resource_show.yml +18 -18
  103. data/spec/support/cassettes/resource_with_price.yml +19 -19
  104. data/spec/support/cassettes/settings_basic.yml +12 -12
  105. data/spec/support/cassettes/tenant_switcher.yml +37 -29
  106. data/spec/support/cassettes/wrong_url.yml +28 -47
  107. data/spec/support/coverage_loader.rb +1 -1
  108. metadata +69 -27
  109. data/gemfiles/rails4.gemfile +0 -9
@@ -1,6 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'quick_travel/adapter'
4
+ require 'quick_travel/init_from_hash'
2
5
 
3
6
  module QuickTravel
4
7
  class Client < Adapter
8
+ include QuickTravel::InitFromHash
9
+ self.api_base = '/api/clients'
10
+
11
+ def templates
12
+ get_and_validate("/api/clients/#{id}/templates")
13
+ end
5
14
  end
6
15
  end
@@ -1,4 +1,7 @@
1
+ require 'quick_travel/init_from_hash'
2
+
1
3
  module QuickTravel
2
- class Contact < Adapter
4
+ class Contact
5
+ include QuickTravel::InitFromHash
3
6
  end
4
7
  end
@@ -3,7 +3,8 @@ module QuickTravel
3
3
  def initialize(hash = {})
4
4
  return nil if hash.blank?
5
5
 
6
- hash.each do |attr, val|
6
+ define_readers(hash.keys)
7
+ Parser.new(hash).parsed_attributes.each do |attr, val|
7
8
  # set datamember of the object using hash key and value
8
9
  if respond_to?("#{attr}=")
9
10
  send("#{attr}=", val)
@@ -12,5 +13,61 @@ module QuickTravel
12
13
  end
13
14
  end
14
15
  end
16
+
17
+ def define_readers(keys)
18
+ keys.each do |key|
19
+ next if respond_to?(key)
20
+ define_singleton_method(key) { instance_variable_get("@#{key}") }
21
+ if key.to_s.ends_with? '_cents'
22
+ name = key.to_s.gsub(/_in_cents$/, '')
23
+ define_singleton_method(name) {
24
+ cents = instance_variable_get("@#{key}")
25
+ return nil unless cents
26
+ Money.new(cents)
27
+ }
28
+ end
29
+ end
30
+ end
31
+
32
+ def to_hash
33
+ instance_values
34
+ end
35
+ end
36
+
37
+ class Parser
38
+ def initialize(attributes)
39
+ @attributes = attributes
40
+ end
41
+
42
+ def attributes
43
+ @attributes ||= {}
44
+ end
45
+
46
+ def parsed_attributes
47
+ @parsed_attributes ||= parse_attributes
48
+ end
49
+
50
+ private
51
+
52
+ def parse_attributes
53
+ attributes.map.with_object({}) do |(attribute, value), hash|
54
+ hash[attribute] = parse(attribute, value)
55
+ end
56
+ end
57
+
58
+ def parse(attribute, value)
59
+ return nil if value.nil?
60
+ return convert(value, :to_date) if attribute.to_s.ends_with?('_date')
61
+ return convert(value, :to_date) if attribute.to_s.ends_with?('_on')
62
+ # to_datetime as it converts to app time zone, to_time converts to system time zone
63
+ return convert(value, :to_datetime) if attribute.to_s.ends_with?('_time')
64
+ return convert(value, :to_datetime) if attribute.to_s.ends_with?('_at')
65
+ value
66
+ end
67
+
68
+ def convert(value, conversion_method)
69
+ convertable_value = value.is_a?(Hash) ? value['_value'] : value
70
+ convertable_value.try(conversion_method) || convertable_value
71
+ end
15
72
  end
16
73
  end
@@ -0,0 +1,13 @@
1
+ require 'quick_travel/adapter'
2
+
3
+ module QuickTravel
4
+ class Package < Adapter
5
+ attr_reader :error_message
6
+
7
+ self.api_base = '/api/packages'
8
+
9
+ def product_type
10
+ QuickTravel::ProductType.find(product_type_id)
11
+ end
12
+ end
13
+ end
@@ -1,6 +1,11 @@
1
- require 'quick_travel/adapter'
1
+ require 'quick_travel/init_from_hash'
2
2
 
3
3
  module QuickTravel
4
- class Passenger < Adapter
4
+ class Passenger
5
+ include QuickTravel::InitFromHash
6
+
7
+ def passenger_type
8
+ QuickTravel::PassengerType.find(@passenger_type_id)
9
+ end
5
10
  end
6
11
  end
@@ -1,6 +1,7 @@
1
- require 'quick_travel/adapter'
1
+ require 'quick_travel/init_from_hash'
2
2
 
3
3
  module QuickTravel
4
- class PassengerPriceBreak < Adapter
4
+ class PassengerPriceBreak
5
+ include QuickTravel::InitFromHash
5
6
  end
6
7
  end
@@ -0,0 +1,5 @@
1
+ module QuickTravel
2
+ class PassengerSplit
3
+ include QuickTravel::InitFromHash
4
+ end
5
+ end
@@ -13,7 +13,7 @@ module QuickTravel
13
13
  end
14
14
 
15
15
  def self.pluralize(count, singular, plural = nil)
16
- "#{count || 0} " + ((count == 1 || count =~ /^1(\.0+)?$/) ? singular : (plural || singular.pluralize))
16
+ "#{count || 0} " + ((count == 1) ? singular : (plural || singular.pluralize))
17
17
  end
18
18
  end
19
19
  end
@@ -31,7 +31,7 @@ module QuickTravel
31
31
  end
32
32
 
33
33
  def priced?
34
- @product.pricing_details.present?
34
+ @product.try(:pricing_details).present?
35
35
  end
36
36
 
37
37
  def price
@@ -7,13 +7,13 @@ module QuickTravel
7
7
  bookable || exception_type == 'inventory'
8
8
  end
9
9
 
10
- def self.find(search_params = {})
11
- find_for_type(@reservation_for_type, search_params)
10
+ def self.find(search_params = {}, opts = {})
11
+ find_for_type(@reservation_for_type, search_params, opts)
12
12
  end
13
13
 
14
- def self.find_for_type(type, search_params = {})
14
+ def self.find_for_type(type, search_params = {}, opts = {})
15
15
  url = "/reservation_for/#{type}/find_services_for.json"
16
- product_maps = post_and_validate(url, search_params)
16
+ product_maps = post_and_validate(url, search_params, opts)
17
17
  product_maps.map { |product_map| new(product_map) }
18
18
  end
19
19
  end
@@ -3,6 +3,7 @@ require 'quick_travel/property_facility'
3
3
 
4
4
  module QuickTravel
5
5
  class Property < Adapter
6
+ self.api_base = '/api/properties'
6
7
  attr_reader :error
7
8
 
8
9
  def accommodations=(hash_array)
@@ -23,7 +24,7 @@ module QuickTravel
23
24
 
24
25
  def self.load_with_pricing(id, options)
25
26
  # Find property 'standard' way -- finds price for whole duration
26
- fail ArgumentError.new('Must Specify valid property id') if id.blank? || id.class != Fixnum
27
+ fail ArgumentError.new('Must Specify valid property id') if id.blank? || !id.is_a?(Integer)
27
28
  property = find_all!("/api/properties/#{id}.json", options).first
28
29
  first_travel_date = options.fetch(:product).fetch(:first_travel_date)
29
30
  property.accommodations.each do |accommodation|
@@ -1,6 +1,7 @@
1
- require 'quick_travel/adapter'
1
+ require 'quick_travel/init_from_hash'
2
2
 
3
3
  module QuickTravel
4
- class PropertyFacility < Adapter
4
+ class PropertyFacility
5
+ include QuickTravel::InitFromHash
5
6
  end
6
7
  end
@@ -30,6 +30,10 @@ module QuickTravel
30
30
  end_time.to_time.on(last_travel_date) if end_time
31
31
  end
32
32
 
33
+ def passenger_splits
34
+ @_passenger_splits ||= @passenger_splits.map{ |split| PassengerSplit.new(split) }
35
+ end
36
+
33
37
  def passengers_count_string(booking)
34
38
  passengers_count(booking).join(', ')
35
39
  end
@@ -38,7 +42,7 @@ module QuickTravel
38
42
  passenger_type_count = {}
39
43
  if passenger_splits.present?
40
44
  passenger_splits.each do |p|
41
- passenger = booking.find_passenger_by_id(p['consumer_id'])
45
+ passenger = booking.find_passenger_by_id(p.consumer_id)
42
46
 
43
47
  if passenger.present?
44
48
  passenger_type_count[passenger.passenger_type_id] ||= 0
@@ -5,21 +5,30 @@ require 'quick_travel/product_type'
5
5
 
6
6
  module QuickTravel
7
7
  class Resource < Adapter
8
- self.api_base = '/resources'
8
+ self.api_base = '/api/resources'
9
9
 
10
10
  def sub_resources
11
- Resource.find_all!('/resources.json', parent_resource_id: @id)
11
+ Resource.find_all!('/api/resources.json', parent_resource_id: @id)
12
12
  end
13
13
 
14
14
  def self.all_with_price(opts)
15
15
  cache_key = GenerateCacheKey.new(name, opts).call
16
- find_all!("/api/resources/index_with_price.json", opts.merge(cache: cache_key))
16
+ find_all!("/api/resources/index_with_price.json", opts.merge(cache_key: cache_key))
17
17
  end
18
18
 
19
19
  def product_type
20
20
  QuickTravel::ProductType.find(product_type_id)
21
21
  end
22
22
 
23
+ def locations
24
+ location_ids.map{ |id| Location.find(id) }
25
+ end
26
+
27
+ def category
28
+ return nil if @category.nil?
29
+ @_category ||= QuickTravel::ResourceCategory.new(@category)
30
+ end
31
+
23
32
  def bed_requirements
24
33
  @_bed_requirements ||= Array.wrap(@bed_requirements).map do |bed_requirement|
25
34
  BedRequirement.new(bed_requirement)
@@ -4,5 +4,9 @@ module QuickTravel
4
4
  class ResourceCategory < Adapter
5
5
  self.api_base = '/api/resource_categories'
6
6
  self.lookup = true
7
- end
7
+
8
+ def product_type
9
+ QuickTravel::ProductType.find(product_type_id)
10
+ end
11
+ end
8
12
  end
@@ -0,0 +1,9 @@
1
+ module QuickTravel
2
+ class ResourceGroup
3
+ include QuickTravel::InitFromHash
4
+
5
+ def product_type
6
+ ProductType.find(product_type_id)
7
+ end
8
+ end
9
+ end
@@ -1,6 +1,7 @@
1
- require 'quick_travel/adapter'
1
+ require 'quick_travel/init_from_hash'
2
2
 
3
3
  module QuickTravel
4
- class RoomFacility < Adapter
4
+ class RoomFacility
5
+ include QuickTravel::InitFromHash
5
6
  end
6
7
  end
@@ -17,7 +17,7 @@ module QuickTravel
17
17
  # All routes for a given product type
18
18
  def self.all(product_type_id)
19
19
  find_all!("/product_types/#{product_type_id}/routes.json",
20
- cache: "QuickTravel::Route.all-#{product_type_id}-attrs")
20
+ cache_key: "QuickTravel::Route.all-#{product_type_id}-attrs")
21
21
  end
22
22
 
23
23
  def self.find(routes_list, route_id)
@@ -1,6 +1,22 @@
1
- require 'quick_travel/adapter'
1
+ require 'quick_travel/init_from_hash'
2
2
 
3
3
  module QuickTravel
4
- class RouteStop < Adapter
4
+ class RouteStop
5
+ include QuickTravel::InitFromHash
6
+
7
+ def stop
8
+ Stop.new({
9
+ id: stop_id,
10
+ name: name,
11
+ code: code,
12
+ address: address,
13
+ longitude: longitude,
14
+ latitude: latitude
15
+ })
16
+ end
17
+ end
18
+
19
+ class Stop
20
+ include QuickTravel::InitFromHash
5
21
  end
6
22
  end
@@ -1,6 +1,7 @@
1
- require 'quick_travel/adapter'
1
+ require 'quick_travel/init_from_hash'
2
2
 
3
3
  module QuickTravel
4
- class Service < Adapter
4
+ class Service
5
+ include QuickTravel::InitFromHash
5
6
  end
6
7
  end
@@ -1,3 +1,3 @@
1
1
  module QuickTravel
2
- VERSION = '3.6.1'
2
+ VERSION = '4.0.0'
3
3
  end
@@ -16,13 +16,14 @@ Gem::Specification.new do |spec|
16
16
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
17
  spec.require_paths = ['lib']
18
18
 
19
- spec.add_dependency 'httparty', '~> 0.14'
20
- spec.add_dependency 'json'
21
- spec.add_dependency 'activesupport', '>= 2.0.0'
19
+ spec.add_dependency 'httparty'
20
+ spec.add_dependency 'activesupport', '>= 5.0.0'
22
21
  spec.add_dependency 'facets'
23
- spec.add_dependency 'money', '>= 3.0', '< 6.0' # 6.0 starts to deprecate/split
22
+ spec.add_dependency 'money', '>= 6.0'
23
+ spec.add_dependency 'money_extensions', '>= 1.0'
24
+ spec.add_dependency 'will_paginate'
24
25
 
25
- spec.add_development_dependency 'bundler', '~> 1.7'
26
+ spec.add_development_dependency 'bundler', '~> 2'
26
27
  spec.add_development_dependency 'rake'
27
28
  spec.add_development_dependency 'rspec'
28
29
  spec.add_development_dependency 'rspec-its'
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
  require 'quick_travel/adapter'
3
3
 
4
4
  describe QuickTravel::Adapter do
5
- let(:response) { double code: 200, parsed_response: parsed_response }
5
+ let(:response) { double code: 200, parsed_response: parsed_response, headers: {} }
6
6
  let(:parsed_response) { { test: true } }
7
7
 
8
8
  before do
@@ -26,8 +26,7 @@ describe QuickTravel::Adapter do
26
26
  let(:expected_body) {
27
27
  {
28
28
  test: true,
29
- sub_hash: { id: 42 },
30
- access_key: an_instance_of(String)
29
+ sub_hash: { id: 42 }
31
30
  }
32
31
  }
33
32
 
@@ -37,7 +36,7 @@ describe QuickTravel::Adapter do
37
36
  end
38
37
 
39
38
  context 'when response non standard' do
40
- let(:url) { 'http://www.google.com' }
39
+ let(:url) { 'https://httpstat.us/418' }
41
40
 
42
41
  let(:adapter_response) {
43
42
  VCR.use_cassette 'wrong_url' do
@@ -48,8 +47,40 @@ describe QuickTravel::Adapter do
48
47
  specify do
49
48
  expect { adapter_response }.to raise_error(
50
49
  QuickTravel::AdapterError,
51
- /That’s all we know/
50
+ /418 I'm a teapot/
52
51
  )
53
52
  end
54
53
  end
54
+
55
+ context 'when cache options present' do
56
+ subject(:all) do
57
+ QuickTravel::Adapter.call_and_validate(:get, 'some_path', {}, { cache_key: 'test_key', cache_options: { expires_in: 3.minutes } })
58
+ end
59
+ let(:api) { double }
60
+
61
+ before do
62
+ QuickTravel::Cache.cache_store.clear
63
+ stub_const('QuickTravel::Api', api)
64
+ allow(api).to receive(:call_and_validate) { [{id: 1}, {id: 2}] }
65
+ all
66
+ end
67
+
68
+ specify { expect(api).to have_received(:call_and_validate).once }
69
+
70
+ context 'when called again' do
71
+ before do
72
+ QuickTravel::Adapter.call_and_validate(:get, 'some_path', {}, { cache_key: 'test_key', cache_options: { expires_in: 3.minutes } })
73
+ end
74
+
75
+ specify { expect(api).to have_received(:call_and_validate).once } # not called again
76
+ end
77
+
78
+ context 'when called with different key' do
79
+ before do
80
+ QuickTravel::Adapter.call_and_validate(:get, 'some_path', {}, { cache_key: 'test_key1', cache_options: { expires_in: 3.minutes } })
81
+ end
82
+
83
+ specify { expect(api).to have_received(:call_and_validate).twice }
84
+ end
85
+ end
55
86
  end
@@ -65,7 +65,7 @@ describe QuickTravel::Booking do
65
65
  VCR.use_cassette('booking_show') do
66
66
  b = QuickTravel::Booking.find(@booking.id)
67
67
  expect(b.payment_types).to be_an_instance_of Array
68
- expect(b.payment_types.size).to eq 3
68
+ expect(b.payment_types.size).to eq 4
69
69
  expect(b.payment_types.first).to be_an_instance_of QuickTravel::PaymentType
70
70
  expect(b.payments).to be_an_instance_of Array
71
71
  expect(b.payments.size).to eq 0
@@ -144,10 +144,12 @@ end
144
144
 
145
145
  describe QuickTravel::Booking, 'when booking accommodation' do
146
146
  let(:booking) {
147
- VCR.use_cassette('booking_with_documents') {
148
- QuickTravel::Booking.find(1)
149
- }
147
+ VCR.use_cassette('booking_create_accommodation') do
148
+ QuickTravel.config.version = 4
149
+ QuickTravel::Booking.create
150
+ end
150
151
  }
152
+
151
153
  let(:reservation) {
152
154
  VCR.use_cassette('accommodation_reserve') do
153
155
  booking.accommodation_reserve(
@@ -157,14 +159,20 @@ describe QuickTravel::Booking, 'when booking accommodation' do
157
159
  first_travel_date: '01/03/2016',
158
160
  last_travel_date: '02/03/2016'
159
161
  )
160
- booking.reservations.detect { |reservation| reservation.resource.name == 'Executive Room' }
162
+ QuickTravel::Booking.find(booking.id).reservations.detect { |reservation| reservation.resource.name == 'Executive Room' }
163
+ end
164
+ }
165
+
166
+ let(:resource) {
167
+ VCR.use_cassette('reservation_resource') do
168
+ QuickTravel::Resource.find(reservation.resource_id)
161
169
  end
162
170
  }
163
171
 
164
172
  it 'should create acommodation reservation' do
165
173
  expect(reservation.first_travel_date).to eq '2016-03-01'.to_date
166
174
  expect(reservation.last_travel_date).to eq '2016-03-02'.to_date
167
- expect(reservation.resource.name).to eq 'Executive Room'
175
+ expect(resource.name).to eq 'Executive Room'
168
176
  expect(reservation.passenger_ids).to eq booking.passenger_ids
169
177
  end
170
178
  end
@@ -199,3 +207,13 @@ describe QuickTravel::Booking, "when booking doesn't exist" do
199
207
  end
200
208
  end
201
209
  end
210
+
211
+ describe QuickTravel::Booking, "#customer_comments" do
212
+ let(:booking) { QuickTravel::Booking.find(333536) }
213
+
214
+ it 'should return customer comments' do
215
+ VCR.use_cassette('booking_with_comments') do
216
+ expect(booking.customer_comments).to eq 'I hate this'
217
+ end
218
+ end
219
+ end