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)
def create_product(isbn, **kwargs): return factories.ProductFactory( idAtProviders=isbn, subcategoryId=subcategories.LIVRE_PAPIER.id, extraData={"prix_livre": 12}, **kwargs, )
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"
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"
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
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]
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
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])
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
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
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