quicktravel_client 3.6.1 → 3.7.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 (92) hide show
  1. checksums.yaml +5 -5
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +4 -2
  4. data/CHANGELOG.md +12 -3
  5. data/README.md +1 -1
  6. data/lib/quick_travel.rb +2 -0
  7. data/lib/quick_travel/adapter.rb +8 -58
  8. data/lib/quick_travel/address.rb +4 -2
  9. data/lib/quick_travel/adjustment.rb +3 -2
  10. data/lib/quick_travel/background_check.rb +4 -2
  11. data/lib/quick_travel/bed_configuration.rb +3 -2
  12. data/lib/quick_travel/bed_requirement.rb +3 -2
  13. data/lib/quick_travel/booking.rb +10 -1
  14. data/lib/quick_travel/checkout.rb +1 -1
  15. data/lib/quick_travel/client.rb +3 -2
  16. data/lib/quick_travel/contact.rb +4 -1
  17. data/lib/quick_travel/init_from_hash.rb +54 -1
  18. data/lib/quick_travel/passenger.rb +7 -2
  19. data/lib/quick_travel/passenger_price_break.rb +3 -2
  20. data/lib/quick_travel/passenger_split.rb +5 -0
  21. data/lib/quick_travel/property.rb +2 -1
  22. data/lib/quick_travel/property_facility.rb +3 -2
  23. data/lib/quick_travel/reservation.rb +4 -0
  24. data/lib/quick_travel/resource.rb +11 -2
  25. data/lib/quick_travel/resource_category.rb +5 -1
  26. data/lib/quick_travel/resource_group.rb +9 -0
  27. data/lib/quick_travel/room_facility.rb +3 -2
  28. data/lib/quick_travel/route_stop.rb +11 -2
  29. data/lib/quick_travel/service.rb +3 -2
  30. data/lib/quick_travel/version.rb +1 -1
  31. data/quicktravel_client.gemspec +2 -1
  32. data/spec/adapter_spec.rb +2 -2
  33. data/spec/booking_spec.rb +14 -6
  34. data/spec/checkout_spec.rb +182 -0
  35. data/spec/product_spec.rb +5 -5
  36. data/spec/region_spec.rb +2 -2
  37. data/spec/reservation_spec.rb +2 -6
  38. data/spec/support/cassettes/accommodation_reserve.yml +109 -51
  39. data/spec/support/cassettes/basic_product_scheduled_trips.yml +19 -33
  40. data/spec/support/cassettes/basic_product_scheduled_trips_multi_sector.yml +19 -27
  41. data/spec/support/cassettes/basic_product_scheduled_trips_unbookable.yml +9 -11
  42. data/spec/support/cassettes/booking_activate.yml +25 -28
  43. data/spec/support/cassettes/booking_cancel.yml +25 -28
  44. data/spec/support/cassettes/booking_create.yml +14 -15
  45. data/spec/support/cassettes/booking_create_accommodation.yml +62 -0
  46. data/spec/support/cassettes/booking_documents.yml +9 -11
  47. data/spec/support/cassettes/booking_non_existant.yml +8 -10
  48. data/spec/support/cassettes/booking_price_changes.yml +19 -17
  49. data/spec/support/cassettes/booking_show.yml +13 -14
  50. data/spec/support/cassettes/booking_update.yml +25 -27
  51. data/spec/support/cassettes/booking_with_documents.yml +35 -36
  52. data/spec/support/cassettes/booking_with_nested_attributes.yml +61 -61
  53. data/spec/support/cassettes/booking_with_price_changes.yml +27 -26
  54. data/spec/support/cassettes/checkout_client_token.yml +11 -13
  55. data/spec/support/cassettes/countries.yml +15 -93
  56. data/spec/support/cassettes/country_all.yml +15 -93
  57. data/spec/support/cassettes/create_reservation_fail.yml +8 -10
  58. data/spec/support/cassettes/create_reservation_with_booking.yml +15 -16
  59. data/spec/support/cassettes/locations.yml +12 -14
  60. data/spec/support/cassettes/opal_modern_pay_failed_booking.yml +62 -0
  61. data/spec/support/cassettes/opal_modern_pay_failed_create.yml +59 -0
  62. data/spec/support/cassettes/opal_modern_pay_failed_update.yml +57 -0
  63. data/spec/support/cassettes/opal_modern_pay_successful_booking.yml +62 -0
  64. data/spec/support/cassettes/opal_modern_pay_successful_response.yml +59 -0
  65. data/spec/support/cassettes/opal_modern_pay_successful_update_response.yml +59 -0
  66. data/spec/support/cassettes/opal_pay.yml +59 -0
  67. data/spec/support/cassettes/opal_pay_booking.yml +62 -0
  68. data/spec/support/cassettes/passenger_all.yml +11 -13
  69. data/spec/support/cassettes/payment_info.yml +9 -11
  70. data/spec/support/cassettes/price_quote.yml +17 -21
  71. data/spec/support/cassettes/product_date_range_bookability.yml +32 -48
  72. data/spec/support/cassettes/product_show.yml +13 -17
  73. data/spec/support/cassettes/product_show_as_agent.yml +14 -22
  74. data/spec/support/cassettes/product_type_all.yml +16 -14
  75. data/spec/support/cassettes/product_type_resource_categories.yml +9 -11
  76. data/spec/support/cassettes/product_type_resource_categories_tickets.yml +12 -14
  77. data/spec/support/cassettes/product_type_routes.yml +14 -16
  78. data/spec/support/cassettes/property.yml +16 -18
  79. data/spec/support/cassettes/property_types.yml +12 -14
  80. data/spec/support/cassettes/region_show.yml +11 -13
  81. data/spec/support/cassettes/reservation_resource.yml +62 -0
  82. data/spec/support/cassettes/reservation_with_extra_picks.yml +54 -60
  83. data/spec/support/cassettes/resource_category_all.yml +12 -14
  84. data/spec/support/cassettes/resource_category_all_for_product_type_8.yml +11 -13
  85. data/spec/support/cassettes/resource_fare_bases.yml +18 -23
  86. data/spec/support/cassettes/resource_show.yml +15 -17
  87. data/spec/support/cassettes/resource_with_price.yml +16 -18
  88. data/spec/support/cassettes/settings_basic.yml +9 -11
  89. data/spec/support/cassettes/tenant_switcher.yml +31 -27
  90. data/spec/support/cassettes/wrong_url.yml +25 -46
  91. data/spec/support/coverage_loader.rb +1 -1
  92. metadata +43 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 72a489cb7817b24b10974577573ac48201ada117
