def test_returns_two_days_after_booking_creation_if_event_begins_in_more_than_four_days( self, booking_date): event_date_more_ten_days_from_now = booking_date + timedelta(days=6) booking_creation = booking_date assert api.compute_confirmation_date( event_date_more_ten_days_from_now, booking_creation) == booking_creation + timedelta(days=2)
def check_is_usable(booking: Booking) -> None: booking_payment = payment_queries.find_by_booking_id(booking.id) if booking_payment is not None: forbidden = api_errors.ForbiddenError() forbidden.add_error("payment", "Cette réservation a été remboursée") raise forbidden if booking.isUsed: gone = api_errors.ResourceGoneError() gone.add_error("booking", "Cette réservation a déjà été validée") raise gone if booking.isCancelled: forbidden = api_errors.ForbiddenError() forbidden.add_error("booking", "Cette réservation a été annulée") raise forbidden is_booking_for_event_and_not_confirmed = booking.stock.beginningDatetime and not booking.isConfirmed if is_booking_for_event_and_not_confirmed: forbidden = api_errors.ForbiddenError() booking_date = datetime.datetime.strftime(booking.dateCreated, "%d/%m/%Y à %H:%M") max_cancellation_date = datetime.datetime.strftime( api.compute_confirmation_date(booking.stock.beginningDatetime, booking.dateCreated), "%d/%m/%Y à %H:%M") forbidden.add_error( "booking", f"Cette réservation a été effectuée le {booking_date}. " f"Veuillez attendre jusqu’au {max_cancellation_date} pour valider la contremarque.", ) raise forbidden
def test_returns_two_days_before_event_if_event_begins_between_two_and_four_days_from_now( self, booking_date): event_date_four_days_from_now = booking_date + timedelta(days=4) booking_creation = booking_date assert api.compute_confirmation_date( event_date_four_days_from_now, booking_creation) == event_date_four_days_from_now - timedelta( days=2)
def test_returns_creation_date_if_event_begins_too_soon( self, booking_date): event_date_too_close_to_cancel_booking = booking_date + timedelta( days=1) booking_creation = booking_date assert (api.compute_confirmation_date( event_date_too_close_to_cancel_booking, booking_creation) == booking_creation)
def create_booking( user: User, amount: Optional[Union[Decimal, float]] = None, date_created: datetime = datetime.utcnow(), date_used: datetime = None, idx: int = None, is_cancelled: bool = False, is_used: bool = False, quantity: int = 1, stock: Stock = None, token: str = None, venue: VenueSQLEntity = None, ) -> Booking: booking = Booking() offerer = create_offerer(siren="987654321", address="Test address", city="Test city", postal_code="93000", name="Test name") if venue is None: venue = create_venue( offerer=offerer, name="Test offerer", booking_email="*****@*****.**", address="123 rue test", postal_code="93000", city="Test city", departement_code="93", ) if stock is None: price = amount if amount is not None else 10 product_with_thing_type = create_offer_with_thing_product(venue) stock = create_stock_with_thing_offer(offerer=offerer, venue=venue, offer=product_with_thing_type, price=price) if not stock.offer: stock.offer = create_offer_with_thing_product(venue) booking.user = user booking.amount = amount if amount is not None else stock.price booking.dateCreated = date_created booking.dateUsed = date_used booking.id = idx booking.isCancelled = is_cancelled booking.isUsed = is_used booking.quantity = quantity booking.stock = stock booking.token = token if token is not None else random_token() booking.userId = user.id booking.confirmationDate = bookings_api.compute_confirmation_date( stock.beginningDatetime, date_created) return booking
def create_domain_event_booking_recap( payment_date: Optional[datetime] = None, cancellation_date: Optional[datetime] = None, date_used: Optional[datetime] = None, offer_identifier: int = 1, offer_name: str = "Le cirque du Soleil", offerer_name="Libraire de Caen", beneficiary_lastname: str = "Doe", beneficiary_firstname: str = "Jane", beneficiary_email: str = "*****@*****.**", booking_amount: float = 0, booking_token: str = "CIRQUE", booking_date: datetime = datetime(2020, 3, 14, 19, 5, 3, 0), booking_is_duo: bool = False, booking_is_used: bool = False, booking_is_cancelled: bool = False, booking_is_reimbursed: bool = False, booking_is_confirmed: bool = False, event_beginning_datetime: datetime = datetime(2020, 5, 26, 20, 30, 0, 0), venue_identifier: int = 1, venue_name="Librairie Kléber", venue_is_virtual=False, ) -> EventBookingRecap: return EventBookingRecap( offer_identifier=offer_identifier, offer_name=offer_name, offerer_name=offerer_name, beneficiary_lastname=beneficiary_lastname, beneficiary_firstname=beneficiary_firstname, beneficiary_email=beneficiary_email, booking_amount=booking_amount, booking_token=booking_token, booking_date=booking_date, booking_is_duo=booking_is_duo, booking_is_used=booking_is_used, booking_is_cancelled=booking_is_cancelled, booking_is_confirmed=booking_is_confirmed, booking_is_reimbursed=booking_is_reimbursed, event_beginning_datetime=event_beginning_datetime, venue_identifier=venue_identifier, cancellation_date=cancellation_date, confirmation_date=compute_confirmation_date(event_beginning_datetime, booking_date), payment_date=payment_date, date_used=date_used, venue_name=venue_name, venue_is_virtual=venue_is_virtual, )
def test_returns_none_if_no_event_beginning(self, booking_date): event_beginning = None booking_creation = booking_date assert api.compute_confirmation_date(event_beginning, booking_creation) is None
def _get_cancellation_limit_datetime(stock: Stock) -> Optional[datetime]: # compute date as if it were booked now return compute_confirmation_date(stock.beginningDatetime, datetime.now())