def test_create_recommendations_for_discovery_should_include_recommendations_on_offers_previously_displayed_in_search_results(
        app):
    # Given
    user = create_user()
    offerer = create_offerer()
    venue = create_venue(offerer)
    offer1 = create_offer_with_thing_product(venue, thumb_count=0)
    stock1 = create_stock_from_offer(offer1, price=0)
    mediation1 = create_mediation(offer1, is_active=True)
    offer2 = create_offer_with_thing_product(venue, thumb_count=0)
    stock2 = create_stock_from_offer(offer2, price=0)
    mediation2 = create_mediation(offer2, is_active=True)

    recommendation = create_recommendation(offer=offer2,
                                           user=user,
                                           mediation=mediation2,
                                           search="bla")

    PcObject.save(user, stock1, mediation1, stock2, mediation2, recommendation)
    db.session.refresh(offer2)

    # When
    recommendations = create_recommendations_for_discovery(user=user)

    # Then
    assert len(recommendations) == 2
    def test_only_returns_payments_with_given_message(self, app):
        # Given
        offerer = create_offerer()
        venue = create_venue(offerer)
        offer = create_offer_with_thing_product(venue)
        paying_stock = create_stock_from_offer(offer)
        free_stock = create_stock_from_offer(offer, price=0)
        user = create_user()
        deposit = create_deposit(user, amount=500)
        booking1 = create_booking(user, paying_stock, venue, is_used=True)
        booking2 = create_booking(user, paying_stock, venue, is_used=True)
        booking3 = create_booking(user, paying_stock, venue, is_used=True)
        booking4 = create_booking(user, free_stock, venue, is_used=True)
        payment1 = create_payment(booking1, offerer, 10, payment_message_name="ABCD123")
        payment2 = create_payment(booking2, offerer, 10, payment_message_name="EFGH456")

        PcObject.save(payment1, payment2)
        PcObject.save(deposit, booking1, booking3, booking4)

        # When
        payements_by_id = get_payments_by_message_id('ABCD123')

        # Then
        assert len(payements_by_id) == 1
        assert payements_by_id[0].paymentMessage.name == 'ABCD123'
示例#3
0
        def test_check_offer_with_two_sold_out_one_unlimited_and_one_remaining_stocks(
                self, app):
            # given
            user = create_user(email='*****@*****.**')
            user2 = create_user(email='*****@*****.**')
            offerer = create_offerer()
            venue = create_venue(offerer)
            offer = create_offer_with_event_product(venue)
            recommendation = create_recommendation(offer, user)

            stock = create_stock_from_offer(offer, available=10)
            stock2 = create_stock_from_offer(offer, available=5)
            stock3 = create_stock_from_offer(offer, available=1)
            stock4 = create_stock_from_offer(offer, available=None)

            deposit = create_deposit(user2, amount=500)
            booking = create_booking(user2,
                                     stock2,
                                     venue,
                                     recommendation,
                                     quantity=5)
            booking2 = create_booking(user2,
                                      stock3,
                                      venue,
                                      recommendation,
                                      quantity=1)

            PcObject.save(booking, booking2, deposit, user, offer, stock,
                          stock2, stock3, stock4, user2)

            # when
            result = offer.stockAlertMessage

            # then
            assert result == 'plus de places pour 3 offres'
示例#4
0
        def test_check_offer_with_one_unlimited_and_one_available_zero_stock(
                self, app):
            # given
            user = create_user(email='*****@*****.**')
            user2 = create_user(email='*****@*****.**')
            offerer = create_offerer()
            venue = create_venue(offerer)
            offer = create_offer_with_thing_product(venue)
            recommendation = create_recommendation(offer, user)
            stock = create_stock_from_offer(offer, available=None)
            stock2 = create_stock_from_offer(offer, available=0)

            deposit = create_deposit(user2, amount=500)
            booking = create_booking(user2,
                                     stock,
                                     venue,
                                     recommendation,
                                     quantity=3)

            PcObject.save(booking, deposit, user, offer, stock, stock2, user2)

            # when
            result = offer.stockAlertMessage

            # then
            assert result == 'plus de stock pour 2 offres'
示例#5
0
def test_find_activation_offers_returns_activation_offers_with_available_stocks(
        app):
    # given
    offerer = create_offerer()
    venue1 = create_venue(offerer,
                          siret=offerer.siren + '12345',
                          postal_code='93000',
                          departement_code='93')
    venue2 = create_venue(offerer,
                          siret=offerer.siren + '67890',
                          postal_code='93000',
                          departement_code='93')
    venue3 = create_venue(offerer,
                          siret=offerer.siren + '54321',
                          postal_code='93000',
                          departement_code='93')
    offer1 = create_offer_with_event_product(venue1,
                                             event_type=EventType.ACTIVATION)
    offer2 = create_offer_with_event_product(venue2,
                                             event_type=EventType.ACTIVATION)
    offer3 = create_offer_with_event_product(venue3,
                                             event_type=EventType.ACTIVATION)
    offer4 = create_offer_with_event_product(venue3,
                                             event_type=EventType.ACTIVATION)
    stock1 = create_stock_from_offer(offer1, price=0, available=0)
    stock2 = create_stock_from_offer(offer2, price=0, available=10)
    stock3 = create_stock_from_offer(offer3, price=0, available=1)
    booking = create_booking(create_user(), stock3, venue=venue3, quantity=1)
    PcObject.save(stock1, stock2, stock3, booking, offer4)

    # when
    offers = find_activation_offers('93').all()

    # then
    assert len(offers) == 1
