Пример #1
0
    def test_it_updates_an_existing_DocumentMeta_if_there_is_one(
            self, db_session):
        claimant = "http://example.com/claimant"
        type_ = "title"
        value = "the title"
        document_ = document.Document()
        created = yesterday()
        updated = now()
        document_meta = document.DocumentMeta(
            claimant=claimant,
            type=type_,
            value=value,
            document=document_,
            created=created,
            updated=updated,
        )
        db_session.add(document_meta)

        new_updated = now()
        document.create_or_update_document_meta(
            session=db_session,
            claimant=claimant,
            type=type_,
            value="new value",
            document=document.Document(),  # This should be ignored.
            created=now(),  # This should be ignored.
            updated=new_updated,
        )

        assert document_meta.value == "new value"
        assert document_meta.updated == new_updated
        assert document_meta.created == created, "It shouldn't update created"
        assert document_meta.document == document_, "It shouldn't update document"
        assert (len(db_session.query(document.DocumentMeta).all()) == 1
                ), "It shouldn't have added any new objects to the db"
Пример #2
0
    def test_it_updates_an_existing_DocumentMeta_if_there_is_one(self, db_session):
        claimant = "http://example.com/claimant"
        type_ = "title"
        value = "the title"
        document_ = document.Document()
        created = yesterday()
        updated = now()
        document_meta = document.DocumentMeta(
            claimant=claimant,
            type=type_,
            value=value,
            document=document_,
            created=created,
            updated=updated,
        )
        db_session.add(document_meta)

        new_updated = now()
        document.create_or_update_document_meta(
            session=db_session,
            claimant=claimant,
            type=type_,
            value="new value",
            document=document.Document(),  # This should be ignored.
            created=now(),  # This should be ignored.
            updated=new_updated,
        )

        assert document_meta.value == "new value"
        assert document_meta.updated == new_updated
        assert document_meta.created == created, "It shouldn't update created"
        assert document_meta.document == document_, "It shouldn't update document"
        assert (
            len(db_session.query(document.DocumentMeta).all()) == 1
        ), "It shouldn't have added any new objects to the db"
Пример #3
0
    def test_it_logs_a_warning(self, log):
        """
        It should warn on document mismatches.

        It should warn if there's an existing DocumentMeta with a different
        Document.

        """
        session = mock_db_session()
        document_one = mock_document()
        document_two = mock_document()
        existing_document_meta = mock_document_meta(document=document_one)
        session.query.return_value.filter.return_value.one_or_none.return_value = (
            existing_document_meta)

        document.create_or_update_document_meta(
            session=session,
            claimant="http://example.com/claimant",
            type="title",
            value="new value",
            document=document_two,
            created=yesterday(),
            updated=now(),
        )

        assert log.warning.call_count == 1
Пример #4
0
    def test_it_logs_a_warning(self, log):
        """
        It should warn on document mismatches.

        It should warn if there's an existing DocumentMeta with a different
        Document.

        """
        session = mock_db_session()
        document_one = mock_document()
        document_two = mock_document()
        existing_document_meta = mock_document_meta(document=document_one)
        session.query.return_value.filter.return_value.one_or_none.return_value = (
            existing_document_meta
        )

        document.create_or_update_document_meta(
            session=session,
            claimant="http://example.com/claimant",
            type="title",
            value="new value",
            document=document_two,
            created=yesterday(),
            updated=now(),
        )

        assert log.warning.call_count == 1
Пример #5
0
    def test_it_creates_a_new_DocumentMeta_if_there_is_no_existing_one(
        self, db_session, meta_attrs
    ):
        # Add one non-matching DocumentMeta to the database to be ignored.
        db_session.add(DocumentMeta(**dict(meta_attrs, type="noise")))

        create_or_update_document_meta(session=db_session, **meta_attrs)

        document_meta = db_session.query(DocumentMeta).all()[-1]
        assert document_meta == Any.object.with_attrs(meta_attrs)
