def test_select_cancellation_policy_for_plan_without_policy(
        service: CreateReservation, context: Context, house, rate_plan):
    context.rate_plan = attr.evolve(rate_plan, policy_id=0)
    context.house = house

    result = service.select_cancellation_policy(context)
    assert is_successful(result)
    assert result.unwrap().rate_plan.policy is None
def test_select_cancellation_policy_fail(service: CreateReservation,
                                         context: Context, house, rate_plan):
    service._policies_repo = Mock(get=Mock(return_value=Nothing))
    context.house = house
    context.rate_plan = rate_plan

    result = service.select_cancellation_policy(context)
    assert is_successful(result)
    assert result.unwrap().rate_plan.policy is None
def test_select_cancellation_policy_error(service: CreateReservation,
                                          context: Context, house, rate_plan):
    service._policies_repo = Mock(get=Mock(side_effect=RuntimeError('ERR')))
    context.house = house
    context.rate_plan = rate_plan

    result = service.select_cancellation_policy(context)
    assert not is_successful(result)
    assert result.failure().failure == ReservationErrors.error
    assert str(result.failure().exc) == 'ERR'
def test_select_rate_fail(service: CreateReservation, context: Context, house,
                          room_type, rate_plan):
    service._prices_repo = Mock(select_rates=Mock(return_value=[]))
    context.house = house
    context.room_type = room_type
    context.rate_plan = rate_plan

    result = service.select_rate(context)
    assert not is_successful(result)
    assert result.failure().failure == ReservationErrors.missed_rate
def test_select_rate_ok(service: CreateReservation, context: Context, house,
                        room_type, rate_plan, rate):
    rate_with_3 = attr.evolve(rate, id=401, occupancy=3)
    rate_with_4 = attr.evolve(rate, id=402, occupancy=4)
    service._prices_repo = Mock(select_rates=Mock(
        return_value=[rate_with_4, rate_with_3, rate]))
    context.house = house
    context.room_type = room_type
    context.rate_plan = rate_plan

    result = service.select_rate(context)
    assert is_successful(result)
    assert result.unwrap().rate == rate
def test_missed_room_type(service: CreateReservation, context: Context, house):
    context.house = house
    context.request.roomtype_id = None

    result = service.select_room_type(context)
    assert not is_successful(result)
    assert result.failure().failure == ReservationErrors.missed_roomtype
def test_select_rate_plan_ok(service: CreateReservation, context: Context,
                             house, rate_plan):
    service._prices_repo = Mock(get_plan=Mock(return_value=Some(rate_plan)))
    context.house = house

    result = service.select_rate_plan(context)
    assert is_successful(result)
    assert result.unwrap().rate_plan == rate_plan
def test_select_rate_plan_fail(service: CreateReservation, context: Context,
                               house):
    service._prices_repo = Mock(get_plan=Mock(return_value=Nothing))
    context.house = house

    result = service.select_rate_plan(context)
    assert not is_successful(result)
    assert result.failure().failure == ReservationErrors.missed_rateplan
def test_select_room_type_ok(service: CreateReservation, context: Context,
                             house, room_type):
    service._roomtypes_repo = Mock(get=Mock(return_value=Some(room_type)))
    context.house = house

    result = service.select_room_type(context)
    assert is_successful(result)
    assert result.unwrap().room_type == room_type
def test_select_room_type_error(service: CreateReservation, context: Context,
                                house):
    service._roomtypes_repo = Mock(get=Mock(side_effect=RuntimeError('ERR')))
    context.house = house

    result = service.select_room_type(context)
    assert not is_successful(result)
    assert result.failure().failure == ReservationErrors.error
    assert str(result.failure().exc) == 'ERR'
def test_accept_reservation_fail(service: CreateReservation, context: Context,
                                 house, room_type):
    service._reservations_repo = Mock(accept=Mock(return_value=Nothing))
    context.house = house
    context.room_type = room_type
    context.reservation = Reservation(
        id=111,
        house_id=house.id,
        connection_id=None,
        source=ReservationSources.MANUAL,
        channel=None,
        channel_id='',
        checkin=context.request.checkin,
        checkout=context.request.checkout,
        booked_at=timezone.now(),
        status=ReservationStatuses.HOLD,
    )

    result = service.accept_reservation(context)
    assert not is_successful(result)
    assert result.failure().failure == ReservationErrors.save
    assert result.failure().error.startswith('Error accept new Reservation')
def test_accept_reservation_error(service: CreateReservation, context: Context,
                                  house, room_type):
    service._reservations_repo = Mock(accept=Mock(
        side_effect=RuntimeError('ERR')))
    context.house = house
    context.room_type = room_type
    context.reservation = Reservation(
        id=111,
        house_id=house.id,
        connection_id=None,
        source=ReservationSources.MANUAL,
        channel=None,
        channel_id='',
        checkin=context.request.checkin,
        checkout=context.request.checkout,
        booked_at=timezone.now(),
        status=ReservationStatuses.HOLD,
    )

    result = service.accept_reservation(context)
    assert not is_successful(result)
    assert result.failure().failure == ReservationErrors.error
    assert str(result.failure().exc) == 'ERR'
