Пример #1
0
    def test_create_offer_from_existing_product(
            self, mocked_offer_creation_notification_to_admin):
        product = factories.ProductFactory(
            name="An excellent offer",
            type=str(offer_type.EventType.CINEMA),
        )
        venue = factories.VenueFactory()
        offerer = venue.managingOfferer
        user_offerer = factories.UserOffererFactory(offerer=offerer)
        user = user_offerer.user

        data = offers_serialize.PostOfferBodyModel(
            venueId=humanize(venue.id),
            productId=humanize(product.id),
            externalTicketOfficeUrl="http://example.net",
            audioDisabilityCompliant=True,
            mentalDisabilityCompliant=True,
            motorDisabilityCompliant=True,
            visualDisabilityCompliant=True,
        )
        offer = api.create_offer(data, user)

        assert offer.name == "An excellent offer"
        assert offer.type == str(offer_type.EventType.CINEMA)
        assert offer.product == product
        assert offer.externalTicketOfficeUrl == "http://example.net"
        assert offer.audioDisabilityCompliant
        assert offer.mentalDisabilityCompliant
        assert offer.motorDisabilityCompliant
        assert offer.visualDisabilityCompliant
        assert Offer.query.count() == 1
        mocked_offer_creation_notification_to_admin.assert_called_once_with(
            offer, user)
Пример #2
0
def create_product(isbn, **kwargs):
    return factories.ProductFactory(
        idAtProviders=isbn,
        subcategoryId=subcategories.LIVRE_PAPIER.id,
        extraData={"prix_livre": 12},
        **kwargs,
    )
Пример #3
0
    def test_do_not_update_product_if_owning_offerer_is_not_the_venue_managing_offerer(self):
        product = factories.ProductFactory(name="Old name")
        offer = factories.OfferFactory(product=product, name="Old name")

        offer = api.update_offer(offer, name="New name")

        assert offer.name == "New name"
        assert product.name == "Old name"
Пример #4
0
    def test_update_product_if_owning_offerer_is_the_venue_managing_offerer(self):
        offerer = factories.OffererFactory()
        product = factories.ProductFactory(owningOfferer=offerer)
        offer = factories.OfferFactory(product=product, venue__managingOfferer=offerer)

        offer = api.update_offer(offer, name="New name")

        assert offer.name == "New name"
        assert product.name == "New name"
Пример #5
0
    def test_success_if_physical_product_and_physical_venue(self):
        venue = factories.VenueFactory()
        user_offerer = factories.UserOffererFactory(offerer=venue.managingOfferer)
        product = factories.ProductFactory()

        data = offers_serialize.PostOfferBodyModel(
            venueId=humanize(venue.id),
            productId=humanize(product.id),
        )
        api.create_offer(data, user_offerer.user)  # should not fail
Пример #6
0
    def test_fail_if_physical_product_and_virtual_venue(self):
        venue = factories.VirtualVenueFactory()
        user_offerer = factories.UserOffererFactory(offerer=venue.managingOfferer)
        product = factories.ProductFactory()

        data = offers_serialize.PostOfferBodyModel(
            venueId=humanize(venue.id),
            productId=humanize(product.id),
        )
        with pytest.raises(api_errors.ApiErrors) as error:
            api.create_offer(data, user_offerer.user)
        err = 'Une offre physique ne peut être associée au lieu "Offre numérique"'
        assert error.value.errors["venue"] == [err]
Пример #7
0
    def test_create_offer_from_existing_product(self):
        product = factories.ProductFactory(
            name="An excellent offer",
            type=str(offer_type.EventType.CINEMA),
        )
        venue = factories.VenueFactory()
        offerer = venue.managingOfferer
        user_offerer = factories.UserOffererFactory(offerer=offerer)
        user = user_offerer.user

        data = offers_serialize.PostOfferBodyModel(
            venueId=humanize(venue.id),
            productId=humanize(product.id),
        )
        offer = api.create_offer(data, user)

        assert offer.name == "An excellent offer"
        assert offer.type == str(offer_type.EventType.CINEMA)
        assert offer.product == product
