Exemplo n.º 1
0
def test_modify_saves_non_empty_diffs(post_factory, user_factory):
    if 'sqlite' in db.sessionmaker.kw['bind'].driver:
        pytest.xfail(
            'SQLite doesn\'t support transaction isolation, '
            'which is required to retrieve original entity')
    post = post_factory()
    post.notes = [model.PostNote(polygon=[(0, 0), (0, 1), (1, 1)], text='old')]
    user = user_factory()
    db.session.add_all([post, user])
    db.session.commit()
    post.source = 'new source'
    post.notes = [model.PostNote(polygon=[(0, 0), (0, 1), (1, 1)], text='new')]
    db.session.flush()
    snapshots.modify(post, user)
    db.session.flush()
    results = db.session.query(model.Snapshot).all()
    assert len(results) == 1
    assert results[0].data == {
        'type': 'object change',
        'value': {
            'source': {
                'type': 'primitive change',
                'old-value': None,
                'new-value': 'new source',
            },
            'notes': {
                'type': 'list change',
                'removed': [
                    {'polygon': [[0, 0], [0, 1], [1, 1]], 'text': 'old'}],
                'added': [
                    {'polygon': [[0, 0], [0, 1], [1, 1]], 'text': 'new'}],
            },
        },
    }
Exemplo n.º 2
0
def update_post_notes(post: model.Post, notes: Any) -> None:
    assert post
    post.notes = []
    for note in notes:
        for field in ('polygon', 'text'):
            if field not in note:
                raise InvalidPostNoteError('Note is missing %r field.' % field)
        if not note['text']:
            raise InvalidPostNoteError('A note\'s text cannot be empty.')
        if not isinstance(note['polygon'], (list, tuple)):
            raise InvalidPostNoteError(
                'A note\'s polygon must be a list of points.')
        if len(note['polygon']) < 3:
            raise InvalidPostNoteError(
                'A note\'s polygon must have at least 3 points.')
        for point in note['polygon']:
            if not isinstance(point, (list, tuple)):
                raise InvalidPostNoteError(
                    'A note\'s polygon point must be a list of length 2.')
            if len(point) != 2:
                raise InvalidPostNoteError(
                    'A point in note\'s polygon must have two coordinates.')
            try:
                pos_x = float(point[0])
                pos_y = float(point[1])
                if not 0 <= pos_x <= 1 or not 0 <= pos_y <= 1:
                    raise InvalidPostNoteError(
                        'All points must fit in the image (0..1 range).')
            except ValueError:
                raise InvalidPostNoteError(
                    'A point in note\'s polygon must be numeric.')
        if util.value_exceeds_column_size(note['text'], model.PostNote.text):
            raise InvalidPostNoteError('Note text is too long.')
        post.notes.append(
            model.PostNote(polygon=note['polygon'], text=str(note['text'])))
Exemplo n.º 3
0
def update_post_notes(post: model.Post, notes: Any) -> None:
    assert post
    post.notes = []
    for note in notes:
        for field in ('polygon', 'text'):
            if field not in note:
                raise InvalidPostNoteError('메모의 %r 필드가 누락되었습니다.' % field)
        if not note['text']:
            raise InvalidPostNoteError('메모의 텍스트가 반드시 필요합니다.')
        if not isinstance(note['polygon'], (list, tuple)):
            raise InvalidPostNoteError('메모의 폴리곤은 점의 리스트여야 합니다.')
        if len(note['polygon']) < 3:
            raise InvalidPostNoteError('메모의 폴리곤은 최소 3개의 점이 포함되어야 합니다.')
        for point in note['polygon']:
            if not isinstance(point, (list, tuple)):
                raise InvalidPostNoteError('메모의 폴리곤 점은 길이 2인 리스트여야 합니다.')
            if len(point) != 2:
                raise InvalidPostNoteError('메모의 폴리곤 점은 두 좌표축을 포함해야 합니다.')
            try:
                pos_x = float(point[0])
                pos_y = float(point[1])
                if not 0 <= pos_x <= 1 or not 0 <= pos_y <= 1:
                    raise InvalidPostNoteError(
                        '메모의 모든 폴리곤 점은 이미지 내부에 존재해야 합니다 (0 ~ 1 범위).')
            except ValueError:
                raise InvalidPostNoteError('메모의 폴리곤 점은 숫자여야 합니다.')
        if util.value_exceeds_column_size(note['text'], model.PostNote.text):
            raise InvalidPostNoteError('메모 텍스트가 너무 깁니다.')
        post.notes.append(
            model.PostNote(polygon=note['polygon'], text=str(note['text'])))
