Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
    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
Ejemplo n.º 8
0
    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
Ejemplo n.º 9
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