4
- data.tar.gz: d0588b714309e3e3cbd7425638171a32193cf615
2
+ SHA256:
3
+ metadata.gz: b60bf00c1c2d71210f2d1f462986abba8859b7acd216b13d68c8d4ad2c475e9d
4
+ data.tar.gz: 79cb1bad6bdd5a2178577824c1196ff9e5728beda74e5474bac7f9e53e63c053
5
5
  SHA512:
6
- metadata.gz: aa65860cb328ee8428b409c33c10d42c4bc2ce838c9c53ec386da17a0350d6af2c6d0d3f08e56d8074421df5a71f63d99e57759d1448e640d6c8ff94caa462ca
7
- data.tar.gz: 246af3dc7676cd28979f6e681573b2c8a893bc8c0675095d0f118b597bc20552299bbc4b911a0ea0a15a55644d7b9cda2b3f2542faac1f6e58028b2092413502
6
+ metadata.gz: 205130ad17115f1f0491351af5b76242a8b67a1f384912708fa4ebad3211d428e83284c41aa8c024d82b1004371415848d47a7fd44bd86fcd375952c5eb68737
7
+ data.tar.gz: b0cca6ec2c7b5dd695112ba71d112f7593c8bc174070c380aade2d3ddd5aed23b9a44eec3796c207b65ef3d87c6f6bd2f02ced5c3248e58a505907ddfcb2c1f4
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.2.4
1
+ 2.5.0
data/.travis.yml CHANGED
@@ -1,7 +1,9 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2.5
4
- - 2.3.1
3
+ - 2.2
4
+ - 2.3
5
+ - 2.4
6
+ - 2.5
5
7
  script: bundle && bundle exec rake spec
6
8
  gemfile:
7
9
  - gemfiles/rails4.gemfile