Exemplo n.º 4
0
def test_get_post_snapshot(post_factory, user_factory, tag_factory):
    user = user_factory(name='dummy-user')
    tag1 = tag_factory(names=['dummy-tag1'])
    tag2 = tag_factory(names=['dummy-tag2'])
    post = post_factory(id=1)
    related_post1 = post_factory(id=2)
    related_post2 = post_factory(id=3)
    db.session.add_all([user, tag1, tag2, post, related_post1, related_post2])
    db.session.flush()

    score = model.PostScore()
    score.post = post
    score.user = user
    score.time = datetime(1997, 1, 1)
    score.score = 1
    favorite = model.PostFavorite()
    favorite.post = post
    favorite.user = user
    favorite.time = datetime(1997, 1, 1)
    feature = model.PostFeature()
    feature.post = post
    feature.user = user
    feature.time = datetime(1997, 1, 1)
    note = model.PostNote()
    note.post = post
    note.polygon = [(1, 1), (200, 1), (200, 200), (1, 200)]
    note.text = 'some text'
    db.session.add_all([score])
    db.session.flush()

    post.user = user
    post.checksum = 'deadbeef'
    post.source = 'example.com'
    post.tags.append(tag1)
    post.tags.append(tag2)
    post.relations.append(related_post1)
    post.relations.append(related_post2)
    post.scores.append(score)
    post.favorited_by.append(favorite)
    post.features.append(feature)
    post.notes.append(note)

    assert snapshots.get_post_snapshot(post) == {
        'checksum':
        'deadbeef',
        'featured':
        True,
        'flags': [],
        'notes': [{
            'polygon': [[1, 1], [200, 1], [200, 200], [1, 200]],
            'text': 'some text',
        }],
        'relations': [2, 3],
        'safety':
        'safe',
        'source':
        'example.com',
        'tags': ['dummy-tag1', 'dummy-tag2'],
    }
Exemplo n.º 5
0
def test_get_post_snapshot(post_factory, user_factory, tag_factory):
    user = user_factory(name="dummy-user")
    tag1 = tag_factory(names=["dummy-tag1"])
    tag2 = tag_factory(names=["dummy-tag2"])
    post = post_factory(id=1)
    related_post1 = post_factory(id=2)
    related_post2 = post_factory(id=3)
    db.session.add_all([user, tag1, tag2, post, related_post1, related_post2])
    db.session.flush()

    score = model.PostScore()
    score.post = post
    score.user = user
    score.time = datetime(1997, 1, 1)
    score.score = 1
    favorite = model.PostFavorite()
    favorite.post = post
    favorite.user = user
    favorite.time = datetime(1997, 1, 1)
    feature = model.PostFeature()
    feature.post = post
    feature.user = user
    feature.time = datetime(1997, 1, 1)
    note = model.PostNote()
    note.post = post
    note.polygon = [(1, 1), (200, 1), (200, 200), (1, 200)]
    note.text = "some text"
    db.session.add_all([score])
    db.session.flush()

    post.user = user
    post.checksum = "deadbeef"
    post.source = "example.com"
    post.tags.append(tag1)
    post.tags.append(tag2)
    post.relations.append(related_post1)
    post.relations.append(related_post2)
    post.scores.append(score)
    post.favorited_by.append(favorite)
    post.features.append(feature)
    post.notes.append(note)

    assert snapshots.get_post_snapshot(post) == {
        "checksum":
        "deadbeef",
        "featured":
        True,
        "flags": [],
        "notes": [{
            "polygon": [[1, 1], [200, 1], [200, 200], [1, 200]],
            "text": "some text",
        }],
        "relations": [2, 3],
        "safety":
        "safe",
        "source":
        "example.com",
        "tags": ["dummy-tag1", "dummy-tag2"],
    }
Exemplo n.º 6
0
def test_serialize_note():
    note = model.PostNote()
    note.polygon = [[0, 1], [1, 1], [1, 0], [0, 0]]
    note.text = "..."
    assert posts.serialize_note(note) == {
        "polygon": [[0, 1], [1, 1], [1, 0], [0, 0]],
        "text": "...",
    }
