def test_should_set_isGcuCompatible_and_isSynchronizationCompatible_at_false_in_product_and_deactivate_offer_when_bookings_related_to_offer( self, app): # Given isbn = "1111111111111" beneficiary = users_factories.BeneficiaryGrant18Factory() offerer = create_offerer(siren="775671464") venue = create_venue(offerer, name="Librairie Titelive", siret="77567146400110") product = ProductFactory( idAtProviders=isbn, isGcuCompatible=True, isSynchronizationCompatible=True, subcategoryId=subcategories.LIVRE_PAPIER.id, ) offer = create_offer_with_thing_product(venue, product=product, is_active=True) stock = create_stock(offer=offer, price=0) create_booking(user=beneficiary, is_cancelled=True, stock=stock) # When with pytest.raises(ProductWithBookingsException): delete_unwanted_existing_product("1111111111111") # Then offer = Offer.query.one() assert offer.isActive is False assert Product.query.one() == product assert not product.isGcuCompatible assert not product.isSynchronizationCompatible
def test_should_delete_product_when_related_offer_is_on_user_favorite_list( self, app): # Given isbn = "1111111111111" beneficiary = users_factories.BeneficiaryGrant18Factory() offerer = create_offerer(siren="775671464") venue = create_venue(offerer, name="Librairie Titelive", siret="77567146400110") product = create_product_with_thing_subcategory(id_at_providers=isbn) offer = create_offer_with_thing_product(venue, product=product) stock = create_stock(offer=offer, price=0) mediation = create_mediation(offer=offer) favorite = create_favorite(mediation=mediation, offer=offer, user=beneficiary) repository.save(venue, product, offer, stock, mediation, favorite) # When delete_unwanted_existing_product("1111111111111") # Then assert Product.query.count() == 0 assert Offer.query.count() == 0 assert Stock.query.count() == 0 assert Mediation.query.count() == 0 assert Favorite.query.count() == 0
def test_should_set_isGcuCompatible_at_false_in_product_and_deactivate_offer_when_bookings_related_to_offer( self, app): # Given isbn = "1111111111111" user = create_user() offerer = create_offerer(siren="775671464") venue = create_venue(offerer, name="Librairie Titelive", siret="77567146400110") product = create_product_with_thing_type(id_at_providers=isbn, is_gcu_compatible=True) offer = create_offer_with_thing_product(venue, product=product, is_active=True) stock = create_stock(offer=offer, price=0) booking = create_booking(user=user, is_cancelled=True, stock=stock) repository.save(venue, product, offer, stock, booking, user) # When with pytest.raises(Exception): delete_unwanted_existing_product("1111111111111") # Then offer = Offer.query.one() assert offer.isActive is False assert Product.query.one() == product assert not product.isGcuCompatible
def test_should_not_delete_product_when_isbn_not_found(self, app): # Given isbn = "1111111111111" product = create_product_with_thing_subcategory(id_at_providers=isbn) repository.save(product) # When delete_unwanted_existing_product("2222222222222") # Then assert Product.query.count() == 1
def test_should_delete_nothing_when_product_not_found(self, app): # Given isbn = "1111111111111" ProductFactory(idAtProviders=isbn, isSynchronizationCompatible=False, subcategoryId=subcategories.LIVRE_PAPIER.id) # When delete_unwanted_existing_product(isbn) # Then assert Product.query.count() == 1
def __next__(self) -> Optional[list[ProvidableInfo]]: if self.data_lines is None: self.open_next_file() try: data_lines = next(self.data_lines) elements = data_lines.split("~") except StopIteration: self.open_next_file() elements = next(self.data_lines).split("~") if len(elements) != NUMBER_OF_ELEMENTS_PER_LINE: self.log_provider_event(LocalProviderEventType.SyncError, "number of elements mismatch") return [] self.product_infos = get_infos_from_data_line(elements) ( self.product_subcategory_id, self.product_extra_data["bookFormat"], ) = get_subcategory_and_extra_data_from_titelive_type( self.product_infos["code_support"]) book_unique_identifier = self.product_infos["ean13"] ineligibility_reason = self.get_ineligibility_reason() if ineligibility_reason: logger.info("Ignoring isbn=%s because reason=%s", book_unique_identifier, ineligibility_reason) try: product_queries.delete_unwanted_existing_product( book_unique_identifier) except ProductWithBookingsException: self.log_provider_event( LocalProviderEventType.SyncError, f"Error deleting product with ISBN: {self.product_infos['ean13']}" ) return [] if is_unreleased_book(self.product_infos): logger.info( "Ignoring isbn=%s because it has 'xxx' in 'titre' and 'auteurs' fields, which means it is not yet released", book_unique_identifier, ) return [] book_information_last_update = read_things_date( self.product_infos["date_updated"]) providable_info = self.create_providable_info( Product, book_unique_identifier, book_information_last_update, book_unique_identifier) return [providable_info]
def test_should_delete_nothing_when_product_not_found(self, app): # Given isbn = "1111111111111" product = create_product_with_thing_type( id_at_providers=isbn, is_gcu_compatible=False, thing_type=ThingType.LIVRE_EDITION, ) repository.save(product) # When delete_unwanted_existing_product(isbn) # Then assert Product.query.count() == 1
def test_should_delete_product_when_it_has_offer_and_stock_but_not_booked( self, app): # Given isbn = "1111111111111" offerer = create_offerer(siren="775671464") venue = create_venue(offerer, name="Librairie Titelive", siret="77567146400110") product = create_product_with_thing_subcategory(id_at_providers=isbn) offer = create_offer_with_thing_product(venue, product=product) stock = create_stock(offer=offer, price=0) repository.save(venue, product, offer, stock) # When delete_unwanted_existing_product("1111111111111") # Then assert Product.query.count() == 0 assert Offer.query.count() == 0 assert Stock.query.count() == 0
def __next__(self) -> Optional[List[ProvidableInfo]]: if self.data_lines is None: self.open_next_file() try: data_lines = next(self.data_lines) elements = data_lines.split("~") except StopIteration: self.open_next_file() elements = next(self.data_lines).split("~") if len(elements) != NUMBER_OF_ELEMENTS_PER_LINE: self.log_provider_event(LocalProviderEventType.SyncError, "number of elements mismatch") return [] self.product_infos = get_infos_from_data_line(elements) self.product_type, self.product_extra_data[ "bookFormat"] = get_thing_type_and_extra_data_from_titelive_type( self.product_infos["code_support"]) book_unique_identifier = self.product_infos["ean13"] if self.product_is_not_eligible_for_offer_creation(): try: product_queries.delete_unwanted_existing_product( book_unique_identifier) except ProductWithBookingsException: self.log_provider_event( LocalProviderEventType.SyncError, f"Error deleting product with ISBN: {self.product_infos['ean13']}" ) return [] book_information_last_update = read_things_date( self.product_infos["date_updated"]) providable_info = self.create_providable_info( Product, book_unique_identifier, book_information_last_update) return [providable_info]
def test_should_delete_product_when_related_offer_has_mediation(self, app): # Given isbn = "1111111111111" user = create_user() offerer = create_offerer(siren="775671464") venue = create_venue(offerer, name="Librairie Titelive", siret="77567146400110") product = create_product_with_thing_type(id_at_providers=isbn) offer = create_offer_with_thing_product(venue, product=product) stock = create_stock(offer=offer, price=0) mediation = create_mediation(offer=offer) repository.save(venue, product, offer, stock, user, mediation) # When delete_unwanted_existing_product("1111111111111") # Then assert Product.query.count() == 0 assert Offer.query.count() == 0 assert Stock.query.count() == 0 assert Mediation.query.count() == 0