quicktravel_client 1.0.2
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.
- checksums.yaml +7 -0
- data/.gitignore +25 -0
- data/.rspec +2 -0
- data/.rubocop.yml +13 -0
- data/.ruby-version +1 -0
- data/.travis.yml +18 -0
- data/Gemfile +5 -0
- data/LICENSE +22 -0
- data/README.md +17 -0
- data/Rakefile +18 -0
- data/bootstrap/boot.rb +4 -0
- data/examples/example_config.rb +4 -0
- data/examples/login_example.rb +25 -0
- data/lib/extensions.rb +12 -0
- data/lib/quick_travel/accommodation.rb +72 -0
- data/lib/quick_travel/adapter.rb +283 -0
- data/lib/quick_travel/adapter_exception.rb +20 -0
- data/lib/quick_travel/address.rb +27 -0
- data/lib/quick_travel/adjustment.rb +8 -0
- data/lib/quick_travel/background_check.rb +9 -0
- data/lib/quick_travel/bed_configuration.rb +7 -0
- data/lib/quick_travel/bed_requirement.rb +7 -0
- data/lib/quick_travel/booking.rb +370 -0
- data/lib/quick_travel/cache.rb +38 -0
- data/lib/quick_travel/client.rb +8 -0
- data/lib/quick_travel/client_type.rb +6 -0
- data/lib/quick_travel/config.rb +26 -0
- data/lib/quick_travel/connection_error.rb +9 -0
- data/lib/quick_travel/constants.rb +16 -0
- data/lib/quick_travel/contact.rb +5 -0
- data/lib/quick_travel/country.rb +11 -0
- data/lib/quick_travel/credit_card.rb +12 -0
- data/lib/quick_travel/discounts/booking_discount.rb +18 -0
- data/lib/quick_travel/discounts/discount.rb +21 -0
- data/lib/quick_travel/discounts/discount_tree.rb +35 -0
- data/lib/quick_travel/discounts.rb +3 -0
- data/lib/quick_travel/document.rb +20 -0
- data/lib/quick_travel/document_group.rb +14 -0
- data/lib/quick_travel/encrypt.rb +13 -0
- data/lib/quick_travel/graphic.rb +18 -0
- data/lib/quick_travel/init_from_hash.rb +16 -0
- data/lib/quick_travel/location.rb +14 -0
- data/lib/quick_travel/mock.rb +41 -0
- data/lib/quick_travel/party.rb +49 -0
- data/lib/quick_travel/passenger.rb +7 -0
- data/lib/quick_travel/passenger_price_break.rb +8 -0
- data/lib/quick_travel/passenger_type.rb +21 -0
- data/lib/quick_travel/payment.rb +41 -0
- data/lib/quick_travel/payment_type.rb +37 -0
- data/lib/quick_travel/price.rb +14 -0
- data/lib/quick_travel/product.rb +165 -0
- data/lib/quick_travel/product_configuration.rb +134 -0
- data/lib/quick_travel/product_passenger_search_criteria.rb +28 -0
- data/lib/quick_travel/product_type.rb +28 -0
- data/lib/quick_travel/property.rb +99 -0
- data/lib/quick_travel/property_facility.rb +7 -0
- data/lib/quick_travel/property_type.rb +20 -0
- data/lib/quick_travel/region.rb +21 -0
- data/lib/quick_travel/reservation.rb +110 -0
- data/lib/quick_travel/resource.rb +50 -0
- data/lib/quick_travel/room_facility.rb +7 -0
- data/lib/quick_travel/route.rb +81 -0
- data/lib/quick_travel/route_stop.rb +7 -0
- data/lib/quick_travel/search.rb +14 -0
- data/lib/quick_travel/service.rb +5 -0
- data/lib/quick_travel/trip.rb +8 -0
- data/lib/quick_travel/vehicle.rb +17 -0
- data/lib/quick_travel/vehicle_type.rb +11 -0
- data/lib/quick_travel/version.rb +3 -0
- data/lib/quick_travel.rb +59 -0
- data/lib/quicktravel_client.rb +1 -0
- data/quicktravel_client.gemspec +37 -0
- data/spec/booking_spec.rb +107 -0
- data/spec/country_spec.rb +18 -0
- data/spec/credit_card_spec.rb +11 -0
- data/spec/discounts_spec.rb +121 -0
- data/spec/passenger_type_spec.rb +32 -0
- data/spec/payment_type_spec.rb +18 -0
- data/spec/product_spec.rb +82 -0
- data/spec/region_spec.rb +29 -0
- data/spec/reservation_spec.rb +50 -0
- data/spec/resource_spec.rb +22 -0
- data/spec/spec_helper.rb +77 -0
- data/spec/support/cassettes/booking_create.yml +50 -0
- data/spec/support/cassettes/booking_create_legacy.yml +50 -0
- data/spec/support/cassettes/booking_discounts.yml +53 -0
- data/spec/support/cassettes/booking_documents.yml +48 -0
- data/spec/support/cassettes/booking_show.yml +49 -0
- data/spec/support/cassettes/booking_update.yml +94 -0
- data/spec/support/cassettes/booking_with_discounts.yml +72 -0
- data/spec/support/cassettes/booking_with_documents.yml +117 -0
- data/spec/support/cassettes/booking_with_nested_attributes.yml +187 -0
- data/spec/support/cassettes/country_all.yml +127 -0
- data/spec/support/cassettes/create_reservation_fail.yml +47 -0
- data/spec/support/cassettes/create_reservation_with_booking.yml +53 -0
- data/spec/support/cassettes/passenger_all.yml +48 -0
- data/spec/support/cassettes/product_date_range_bookability.yml +118 -0
- data/spec/support/cassettes/product_show.yml +52 -0
- data/spec/support/cassettes/region_index.yml +48 -0
- data/spec/support/cassettes/region_show.yml +48 -0
- data/spec/support/cassettes/reservation_with_extra_picks.yml +165 -0
- data/spec/support/cassettes/resource_fare_bases.yml +97 -0
- data/spec/support/cassettes/resource_show.yml +50 -0
- metadata +421 -0
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'quick_travel/adapter'
|
2
|
+
require 'quick_travel/cache'
|
3
|
+
|
4
|
+
module QuickTravel
|
5
|
+
class PropertyType < Adapter
|
6
|
+
include Cache
|
7
|
+
|
8
|
+
attr_accessor :id, :name, :position
|
9
|
+
|
10
|
+
def self.first(_id = nil)
|
11
|
+
generic_first('/property_types.json')
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.all
|
15
|
+
QuickTravel::Cache.cache 'all_property_types' do
|
16
|
+
self.find_all!('/property_types.json')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'quick_travel/adapter'
|
2
|
+
require 'quick_travel/cache'
|
3
|
+
|
4
|
+
module QuickTravel
|
5
|
+
class Region < Adapter
|
6
|
+
include Cache
|
7
|
+
|
8
|
+
attr_accessor :id, :name, :location_ids
|
9
|
+
|
10
|
+
self.api_base = '/regions'
|
11
|
+
self.lookup = true
|
12
|
+
|
13
|
+
def self.first
|
14
|
+
generic_first '/regions.json'
|
15
|
+
end
|
16
|
+
|
17
|
+
def locations
|
18
|
+
Location.all.select { |l| location_ids.include?(l.id) }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'quick_travel/adapter'
|
2
|
+
require 'quick_travel/adjustment'
|
3
|
+
require 'quick_travel/resource'
|
4
|
+
|
5
|
+
module QuickTravel
|
6
|
+
class Reservation < Adapter
|
7
|
+
attr_accessor :id, :booking_id,
|
8
|
+
:gross_in_cents, :commission_in_cents, :cost_in_cents, :pre_adjusted_gross_in_cents,
|
9
|
+
:pre_adjusted_gross_including_packaged_item_in_cents, :gross_including_packaged_item_in_cents, :price_rules,
|
10
|
+
:first_travel_date, :last_travel_date, :checkout_date, :created_at, :start_time, :end_time,
|
11
|
+
:resource_id, :resource_class_name, :product_type_id, :product_type_name,
|
12
|
+
:bed_configuration_id, :inventory_type, :quantity,
|
13
|
+
:comment, :selection_name,
|
14
|
+
:service_ids,
|
15
|
+
:vehicle_splits, :passenger_splits,
|
16
|
+
:adjustments_attributes,
|
17
|
+
:inverse_reservation_id,
|
18
|
+
:from_route_stop_attributes, :to_route_stop_attributes,
|
19
|
+
:route_id, :trip_id, :route_path, :pick_up_information, :drop_off_information,
|
20
|
+
:complete, :enough_time_before_travel_to_edit
|
21
|
+
|
22
|
+
money :gross, :commission, :cost, :pre_adjusted_gross, :gross_including_packaged_item, :pre_adjusted_gross_including_packaged_item
|
23
|
+
|
24
|
+
def self.create(options)
|
25
|
+
json = post_and_validate('/api/reservations.json', options, expect: :json)
|
26
|
+
new(json)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.destroy(id)
|
30
|
+
delete_and_validate("/api/reservations/#{id}.json")
|
31
|
+
end
|
32
|
+
|
33
|
+
def adjustments
|
34
|
+
@adjustments_attributes.map { |adjustment| Adjustment.new(adjustment) }
|
35
|
+
end
|
36
|
+
|
37
|
+
def resource
|
38
|
+
@resource ||= QuickTravel::Resource.find(resource_id) if resource_id
|
39
|
+
end
|
40
|
+
|
41
|
+
def start_date_time
|
42
|
+
start_time.to_time.on(first_travel_date) if start_time
|
43
|
+
end
|
44
|
+
|
45
|
+
def end_date_time
|
46
|
+
end_time.to_time.on(last_travel_date) if end_time
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_route_stop
|
50
|
+
QuickTravel::RouteStop.new(@to_route_stop_attributes) if @to_route_stop_attributes
|
51
|
+
end
|
52
|
+
|
53
|
+
def from_route_stop
|
54
|
+
QuickTravel::RouteStop.new(@from_route_stop_attributes) if @from_route_stop_attributes
|
55
|
+
end
|
56
|
+
|
57
|
+
# it send API request for Resource show. and cache the data.
|
58
|
+
# i think now this method is not required because now booking show api call have display_text for every reservation
|
59
|
+
def details
|
60
|
+
if @_resource.blank?
|
61
|
+
@_resource = Resource.find(@resource_id) unless @resource_id.blank?
|
62
|
+
end
|
63
|
+
@_resource
|
64
|
+
end
|
65
|
+
|
66
|
+
def sub_reservations
|
67
|
+
@sub_reservations ||= Array(@sub_reservations_attributes).map do |attributes|
|
68
|
+
Reservation.new(attributes)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def passengers_count_string(booking)
|
73
|
+
passengers_count(booking).join(', ')
|
74
|
+
end
|
75
|
+
|
76
|
+
def passengers_count(booking)
|
77
|
+
passenger_type_count = {}
|
78
|
+
if passenger_splits.present?
|
79
|
+
passenger_splits.each do |p|
|
80
|
+
passenger = booking.find_passenger_by_id(p['consumer_id'])
|
81
|
+
|
82
|
+
if passenger.present?
|
83
|
+
passenger_type_count[passenger.passenger_type_id] ||= 0
|
84
|
+
passenger_type_count[passenger.passenger_type_id] += 1
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
PassengerType.passenger_counts(passenger_type_count)
|
89
|
+
end
|
90
|
+
|
91
|
+
def vehicle_count_string(booking)
|
92
|
+
vehicles_count(booking).to_sentence
|
93
|
+
end
|
94
|
+
|
95
|
+
def vehicles_count(booking)
|
96
|
+
vehicle_splits.map do|v|
|
97
|
+
vehicle = booking.find_vehicle_by_id(v['consumer_id'])
|
98
|
+
"#{vehicle.length}m #{vehicle.vehicle_type.name}"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def duration
|
103
|
+
(last_travel_date - first_travel_date + 1).to_i
|
104
|
+
end
|
105
|
+
|
106
|
+
def adjusted?
|
107
|
+
pre_adjusted_gross_including_packaged_item != gross_including_packaged_item
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'quick_travel/adapter'
|
2
|
+
require 'quick_travel/bed_requirement'
|
3
|
+
require 'quick_travel/passenger_price_break'
|
4
|
+
require 'quick_travel/product_type'
|
5
|
+
require 'quick_travel/cache'
|
6
|
+
|
7
|
+
module QuickTravel
|
8
|
+
class Resource < Adapter
|
9
|
+
include QuickTravel::Cache
|
10
|
+
attr_accessor :id,
|
11
|
+
:code,
|
12
|
+
:name,
|
13
|
+
:current_description,
|
14
|
+
:images,
|
15
|
+
:category,
|
16
|
+
:property_name,
|
17
|
+
:product_type_id,
|
18
|
+
:package_options,
|
19
|
+
:bed_requirements,
|
20
|
+
:client_type_ids,
|
21
|
+
:restrict_to_client_types,
|
22
|
+
:type
|
23
|
+
self.api_base = '/resources'
|
24
|
+
|
25
|
+
def sub_resources
|
26
|
+
Resource.find_all!('/resources.json', parent_resource_id: @id)
|
27
|
+
end
|
28
|
+
|
29
|
+
def product_type
|
30
|
+
QuickTravel::ProductType.all.detect { |pt| pt.id == product_type_id }
|
31
|
+
end
|
32
|
+
|
33
|
+
# this method is also duplicated in accommodation class. because now its room facilities are now also available in property show api call
|
34
|
+
def room_facilities
|
35
|
+
if @_room_facilities.blank?
|
36
|
+
@_room_facilities = []
|
37
|
+
@room_facilities.each do |item|
|
38
|
+
@_room_facilities << RoomFacility.new(item['room_facility'])
|
39
|
+
end
|
40
|
+
end
|
41
|
+
@_room_facilities
|
42
|
+
end
|
43
|
+
|
44
|
+
def bed_requirements
|
45
|
+
@_bed_requirements ||= Array.wrap(@bed_requirements).map do |bed_requirement|
|
46
|
+
BedRequirement.new(bed_requirement)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module QuickTravel
|
2
|
+
class Route < Adapter
|
3
|
+
attr_accessor :id, :name, :path, :position, :product_type_id, :reverse_id, :route_stops
|
4
|
+
|
5
|
+
# First route for product_type_id
|
6
|
+
def self.first(product_type_id)
|
7
|
+
generic_first("/product_types/#{product_type_id}/routes.json")
|
8
|
+
end
|
9
|
+
|
10
|
+
# find_by_id -- but the API only does lookup by product_type_id
|
11
|
+
def self.find_by_route_id_and_product_type_id(route_id, product_type_id)
|
12
|
+
all_by_route_ids_and_product_type_id([route_id.to_i], product_type_id).first
|
13
|
+
end
|
14
|
+
|
15
|
+
# Return routes that match the given ids and product_type_id
|
16
|
+
#
|
17
|
+
# Initializes with path set
|
18
|
+
def self.all_by_route_ids_and_product_type_id(route_ids, product_type_id)
|
19
|
+
all(product_type_id).select do|route|
|
20
|
+
route_ids.include?(route.id.to_i)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# All routes for a given product type
|
25
|
+
def self.all(product_type_id)
|
26
|
+
cache_key = "trip_routes_#{product_type_id}"
|
27
|
+
routes = QuickTravel::Cache.cache_store.read(cache_key)
|
28
|
+
|
29
|
+
if routes.blank? || !routes.first.instance_of?(Route) # this is hack for development env. Lazy loading is main issue with it.
|
30
|
+
routes = self.find_all!("/product_types/#{product_type_id}/routes.json")
|
31
|
+
QuickTravel::Cache.cache_store.write(
|
32
|
+
cache_key,
|
33
|
+
routes,
|
34
|
+
expires_in: 1440.minutes # expires_in will only work with something like Rails.cache
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
38
|
+
routes
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.find(routes_list, route_id)
|
42
|
+
routes_list.detect do|route|
|
43
|
+
route.id.to_i == route_id.to_i
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def route_stops
|
48
|
+
@_stops ||= @route_stops.map { |item| RouteStop.new(item) }
|
49
|
+
end
|
50
|
+
|
51
|
+
def get_return_route_stop!(forward_stop)
|
52
|
+
if forward_stop.blank?
|
53
|
+
fail AdapterException, 'Selected pick up/drop off stops have not been set up for the selected route.'
|
54
|
+
end
|
55
|
+
|
56
|
+
reverse_stop = get_reverse_route!.route_stops.detect { |route_stop| route_stop.name == forward_stop.name }
|
57
|
+
|
58
|
+
if reverse_stop.blank?
|
59
|
+
fail AdapterException, 'Selected pick up/drop off stops have not been setup on the reverse route.'
|
60
|
+
end
|
61
|
+
reverse_stop
|
62
|
+
end
|
63
|
+
|
64
|
+
def get_reverse_route!
|
65
|
+
if reverse_id.blank?
|
66
|
+
fail AdapterException, 'Reverse has not been setup for the selected route.'
|
67
|
+
end
|
68
|
+
|
69
|
+
reverse_route = Route.find_by_route_id_and_product_type_id(reverse_id, product_type_id)
|
70
|
+
if reverse_route.blank?
|
71
|
+
fail AdapterException, 'Reverse does not exist for the selected route.'
|
72
|
+
end
|
73
|
+
|
74
|
+
reverse_route
|
75
|
+
end
|
76
|
+
|
77
|
+
def find_route_stop_by_id(route_stop_id)
|
78
|
+
route_stops.detect { |route_stop| route_stop.id.to_i == route_stop_id.to_i }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'quick_travel/init_from_hash'
|
2
|
+
|
3
|
+
module QuickTravel
|
4
|
+
class Search
|
5
|
+
attr_accessor :property_type_id, :property_name, :product, :last_travel_date, :location_id
|
6
|
+
attr_accessor :category # type of search
|
7
|
+
attr_accessor :way # used for one_way or two_way in "getting there search"
|
8
|
+
attr_accessor :route_id # for getting there search
|
9
|
+
attr_accessor :number_of_rooms # required for accommodation search
|
10
|
+
attr_accessor :forward_connection_date, :backward_connection_date
|
11
|
+
|
12
|
+
include QuickTravel::InitFromHash
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'quick_travel/adapter'
|
2
|
+
|
3
|
+
module QuickTravel
|
4
|
+
class Vehicle < Adapter
|
5
|
+
attr_accessor :id, :vehicle_type_id, :registration, :length, :linked_to, :vehicle_type_name, :details
|
6
|
+
|
7
|
+
def self.create(booking_id, vehicle_types = {})
|
8
|
+
options = { booking_id: booking_id, vehicle_types: vehicle_types }
|
9
|
+
response = post_and_validate("#{Booking.front_office_base}/#{booking_id}/vehicles.json", options)
|
10
|
+
fail AdapterException.new(response) unless response.key?('booking_id')
|
11
|
+
end
|
12
|
+
|
13
|
+
def vehicle_type
|
14
|
+
VehicleType.all.detect { |vt| vt.id == vehicle_type_id }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'quick_travel/adapter'
|
2
|
+
|
3
|
+
module QuickTravel
|
4
|
+
class VehicleType < Adapter
|
5
|
+
attr_accessor :id, :name, :position, :code, :default_weight, :description, :detail_prompt, :double_length, :fixed_length, :fixed_weight
|
6
|
+
attr_accessor :has_cargo, :default, :maximum_length, :minimum_length, :trailer
|
7
|
+
|
8
|
+
self.api_base = '/vehicle_types'
|
9
|
+
self.lookup = true
|
10
|
+
end
|
11
|
+
end
|
data/lib/quick_travel.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# QuickTravel
|
2
|
+
#
|
3
|
+
module QuickTravel
|
4
|
+
VERSION = '0.0.2'
|
5
|
+
|
6
|
+
require 'active_support' # for .try, etc.
|
7
|
+
|
8
|
+
require 'quick_travel/cache'
|
9
|
+
require 'quick_travel/config'
|
10
|
+
require 'quick_travel/adapter'
|
11
|
+
require 'quick_travel/adapter_exception'
|
12
|
+
require 'quick_travel/connection_error'
|
13
|
+
|
14
|
+
# Don't include this guy: pull the pieces into the classes that use it, or ref
|
15
|
+
require 'quick_travel/constants'
|
16
|
+
|
17
|
+
require 'quick_travel/product'
|
18
|
+
require 'quick_travel/product_configuration'
|
19
|
+
require 'quick_travel/search'
|
20
|
+
|
21
|
+
# QuickTravel models
|
22
|
+
require 'quick_travel/graphic'
|
23
|
+
require 'quick_travel/accommodation'
|
24
|
+
require 'quick_travel/adapter'
|
25
|
+
require 'quick_travel/address'
|
26
|
+
require 'quick_travel/bed_configuration'
|
27
|
+
require 'quick_travel/booking'
|
28
|
+
require 'quick_travel/client'
|
29
|
+
require 'quick_travel/client_type'
|
30
|
+
require 'quick_travel/contact'
|
31
|
+
require 'quick_travel/country'
|
32
|
+
require 'quick_travel/document'
|
33
|
+
require 'quick_travel/document_group'
|
34
|
+
require 'quick_travel/location'
|
35
|
+
require 'quick_travel/party'
|
36
|
+
require 'quick_travel/passenger'
|
37
|
+
require 'quick_travel/passenger_type'
|
38
|
+
require 'quick_travel/payment'
|
39
|
+
require 'quick_travel/background_check'
|
40
|
+
require 'quick_travel/payment_type'
|
41
|
+
require 'quick_travel/product_type'
|
42
|
+
require 'quick_travel/property'
|
43
|
+
require 'quick_travel/property_facility'
|
44
|
+
require 'quick_travel/property_type'
|
45
|
+
require 'quick_travel/route'
|
46
|
+
require 'quick_travel/region'
|
47
|
+
require 'quick_travel/reservation'
|
48
|
+
require 'quick_travel/resource'
|
49
|
+
require 'quick_travel/room_facility'
|
50
|
+
require 'quick_travel/route_stop'
|
51
|
+
require 'quick_travel/service'
|
52
|
+
require 'quick_travel/trip'
|
53
|
+
require 'quick_travel/vehicle'
|
54
|
+
require 'quick_travel/vehicle_type'
|
55
|
+
|
56
|
+
require 'quick_travel/product_passenger_search_criteria'
|
57
|
+
require 'money'
|
58
|
+
require 'extensions'
|
59
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'quick_travel'
|
@@ -0,0 +1,37 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'quick_travel/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'quicktravel_client'
|
7
|
+
spec.version = QuickTravel::VERSION
|
8
|
+
spec.authors = ['Michael Noack', 'Adam Davies', 'Alessandro Berardi']
|
9
|
+
spec.email = 'support@travellink.com.au'
|
10
|
+
spec.description = 'For integrating with QuickTravel API'
|
11
|
+
spec.summary = 'Booking process using QuickTravel API'
|
12
|
+
spec.homepage = 'https://bitbucket.org/team-sealink/quicktravel_client'
|
13
|
+
|
14
|
+
spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
15
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
16
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
17
|
+
spec.require_paths = ['lib']
|
18
|
+
|
19
|
+
spec.add_dependency 'httparty'
|
20
|
+
spec.add_dependency 'geokit', '~> 1.8.3' # used in address model
|
21
|
+
spec.add_dependency 'activesupport', '>= 2.0.0'
|
22
|
+
spec.add_dependency 'money_extensions'
|
23
|
+
spec.add_dependency 'facets'
|
24
|
+
spec.add_dependency 'money', '>= 3.0', '< 6.0' # 6.0 starts to deprecate/split
|
25
|
+
|
26
|
+
spec.add_development_dependency 'bundler', '~> 1.7'
|
27
|
+
spec.add_development_dependency 'rake'
|
28
|
+
spec.add_development_dependency 'rspec'
|
29
|
+
spec.add_development_dependency 'rspec-its'
|
30
|
+
spec.add_development_dependency 'simplecov'
|
31
|
+
spec.add_development_dependency 'simplecov-rcov'
|
32
|
+
spec.add_development_dependency 'coveralls'
|
33
|
+
spec.add_development_dependency 'stamp' # Used to send appropriate dates to API's
|
34
|
+
spec.add_development_dependency 'vcr'
|
35
|
+
spec.add_development_dependency 'fakeweb'
|
36
|
+
spec.add_development_dependency 'rubocop'
|
37
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'quick_travel/booking'
|
3
|
+
require 'quick_travel/document'
|
4
|
+
|
5
|
+
describe QuickTravel::Booking do
|
6
|
+
before(:each) do
|
7
|
+
@booking = QuickTravel::Booking.new(gross_in_cents: 500)
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should show me the money' do
|
11
|
+
expect(@booking.gross).to be_an_instance_of Money
|
12
|
+
expect(@booking.gross).to eq 5.to_money
|
13
|
+
expect(@booking.gross_in_cents).to eq 500
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe QuickTravel::Booking, '#on_account_payment_type' do
|
18
|
+
subject(:booking) { QuickTravel::Booking.new }
|
19
|
+
before { allow(booking).to receive(:payment_types) { payment_types } }
|
20
|
+
let(:reference) { double(code: 'on_account_with_reference') }
|
21
|
+
let(:on_account) { double(code: 'on_account_without_reference') }
|
22
|
+
let(:cash) { double(code: 'Cash') }
|
23
|
+
|
24
|
+
context 'when no on account types are applicable' do
|
25
|
+
let(:payment_types) { [cash] }
|
26
|
+
its(:on_account_payment_type) { should be nil }
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'when only reference required' do
|
30
|
+
let(:payment_types) { [cash, reference] }
|
31
|
+
its(:on_account_payment_type) { should eq reference }
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'when both on account and reference required' do
|
35
|
+
let(:payment_types) { [cash, reference, on_account] }
|
36
|
+
its(:on_account_payment_type) { should be on_account }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe QuickTravel::Booking do
|
41
|
+
before(:each) do
|
42
|
+
VCR.use_cassette('booking_create') do
|
43
|
+
QuickTravel.config.version = 4
|
44
|
+
@booking = QuickTravel::Booking.create
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should find a first instance of booking with given booking.id from QuickTravel' do
|
49
|
+
VCR.use_cassette('booking_show') do
|
50
|
+
b = QuickTravel::Booking.find(@booking.id)
|
51
|
+
expect(b).to be_an_instance_of QuickTravel::Booking
|
52
|
+
expect(b.id).to eq @booking.id
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should be able to return its assigned reservations' do
|
57
|
+
VCR.use_cassette('booking_show') do
|
58
|
+
b = QuickTravel::Booking.find(@booking.id)
|
59
|
+
expect(b.reservations).to be_an_instance_of Array
|
60
|
+
expect(b.reservations.size).to eq 0
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should be able to update the booking' do
|
65
|
+
VCR.use_cassette('booking_update') do
|
66
|
+
response = @booking.update(customer_contact_name: 'John')
|
67
|
+
expect(response.class).to eq QuickTravel::Booking
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'should not have booking documents' do
|
72
|
+
VCR.use_cassette('booking_documents') do
|
73
|
+
expect(@booking.documents.size).to eq 0
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe QuickTravel::Booking do
|
79
|
+
let(:booking) { QuickTravel::Booking.find(1) }
|
80
|
+
it 'should have booking documents' do
|
81
|
+
VCR.use_cassette('booking_with_documents') do
|
82
|
+
expect(booking.documents.size).to eq 1
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe QuickTravel::Booking do
|
88
|
+
let(:booking) { QuickTravel::Booking.find(1) }
|
89
|
+
subject(:consumer) { booking.passengers.first }
|
90
|
+
it 'should updated nested attributes' do
|
91
|
+
updated_booking = nil
|
92
|
+
VCR.use_cassette('booking_with_nested_attributes') do
|
93
|
+
expect(booking.customer_contact_name).to be nil
|
94
|
+
expect(consumer.id).to eq 1
|
95
|
+
expect(consumer.title).to be nil
|
96
|
+
expect(consumer.first_name).to be nil
|
97
|
+
updated_booking = booking.update_with_nested_attributes!(
|
98
|
+
customer_contact_name: 'New Name',
|
99
|
+
consumers: [{id: 1, title: 'Mr', first_name: 'New', last_name: 'Name'}]
|
100
|
+
)
|
101
|
+
end
|
102
|
+
updated_consumer = updated_booking.passengers.first
|
103
|
+
expect(updated_booking.customer_contact_name).to eq 'New Name'
|
104
|
+
expect(updated_consumer.title).to eq 'Mr'
|
105
|
+
expect(updated_consumer.first_name).to eq 'New'
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'quick_travel/country'
|
3
|
+
|
4
|
+
describe QuickTravel::Country do
|
5
|
+
before do
|
6
|
+
VCR.use_cassette('country_all') do
|
7
|
+
@countries = QuickTravel::Country.all
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should fetch all countries' do
|
12
|
+
expect(@countries).to_not be_empty
|
13
|
+
au = @countries.detect { |c| c.iso_3166_code == 'AU' }
|
14
|
+
expect(au.name).to eq 'Australia'
|
15
|
+
au.id
|
16
|
+
expect(QuickTravel::Country.find(au.id).name).to eq 'Australia'
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'quick_travel/credit_card'
|
3
|
+
|
4
|
+
describe QuickTravel::CreditCard do
|
5
|
+
it 'determine the correct payment type for credit card number' do
|
6
|
+
expect(QuickTravel::CreditCard.type_from_number('4000123456780123')).to eq 'visa'
|
7
|
+
expect(QuickTravel::CreditCard.type_from_number('5400123456780123')).to eq 'master'
|
8
|
+
expect(QuickTravel::CreditCard.type_from_number('3600123456780123')).to eq 'diners_club'
|
9
|
+
expect(QuickTravel::CreditCard.type_from_number('3400123456780123')).to eq 'american_express'
|
10
|
+
end
|
11
|
+
end
|