示例#6
0
        def test_check_offer_with_all_remaining_stocks(self, app):
            # given
            user = create_user(email='*****@*****.**')
            user2 = create_user(email='*****@*****.**')
            offerer = create_offerer()
            venue = create_venue(offerer)
            offer = create_offer_with_event_product(venue)
            recommendation = create_recommendation(offer, user)
            stock = create_stock_from_offer(offer, available=10)
            stock2 = create_stock_from_offer(offer, available=40)

            deposit = create_deposit(user2, amount=500)
            booking = create_booking(user2,
                                     stock,
                                     venue,
                                     recommendation,
                                     quantity=3)
            booking2 = create_booking(user2,
                                      stock2,
                                      venue,
                                      recommendation,
                                      quantity=11)

            PcObject.save(booking, booking2, deposit, user, offer, stock,
                          stock2, user2)

            # when
            result = offer.stockAlertMessage

            # then
            assert result == 'encore 36 places'
示例#7
0
def test_find_activation_offers_returns_activation_offers_if_offer_is_national(
        app):
    # given
    offerer = create_offerer()
    venue1 = create_venue(offerer,
                          siret=offerer.siren + '12345',
                          postal_code='34000',
                          departement_code='34')
    venue2 = create_venue(offerer,
                          siret=offerer.siren + '54321',
                          postal_code='93000',
                          departement_code='93')
    offer1 = create_offer_with_event_product(venue1,
                                             event_type=EventType.ACTIVATION)
    offer2 = create_offer_with_thing_product(venue1,
                                             thing_type=ThingType.AUDIOVISUEL)
    offer3 = create_offer_with_event_product(venue2,
                                             event_type=EventType.ACTIVATION,
                                             is_national=True)
    offer4 = create_offer_with_event_product(venue2,
                                             event_type=EventType.ACTIVATION,
                                             is_national=True)
    stock1 = create_stock_from_offer(offer1)
    stock2 = create_stock_from_offer(offer2)
    stock3 = create_stock_from_offer(offer3)
    stock4 = create_stock_from_offer(offer4)
    PcObject.save(stock1, stock2, stock3, stock4)

    # when
    offers = find_activation_offers('34').all()

    # then
    assert len(offers) == 3
示例#8
0
def test_find_activation_offers_returns_activation_offers_in_all_ile_de_france_if_departement_is_93(
        app):
    # given
    offerer = create_offerer()
    venue1 = create_venue(offerer,
                          siret=offerer.siren + '12345',
                          postal_code='34000',
                          departement_code='34')
    venue2 = create_venue(offerer,
                          siret=offerer.siren + '67890',
                          postal_code='75000',
                          departement_code='75')
    venue3 = create_venue(offerer,
                          siret=offerer.siren + '54321',
                          postal_code='78000',
                          departement_code='78')
    offer1 = create_offer_with_event_product(venue1,
                                             event_type=EventType.ACTIVATION)
    offer2 = create_offer_with_event_product(venue2,
                                             event_type=EventType.ACTIVATION)
    offer3 = create_offer_with_event_product(venue3,
                                             event_type=EventType.ACTIVATION)
    stock1 = create_stock_from_offer(offer1)
    stock2 = create_stock_from_offer(offer2)
    stock3 = create_stock_from_offer(offer3)
    PcObject.save(stock1, stock2, stock3)

    # when
    offers = find_activation_offers('93').all()

    # then
    assert len(offers) == 2
示例#9
0
def test_find_activation_offers_returns_activation_offers_in_given_departement(
        app):
    # given
    offerer = create_offerer()
    venue1 = create_venue(offerer,
                          siret=offerer.siren + '12345',
                          postal_code='34000',
                          departement_code='34')
    venue2 = create_venue(offerer,
                          siret=offerer.siren + '54321',
                          postal_code='93000',
                          departement_code='93')
    offer1 = create_offer_with_event_product(venue1,
                                             event_type=EventType.ACTIVATION)
    offer2 = create_offer_with_event_product(
        venue1, event_type=EventType.SPECTACLE_VIVANT)
    offer3 = create_offer_with_event_product(venue2,
                                             event_type=EventType.ACTIVATION)
    stock1 = create_stock_from_offer(offer1)
    stock2 = create_stock_from_offer(offer2)
    stock3 = create_stock_from_offer(offer3)
    PcObject.save(stock1, stock2, stock3)

    # when
    offers = find_activation_offers('34').all()

    # then
    assert len(offers) == 1
