def test_return_arrival_time(self): f1 = FlightSearchBuilder().return_arrival_time((time(0,0,1), time(0,0,2))) f2 = FlightSearch.return_arrival_time((time(0,0,1), time(0,0,2))) f3 = FlightSearchBuilder(return_arrival_time=(time(0,0,1), time(0,0,2))) self.assertEqual(f1._departure_date, f2._departure_date) self.assertEqual(f2._departure_date, f3._departure_date)
def test_from_place(self): f1 = FlightSearchBuilder().from_place("SFO") f2 = FlightSearch.from_place("SFO") f3 = FlightSearchBuilder(from_location="SFO") self.assertEqual(f1._from_location, f2._from_location) self.assertEqual(f2._from_location, f3._from_location)
def test_return_departure_date(self): f1 = FlightSearchBuilder().return_departure_date(datetime(2020,1,1)) f2 = FlightSearch.return_departure_date(datetime(2020,1,1)) f3 = FlightSearchBuilder(return_departure_date=datetime(2020,1,1)) self.assertEqual(f1._departure_date, f2._departure_date) self.assertEqual(f2._departure_date, f3._departure_date)
def test_price_threshold(self): f1 = FlightSearchBuilder().price_threshold(100) f2 = FlightSearch.price_threshold(100) f3 = FlightSearchBuilder(price_threshold=100) self.assertEqual(f1._price_threshold, f2._price_threshold) self.assertEqual(f2._price_threshold, f3._price_threshold)
def test_allow_layovers(self): f1 = FlightSearchBuilder().allow_layovers(True) f2 = FlightSearch.allow_layovers(True) f3 = FlightSearchBuilder(allow_layovers=True) self.assertEqual(f1._allow_layovers, f2._allow_layovers) self.assertEqual(f2._allow_layovers, f3._allow_layovers)
def test_start_from(self): f1 = FlightSearchBuilder().start_from(datetime(2020,1,1)) f2 = FlightSearch.start_from(datetime(2020,1,1)) f3 = FlightSearchBuilder(start_from=datetime(2020,1,1)) self.assertEqual(f1._start_from, f2._start_from) self.assertEqual(f2._start_from, f3._start_from)
def test_chain_elements(self): f1 = FlightSearchBuilder().from_place("SFO").to_place("MCO").allow_layovers(True).price_threshold(100) f2 = FlightSearchBuilder(from_location="SFO", to_location="MCO", allow_layovers=True, price_threshold=100) self.assertEqual(f1._from_location, f2._from_location) self.assertEqual(f1._to_location, f2._to_location) self.assertEqual(f1._allow_layovers, f2._allow_layovers) self.assertEqual(f1._price_threshold, f2._price_threshold)
def test_weekend(self): f1 = FlightSearchBuilder().weekend() f2 = FlightSearch.weekend() f3 = FlightSearchBuilder(departure_time=(time(hour=18, minute=0), time(hour=23, minute=59)), return_arrival_time=(time(hour=0, minute=0), time(hour=23, minute=0)), departure_day=Day.FRIDAY, return_arrival_day=Day.SUNDAY) self.assertEqual(f1._departure_time, f2._departure_time) self.assertEqual(f2._departure_time, f3._departure_time) self.assertEqual(f1._return_arrival_time, f2._return_arrival_time) self.assertEqual(f2._return_arrival_time, f3._return_arrival_time) self.assertEqual(f1._departure_day, f2._departure_day) self.assertEqual(f2._departure_day, f3._departure_day) self.assertEqual(f1._return_arrival_day, f2._return_arrival_day) self.assertEqual(f2._return_arrival_day, f3._return_arrival_day)
def return_arrival_time(time_range): if type(time_range) != tuple: return ConfigurationError( "Input to arrival_time must be a tuple of string objects that represent times." ) if not isinstance(time_range[0], time) or not isinstance( time_range[1], time): return ConfigurationError( "Input to arrival_time must be a tuple of string objects that represent times." ) return FlightSearchBuilder(return_arrival_time=time_range)
def weekend(): departure_time_range = (time(hour=18, minute=0), time(hour=23, minute=59)) return_time_range = (time(hour=0, minute=0), time(hour=23, minute=0)) #arrival_time_range = (time(hour=0, minute=0), time(hour=6, minute=0)) departure_day = Day.FRIDAY return_arrival_day = Day.SUNDAY return FlightSearchBuilder(departure_time=departure_time_range, return_arrival_time=return_time_range, departure_day=departure_day, return_arrival_day=return_arrival_day)
def test_build_flight_search_queries_min(self): f = FlightSearchBuilder(from_location="SFO", to_location="MCO", start_from=date(2020, 1, 1)) query = build_flight_search_queries(f) self.assertEqual(len(query), 1) self.assertEqual( query[0], "https://api.skypicker.com/flights?partner=picky&curr=USD&max_stopovers=0&fly_from=SFO&fly_to=MCO&date_from=01/01/2020&date_to=01/03/2020" )
def test_build_flight_search_queries_with_return_arrival_time(self): f = FlightSearchBuilder(from_location="SFO", to_location="MCO", start_from=date(2020, 1, 1), return_arrival_time=(time(hour=10, minute=0), time(hour=12, minute=0))) query = build_flight_search_queries(f) self.assertEqual(len(query), 1) self.assertEqual( query[0], "https://api.skypicker.com/flights?partner=picky&curr=USD&max_stopovers=0&fly_from=SFO&fly_to=MCO&ret_atime_from=10:00&ret_atime_to=12:00&date_from=01/01/2020&date_to=01/03/2020" )
def test_build_flight_search_queries_with_departure_day_and_return_arrival_day( self): f = FlightSearchBuilder(from_location="SFO", to_location="MCO", start_from=date(2020, 1, 1), departure_day=Day.SATURDAY, return_arrival_day=Day.MONDAY) query = build_flight_search_queries(f) self.assertEqual(len(query), 9) self.assertEqual( query[0], "https://api.skypicker.com/flights?partner=picky&curr=USD&max_stopovers=0&fly_from=SFO&fly_to=MCO&date_from=04/01/2020&date_to=04/01/2020&return_from=06/01/2020&return_to=06/01/2020&nights_in_dst_from=1&nights_in_dst_to=1" ) self.assertEqual( query[1], "https://api.skypicker.com/flights?partner=picky&curr=USD&max_stopovers=0&fly_from=SFO&fly_to=MCO&date_from=11/01/2020&date_to=11/01/2020&return_from=13/01/2020&return_to=13/01/2020&nights_in_dst_from=1&nights_in_dst_to=1" ) self.assertEqual( query[2], "https://api.skypicker.com/flights?partner=picky&curr=USD&max_stopovers=0&fly_from=SFO&fly_to=MCO&date_from=18/01/2020&date_to=18/01/2020&return_from=20/01/2020&return_to=20/01/2020&nights_in_dst_from=1&nights_in_dst_to=1" ) self.assertEqual( query[3], "https://api.skypicker.com/flights?partner=picky&curr=USD&max_stopovers=0&fly_from=SFO&fly_to=MCO&date_from=25/01/2020&date_to=25/01/2020&return_from=27/01/2020&return_to=27/01/2020&nights_in_dst_from=1&nights_in_dst_to=1" ) self.assertEqual( query[4], "https://api.skypicker.com/flights?partner=picky&curr=USD&max_stopovers=0&fly_from=SFO&fly_to=MCO&date_from=01/02/2020&date_to=01/02/2020&return_from=03/02/2020&return_to=03/02/2020&nights_in_dst_from=1&nights_in_dst_to=1" ) self.assertEqual( query[5], "https://api.skypicker.com/flights?partner=picky&curr=USD&max_stopovers=0&fly_from=SFO&fly_to=MCO&date_from=08/02/2020&date_to=08/02/2020&return_from=10/02/2020&return_to=10/02/2020&nights_in_dst_from=1&nights_in_dst_to=1" ) self.assertEqual( query[6], "https://api.skypicker.com/flights?partner=picky&curr=USD&max_stopovers=0&fly_from=SFO&fly_to=MCO&date_from=15/02/2020&date_to=15/02/2020&return_from=17/02/2020&return_to=17/02/2020&nights_in_dst_from=1&nights_in_dst_to=1" ) self.assertEqual( query[7], "https://api.skypicker.com/flights?partner=picky&curr=USD&max_stopovers=0&fly_from=SFO&fly_to=MCO&date_from=22/02/2020&date_to=22/02/2020&return_from=24/02/2020&return_to=24/02/2020&nights_in_dst_from=1&nights_in_dst_to=1" ) self.assertEqual( query[8], "https://api.skypicker.com/flights?partner=picky&curr=USD&max_stopovers=0&fly_from=SFO&fly_to=MCO&date_from=29/02/2020&date_to=29/02/2020&return_from=02/03/2020&return_to=02/03/2020&nights_in_dst_from=1&nights_in_dst_to=1" )
def test_make_api_request_bad_response_body(self): f = FlightSearchBuilder(from_location="SFO", to_location="MCO", start_from=date(2020, 1, 1)) query = build_flight_search_queries(f) self.assertEqual(len(query), 1) self.assertEqual( query[0], "https://api.skypicker.com/flights?partner=picky&curr=USD&max_stopovers=0&fly_from=SFO&fly_to=MCO&date_from=01/01/2020&date_to=01/03/2020" ) responses.add( responses.GET, 'https://api.skypicker.com/flights?partner=picky&curr=USD&max_stopovers=0&fly_from=SFO&fly_to=MCO&date_from=01/01/2020&date_to=01/03/2020', json={'error': 'bad_response'}, status=200) r = make_api_request(query[0]) self.assertIsNone(r)
def allow_layovers(allow_layovers): if type(allow_layovers) != bool: return ConfigurationError( "Input to allow_layovers must be of type bool") return FlightSearchBuilder(allow_layovers=allow_layovers)
def from_place(location): return FlightSearchBuilder(from_location=location)
def start_from(start_date): if not isinstance(start_date, date): return ConfigurationError( "Input to start_from must be of type date") return FlightSearchBuilder(start_from=start_date)
def price_threshold(price): if type(price) != float and type(price) != int: return ConfigurationError( "Input to price_threshold must be of type int or float") return FlightSearchBuilder(price_threshold=price)
def test_request_is_valid_valid_request(self): f1 = FlightSearchBuilder().from_place("SFO").to_place("MCO") self.assertTrue(f1.request_is_valid())
def to_place(location): return FlightSearchBuilder(to_location=location)
def return_departure_date(return_departure_date): if not isinstance(return_departure_date, date): return ConfigurationError( "Input to departure_date must be of type datetime") return FlightSearchBuilder(return_departure_date=return_departure_date)
def test_request_is_valid_invalid_request(self): f1 = FlightSearchBuilder().from_place("SFO") self.assertFalse(f1.request_is_valid())
def test_get_date_range(self): f1 = FlightSearchBuilder().start_from(datetime(2020,1,1)) date_range = f1.get_date_range() self.assertEqual(date_range[0], datetime(2020,1,1)) self.assertEqual(date_range[1], datetime(2020,3,1))
def test_overwrite_fields(self): f1 = FlightSearchBuilder().from_place("SFO").from_place("MCO") self.assertEqual(f1._from_location, "MCO")