def test_accept_reservation_ok(service: CreateReservation, context: Context,
                               house, room_type):
    reservation = Reservation(
        id=111,
        house_id=house.id,
        connection_id=None,
        source=ReservationSources.MANUAL,
        channel=None,
        channel_id='',
        checkin=context.request.checkin,
        checkout=context.request.checkout,
        booked_at=timezone.now(),
        status=ReservationStatuses.HOLD,
        is_verified=True,
    )
    service._reservations_repo = Mock(accept=Mock(
        return_value=Some(reservation)))
    context.house = house
    context.room_type = room_type
    context.reservation = attr.evolve(reservation, is_verified=False)

    result = service.accept_reservation(context)
    assert is_successful(result)
    assert result.unwrap().reservation == reservation
def context(house, room_type, rate_plan, rate, user) -> Context:
    request = ReservationRequest(
        roomtype_id=room_type.id,
        plan_id=rate_plan.id,
        checkin=datetime.date.today(),
        checkout=datetime.date.today() + datetime.timedelta(days=2),
        guests=2,
        rate_id=rate.id,
        guest_name='John',
        guest_surname='Smith',
        guest_email='*****@*****.**',
        guest_phone='+371-20202020',
        notes='Comment',
        prices={
            datetime.date.today(): Decimal(100),
            datetime.date.today() + datetime.timedelta(days=1): Decimal(110),
        },
    )
    return Context(house_id=house.id, request=request, user=user)
def test_missed_house_id(service: CreateReservation, context: Context):
    context.house_id = None

    result = service.select_house(context)
    assert not is_successful(result)
    assert result.failure().failure == ReservationErrors.missed_house
def test_make_reservation_from_data_no_prices(service: CreateReservation,
                                              context: Context, house,
                                              room_type, rate_plan, rate):
    context.house = house
    context.room_type = room_type
    context.rate_plan = attr.evolve(rate_plan, policy=None)
    context.rate = rate
    context.request.prices = {}

    result = service.make_reservation_from_date(context)
    assert is_successful(result)

    reservation = result.unwrap().reservation
    assert isinstance(reservation, Reservation)
    assert reservation.id is None
    assert reservation.house_id == house.id
    assert reservation.connection_id is None
    assert reservation.source == ReservationSources.MANUAL
    assert reservation.channel is None
    assert reservation.channel_id == ''
    assert reservation.checkin == context.request.checkin
    assert reservation.checkout == context.request.checkout
    assert reservation.status == ReservationStatuses.HOLD
    assert reservation.room_count == 1
    assert reservation.currency == house.currency.code
    assert reservation.price == Decimal(0)
    assert reservation.tax == Decimal(0)
    assert reservation.fees == Decimal(0)
    assert reservation.netto_price == Decimal(0)
    assert reservation.guest_name == 'John'
    assert reservation.guest_surname == 'Smith'
    assert reservation.guest_email == '*****@*****.**'
    assert reservation.guest_phone == '+371-20202020'

    assert len(reservation.rooms) == 1

    room = reservation.rooms[0]
    assert isinstance(room, ReservationRoom)
    assert room.id is None
    assert room.channel_id == ''
    assert room.channel_rate_id == ''
    assert room.checkin == context.request.checkin
    assert room.checkout == context.request.checkout
    assert room.rate_plan_id == rate_plan.id
    assert room.policy == {}
    assert room.rate_id == rate.id
    assert room.guest_name == 'John Smith'
    assert room.guest_count == 2
    assert room.adults == 2
    assert room.children == 0
    assert room.currency == context.house.currency.code
    assert room.price == Decimal(0)
    assert room.tax == Decimal(0)
    assert room.fees == Decimal(0)
    assert room.netto_price == Decimal(0)
    assert room.notes_info == 'Comment'

    assert len(room.day_prices) == 2

    price = room.day_prices[0]
    assert isinstance(price, ReservationDay)
    assert price.id is None
    assert price.day == context.request.checkin
    assert price.roomtype_id == room_type.id
    assert price.room_id is None
    assert price.price_changed == Decimal(0)
    assert price.price_original == Decimal(0)
    assert price.price_accepted == Decimal(0)
    assert price.tax == Decimal(0)
    assert price.currency == house.currency.code

    price = room.day_prices[1]
    assert isinstance(price, ReservationDay)
    assert price.id is None
    assert price.day == context.request.checkin + datetime.timedelta(days=1)
    assert price.roomtype_id == room_type.id
    assert price.room_id is None
    assert price.price_changed == Decimal(0)
    assert price.price_original == Decimal(0)
    assert price.price_accepted == Decimal(0)
    assert price.tax == Decimal(0)
    assert price.currency == house.currency.code