예제 #1
0
def test_check_los_discounts(service: CalculateNewReservation,
                             context: Context, house, room_type, rate,
                             los_discount):
    period = [
        context.start_date,
        context.start_date + datetime.timedelta(days=1),
        context.start_date + datetime.timedelta(days=2),
        context.start_date + datetime.timedelta(days=3),
    ]
    context.end_date = context.start_date + datetime.timedelta(days=4)
    context.house = house
    context.room_type = room_type
    context.rate = rate
    context.prices = {
        period[0]: Decimal(100),
        period[1]: Decimal(100),
        period[2]: Decimal(100),
        period[3]: Decimal(100),
    }
    context.discounts = {DiscountTypes.LOS: [los_discount]}

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

    assert result.unwrap().prices == {
        period[0]: Decimal(85),
        period[1]: Decimal(85),
        period[2]: Decimal(85),
        period[3]: Decimal(85),
    }
예제 #2
0
def test_select_occupancy_no_discounts(service: CalculateNewReservation,
                                       context: Context, house, room_type,
                                       rate):
    service._occupancy_repo = Mock(get=Mock(side_effect=RuntimeError("ERR")))
    context.house = house
    context.room_type = room_type
    context.rate = rate
    context.discounts = {DiscountTypes.AVAILABILITY: []}

    result = service.select_occupancies(context)
    assert is_successful(result)
    assert result.unwrap().occupancies == {}
예제 #3
0
def test_select_occupancy_error(service: CalculateNewReservation,
                                context: Context, house, room_type, rate,
                                availability_discount):
    service._occupancy_repo = Mock(get=Mock(side_effect=RuntimeError("ERR")))
    context.house = house
    context.room_type = room_type
    context.rate = rate
    context.discounts = {DiscountTypes.AVAILABILITY: [availability_discount]}

    result = service.select_occupancies(context)
    assert not is_successful(result)
    assert result.failure().failure == ReservationErrors.error
    assert str(result.failure().exc) == "ERR"
예제 #4
0
def test_check_los_discounts_empty(service: CalculateNewReservation,
                                   context: Context, house, room_type, rate):
    period = [
        context.start_date, context.start_date + datetime.timedelta(days=1)
    ]
    context.house = house
    context.room_type = room_type
    context.rate = rate
    context.prices = {period[0]: Decimal(100), period[1]: Decimal(110)}
    context.discounts = {DiscountTypes.LOS: []}

    result = service.check_los_discounts(context)
    assert is_successful(result)
    assert result.unwrap().prices == context.prices
예제 #5
0
def test_select_occupancy_ok(service: CalculateNewReservation,
                             context: Context, house, room_type, rate,
                             availability_discount):
    occupancies = {
        context.start_date: 1,
        context.start_date + datetime.timedelta(days=1): 2
    }
    service._occupancy_repo = Mock(get=Mock(return_value=occupancies))
    context.house = house
    context.room_type = room_type
    context.rate = rate
    context.discounts = {DiscountTypes.AVAILABILITY: [availability_discount]}

    result = service.select_occupancies(context)
    assert is_successful(result)
    assert result.unwrap().occupancies == occupancies
예제 #6
0
def test_check_availability_discounts(service: CalculateNewReservation,
                                      context: Context, house, room_type, rate,
                                      availability_discount):
    period = [
        context.start_date, context.start_date + datetime.timedelta(days=1)
    ]
    context.house = house
    context.room_type = room_type
    context.rate = rate
    context.prices = {period[0]: Decimal(100), period[1]: Decimal(110)}
    context.discounts = {DiscountTypes.AVAILABILITY: [availability_discount]}
    context.occupancies = {period[0]: 3, period[1]: 1}

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

    assert result.unwrap().prices == {
        period[0]: Decimal(85),
        period[1]: Decimal(110)
    }
예제 #7
0
def test_check_last_minute_discounts(service: CalculateNewReservation,
                                     context: Context, house, room_type, rate,
                                     last_min_discount):
    period = [
        context.start_date + datetime.timedelta(days=5),
        context.start_date + datetime.timedelta(days=6)
    ]
    context.house = house
    context.room_type = room_type
    context.rate = rate
    context.prices = {period[0]: Decimal(100), period[1]: Decimal(110)}
    context.discounts = {DiscountTypes.LAST_MINUTE: [last_min_discount]}

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

    assert result.unwrap().prices == {
        period[0]: Decimal(85),
        period[1]: Decimal(110)
    }