示例#10
0
    def test_when_departement_code_00(app):
        # Given
        offerer = create_offerer()
        venue_34 = create_venue(offerer,
                                postal_code='34000',
                                departement_code='34',
                                siret=offerer.siren + '11111')
        venue_93 = create_venue(offerer,
                                postal_code='93000',
                                departement_code='93',
                                siret=offerer.siren + '22222')
        venue_75 = create_venue(offerer,
                                postal_code='75000',
                                departement_code='75',
                                siret=offerer.siren + '33333')
        offer_34 = create_offer_with_thing_product(venue_34)
        offer_93 = create_offer_with_thing_product(venue_93)
        offer_75 = create_offer_with_thing_product(venue_75)
        stock_34 = create_stock_from_offer(offer_34)
        stock_93 = create_stock_from_offer(offer_93)
        stock_75 = create_stock_from_offer(offer_75)
        user = create_user(departement_code='00')

        PcObject.save(user, stock_34, stock_93, stock_75)

        # When
        offers = get_active_offers(departement_codes=['00'], offer_id=None)

        # Then
        assert offer_34 in offers
        assert offer_93 in offers
        assert offer_75 in offers
示例#11
0
    def test_search_with_several_partial_keywords_returns_things_and_events_with_name_containing_keywords(
            self, app):
        # Given
        thing_ok = create_product_with_thing_type(
            thing_name='Rencontre de michel')
        thing_product = create_product_with_thing_type(
            thing_name='Rencontre avec jean-luc')
        event_product = create_product_with_event_type(
            event_name='Rencontre avec jean-mimi chelou')
        offerer = create_offerer()
        venue = create_venue(offerer)
        thing_ok_offer = create_offer_with_thing_product(venue, thing_ok)
        thing_ko_offer = create_offer_with_thing_product(venue, thing_product)
        event_ko_offer = create_offer_with_event_product(venue, event_product)
        event_ko_occurrence = create_event_occurrence(event_ko_offer)
        event_ko_stock = create_stock_from_event_occurrence(
            event_ko_occurrence)
        thing_ok_stock = create_stock_from_offer(thing_ok_offer)
        thing_ko_stock = create_stock_from_offer(thing_ko_offer)
        PcObject.save(event_ko_stock, thing_ok_stock, thing_ko_stock)

        # When
        offers = get_offers_for_recommendations_search(
            keywords_string='renc michel')

        # Then
        assert thing_ok_offer in offers
        assert thing_ko_offer not in offers
        assert event_ko_offer not in offers
        def when_tutos_are_not_already_read(self, app):
            # given
            offerer = create_offerer()
            venue = create_venue(offerer)
            offer = create_offer_with_event_product(venue)
            user = create_user()
            event_occurrence1 = create_event_occurrence(offer)
            event_occurrence2 = create_event_occurrence(offer)
            stock1 = create_stock_from_event_occurrence(event_occurrence1)
            stock2 = create_stock_from_event_occurrence(event_occurrence2)
            thing_offer1 = create_offer_with_thing_product(venue)
            thing_offer2 = create_offer_with_thing_product(venue)
            stock3 = create_stock_from_offer(thing_offer1)
            stock4 = create_stock_from_offer(thing_offer2)
            PcObject.save(stock1, stock2, stock3, stock4, user)
            upsert_tuto_mediations()

            # when
            auth_request = TestClient(app.test_client()).with_auth(user.email)
            response = auth_request.put(RECOMMENDATION_URL, json={})

            # then
            assert response.status_code == 200
            recommendations = response.json
            assert recommendations[0]['mediation']['tutoIndex'] == 0
            assert recommendations[1]['mediation']['tutoIndex'] == 1
示例#13
0
        def when_searching_by_type_with_two_types(self, app):
            # given
            user = create_user(email='*****@*****.**')
            offerer = create_offerer()
            venue = create_venue(offerer)
            offer1 = create_offer_with_event_product(
                venue, event_name='Training in Modern Jazz')
            offer2 = create_offer_with_event_product(
                venue,
                event_name='Training in Modern Jazz',
                event_type=EventType.CINEMA)
            recommendation = create_recommendation(offer1, user)
            recommendation2 = create_recommendation(offer2, user)
            stock = create_stock_from_offer(
                offer1,
                beginning_datetime=TEN_DAYS_FROM_NOW,
                end_datetime=TWENTY_DAYS_FROM_NOW)
            stock2 = create_stock_from_offer(
                offer2,
                beginning_datetime=TEN_DAYS_FROM_NOW,
                end_datetime=TWENTY_DAYS_FROM_NOW)
            PcObject.save(stock, recommendation, stock2, recommendation2)

            # when
            response = TestClient(app.test_client()).with_auth(
                user.email).get(RECOMMENDATION_URL +
                                '?categories=Applaudir%2CRegarder')

            # then
            assert response.status_code == 200
            assert len(response.json) == 2
        def test_discovery_recommendations_should_not_include_search_recommendations(self, app):
            # Given
            user = create_user()
            offerer = create_offerer()
            venue = create_venue(offerer)
            venue_outside_dept = create_venue(offerer, postal_code='29100', siret='12345678912341')
            offer1 = create_offer_with_thing_product(venue, thumb_count=0)
            stock1 = create_stock_from_offer(offer1, price=0)
            mediation1 = create_mediation(offer1, is_active=True)
            offer2 = create_offer_with_thing_product(venue_outside_dept, thumb_count=0)
            stock2 = create_stock_from_offer(offer2, price=0)
            mediation2 = create_mediation(offer2, is_active=True)

            recommendation = create_recommendation(offer=offer2, user=user, mediation=mediation2, search="bla")

            PcObject.save(user, stock1, mediation1, stock2, mediation2, recommendation)

            auth_request = TestClient(app.test_client()).with_auth(user.email)

            # When
            recommendations_req = auth_request.put(RECOMMENDATION_URL, json={})

            # Then
            assert recommendations_req.status_code == 200
            recommendations = recommendations_req.json
            assert len(recommendations) == 1
            assert recommendations[0]['search'] is None
