def test_availability_accessibility(self):
        """
        Test case for a valid availability query. Reads the
        travel properties from test-data.json, sets the
        travel departureTimeEarliest to next monday at 11:00Z.
        Expects valid response for a transport leaving
        19:00+3, one availability for the passenger adult with
        GUIDE_DOG accessibility feature in the reservation.
        """

        # Trip availaibility inquiry
        travel = self.testdata['travel_data_accessibility']
        product = self.testdata['test_products_current_date_response']
        t = datetime.datetime.now()
        travel["travel"]["departureTimeEarliest"]  = zulu.now().shift(days=(7 - t.weekday())). \
            replace(hour=11, minute=00).isoformat()
        r = lippuclient.availability_request(self.envdata['base_url'],
                                             headers=self.headers,
                                             payload=travel)
        logging.info(
            "test_availability_accessibility, availability response: %s" %
            r.json())
        self.assertEqual(r.status_code, 200)
        self.assertEqual(len(r.json()['availability']), 1)
        self.assertEqual(r.json()['contract'], travel['contract'])
        self.assertEqual(r.json()['travel']['productType'],
                         travel['travel']['productType'])
        self.assertEqual(r.json()['travel']['to']['lat'],
                         travel['travel']['to']['lat'])
        self.assertEqual(r.json()['travel']['to']['lon'],
                         travel['travel']['to']['lon'])
        self.assertEqual(r.json()['travel']['from']['lat'],
                         travel['travel']['from']['lat'])
        self.assertEqual(r.json()['travel']['from']['lon'],
                         travel['travel']['from']['lon'])
        for item in r.json()['availability']:
            self.assertNotEqual(item['applicableForPassengers'], 'None')
            self.assertEqual(item['fare']['currency'], 'EUR')
            self.assertEqual(item['fare']['amount'], 14)
            self.assertEqual(item['fare']['vatPercent'], 10)
            for applicable in item['applicableForPassengers']:
                self.assertEqual(applicable['category'], 'Adult')
                self.assertEqual(
                    applicable['category']
                    in product['products2']['suitablePassengerCategories'],
                    True)
                self.assertEqual(applicable['accessibility'][0]['title'],
                                 'GUIDE_DOG')
                self.assertEqual(
                    applicable['accessibility'][0]['fare']['currency'], 'EUR')
                self.assertEqual(
                    applicable['accessibility'][0]['fare']['amount'], 0)
                self.assertEqual(
                    applicable['accessibility'][0]['fare']['vatPercent'], 0)
        self.assertEqual(r.json()['travel']['departureTime'].startswith(
            zulu.now().shift(days=(7 - t.weekday())). \
                replace(hour=19, minute=00).format('%Y-%m-%dT%H:%M')
        ), True)
        logging.info("Departure time: %s" %
                     zulu.parse(r.json()['travel']['departureTime']))
    def test_availability_empty_extra_services(self):
        """
        Test case for a availability query with invalid extraService.
        Expects valid response for a transport leaving, but with
        no availabilities as the one passenger has invalid
        extraService
        """

        # Trip availaibility inquiry
        travel = self.testdata['travel_data_extra_services']
        travel['passengers'][0]['extraServices'][0]['title'] = ""
        product = self.testdata['test_products_current_date_response']
        t = datetime.datetime.now()
        travel["travel"]["departureTimeEarliest"]  = zulu.now().shift(days=(7 - t.weekday())). \
            replace(hour=11, minute=00).isoformat()
        r = lippuclient.availability_request(self.envdata['base_url'],
                                             headers=self.headers,
                                             payload=travel)
        logging.info(
            "test_availability_invalid_extra_services, availability response: %s"
            % r.json())
        self.assertEqual(r.status_code, 200)
        self.assertEqual(len(r.json()['availability']), 0)
        self.assertEqual(r.json()['contract'], travel['contract'])
        self.assertEqual(r.json()['travel']['productType'],
                         travel['travel']['productType'])
        self.assertEqual(r.json()['travel']['to']['lat'],
                         travel['travel']['to']['lat'])
        self.assertEqual(r.json()['travel']['to']['lon'],
                         travel['travel']['to']['lon'])
        self.assertEqual(r.json()['travel']['from']['lat'],
                         travel['travel']['from']['lat'])
        self.assertEqual(r.json()['travel']['from']['lon'],
                         travel['travel']['from']['lon'])
    def test_availability_set_both_times(self):
        """
        Test case for a valid availability query. Reads the
        travel properties from test-data.json, sets the
        travel departureTimeEarliest two days from now to 14:00Z
        and arrivalTimeLatest two days from now at 21:30.
        As both are set, expects the departureTimeEarliest
        to be used for query.Expects valid response for a transport leaving
        20:00+3.
        """

        # Trip availaibility inquiry
        travel = self.testdata['travel_data']
        product = self.testdata['test_products_current_date_response']
        travel["travel"]["departureTimeEarliest"]  = zulu.now().shift(days=2). \
            replace(hour=14, minute=00).isoformat()
        travel["travel"]["arrivalTimeLatest"]  = zulu.now().shift(days=2). \
            replace(hour=21, minute=30).isoformat()
        r = lippuclient.availability_request(self.envdata['base_url'],
                                             headers=self.headers,
                                             payload=travel)
        logging.info(
            "test_availability_both_arrival_time, availability response: %s" %
            r.json())
        self.assertEqual(r.status_code, 200)
        self.assertEqual(len(r.json()['availability']), 3)
        self.assertEqual(r.json()['contract'], travel['contract'])
        self.assertEqual(r.json()['travel']['productType'],
                         travel['travel']['productType'])
        self.assertEqual(r.json()['travel']['to']['lat'],
                         travel['travel']['to']['lat'])
        self.assertEqual(r.json()['travel']['to']['lon'],
                         travel['travel']['to']['lon'])
        self.assertEqual(r.json()['travel']['from']['lat'],
                         travel['travel']['from']['lat'])
        self.assertEqual(r.json()['travel']['from']['lon'],
                         travel['travel']['from']['lon'])
        for item in r.json()['availability']:
            self.assertNotEqual(item['applicableForPassengers'], 'None')
            for applicable in item['applicableForPassengers']:
                self.assertNotEqual(applicable, 'None')
                self.assertEqual(
                    applicable['category']
                    in product['products1']['suitablePassengerCategories'],
                    True)

        self.assertEqual(r.json()['travel']['departureTime'].startswith(
            zulu.now().shift(days=2). \
                replace(hour=20, minute=00).format('%Y-%m-%dT%H:%M')
        ), True)
        self.assertEqual(r.json()['travel']['arrivalTime'].startswith(
            zulu.now().shift(days=2). \
                replace(hour=23, minute=10).format('%Y-%m-%dT%H:%M')
        ), True)

        logging.info("Arrival time: %s" %
                     zulu.parse(r.json()['travel']['arrivalTime']))
    def test_reservation_accessibility_invalid_reservation_id(self):
        """
        Test case for reservation with invalid accessibility requirements
        reservation id, reservation request fails.
        """

        t = datetime.datetime.now()
        travel = self.testdata['travel_data_accessibility']
        travel["travel"]["departureTimeEarliest"]  = zulu.now().shift(days=(7 - t.weekday())). \
            replace(hour=14, minute=00).isoformat()
        logging.info(
            "test_reservation_accessibility, availability request: %s" %
            travel)
        r_availability = lippuclient.availability_request(
            self.envdata['base_url'], headers=self.headers, payload=travel)
        logging.info(
            "test_reservation_accessibility, availability response: %s" %
            r_availability)
        self.assertEqual(r_availability.status_code, 200)
        self.assertGreater(len(r_availability.json()), 0)

        # Make reservation
        self.headers['X-Message-Id'] = str(uuid.uuid4())
        travel_entitlement_id = r_availability.json(
        )['availability'][0]['travelEntitlementId']
        reservation = {
            'reservations': [{
                'travelEntitlementId':
                travel_entitlement_id,
                'chosenAccessibilityReservationIds': [str(uuid.uuid4())],
                'customerInfo': [self.testdata['customer_info']]
            }]
        }
        logging.info("Sending reservation %s" % reservation)
        r_reservation = lippuclient.reservation_request(
            self.envdata['base_url'],
            headers=self.headers,
            payload=reservation)
        logging.info(
            "test_reservation_accessibility, reservation response %s" %
            r_reservation.text)
        self.assertEqual(r_reservation.status_code, 404)

        # Test that reservation does not exits.
        self.headers['X-Message-Id'] = str(uuid.uuid4())
        r = lippuclient.travel_entitlement_status(
            self.envdata['base_url'],
            headers=self.headers,
            travel_entitlement_id=travel_entitlement_id)
        logging.info(
            "test_reservation_accessibility, travel entitlement response %s" %
            r.text)
        self.assertEqual(r.status_code, 404)
    def test_availability_null_date(self):
        """
        Test case for using null departureTimeEarliest.

        """

        travel = self.testdata['travel_data']
        travel["travel"]["departureTimeEarliest"] = None
        r = lippuclient.availability_request(self.envdata['base_url'],
                                             headers=self.headers,
                                             payload=travel)
        logging.info("test_availability_null_date, availability response: %s" %
                     r.json())
        self.assertEqual(r.status_code, 200)
    def test_reservation_delete(self):
        """
        Test case for reservation_delete, create reservation and then
        delete it.

        Cancelletion of transport reservation
        """

        # Add reservation and test you can delete it with the case id
        travel = self.testdata['travel_data']
        r_availability = lippuclient.availability_request(
            self.envdata['base_url'], headers=self.headers, payload=travel)
        logging.info("test_reservation_delete, availability response: %s" %
                     r_availability)
        self.assertEqual(r_availability.status_code, 200)
        self.assertGreater(len(r_availability.json()), 0)

        # Make reservation
        self.headers['X-Message-Id'] = str(uuid.uuid4())
        reservation = {
            'reservations': [{
                'travelEntitlementId':
                r_availability.json()['availability'][0]
                ['travelEntitlementId'],
                'customerInfo': [self.testdata['customer_info']]
            }]
        }
        logging.info("Sending reservation %s" % reservation)
        r_reservation = lippuclient.reservation_request(
            self.envdata['base_url'],
            headers=self.headers,
            payload=reservation)
        logging.info("test_reservation_delete, reservation response %s" %
                     r_reservation.text)
        self.assertEqual(r_reservation.status_code, 200)
        self.headers['X-Message-Id'] = str(uuid.uuid4())
        caseId = r_reservation.json()['caseId']
        r_delete = lippuclient.reservation_delete(self.envdata['base_url'],
                                                  headers=self.headers,
                                                  reservation_id=caseId)
        self.assertEqual(r_delete.status_code, 200)

        # Test that already deleted reservation is deleted and could
        # not be deleted again.
        self.headers['X-Message-Id'] = str(uuid.uuid4())
        r_delete2 = lippuclient.reservation_delete(self.envdata['base_url'],
                                                   headers=self.headers,
                                                   reservation_id=caseId)
        self.assertEqual(r_delete2.status_code, 404)
    def test_availability_null_from_lat_coordinate(self):
        """
        Test case for using null latiatude from coordinate.

        """
        travel = self.testdata['travel_data']
        travel["travel"]["departureTimeEarliest"]  = zulu.now().shift(days=2).\
            replace(hour=14, minute=00).isoformat()
        travel["travel"]["from"]["lat"] = None
        r = lippuclient.availability_request(self.envdata['base_url'],
                                             headers=self.headers,
                                             payload=travel)
        logging.info(
            "test_availability_null_from_lat_coordinate, availability response: %s"
            % r.json())
        self.assertEqual(r.status_code, 400)
        self.assertEqual(r.json()["statusCode"], 400)
    def test_availability_departure_late(self):
        """
        Test case for using too late departure time earliest,
        in which case the tansport operator does not
        have transport to offer.

        """
        travel = self.testdata['travel_data']
        travel["travel"]["departureTimeEarliest"] = zulu.now().shift(days=2). \
            replace(hour=20, minute=45).isoformat()
        r = lippuclient.availability_request(self.envdata['base_url'],
                                             headers=self.headers,
                                             payload=travel)
        logging.info(
            "test_availability_departure_late, availability response: %s" %
            r.json())
        self.assertEqual(r.status_code, 400)
        self.assertEqual(r.json()["statusCode"], 400)
    def test_availability_non_valid_token(self):
        """
        Test case for using non valid authentication token for availability query

        """
        travel = self.testdata['travel_data']
        travel["travel"]["departureTimeEarliest"]  = zulu.now().shift(days=2).\
            replace(hour=14, minute=00).isoformat()
        headers = lippuclient.generate_headers(
            account_id=self.testdata['valid_client1'],
            token=str(uuid.uuid4()),
            language="fi")
        r = lippuclient.availability_request(self.envdata['base_url'],
                                             headers=headers,
                                             payload=travel)
        logging.info("test_availability_non_valid_token, response: %s" %
                     (r.json()))
        self.assertEqual(r.status_code, 403)
    def test_availability_invalid_accessibility(self):
        """
        Test case for a availability query with invalid accessibility feature.
        Reads the travel properties from test-data.json, sets the
        travel departureTimeEarliest to next monday at 11:00Z.
        Expects response with zero travel availabilities.
        """

        # Trip availaibility inquiry
        travel = self.testdata['travel_data_accessibility']
        travel["passengers"][0]["accessibility"][0][
            "title"] = "TESTING_ACCESSIBILITY"
        product = self.testdata['test_products_current_date_response']
        t = datetime.datetime.now()
        travel["travel"]["departureTimeEarliest"]  = zulu.now().shift(days=(7 - t.weekday())). \
            replace(hour=11, minute=00).isoformat()
        r = lippuclient.availability_request(self.envdata['base_url'],
                                             headers=self.headers,
                                             payload=travel)
        logging.info(
            "test_availability_invalid_accessibility, availability response: %s"
            % r.json())
        self.assertEqual(r.status_code, 400)
    def test_reservation_extra_services_accessibility(self):
        """
        Test case for reservation with extra services and accessibility
        requirements
        """

        t = datetime.datetime.now()
        travel = self.testdata['travel_data_extra_services']
        travel['passengers'][0]['accessibility'] = [{"title": "LOW-FLOOR"}]
        travel["travel"]["departureTimeEarliest"]  = zulu.now().shift(days=(7 - t.weekday())). \
            replace(hour=14, minute=00).isoformat()
        r_availability = lippuclient.availability_request(
            self.envdata['base_url'], headers=self.headers, payload=travel)
        logging.info(
            "test_reservation_extra_services_accessibility, availability response: %s"
            % r_availability)
        self.assertEqual(r_availability.status_code, 200)
        self.assertGreater(len(r_availability.json()['availability']), 0)

        # Make reservation
        self.headers['X-Message-Id'] = str(uuid.uuid4())
        travel_entitlement_id = r_availability.json(
        )['availability'][0]['travelEntitlementId']
        extra_service_id = r_availability.json()['availability'][0]\
            ['applicableForPassengers'][0]['extraServices'][0]['extraServiceReservationId']
        accessibility_id = r_availability.json()['availability'][0]\
            ['applicableForPassengers'][0]['accessibility'][0]['accessibilityReservationId']
        reservation = {
            'reservations': [{
                'travelEntitlementId':
                travel_entitlement_id,
                'chosenExtraReservationIds': [extra_service_id],
                'chosenAccessibilityReservationIds': [accessibility_id],
                'customerInfo': [self.testdata['customer_info']]
            }]
        }
        logging.info("Sending reservation %s" % reservation)
        r_reservation = lippuclient.reservation_request(
            self.envdata['base_url'],
            headers=self.headers,
            payload=reservation)
        logging.info("test_reservation_extra_services_accessibility, "
                     "reservation response %s" % r_reservation.text)
        self.assertEqual(r_reservation.status_code, 200)
        self.assertNotEqual(r_reservation.json()['caseId'], None)
        self.assertNotEqual(r_reservation.json()['caseId'], '')
        self.assertNotEqual(r_reservation.json()['confirmedReservations'],
                            None)
        self.assertEqual(
            r_reservation.json()['confirmedReservations'][0]
            ['travelEntitlementId'], travel_entitlement_id)
        caseId = r_reservation.json()['caseId']

        # Test that reservation has the extra service and accessibility
        # requirements reserved in the reservation request.
        self.headers['X-Message-Id'] = str(uuid.uuid4())
        r = lippuclient.travel_entitlement_status(
            self.envdata['base_url'],
            headers=self.headers,
            travel_entitlement_id=travel_entitlement_id)
        logging.info("test_reservation_extra_services_accessibility, "
                     "travel entitlment response %s" % r_reservation.text)
        self.assertEqual(r.json()['travelEntitlementId'],
                         travel_entitlement_id)
        self.assertEqual(
            r.json()['extraServices'][0]['extraServiceReservationId'],
            extra_service_id)
        self.assertEqual(
            r.json()['accessibility'][0]['accessibilityReservationId'],
            accessibility_id)
    def test_reservation_do_not_include_accessibility(self):
        """
        Test case for reservation with leaving out accessibility requirements
        that were in availability request.
        """

        t = datetime.datetime.now()
        travel = self.testdata['travel_data_accessibility']
        travel["travel"]["departureTimeEarliest"]  = zulu.now().shift(days=(7 - t.weekday())). \
            replace(hour=14, minute=00).isoformat()
        logging.info(
            "test_reservation_do_not_include_accessibility, availability request: %s"
            % travel)
        r_availability = lippuclient.availability_request(
            self.envdata['base_url'], headers=self.headers, payload=travel)
        logging.info(
            "test_reservation_do_not_include_accessibility, availability response: %s"
            % r_availability)
        self.assertEqual(r_availability.status_code, 200)
        self.assertGreater(len(r_availability.json()), 0)

        # Make reservation
        self.headers['X-Message-Id'] = str(uuid.uuid4())
        travel_entitlement_id = r_availability.json(
        )['availability'][0]['travelEntitlementId']
        accessibility_id = r_availability.json(
        )['availability'][0]['applicableForPassengers'][0]['accessibility'][0][
            'accessibilityReservationId']
        reservation = {
            'reservations': [{
                'travelEntitlementId': travel_entitlement_id,
                'chosenAccessibilityReservationIds': [],
                'customerInfo': [self.testdata['customer_info']]
            }]
        }
        logging.info("Sending reservation %s" % reservation)
        r_reservation = lippuclient.reservation_request(
            self.envdata['base_url'],
            headers=self.headers,
            payload=reservation)
        logging.info(
            "test_reservation_do_not_include_accessibility, reservation response %s"
            % r_reservation.text)
        self.assertEqual(r_reservation.status_code, 200)
        self.assertNotEqual(r_reservation.json()['caseId'], None)
        self.assertNotEqual(r_reservation.json()['caseId'], '')
        self.assertNotEqual(r_reservation.json()['confirmedReservations'],
                            None)
        self.assertEqual(
            r_reservation.json()['confirmedReservations'][0]
            ['travelEntitlementId'], travel_entitlement_id)
        caseId = r_reservation.json()['caseId']

        # Test that reservation does not have the accessibility features in
        # the reservation request.
        self.headers['X-Message-Id'] = str(uuid.uuid4())
        r = lippuclient.travel_entitlement_status(
            self.envdata['base_url'],
            headers=self.headers,
            travel_entitlement_id=travel_entitlement_id)
        logging.info(
            "test_reservation_do_not_include_accessibility, travel entitlement response %s"
            % r_reservation.text)
        self.assertEqual(r.json()['travelEntitlementId'],
                         travel_entitlement_id)
        self.assertEqual(r.json()['accessibility'], [])