def test_cheapest(self, mocker):
        mocker.patch('delivery.views.route.Route.validate_cheapest_input')
        mocker.patch('delivery.views.route.Route.calculate_expenses')
        expected = RouteModel(**self.mock_data)

        input = {}
        input.update(self.mock_data)
        input['gas_price'] = 1
        input['truck_autonomy'] = 1

        session = UnifiedAlchemyMagicMock(data=[
            (
                [mock.call.query(RouteModel),
                 mock.call.filter(RouteModel.map == self.mock_data['map'])],
                [expected]
            ),
        ])

        route = Route(session)

        result = route.cheapest(input)

        route.calculate_expenses.assert_called_once()

        assert list(result.keys()) == ['route', 'cost']
        assert self.mock_data['origin'] in list(result['route'])
        assert self.mock_data['destination'] in list(result['route'])
Example #2
0
def route_cheapest(map: str,
                   origin: str,
                   destination: str,
                   truck_autonomy: float,
                   gas_price: float,
                   db: Session = Depends(async_session)):

    route = Route(db)

    try:
        data_input = {
            'map': map,
            'origin': origin,
            'destination': destination,
            'truck_autonomy': truck_autonomy,
            'gas_price': gas_price
        }

        data = route.cheapest(data_input)
        return RouteCheapestSchema(**data)

    except ValueError as e:
        logger.error(e)
        raise HTTPException(
            status_code=400,
            detail=str(e),
        )
    except Exception as e:
        logger.error(e)
        raise HTTPException(
            status_code=400,
            detail="Error to retrive the cheapest route.",
        )
    def test_validate_map_exception(self):
        expected = []
        session = UnifiedAlchemyMagicMock(data=[
            (
                [mock.call.query(RouteModel.id),
                 mock.call.filter(RouteModel.map == self.mock_data['map']),
                 ],
                expected,
            ),
        ])
        route = Route(session)

        with pytest.raises(ValueError, match='This map does not exists.'):
            route.validate_map(self.mock_data['map'])
    def test_validate_map(self):
        expected = 10
        session = UnifiedAlchemyMagicMock(data=[
            (
                [mock.call.query(RouteModel.id),
                 mock.call.filter(RouteModel.map == self.mock_data['map'])],
                [expected]
            ),
        ])

        route = Route(session)
        route.validate_map(self.mock_data['map'])

        session.query.return_value.filter.\
            assert_called_once_with(RouteModel.map == self.mock_data['map'])
Example #5
0
def new_route(input: RouteSchema, db: Session = Depends(async_session)):
    route = Route(db)

    try:
        new_route = route.create(input)
        return new_route
    except ValueError as e:
        logger.error(e)
        raise HTTPException(
            status_code=400,
            detail=str(e),
        )
    except Exception as e:
        logger.error(e)
        raise HTTPException(
            status_code=400,
            detail="Error to create a new route.",
        )
    def test_validate_input(self):
        expected = False
        route_schema = RouteSchema(**self.mock_data)

        session = UnifiedAlchemyMagicMock(data=[
            (
                [mock.call.query(RouteModel.id),
                 mock.call.filter(
                     RouteModel.map == self.mock_data['map'],
                     RouteModel.origin == self.mock_data['origin'],
                     RouteModel.destination == self.mock_data['destination'])],
                [expected]
            ),
        ])

        route = Route(session)
        valid_input = route.validate_input(route_schema)

        assert valid_input == expected
    def test_calculate_cost(self):
        gas_price = 1
        truck_autonomy = 1
        distance = 0

        expected = 0

        result = Route.calculate_expenses(gas_price, truck_autonomy, distance)

        assert result == expected
    def test_validate_destination_exception(self):
        expected = []
        session = UnifiedAlchemyMagicMock(data=[
            (
                [mock.call.query(RouteModel.id),
                 mock.call.filter(
                     RouteModel.map == self.mock_data['map'],
                     RouteModel.destination == self.mock_data['destination'])
                 ],
                expected,
            ),
        ])

        route = Route(session)

        msg = 'This destination on this map does not exists.'
        with pytest.raises(ValueError, match=msg):
            route.validate_destination(
                self.mock_data['map'], self.mock_data['destination']
            )
    def test_validate_cheapest_input(self, mocker):
        session = AlchemyMagicMock()
        route = Route(session)

        spy_map = mocker.spy(route, 'validate_map')
        spy_origin = mocker.spy(route, 'validate_origin')
        spy_destination = mocker.spy(route, 'validate_destination')

        mocker.patch('delivery.views.route.Route.validate_map')
        mocker.patch('delivery.views.route.Route.validate_origin')
        mocker.patch('delivery.views.route.Route.validate_destination')

        route.validate_cheapest_input(self.mock_data)

        map = self.mock_data['map']

        spy_map.assert_called_once_with(map)
        spy_origin.assert_called_once_with(map, self.mock_data['origin'])
        spy_destination.assert_called_once_with(
            map, self.mock_data['destination']
        )