def test_find_online_activation_stock(app):
    # given
    offerer = create_offerer(siren='123456789', name='pass Culture')
    venue_online = create_venue(offerer, siret=None, is_virtual=True)
    venue_physical = create_venue(offerer,
                                  siret='12345678912345',
                                  is_virtual=False)
    activation_offer = create_offer_with_thing_product(
        venue_online, thing_type=ThingType.ACTIVATION)
    other_thing_offer = create_offer_with_thing_product(
        venue_physical, thing_type=ThingType.ACTIVATION)
    event_offer = create_offer_with_event_product(venue_physical)
    activation_stock = create_stock_from_offer(activation_offer,
                                               available=200,
                                               price=0)
    other_thing_stock = create_stock_from_offer(other_thing_offer,
                                                available=100,
                                                price=10)
    event_stock = create_stock_from_offer(event_offer, available=50, price=20)

    PcObject.save(other_thing_stock, activation_stock, event_stock)

    # when
    stock = find_online_activation_stock()

    # then
    assert stock.offer.venue.isVirtual == True
    assert stock.offer.product.type == 'ThingType.ACTIVATION'
    assert stock.available == 200
    assert stock.price == 0
        def when_offers_have_non_validated_venues(self, app):
            # Given
            offerer = create_offerer()
            venue_not_validated = create_venue(offerer, siret=None, comment='random reason')
            venue_not_validated.generate_validation_token()
            venue_validated = create_venue(offerer, siret=None, comment='random reason')
            offer_venue_not_validated = create_offer_with_thing_product(venue_not_validated, thumb_count=1)
            offer_venue_validated = create_offer_with_thing_product(venue_validated, thumb_count=1)
            stock_venue_not_validated = create_stock_from_offer(offer_venue_not_validated)
            stock_venue_validated = create_stock_from_offer(offer_venue_validated)
            user = create_user(email='*****@*****.**')
            PcObject.save(stock_venue_not_validated, stock_venue_validated, user)
            venue_validated_id = venue_validated.id
            venue_not_validated_id = venue_not_validated.id
            auth_request = TestClient(app.test_client()).with_auth(user.email)

            # when
            response = auth_request.put(RECOMMENDATION_URL, json={'seenRecommendationIds': []})

            # Then
            assert response.status_code == 200
            recommendations = response.json
            venue_ids = set(map(lambda x: x['offer']['venue']['id'], recommendations))
            assert humanize(venue_validated_id) in venue_ids
            assert humanize(venue_not_validated_id) not in venue_ids
        def when_offers_have_active_mediations(self, app):
            # given
            user = create_user()
            offerer = create_offerer()
            venue = create_venue(offerer)
            offer1 = create_offer_with_thing_product(venue, thumb_count=0)
            stock1 = create_stock_from_offer(offer1, price=0)
            mediation1 = create_mediation(offer1, is_active=False)
            offer2 = create_offer_with_thing_product(venue, thumb_count=0)
            stock2 = create_stock_from_offer(offer2, price=0)
            mediation2 = create_mediation(offer2, is_active=False)
            mediation3 = create_mediation(offer2, is_active=True)
            PcObject.save(user, stock1, mediation1, stock2, mediation2, mediation3)
            auth_request = TestClient(app.test_client()).with_auth(user.email)
            mediation3_id = mediation3.id
            mediation2_id = mediation2.id
            mediation1_id = mediation1.id

            # when
            response = auth_request.put(RECOMMENDATION_URL, json={'seenRecommendationIds': []})

            # then
            assert response.status_code == 200
            json = response.json
            mediation_ids = list(map(lambda x: x['mediationId'], json))
            assert humanize(mediation3_id) in mediation_ids
            assert humanize(mediation2_id) not in mediation_ids
            assert humanize(mediation1_id) not in mediation_ids
        def when_user_has_no_offer_in_his_department(self, app):
            # given
            user = create_user(departement_code='973', can_book_free_offers=True, is_admin=False)
            offerer = create_offerer()
            venue29 = create_venue(offerer, siret=offerer.siren + '98765', postal_code='29000', departement_code='29')
            venue34 = create_venue(offerer, siret=offerer.siren + '12345', postal_code='34000', departement_code='34')
            venue93 = create_venue(offerer, siret=offerer.siren + '54321', postal_code='93000', departement_code='93')
            venue67 = create_venue(offerer, siret=offerer.siren + '56789', postal_code='67000', departement_code='67')
            thing_offer1 = create_offer_with_thing_product(venue93, thing_name='thing 93', url=None, is_national=False)
            thing_offer2 = create_offer_with_thing_product(venue67, thing_name='thing 67', url=None, is_national=False)
            thing_offer3 = create_offer_with_thing_product(venue29, thing_name='thing 29', url=None, is_national=False)
            thing_offer4 = create_offer_with_thing_product(venue34, thing_name='thing 34', url=None, is_national=False)
            stock1 = create_stock_from_offer(thing_offer1)
            stock2 = create_stock_from_offer(thing_offer2)
            stock3 = create_stock_from_offer(thing_offer3)
            stock4 = create_stock_from_offer(thing_offer4)
            PcObject.save(user, stock1, stock2, stock3, stock4)

            # when
            response = TestClient(app.test_client()).with_auth(user.email) \
                .put(RECOMMENDATION_URL, json={'readRecommendations': []})

            # then
            assert response.status_code == 200
            assert len(response.json) == 0
        def when_user_has_one_offer_in_his_department(self, app):
            # given
            user = create_user(departement_code='93', can_book_free_offers=True, is_admin=False)
            offerer = create_offerer()
            venue93 = create_venue(offerer, siret=offerer.siren + '54321', postal_code='93000', departement_code='93')
            venue67 = create_venue(offerer, siret=offerer.siren + '56789', postal_code='67000', departement_code='67')
            thing_offer1 = create_offer_with_thing_product(venue93, thing_name='thing 93', url=None, is_national=False)
            thing_offer2 = create_offer_with_thing_product(venue67, thing_name='thing 67', url=None, is_national=False)
            stock1 = create_stock_from_offer(thing_offer1)
            stock2 = create_stock_from_offer(thing_offer2)
            PcObject.save(user, stock1, stock2)

            # when
            response = TestClient(app.test_client()).with_auth(user.email) \
                .put(RECOMMENDATION_URL, json={'readRecommendations': []})

            # then
            assert response.status_code == 200
            assert len(response.json) == 1
            recommendation_response = response.json[0]
            assert 'offer' in recommendation_response
            assert 'venue' in recommendation_response['offer']
            assert 'validationToken' not in recommendation_response['offer']['venue']
            assert 'managingOfferer' in recommendation_response['offer']['venue']
            assert 'validationToken' not in recommendation_response['offer']['venue']['managingOfferer']
        def test_returns_stocks_with_isBookable_property(self, app):
            # Given
            expired_booking_limit_date = datetime(1970, 1, 1)

            user = create_user()
            offerer = create_offerer()
            venue = create_venue(offerer)
            offer = create_offer_with_thing_product(venue, thing_name='Guitar for dummies')
            mediation = create_mediation(offer, is_active=True)

            create_stock_from_offer(offer, price=14)
            create_stock_from_offer(offer, price=26, booking_limit_datetime=expired_booking_limit_date)

            recommendation = create_recommendation(offer=offer, user=user, mediation=mediation)
            PcObject.save(user, recommendation)

            auth_request = TestClient(app.test_client()).with_auth(user.email)

            # When
            recommendations_req = auth_request.put(RECOMMENDATION_URL, json={})

            # Then
            assert recommendations_req.status_code == 200
            recommendations = recommendations_req.json
            assert len(recommendations) == 1
            recommendation = recommendations[0]
            assert recommendation['offer']['name'] == 'Guitar for dummies'
            stocks_response = recommendation['offer']['stocks']
            assert len(stocks_response) == 2
            assert all('isBookable' in stocks_response[i] for i in range(0, len(stocks_response)))
        def test_records_new_payment_lines_in_database(self, app):
            # Given
            offerer = create_offerer()
            venue = create_venue(offerer)
            offer = create_offer_with_thing_product(venue)
            paying_stock = create_stock_from_offer(offer)
            free_stock = create_stock_from_offer(offer, price=0)
            user = create_user()
            deposit = create_deposit(user, amount=500)
            booking1 = create_booking(user, paying_stock, venue, is_used=True)
            booking2 = create_booking(user, paying_stock, venue, is_used=True)
            booking3 = create_booking(user, paying_stock, venue, is_used=True)
            booking4 = create_booking(user, free_stock, venue, is_used=True)
            payment1 = create_payment(booking2,
                                      offerer,
                                      10,
                                      payment_message_name="ABCD123")

            PcObject.save(payment1)
            PcObject.save(deposit, booking1, booking3, booking4)

            initial_payment_count = Payment.query.count()

            # When
            generate_new_payments()

            # Then
            assert Payment.query.count() - initial_payment_count == 2