Пример #6
0
    def test_raises_retryable_error_when_flush_fails(
        self, db_session, monkeypatch, meta_attrs
    ):
        def err():
            raise sa.exc.IntegrityError(None, None, None)

        monkeypatch.setattr(db_session, "flush", err)

        with pytest.raises(ConcurrentUpdateError):
            with db_session.no_autoflush:  # prevent premature IntegrityError
                create_or_update_document_meta(session=db_session, **meta_attrs)
Пример #7
0
    def test_it_denormalizes_title_to_document_when_falsy(
        self, db_session, meta_attrs, doc_title, final_title
    ):
        meta_attrs["value"] = ["attr_title"]
        meta_attrs["document"] = document = Document(title=doc_title)

        db_session.add(document)

        create_or_update_document_meta(session=db_session, **meta_attrs)

        document = db_session.query(Document).get(document.id)
        assert document.title == final_title
Пример #8
0
    def test_it_logs_a_warning_with_existing_meta_on_a_different_doc(
        self, log, mock_db_session, factories, meta_attrs
    ):
        document_one = factories.Document()
        document_two = factories.Document()
        existing_document_meta = factories.DocumentMeta(document=document_one)
        mock_db_session.query.return_value.filter.return_value.one_or_none.return_value = (
            existing_document_meta
        )

        create_or_update_document_meta(
            session=mock_db_session, **dict(meta_attrs, document=document_two)
        )

        assert log.warning.call_count == 1
Пример #9
0
    def test_raises_retryable_error_when_flush_fails(self, db_session, monkeypatch):
        document_ = document.Document()

        def err():
            raise sa.exc.IntegrityError(None, None, None)
        monkeypatch.setattr(db_session, 'flush', err)

        with pytest.raises(transaction.interfaces.TransientError):
            with db_session.no_autoflush:  # prevent premature IntegrityError
                document.create_or_update_document_meta(
                    session=db_session,
                    claimant='http://example.com',
                    type='title',
                    value='My Title',
                    document=document_,
                    created=now(),
                    updated=now(),
                )
Пример #10
0
    def test_raises_retryable_error_when_flush_fails(self, db_session, monkeypatch):
        document_ = document.Document()

        def err():
            raise sa.exc.IntegrityError(None, None, None)
        monkeypatch.setattr(db_session, 'flush', err)

        with pytest.raises(transaction.interfaces.TransientError):
            with db_session.no_autoflush:  # prevent premature IntegrityError
                document.create_or_update_document_meta(
                    session=db_session,
                    claimant='http://example.com',
                    type='title',
                    value='My Title',
                    document=document_,
                    created=now(),
                    updated=now(),
                )
Пример #11
0
    def test_raises_retryable_error_when_flush_fails(self, db_session,
                                                     monkeypatch):
        document_ = document.Document()

        def err():
            raise sa.exc.IntegrityError(None, None, None)

        monkeypatch.setattr(db_session, "flush", err)

        with pytest.raises(ConcurrentUpdateError):
            with db_session.no_autoflush:  # prevent premature IntegrityError
                document.create_or_update_document_meta(
                    session=db_session,
                    claimant="http://example.com",
                    type="title",
                    value="My Title",
                    document=document_,
                    created=now(),
                    updated=now(),
                )
Пример #12
0
    def test_it_creates_a_new_DocumentMeta_if_there_is_no_existing_one(
        self, db_session
    ):
        claimant = "http://example.com/claimant"
        type_ = "title"
        value = "the title"
        document_ = document.Document()
        created = yesterday()
        updated = now()

        # Add one non-matching DocumentMeta to the database.
        # This should be ignored.
        db_session.add(
            document.DocumentMeta(
                claimant=claimant,
                # Different type means this should not match the query.
                type="different",
                value=value,
                document=document_,
                created=created,
                updated=updated,
            )
        )

        document.create_or_update_document_meta(
            session=db_session,
            claimant=claimant,
            type=type_,
            value=value,
            document=document_,
            created=created,
            updated=updated,
        )

        document_meta = db_session.query(document.DocumentMeta).all()[-1]
        assert document_meta.claimant == claimant
        assert document_meta.type == type_
        assert document_meta.value == value
        assert document_meta.document == document_
        assert document_meta.created == created
        assert document_meta.updated == updated
