quicktravel_client 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|