示例#22
0
    def test_get_active_offers_with_criteria_should_return_offer_with_highest_base_score_first_bust_keep_the_partition(
            self, app):
        # Given
        offerer = create_offerer()
        venue = create_venue(offerer,
                             postal_code='34000',
                             departement_code='34')

        offer1 = create_offer_with_thing_product(
            venue, thing_type=ThingType.CINEMA_ABO, thumb_count=1)
        stock1 = create_stock_from_offer(offer1, price=0)
        offer1.criteria = [create_criterion(name='negative', score_delta=1)]

        offer2 = create_offer_with_thing_product(
            venue, thing_type=ThingType.CINEMA_ABO, thumb_count=1)
        stock2 = create_stock_from_offer(offer2, price=0)
        offer2.criteria = [create_criterion(name='positive', score_delta=2)]

        offer3 = create_offer_with_thing_product(
            venue, thing_type=ThingType.JEUX_VIDEO, thumb_count=1)
        stock3 = create_stock_from_offer(offer3, price=0)
        offer3.criteria = []

        PcObject.save(stock1, stock2, stock3)

        # When
        offers = get_active_offers(departement_codes=['00'],
                                   offer_id=None,
                                   order_by=order_by_with_criteria)

        # Then
        assert offers == [offer2, offer3, offer1]
