def test_should_return_event_beginning_times_in_seconds(self, app):
        # Given
        in_three_days_at_eighteen_thirty = datetime.utcnow() + timedelta(
            days=3)
        in_four_days_at_eighteen_thirty = datetime.utcnow() + timedelta(days=4)
        in_five_days_at_twenty_one_thirty = datetime.utcnow() + timedelta(
            days=5, hours=3, seconds=18)
        offerer = create_offerer()
        venue = create_venue(offerer=offerer)
        offer = create_offer_with_event_product(venue=venue)
        stock1 = create_stock(
            beginning_datetime=in_three_days_at_eighteen_thirty, offer=offer)
        stock2 = create_stock(
            beginning_datetime=in_five_days_at_twenty_one_thirty, offer=offer)
        stock3 = create_stock(
            beginning_datetime=in_four_days_at_eighteen_thirty, offer=offer)
        repository.save(stock1, stock2, stock3)

        # When
        result = AlgoliaBackend.serialize_offer(offer)

        # Then
        eighteen_thirty_in_seconds = 66600
        twenty_one_thirty_in_seconds = 77418
        assert sorted(result["offer"]["times"]) == sorted(
            [eighteen_thirty_in_seconds, twenty_one_thirty_in_seconds])
    def test_should_default_coordinates_when_offer_is_numeric(self, app):
        # Given
        offerer = create_offerer()
        venue = create_venue(offerer=offerer, latitude=None, longitude=None)
        offer = create_offer_with_thing_product(venue=venue, is_digital=True)
        stock = create_stock(offer=offer)
        repository.save(stock)

        # When
        result = AlgoliaBackend.serialize_offer(offer)

        # Then
        assert result["_geoloc"]["lat"] == 47.158459
        assert result["_geoloc"]["lng"] == 2.409289
    def test_should_return_a_performer_when_exists(self, app):
        # Given
        offerer = create_offerer()
        venue = create_venue(offerer=offerer)
        offer = create_offer_with_thing_product(venue=venue)
        offer.extraData = {"performer": "MEFA"}
        stock = create_stock(offer=offer)
        repository.save(stock)

        # When
        result = AlgoliaBackend.serialize_offer(offer)

        # Then
        assert result["offer"]["artist"] == "MEFA"
    def test_distinct_should_return_offer_id_by_default(self, app):
        # Given
        offerer = create_offerer()
        venue = create_venue(offerer=offerer)
        offer = create_offer_with_thing_product(venue=venue)
        offer.extraData = {}  # no isbn nor visa
        stock = create_stock(offer=offer)
        repository.save(stock)

        # When
        result = AlgoliaBackend.serialize_offer(offer)

        # Then
        assert result["distinct"] == str(offer.id)
    def test_distinct_should_return_isbn_when_exists(self, app):
        # Given
        offerer = create_offerer()
        venue = create_venue(offerer=offerer)
        offer = create_offer_with_thing_product(venue=venue)
        offer.extraData = {"isbn": "123456987", "visa": "123654"}
        stock = create_stock(offer=offer)
        repository.save(stock)

        # When
        result = AlgoliaBackend.serialize_offer(offer)

        # Then
        assert result["distinct"] == offer.extraData["isbn"]
    def test_should_not_return_event_beginning_datetimes_as_timestamp_when_thing(
            self, app):
        # Given
        offerer = create_offerer()
        venue = create_venue(offerer=offerer)
        offer = create_offer_with_thing_product(venue=venue)
        stock1 = create_stock(offer=offer)
        stock2 = create_stock(offer=offer)
        repository.save(stock1, stock2)

        # When
        result = AlgoliaBackend.serialize_offer(offer)

        # Then
        assert result["offer"]["dates"] == []
    def test_should_return_the_first_stock_price(self, app):
        # Given
        offerer = create_offerer()
        venue = create_venue(offerer=offerer)
        offer = create_offer_with_thing_product(venue=venue)
        stock1 = create_stock(offer=offer, price=7)
        stock2 = create_stock(offer=offer, price=5)
        stock3 = create_stock(offer=offer, price=10.3)
        repository.save(stock1, stock2, stock3)

        # When
        result = AlgoliaBackend.serialize_offer(offer)

        # Then
        assert result["offer"]["prices"] == [
            Decimal("5.00"),
            Decimal("7.00"),
            Decimal("10.30")
        ]