data/CHANGELOG.md CHANGED
@@ -3,12 +3,21 @@ All notable changes to this project will be documented in this file.
3
3
  This project adheres to [Semantic Versioning](http://semver.org/).
4
4
  This changelog adheres to [Keep a CHANGELOG](http://keepachangelog.com/).
5
5
 
6
- ## [Unreleased]
6
+ ## [3.7.0]
7
+ ### Added
8
+ - [DC-1437] Add relationship accesssor methods
9
+ - [TT-3337] Add booking.delete_reservations method
10
+ - [TT-3780] Add tests for Opal payments
11
+ - [TT-3780] Add tests for Opal payment using create / update workflow
7
12
 
8
- ## [3.6.1]
9
- ###
13
+ ### Fixed
10
14
  - [TT-3304] Handle no response in booking update API
11
15
 
16
+ ### Changed
17
+ - [TT-3333] URL encode data sent to booking reference lookup
18
+ - [TT-3783] Remove deprecated FixNum
19
+ - [TT-3812] Update cassettes
20
+
12
21
  ## [3.6.0]
13
22
  ###
14
23
  - [ROT-114] Add drop off details
data/README.md CHANGED
@@ -27,4 +27,4 @@ bundle exec puma -Ilib -p7000
27
27
 
28
28
  In QuickTravel Client:
29
29
  rm spec/support/cassettes/ -rf
30
- QT_KEYS=a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2,a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2 bundle exec rspec
30
+ QT_KEYS=a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2,1b0a9f8e7d6c5b4a3f2e1d0c9b8a7f6e5d4c3b2a1f0e9d8c7b6a5f4e3d2c1b0a bundle exec rspec
data/lib/quick_travel.rb CHANGED
@@ -36,6 +36,7 @@ module QuickTravel
36
36
  require 'quick_travel/party'
37
37
  require 'quick_travel/passenger'
38
38
  require 'quick_travel/passenger_type'
39
+ require 'quick_travel/passenger_split'
39
40
  require 'quick_travel/payment'
40
41
  require 'quick_travel/background_check'
41
42
  require 'quick_travel/payment_type'
@@ -49,6 +50,7 @@ module QuickTravel
49
50
  require 'quick_travel/reservation'
50
51
  require 'quick_travel/resource'
51
52
  require 'quick_travel/resource_category'
53
+ require 'quick_travel/resource_group'
52
54
  require 'quick_travel/room_facility'
53
55
  require 'quick_travel/route_stop'
54
56
  require 'quick_travel/service'
@@ -25,27 +25,6 @@ module QuickTravel
25
25
  # ]
26
26
  class_attribute :object_key # Key of sub-objects (i.e. convert under a key)
27
27
 
28
- def initialize(hash = {})
29
- return nil if hash.blank?
30
- define_readers(hash.keys)
31
- super(Parser.new(hash).parsed_attributes)
32
- end
33
-
34
- def define_readers(keys)
35
- keys.each do |key|
36
- next if respond_to?(key)
37
- define_singleton_method(key) { instance_variable_get("@#{key}") }
38
- if key.to_s.ends_with? '_cents'
39
- name = key.to_s.gsub(/_in_cents$/, '')
40
- define_singleton_method(name) {
41
- cents = instance_variable_get("@#{key}")
42
- return nil unless cents
43
- Money.new(cents)
44
- }
45
- end
46
- end
47
- end
48
-
49
28
  def self.has_many(relation_name, options = {})
50
29
  define_method relation_name do
51
30
  instance_variable_get("@#{relation_name}") || instance_variable_set(
@@ -105,6 +84,14 @@ module QuickTravel
105
84
  instance_values
106
85
  end
107
86
 
87
+ def to_s
88
+ if defined? @to_s
89
+ @to_s
90
+ else
91
+ super
92
+ end
93
+ end
94
+
108
95
  protected
109
96
 
110
97
  def self.check_id!(id)
@@ -223,43 +210,6 @@ module QuickTravel
223
210
  end
224
211
  end
225
212
 
226
- class Parser
227
- def initialize(attributes)
228
- @attributes = attributes
229
- end
230
-
231
- def attributes
232
- @attributes ||= {}
233
- end
234
-
235
- def parsed_attributes
236
- @parsed_attributes ||= parse_attributes
237
- end
238
-
239
- private
240
-
241
- def parse_attributes
242
- attributes.map.with_object({}) do |(attribute, value), hash|
243
- hash[attribute] = parse(attribute, value)
244
- end
245
- end
246
-
247
- def parse(attribute, value)
248
- return nil if value.nil?
249
- return convert(value, :to_date) if attribute.to_s.ends_with?('_date')
250
- return convert(value, :to_date) if attribute.to_s.ends_with?('_on')
251
- # to_datetime as it converts to app time zone, to_time converts to system time zone
252
- return convert(value, :to_datetime) if attribute.to_s.ends_with?('_time')
253
- return convert(value, :to_datetime) if attribute.to_s.ends_with?('_at')
254
- value
255
- end
256
-
257
- def convert(value, conversion_method)
258
- convertable_value = value.is_a?(Hash) ? value['_value'] : value
259
- convertable_value.send(conversion_method)
260
- end
261
- end
262
-
263
213
  class Api
264
214
  include HTTParty
265
215
 
@@ -1,7 +1,9 @@
1
- require 'quick_travel/adapter'
1
+ require 'quick_travel/init_from_hash'
2
2
 
3
3
  module QuickTravel
4
- class Address < Adapter
4
+ class Address
5
+ include QuickTravel::InitFromHash
6
+
5
7
  def country_name
6
8
  QuickTravel::Country.find(@country_id).name
7
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 Adjustment < Adapter
4
+ class Adjustment
5
+ include QuickTravel::InitFromHash
5
6
  end
6
7
  end
@@ -1,7 +1,9 @@
1
- require 'quick_travel/adapter'
1
+ require 'quick_travel/init_from_hash'
2
2
 
3
3
  module QuickTravel
4
- class BackgroundCheck < Adapter
4
+ class BackgroundCheck
5
+ include QuickTravel::InitFromHash
6
+
5
7
  def self.check(options = {})
6
8
  get_and_validate('/background_check/check.json', options)
7
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 BedConfiguration < Adapter
4
+ class BedConfiguration
5
+ include QuickTravel::InitFromHash
5
6
  end
6
7
  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 BedRequirement < Adapter
4
+ class BedRequirement
5
+ include QuickTravel::InitFromHash
5
6
  end
6
7
  end
@@ -4,6 +4,7 @@ require 'quick_travel/vehicle'
4
4
  require 'quick_travel/payment'
5
5
  require 'quick_travel/payment_type'
6
6
  require 'quick_travel/price_changes'
7
+ require 'uri'
7
8
 
8
9
  module QuickTravel
9
10
  class Booking < Adapter
@@ -12,7 +13,7 @@ module QuickTravel
12
13
  end
13
14
 
14
15
  def self.find_by_reference(reference)
15
- find_all!("#{api_base}/reference/#{reference}.json").first
16
+ find_all!("#{api_base}/reference/#{URI.escape(reference)}.json").first
16
17
  end
17
18
 
18
19
  def documents(regenerate = false)
@@ -156,6 +157,10 @@ module QuickTravel
156
157
  reserve(:packages, options)
157
158
  end
158
159
 
160
+ def delete_reservations
161
+ delete_and_validate("#{api_base}/#{@id}/reservations")
162
+ end
163
+
159
164
  # Delete a reservation
160
165
  #
161
166
  # Returns current booking object after deleting the reservation
@@ -184,6 +189,10 @@ module QuickTravel
184
189
  vehicles.detect { |v| v.id.to_i == vid.to_i }
185
190
  end
186
191
 
192
+ def passengers
193
+ @passenger_objects ||= @passengers_attributes.map{ |p| Passenger.new(p) }
194
+ end
195
+
187
196
  def passenger_types_counts
188
197
  passengers.each_with_object(Hash.new(0)) do |passenger, hash|
189
198
  hash[passenger.passenger_type_id] += 1
@@ -46,7 +46,7 @@ module QuickTravel
46
46
  # TODO Move to an external builder?
47
47
  def self.attributes_for
48
48
  attrs = yield
49
- attrs[:completed] = (attrs['progress'] == 'completed')
49
+ attrs[:completed] = attrs['progress'] == 'completed' || attrs['successful']
50
50
  attrs[:successful] = attrs[:completed]
51
51
  attrs
52
52
  rescue AdapterError => e
@@ -1,6 +1,7 @@
1
- require 'quick_travel/adapter'
1
+ require 'quick_travel/init_from_hash'
2
2
 
3
3
  module QuickTravel
4
- class Client < Adapter
4
+ class Client
5
+ include QuickTravel::InitFromHash
5
6
  end
6
7
  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,57 @@ 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
+ end
32
+
33
+ class Parser
34
+ def initialize(attributes)
35
+ @attributes = attributes
36
+ end
37
+
38
+ def attributes
39
+ @attributes ||= {}
40
+ end
41
+
42
+ def parsed_attributes
43
+ @parsed_attributes ||= parse_attributes
44
+ end
45
+
46
+ private
47
+
48
+ def parse_attributes
49
+ attributes.map.with_object({}) do |(attribute, value), hash|
50
+ hash[attribute] = parse(attribute, value)
51
+ end
52
+ end
53
+
54
+ def parse(attribute, value)
55
+ return nil if value.nil?
56
+ return convert(value, :to_date) if attribute.to_s.ends_with?('_date')
57
+ return convert(value, :to_date) if attribute.to_s.ends_with?('_on')
58
+ # to_datetime as it converts to app time zone, to_time converts to system time zone
59
+ return convert(value, :to_datetime) if attribute.to_s.ends_with?('_time')
60
+ return convert(value, :to_datetime) if attribute.to_s.ends_with?('_at')
61
+ value
62
+ end
63
+
64
+ def convert(value, conversion_method)
65
+ convertable_value = value.is_a?(Hash) ? value['_value'] : value
66
+ convertable_value.try(conversion_method) || convertable_value
67
+ end
15
68
  end
16
69
  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
@@ -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
@@ -5,10 +5,10 @@ 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)
@@ -20,6 +20,15 @@ module QuickTravel
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)