示例#23
0
        def when_user_has_an_offerer_attached_and_venue_id_argument_is_valid(
                self, app):
            # Given
            user = create_user(email='*****@*****.**')
            deposit = create_deposit(user, amount=500, source='public')
            offerer1 = create_offerer()
            offerer2 = create_offerer(siren='123456788')
            user_offerer1 = create_user_offerer(user,
                                                offerer1,
                                                validation_token=None)
            user_offerer2 = create_user_offerer(user,
                                                offerer2,
                                                validation_token=None)
            venue1 = create_venue(offerer1)
            venue2 = create_venue(offerer1, siret='12345678912346')
            venue3 = create_venue(offerer2, siret='12345678912347')
            offer1 = create_offer_with_event_product(venue1)
            offer2 = create_offer_with_thing_product(venue1)
            offer3 = create_offer_with_thing_product(venue2)
            stock1 = create_stock_from_offer(offer1, available=100, price=20)
            stock2 = create_stock_from_offer(offer2, available=150, price=16)
            stock3 = create_stock_from_offer(offer3, available=150, price=18)
            booking1 = create_booking(user,
                                      stock1,
                                      venue=venue1,
                                      token='ABCDEF')
            booking2 = create_booking(user,
                                      stock1,
                                      venue=venue1,
                                      token='ABCDEG')
            booking3 = create_booking(user,
                                      stock2,
                                      venue=venue2,
                                      token='ABCDEH')
            booking4 = create_booking(user,
                                      stock3,
                                      venue=venue3,
                                      token='ABCDEI')

            PcObject.save(deposit, booking1, booking2, booking3, booking4,
                          user_offerer1, user_offerer2)

            url = '/bookings/csv?venueId=%s' % (humanize(venue1.id))

            # When
            response = TestClient(app.test_client()).with_auth(
                user.email).get(url)

            # Then
            content_lines = response.data.decode('utf-8').split('\n')[1:-1]
            assert response.status_code == 200
            assert response.headers[
                'Content-type'] == 'text/csv; charset=utf-8;'
            assert response.headers[
                'Content-Disposition'] == 'attachment; filename=reservations_pass_culture.csv'
            assert len(content_lines) == 3
示例#24
0
        def test_list_activation_offers_returns_offers_of_event_type(
                self, app):
            # given
            user = create_user()
            PcObject.save(user)
            auth_request = TestClient(
                app.test_client()).with_auth(email=user.email)
            now = datetime.utcnow()
            five_days_ago = now - timedelta(days=5)
            next_week = now + timedelta(days=7)
            offerer = create_offerer()
            venue1 = create_venue(offerer,
                                  siret=offerer.siren + '12345',
                                  postal_code='93000',
                                  departement_code='93')
            venue2 = create_venue(offerer,
                                  siret=offerer.siren + '67890',
                                  postal_code='93000',
                                  departement_code='93')
            venue3 = create_venue(offerer,
                                  siret=offerer.siren + '54321',
                                  postal_code='93000',
                                  departement_code='93')
            offer1 = create_offer_with_event_product(
                venue1, event_type=EventType.ACTIVATION)
            offer2 = create_offer_with_event_product(
                venue2, event_type=EventType.ACTIVATION)
            offer3 = create_offer_with_event_product(
                venue3, event_type=EventType.ACTIVATION)
            stock1 = create_stock_from_offer(
                offer1, price=0, booking_limit_datetime=five_days_ago)
            stock2 = create_stock_from_offer(offer2,
                                             price=0,
                                             booking_limit_datetime=next_week)
            stock3 = create_stock_from_offer(offer3,
                                             price=0,
                                             booking_limit_datetime=None)
            PcObject.save(stock1, stock2, stock3)

            # when
            response = auth_request.get('/offers/activation')

            # then
            json = response.json
            event_ids = [
                info['productId'] for info in json
                if ProductType.is_event(info['type'])
            ]
            assert len(json) == 2
            assert response.status_code == 200
            assert humanize(offer2.productId) in event_ids
            assert humanize(offer3.productId) in event_ids