Пример #8
0
    def test_edit_product_offers_criteria_from_isbn(
            self, mocked_validate_csrf_token, mocked_async_index_offer_ids,
            app):
        # Given
        users_factories.AdminFactory(email="*****@*****.**")
        product = offers_factories.ProductFactory(
            extraData={"isbn": "9783161484100"})
        offer1 = offers_factories.OfferFactory(
            product=product, extraData={"isbn": "9783161484100"})
        offer2 = offers_factories.OfferFactory(
            product=product, extraData={"isbn": "9783161484100"})
        inactive_offer = offers_factories.OfferFactory(
            product=product,
            extraData={"isbn": "9783161484100"},
            isActive=False)
        unmatched_offer = offers_factories.OfferFactory()
        criterion1 = offers_factories.CriterionFactory(
            name="Pretty good books")
        criterion2 = offers_factories.CriterionFactory(
            name="Other pretty good books")

        data = dict(criteria=[criterion1.id, criterion2.id], )

        # When
        client = TestClient(
            app.test_client()).with_session_auth("*****@*****.**")
        response = client.post(
            "/pc/back-office/many_offers_operations/add_criteria_to_offers?isbn=9783161484100",
            form=data)

        # Then
        assert response.status_code == 302
        assert response.headers[
            "location"] == "http://localhost/pc/back-office/many_offers_operations/"
        assert offer1.criteria == [criterion1, criterion2]
        assert offer2.criteria == [criterion1, criterion2]
        assert not inactive_offer.criteria
        assert not unmatched_offer.criteria
        mocked_async_index_offer_ids.assert_called_once_with(
            [offer1.id, offer2.id])
Пример #9
0
def test_fully_sync_venue():
    api_url = "https://example.com/provider/api"
    provider = offerers_factories.APIProviderFactory(apiUrl=api_url)
    venue_provider = offerers_factories.VenueProviderFactory(provider=provider)
    venue = venue_provider.venue
    stock = offers_factories.StockFactory(quantity=10,
                                          offer__venue=venue,
                                          offer__idAtProviders="1")
    bookings_factories.BookingFactory(stock=stock)
    product2 = offers_factories.ProductFactory(
        idAtProviders="1234",
        extraData={"prix_livre": 10},
        subcategoryId=subcategories.LIVRE_PAPIER.id,
    )

    with requests_mock.Mocker() as mock:
        response = {
            "total": 1,
            "stocks": [{
                "ref": "1234",
                "available": 5
            }],
        }
        mock.get(f"{api_url}/{venue_provider.venueIdAtOfferProvider}",
                 [{
                     "json": response
                 }, {
                     "json": {
                         "stocks": []
                     }
                 }])
        fully_sync_venue.fully_sync_venue(venue)

    # Check that the quantity of existing stocks has been reset.
    assert stock.quantity == 1
    # Check that offers and stocks have been created or updated.
    offer2 = offers_models.Offer.query.filter_by(product=product2).one()
    assert offer2.stocks[0].quantity == 5
Пример #10
0
 def test_use_product(self):
     product = factories.ProductFactory(thumbCount=1)
     offer = factories.OfferFactory(product=product)
     assert offer.thumbUrl.startswith("http")
     assert offer.thumbUrl == product.thumbUrl
Пример #11
0
def create_product(isbn, **kwargs):
    return factories.ProductFactory(idAtProviders=isbn,
                                    type=str(ThingType.LIVRE_EDITION),
                                    **kwargs)
    def test_synchronize_venue_provider(self, app):
        api_url = "https://example.com/provider/api"
        old_provider = APIProviderFactory(id=1)
        provider = APIProviderFactory(id=2, apiUrl=api_url)
        venue_provider = VenueProviderFactory(provider=provider)
        venue = venue_provider.venue

        existing_product = offers_factories.ProductFactory(
            idAtProviders="4321",
            extraData={"prix_livre": 10},
            subcategoryId=subcategories.LIVRE_PAPIER.id,
        )
        offer_id_at_providers = f"{existing_product.idAtProviders}@{venue.siret}"
        existing_stock = offers_factories.StockFactory(
            quantity=10,
            offer__venue=venue,
            offer__product=existing_product,
            lastProviderId=old_provider.id,
            offer__idAtProviders=offer_id_at_providers,
            idAtProviders=offer_id_at_providers,
        )
        bookings_factories.BookingFactory(stock=existing_stock)

        product_to_synchronized = offers_factories.ProductFactory(
            idAtProviders="1234",
            extraData={"prix_livre": 10},
            subcategoryId=subcategories.LIVRE_PAPIER.id,
        )

        with requests_mock.Mocker() as mock:
            response = {
                "total":
                1,
                "stocks": [
                    {
                        "ref": "1234",
                        "available": 5
                    },
                    {
                        "ref": "4321",
                        "available": 12
                    },
                ],
            }
            mock.get(f"{api_url}/{venue_provider.venueIdAtOfferProvider}",
                     [{
                         "json": response
                     }, {
                         "json": {
                             "stocks": []
                         }
                     }])
            synchronize_venue_provider(venue_provider)

        # Check that previously synchronized stock have been updated.
        assert existing_stock.offer.lastProviderId == provider.id
        assert existing_stock.quantity == 12 + existing_stock.dnBookedQuantity

        # Check that offers and stocks have been created.
        created_offer = Offer.query.filter_by(
            product=product_to_synchronized).one()
        assert created_offer.stocks[0].quantity == 5