Exemplo n.º 7
0
def test_serialize_note():
    note = model.PostNote()
    note.polygon = [[0, 1], [1, 1], [1, 0], [0, 0]]
    note.text = '...'
    assert posts.serialize_note(note) == {
        'polygon': [[0, 1], [1, 1], [1, 0], [0, 0]],
        'text': '...'
    }
Exemplo n.º 8
0
def test_modify_saves_non_empty_diffs(post_factory, user_factory):
    if "sqlite" in db.session.get_bind().driver:
        pytest.xfail("SQLite doesn't support transaction isolation, "
                     "which is required to retrieve original entity")
    post = post_factory()
    post.notes = [model.PostNote(polygon=[(0, 0), (0, 1), (1, 1)], text="old")]
    user = user_factory()
    db.session.add_all([post, user])
    db.session.commit()
    post.source = "new source"
    post.notes = [model.PostNote(polygon=[(0, 0), (0, 1), (1, 1)], text="new")]
    db.session.flush()
    with patch("szurubooru.func.snapshots._post_to_webhooks"):
        snapshots.modify(post, user)
        db.session.flush()
        results = db.session.query(model.Snapshot).all()
        assert len(results) == 1
        assert results[0].data == {
            "type": "object change",
            "value": {
                "source": {
                    "type": "primitive change",
                    "old-value": None,
                    "new-value": "new source",
                },
                "notes": {
                    "type":
                    "list change",
                    "removed": [{
                        "polygon": [[0, 0], [0, 1], [1, 1]],
                        "text": "old"
                    }],
                    "added": [{
                        "polygon": [[0, 0], [0, 1], [1, 1]],
                        "text": "new"
                    }],
                },
            },
        }
Exemplo n.º 9
0
 def factory(text="..."):
     return model.PostNote(polygon="...", text=text)
Exemplo n.º 10
0
 def factory(text='...'):
     return model.PostNote(polygon='...', text=text)
Exemplo n.º 11
0
def test_cascade_deletions(post_factory, user_factory, tag_factory,
                           comment_factory):
    user = user_factory()
    tag1 = tag_factory()
    tag2 = tag_factory()
    related_post1 = post_factory()
    related_post2 = post_factory()
    post = post_factory()
    comment = comment_factory(post=post, user=user)
    db.session.add_all(
        [user, tag1, tag2, post, related_post1, related_post2, comment])
    db.session.flush()

    score = model.PostScore()
    score.post = post
    score.user = user
    score.time = datetime(1997, 1, 1)
    score.score = 1
    favorite = model.PostFavorite()
    favorite.post = post
    favorite.user = user
    favorite.time = datetime(1997, 1, 1)
    feature = model.PostFeature()
    feature.post = post
    feature.user = user
    feature.time = datetime(1997, 1, 1)
    note = model.PostNote()
    note.post = post
    note.polygon = ''
    note.text = ''
    db.session.add_all([score, favorite, feature, note])
    db.session.flush()

    post.user = user
    post.tags.append(tag1)
    post.tags.append(tag2)
    post.relations.append(related_post1)
    related_post2.relations.append(post)
    post.scores.append(score)
    post.favorited_by.append(favorite)
    post.features.append(feature)
    post.notes.append(note)
    db.session.commit()

    assert not db.session.dirty
    assert post.user is not None and post.user.user_id is not None
    assert len(post.relations) == 1
    assert db.session.query(model.User).count() == 1
    assert db.session.query(model.Tag).count() == 2
    assert db.session.query(model.Post).count() == 3
    assert db.session.query(model.PostTag).count() == 2
    assert db.session.query(model.PostRelation).count() == 2
    assert db.session.query(model.PostScore).count() == 1
    assert db.session.query(model.PostNote).count() == 1
    assert db.session.query(model.PostFeature).count() == 1
    assert db.session.query(model.PostFavorite).count() == 1
    assert db.session.query(model.Comment).count() == 1

    db.session.delete(post)
    db.session.commit()

    assert not db.session.dirty
    assert db.session.query(model.User).count() == 1
    assert db.session.query(model.Tag).count() == 2
    assert db.session.query(model.Post).count() == 2
    assert db.session.query(model.PostTag).count() == 0
    assert db.session.query(model.PostRelation).count() == 0
    assert db.session.query(model.PostScore).count() == 0
    assert db.session.query(model.PostNote).count() == 0
    assert db.session.query(model.PostFeature).count() == 0
    assert db.session.query(model.PostFavorite).count() == 0
    assert db.session.query(model.Comment).count() == 0