示例#25
0
    def test_file_has_recipient_name_and_siren_in_creditor_info(self, app):
        # Given
        offerer1 = create_offerer(name='first offerer', siren='123456789')
        offerer2 = create_offerer(name='second offerer', siren='987654321')
        offerer3 = create_offerer()
        user = create_user()
        venue1 = create_venue(offerer1)
        venue2 = create_venue(offerer2)
        venue3 = create_venue(offerer3)
        stock1 = create_stock_from_offer(
            create_offer_with_thing_product(venue1))
        stock2 = create_stock_from_offer(
            create_offer_with_thing_product(venue2))
        stock3 = create_stock_from_offer(
            create_offer_with_thing_product(venue3))
        booking1 = create_booking(user, stock1)
        booking2 = create_booking(user, stock2)
        booking3 = create_booking(user, stock3)

        payments = [
            create_payment(booking1,
                           offerer1,
                           Decimal(10),
                           iban='CF13QSDFGH456789',
                           bic='QSDFGH8Z555'),
            create_payment(booking2,
                           offerer2,
                           Decimal(20),
                           iban='FR14WXCVBN123456',
                           bic='WXCVBN7B444'),
            create_payment(booking3,
                           offerer3,
                           Decimal(20),
                           iban=None,
                           bic=None)
        ]

        # When
        xml = generate_message_file(payments, 'BD12AZERTY123456',
                                    'AZERTY9Q666', MESSAGE_ID, '0000')

        # Then
        assert find_all_nodes('//ns:PmtInf/ns:CdtTrfTxInf/ns:Cdtr/ns:Nm',
                              xml)[0] == 'first offerer'
        assert find_all_nodes(
            '//ns:PmtInf/ns:CdtTrfTxInf/ns:Cdtr/ns:Id/ns:OrgId/ns:Othr/ns:Id',
            xml)[0] == '123456789'
        assert find_all_nodes('//ns:PmtInf/ns:CdtTrfTxInf/ns:Cdtr/ns:Nm',
                              xml)[1] == 'second offerer'
        assert find_all_nodes(
            '//ns:PmtInf/ns:CdtTrfTxInf/ns:Cdtr/ns:Id/ns:OrgId/ns:Othr/ns:Id',
            xml)[1] == '987654321'
示例#26
0
    def test_file_has_bic_in_credit_transfer_transaction_info(self, app):
        # Given
        offerer1 = create_offerer(name='first offerer')
        offerer2 = create_offerer(name='second offerer')
        offerer3 = create_offerer(name='third offerer')
        user = create_user()
        venue1 = create_venue(offerer1)
        venue2 = create_venue(offerer2)
        venue3 = create_venue(offerer3)
        stock1 = create_stock_from_offer(
            create_offer_with_thing_product(venue1))
        stock2 = create_stock_from_offer(
            create_offer_with_thing_product(venue2))
        stock3 = create_stock_from_offer(
            create_offer_with_thing_product(venue3))
        booking1 = create_booking(user, stock1)
        booking2 = create_booking(user, stock2)
        booking3 = create_booking(user, stock3)

        payments = [
            create_payment(
                booking1,
                offerer1,
                Decimal(10),
                iban='CF13QSDFGH456789',
                bic='QSDFGH8Z555',
                transaction_label='remboursement 1ère quinzaine 09-2018'),
            create_payment(
                booking2,
                offerer2,
                Decimal(20),
                iban='FR14WXCVBN123456',
                bic='WXCVBN7B444',
                transaction_label='remboursement 1ère quinzaine 09-2018'),
            create_payment(
                booking3,
                offerer3,
                Decimal(20),
                iban=None,
                bic=None,
                transaction_label='remboursement 1ère quinzaine 09-2018')
        ]

        # When
        xml = generate_message_file(payments, 'BD12AZERTY123456',
                                    'AZERTY9Q666', MESSAGE_ID, '0000')

        # Then
        assert find_all_nodes('//ns:PmtInf/ns:CdtTrfTxInf/ns:RmtInf/ns:Ustrd', xml)[0] \
               == 'remboursement 1ère quinzaine 09-2018'
        assert find_all_nodes('//ns:PmtInf/ns:CdtTrfTxInf/ns:RmtInf/ns:Ustrd', xml)[1] \
               == 'remboursement 1ère quinzaine 09-2018'
        def when_tutos_are_already_read(self, app):
            # given
            offerer = create_offerer()
            venue = create_venue(offerer)
            offer = create_offer_with_event_product(venue)
            user = create_user()
            event_occurrence1 = create_event_occurrence(offer)
            event_occurrence2 = create_event_occurrence(offer)
            stock1 = create_stock_from_event_occurrence(event_occurrence1)
            stock2 = create_stock_from_event_occurrence(event_occurrence2)
            thing_offer1 = create_offer_with_thing_product(venue)
            thing_offer2 = create_offer_with_thing_product(venue)
            stock3 = create_stock_from_offer(thing_offer1)
            stock4 = create_stock_from_offer(thing_offer2)
            PcObject.save(stock1, stock2, stock3, stock4, user)
            upsert_tuto_mediations()
            tuto_mediation0 = Mediation.query.filter_by(tutoIndex=0).one()
            tuto_mediation1 = Mediation.query.filter_by(tutoIndex=1).one()
            tuto_recommendation0 = create_recommendation(
                mediation=tuto_mediation0,
                user=user
            )
            tuto_recommendation1 = create_recommendation(
                mediation=tuto_mediation1,
                user=user
            )
            PcObject.save(tuto_recommendation0, tuto_recommendation1)
            humanized_tuto_recommendation0_id = humanize(tuto_recommendation0.id)
            humanized_tuto_recommendation1_id = humanize(tuto_recommendation1.id)
            reads = [
                {
                    "id": humanized_tuto_recommendation0_id,
                    "dateRead": "2018-12-17T15:59:11.689Z"
                },
                {
                    "id": humanized_tuto_recommendation1_id,
                    "dateRead": "2018-12-17T15:59:15.689Z"
                }
            ]
            data = {'readRecommendations': reads}
            auth_request = TestClient(app.test_client()).with_auth(user.email)

            # when
            response = auth_request.put(RECOMMENDATION_URL, json=data)

            # then
            assert response.status_code == 200
            recommendations = response.json
            recommendation_ids = [r['id'] for r in recommendations]
            assert humanized_tuto_recommendation0_id not in recommendation_ids
            assert humanized_tuto_recommendation1_id not in recommendation_ids
        def test_reimburses_95_percent_for_book_product_when_bookings_exceed_100000_euros(
                self, app):
            # Given
            offerer1 = create_offerer(siren='123456789')
            PcObject.save(offerer1)
            bank_information = create_bank_information(
                bic='BDFEFR2LCCB',
                iban='FR7630006000011234567890189',
                id_at_providers='123456789',
                offerer=offerer1)
            venue1 = create_venue(offerer1, siret='12345678912345')
            venue2 = create_venue(offerer1, siret='98765432154321')
            venue3 = create_venue(offerer1, siret='98123432154321')
            offer1 = create_offer_with_thing_product(
                venue1, thing_type=ThingType.LIVRE_EDITION, url=None)
            offer2 = create_offer_with_thing_product(
                venue2, thing_type=ThingType.LIVRE_EDITION, url=None)
            offer3 = create_offer_with_thing_product(
                venue3, thing_type=ThingType.LIVRE_EDITION, url=None)
            paying_stock1 = create_stock_from_offer(offer1, price=10000)
            paying_stock2 = create_stock_from_offer(offer2, price=10000)
            paying_stock3 = create_stock_from_offer(offer3, price=100000)
            user = create_user()
            deposit = create_deposit(user, amount=120000)
            booking1 = create_booking(user,
                                      paying_stock1,
                                      venue1,
                                      quantity=1,
                                      is_used=True)
            booking2 = create_booking(user,
                                      paying_stock2,
                                      venue2,
                                      quantity=1,
                                      is_used=True)
            booking3 = create_booking(user,
                                      paying_stock3,
                                      venue3,
                                      quantity=1,
                                      is_used=True)
            PcObject.save(deposit, booking1, booking2, booking3,
                          bank_information)

            # When
            pending, not_processable = generate_new_payments()

            # Then
            assert len(pending) == 3
            assert len(not_processable) == 0
            assert sum(p.amount for p in pending) == 115000