Пример #13
0
    def test_it_denormalizes_title_to_document_when_empty(self, db_session):
        claimant = "http://example.com/claimant"
        type_ = "title"
        value = ["the title"]
        document_ = document.Document(title="")
        created = yesterday()
        updated = now()
        db_session.add(document_)

        document.create_or_update_document_meta(
            session=db_session,
            claimant=claimant,
            type=type_,
            value=value,
            document=document_,
            created=created,
            updated=updated,
        )

        document_ = db_session.query(document.Document).get(document_.id)
        assert document_.title == value[0]
Пример #14
0
    def test_it_skips_denormalizing_title_to_document_when_already_set(self, db_session):
        claimant = 'http://example.com/claimant'
        type_ = 'title'
        value = ['the title']
        document_ = document.Document(title='foobar')
        created = yesterday()
        updated = now()
        db_session.add(document_)

        document.create_or_update_document_meta(
            session=db_session,
            claimant=claimant,
            type=type_,
            value=value,
            document=document_,
            created=created,
            updated=updated,
        )

        document_ = db_session.query(document.Document).get(document_.id)
        assert document_.title == 'foobar'
Пример #15
0
    def test_it_denormalizes_title_to_document_when_empty(self, db_session):
        claimant = "http://example.com/claimant"
        type_ = "title"
        value = ["the title"]
        document_ = document.Document(title="")
        created = yesterday()
        updated = now()
        db_session.add(document_)

        document.create_or_update_document_meta(
            session=db_session,
            claimant=claimant,
            type=type_,
            value=value,
            document=document_,
            created=created,
            updated=updated,
        )

        document_ = db_session.query(document.Document).get(document_.id)
        assert document_.title == value[0]
Пример #16
0
    def test_it_skips_denormalizing_title_to_document_when_already_set(self, db_session):
        claimant = 'http://example.com/claimant'
        type_ = 'title'
        value = ['the title']
        document_ = document.Document(title='foobar')
        created = yesterday()
        updated = now()
        db_session.add(document_)

        document.create_or_update_document_meta(
            session=db_session,
            claimant=claimant,
            type=type_,
            value=value,
            document=document_,
            created=created,
            updated=updated,
        )

        document_ = db_session.query(document.Document).get(document_.id)
        assert document_.title == 'foobar'
Пример #17
0
    def test_it_creates_a_new_DocumentMeta_if_there_is_no_existing_one(
            self, db_session):
        claimant = "http://example.com/claimant"
        type_ = "title"
        value = "the title"
        document_ = document.Document()
        created = yesterday()
        updated = now()

        # Add one non-matching DocumentMeta to the database.
        # This should be ignored.
        db_session.add(
            document.DocumentMeta(
                claimant=claimant,
                # Different type means this should not match the query.
                type="different",
                value=value,
                document=document_,
                created=created,
                updated=updated,
            ))

        document.create_or_update_document_meta(
            session=db_session,
            claimant=claimant,
            type=type_,
            value=value,
            document=document_,
            created=created,
            updated=updated,
        )

        document_meta = db_session.query(document.DocumentMeta).all()[-1]
        assert document_meta.claimant == claimant
        assert document_meta.type == type_
        assert document_meta.value == value
        assert document_meta.document == document_
        assert document_meta.created == created
        assert document_meta.updated == updated
Пример #18
0
    def test_it_updates_an_existing_DocumentMeta_if_there_is_one(
        self, db_session, meta_attrs, correct_document
    ):
        original_attrs = meta_attrs
        updated_attrs = dict(
            original_attrs,
            value="new value",
            # This should be ignored either way.
            document=meta_attrs["document"] if correct_document else Document(),
            created=datetime.now(),  # This should be ignored.
            updated=datetime.now(),
        )
        document_meta = DocumentMeta(**original_attrs)
        db_session.add(document_meta)

        create_or_update_document_meta(session=db_session, **updated_attrs)

        assert document_meta.value == updated_attrs["value"]
        assert document_meta.updated == updated_attrs["updated"]
        assert document_meta.created == original_attrs["created"]
        assert document_meta.document == original_attrs["document"]
        assert (
            len(db_session.query(DocumentMeta).all()) == 1
        ), "It shouldn't have added any new objects to the db"