def test_serialize_venue():
    venue = offerers_factories.VenueFactory(
        venueTypeCode="VISUAL_ARTS",
        audioDisabilityCompliant=True,
        contact__email="*****@*****.**",
        contact__website="http://venue.example.com",
        contact__phone_number="+33.123456",
        contact__social_medias={
            "facebook": None,
            "instagram": None,
            "snapchat": None,
            "twitter": "https://twitter.com/my.venue",
        },
    )

    serialized = AlgoliaBackend().serialize_venue(venue)
    assert serialized == {
        "objectID": venue.id,
        "city": venue.city,
        "name": venue.name,
        "offerer_name": venue.managingOfferer.name,
        "venue_type": venue.venueTypeCode.name,
        "description": venue.description,
        "audio_disability": True,
        "mental_disability": False,
        "motor_disability": False,
        "visual_disability": False,
        "email": "*****@*****.**",
        "phone_number": "+33.123456",
        "website": "http://venue.example.com",
        "facebook": None,
        "instagram": None,
        "snapchat": None,
        "twitter": "https://twitter.com/my.venue",
        "_geoloc": {
            "lng": float(venue.longitude),
            "lat": float(venue.latitude)
        },
    }
    def test_should_return_event_beginning_datetimes_as_timestamp_sorted_from_oldest_to_newest_when_event(
            self, app):
        # Given
        in_three_days = datetime.utcnow() + timedelta(days=3)
        in_four_days = datetime.utcnow() + timedelta(days=4)
        in_five_days = datetime.utcnow() + timedelta(days=5)
        in_ten_days = datetime.utcnow() + timedelta(days=10)
        offerer = create_offerer()
        venue = create_venue(offerer=offerer)
        offer = create_offer_with_event_product(venue=venue)
        stock1 = create_stock(beginning_datetime=in_four_days, offer=offer)
        stock2 = create_stock(beginning_datetime=in_three_days, offer=offer)
        stock3 = create_stock(beginning_datetime=in_ten_days, offer=offer)
        stock4 = create_stock(beginning_datetime=in_five_days, offer=offer)
        repository.save(stock1, stock2, stock3, stock4)

        # When
        result = AlgoliaBackend.serialize_offer(offer)

        # Then
        assert result["offer"]["dates"] == [
            1603011600.0, 1603098000.0, 1603184400.0, 1603616400.0
        ]
    def test_should_return_algolia_object_with_two_tags_when_two_criterion(
            self, app):
        # Given
        in_four_days = datetime.utcnow() + timedelta(days=4)
        offerer = create_offerer(name="Offerer name", idx=1)
        venue = create_venue(
            offerer=offerer,
            city="Paris",
            idx=2,
            latitude=48.8638689,
            longitude=2.3380198,
            name="Venue name",
            public_name="Venue public name",
        )
        criterion1 = create_criterion(description="Ma super offre",
                                      name="Mon tag associé",
                                      score_delta=0)
        criterion2 = create_criterion(description="Avengers",
                                      name="Iron Man mon super héros",
                                      score_delta=0)
        offer = create_offer_with_event_product(
            venue=venue,
            description="Un lit sous une rivière",
            withdrawal_details="A emporter sur place",
            idx=3,
            is_active=True,
            event_name="Event name",
            event_subcategory_id=subcategories.EVENEMENT_MUSIQUE.id,
            thumb_count=1,
            date_created=datetime(2020, 1, 1, 10, 0, 0),
            criteria=[criterion1, criterion2],
        )
        stock1 = create_stock(
            beginning_datetime=in_four_days,
            date_created=datetime(2020, 12, 5, 11, 0, 0),
            offer=offer,
            price=10,
            quantity=10,
        )
        repository.save(stock1)
        humanized_product_id = humanize(offer.product.id)

        # When
        result = AlgoliaBackend.serialize_offer(offer)

        # Then
        result["offer"]["tags"] = set(result["offer"]["tags"])
        assert result == {
            "distinct": "3",
            "objectID": 3,
            "offer": {
                "artist": None,
                "category": "MUSIQUE",
                "dateCreated": 1577872800.0,
                "dates": [1603098000.0],
                "description": "lit sous rivière",
                "id": "AM",
                "isbn": None,
                "isDuo": False,
                "isEducational": False,
                "isDigital": False,
                "isEvent": True,
                "isThing": False,
                "label": "Autre type d'événement musical",
                "name": "Event name",
                "prices": [Decimal("10.00")],
                "rankingWeight": None,
                "searchGroupName": subcategories.SearchGroups.MUSIQUE.name,
                "stocksDateCreated": [1607166000.0],
                "subcategoryId": subcategories.EVENEMENT_MUSIQUE.id,
                "thumbUrl": f"/storage/thumbs/products/{humanized_product_id}",
                "tags": {"Mon tag associé", "Iron Man mon super héros"},
                "times": [32400],
                "visa": None,
            },
            "offerer": {
                "name": "Offerer name",
            },
            "venue": {
                "id": 2,
                "departementCode": "93",
                "name": "Venue name",
                "publicName": "Venue public name",
            },
            "_geoloc": {
                "lat": 48.86387,
                "lng": 2.33802
            },
        }
    def test_should_return_algolia_object_with_required_information(self, app):
        # Given
        in_four_days = datetime.utcnow() + timedelta(days=4)
        three_days_ago = datetime.utcnow() + timedelta(days=-3)
        offerer = create_offerer(name="Offerer name", idx=1)
        venue = create_venue(
            offerer=offerer,
            city="Paris",
            idx=2,
            latitude=48.8638689,
            longitude=2.3380198,
            name="Venue name",
            public_name="Venue public name",
        )
        offer = create_offer_with_event_product(
            venue=venue,
            description="Un lit sous une rivière",
            withdrawal_details="A emporter sur place",
            idx=3,
            is_active=True,
            event_name="Event name",
            event_subcategory_id=subcategories.EVENEMENT_MUSIQUE.id,
            thumb_count=1,
            date_created=datetime(2020, 1, 1, 10, 0, 0),
            ranking_weight=3,
        )
        stock1 = create_stock(
            beginning_datetime=in_four_days,
            date_created=datetime(2020, 12, 5, 11, 0, 0),
            offer=offer,
            price=10,
            quantity=10,
        )
        stock2 = create_stock(
            beginning_datetime=in_four_days,
            date_created=datetime(2020, 12, 11, 8, 0, 0),
            offer=offer,
            price=20,
            quantity=10,
        )
        stock3 = create_stock(
            beginning_datetime=in_four_days,
            date_created=datetime(2020, 12, 1, 11, 0, 0),
            offer=offer,
            price=0,
            quantity=10,
        )
        stock4 = create_stock(
            beginning_datetime=in_four_days,
            date_created=datetime(2020, 12, 4, 7, 0, 0),
            is_soft_deleted=True,
            offer=offer,
            price=0,
            quantity=10,
        )
        stock5 = create_stock(
            beginning_datetime=three_days_ago,
            date_created=datetime(2020, 12, 7, 14, 0, 0),
            offer=offer,
            price=0,
            quantity=10,
        )
        repository.save(stock1, stock2, stock3, stock4, stock5)
        humanized_product_id = humanize(offer.product.id)

        # When
        result = AlgoliaBackend.serialize_offer(offer)

        # Then
        assert result == {
            "distinct": "3",
            "objectID": 3,
            "offer": {
                "artist": None,
                "category": "MUSIQUE",
                "dateCreated": 1577872800.0,
                "dates": [1603098000.0, 1603098000.0, 1603098000.0],
                "description": "lit sous rivière",
                "id": "AM",
                "isbn": None,
                "isDuo": False,
                "isEducational": False,
                "isDigital": False,
                "isEvent": True,
                "isThing": False,
                "label": "Autre type d'événement musical",
                "name": "Event name",
                "prices":
                [Decimal("0.00"),
                 Decimal("10.00"),
                 Decimal("20.00")],
                "rankingWeight": 3,
                "searchGroupName": subcategories.SearchGroups.MUSIQUE.name,
                "stocksDateCreated":
                [1606820400.0, 1607166000.0, 1607673600.0],
                "subcategoryId": subcategories.EVENEMENT_MUSIQUE.id,
                "thumbUrl": f"/storage/thumbs/products/{humanized_product_id}",
                "tags": [],
                "times": [32400],
                "visa": None,
            },
            "offerer": {
                "name": "Offerer name",
            },
            "venue": {
                "id": 2,
                "departementCode": "93",
                "name": "Venue name",
                "publicName": "Venue public name",
            },
            "_geoloc": {
                "lat": 48.86387,
                "lng": 2.33802
            },
        }