示例#29
0
    def test_file_has_iban_in_credit_transfer_transaction_info(self, app):
        # Given
        offerer1 = create_offerer()
        offerer2 = create_offerer()
        offerer3 = create_offerer()
        user = create_user()
        venue1 = create_venue(offerer1)
        venue2 = create_venue(offerer2)
        venue3 = create_venue(offerer3)
        stock1 = create_stock_from_offer(
            create_offer_with_thing_product(venue1))
        stock2 = create_stock_from_offer(
            create_offer_with_thing_product(venue2))
        stock3 = create_stock_from_offer(
            create_offer_with_thing_product(venue3))
        booking1 = create_booking(user, stock1)
        booking2 = create_booking(user, stock2)
        booking3 = create_booking(user, stock3)

        payments = [
            create_payment(booking1,
                           offerer1,
                           Decimal(10),
                           iban='CF13QSDFGH456789',
                           bic='QSDFGH8Z555'),
            create_payment(booking2,
                           offerer2,
                           Decimal(20),
                           iban='FR14WXCVBN123456',
                           bic='WXCVBN7B444'),
            create_payment(booking3,
                           offerer3,
                           Decimal(20),
                           iban=None,
                           bic=None)
        ]

        # When
        xml = generate_message_file(payments, 'BD12AZERTY123456',
                                    'AZERTY9Q666', MESSAGE_ID, '0000')

        # Then
        assert find_all_nodes(
            '//ns:PmtInf/ns:CdtTrfTxInf/ns:CdtrAcct/ns:Id/ns:IBAN',
            xml)[0] == 'CF13QSDFGH456789'
        assert find_all_nodes(
            '//ns:PmtInf/ns:CdtTrfTxInf/ns:CdtrAcct/ns:Id/ns:IBAN',
            xml)[1] == 'FR14WXCVBN123456'
示例#30
0
def test_raises_error_on_booking_when_existing_booking_is_used_and_booking_date_is_after_last_update_on_stock(
        app):
    offerer = create_offerer()
    venue = create_venue(offerer)
    offer = create_offer_with_thing_product(venue)
    stock = create_stock_from_offer(offer, price=0, available=1)
    user1 = create_user(email='*****@*****.**')
    user2 = create_user(email='*****@*****.**')
    PcObject.save(stock)
    date_after_stock_last_update = datetime.utcnow()
    booking1 = create_booking(user1,
                              stock,
                              date_used=date_after_stock_last_update,
                              is_cancelled=False,
                              is_used=True)
    PcObject.save(booking1)
    date_after_last_booking = datetime.utcnow()
    booking2 = create_booking(user2,
                              stock,
                              date_used=date_after_last_booking,
                              is_cancelled=False,
                              is_used=False)

    # When
    with pytest.raises(ApiErrors) as e:
        PcObject.save(booking2)

    # Then
    assert e.value.errors['global'] == [
        'la quantité disponible pour cette offre est atteinte'
    ]