示例#1
0
def test_get_post_thumbnail_url(input_mime_type, config_injector):
    config_injector({"data_url": "http://example.com/", "secret": "test"})
    post = model.Post()
    post.post_id = 1
    post.mime_type = input_mime_type
    assert (posts.get_post_thumbnail_url(post) ==
            "http://example.com/generated-thumbnails/1_244c8840887984c4.jpg")
示例#2
0
def test_get_post_thumbnail_url(input_mime_type, config_injector):
    config_injector({'data_url': 'http://example.com/'})
    post = model.Post()
    post.post_id = 1
    post.mime_type = input_mime_type
    assert posts.get_post_thumbnail_url(post) \
        == 'http://example.com/generated-thumbnails/1.jpg'
示例#3
0
def test_get_post_thumbnail_backup_path(input_mime_type):
    post = model.Post()
    post.post_id = 1
    post.mime_type = input_mime_type
    assert (
        posts.get_post_thumbnail_backup_path(post)
        == "posts/custom-thumbnails/1_244c8840887984c4.dat"
    )
示例#4
0
def test_update_post_content_with_invalid_content(config_injector,
                                                  input_content):
    config_injector({
        "allow_broken_uploads": True,
    })
    post = model.Post()
    with pytest.raises(posts.InvalidPostContentError):
        posts.update_post_content(post, input_content)
示例#5
0
def test_get_post_thumbnail_path(input_mime_type):
    post = model.Post()
    post.post_id = 1
    post.mime_type = input_mime_type
    assert (
        posts.get_post_thumbnail_path(post)
        == "generated-thumbnails/1_244c8840887984c4.jpg"
    )
示例#6
0
def test_update_post_tags(tag_factory):
    post = model.Post()
    with patch('szurubooru.func.tags.get_or_create_tags_by_names'):
        tags.get_or_create_tags_by_names.side_effect = lambda tag_names: \
            ([tag_factory(names=[name]) for name in tag_names], [])
        posts.update_post_tags(post, ['tag1', 'tag2'])
    assert len(post.tags) == 2
    assert post.tags[0].names[0].name == 'tag1'
    assert post.tags[1].names[0].name == 'tag2'
示例#7
0
def test_update_post_tags(tag_factory):
    post = model.Post()
    with patch("szurubooru.func.tags.get_or_create_tags_by_names"):
        tags.get_or_create_tags_by_names.side_effect = lambda tag_names: (
            [tag_factory(names=[name]) for name in tag_names],
            [],
        )
        posts.update_post_tags(post, ["tag1", "tag2"])
    assert len(post.tags) == 2
    assert post.tags[0].names[0].name == "tag1"
    assert post.tags[1].names[0].name == "tag2"
示例#8
0
 def factory(id=None,
             safety=model.Post.SAFETY_SAFE,
             type=model.Post.TYPE_IMAGE,
             checksum='...'):
     post = model.Post()
     post.post_id = id
     post.safety = safety
     post.type = type
     post.checksum = checksum
     post.flags = []
     post.mime_type = 'application/octet-stream'
     post.creation_time = datetime(1996, 1, 1)
     return post
示例#9
0
def test_update_post_notes():
    post = model.Post()
    posts.update_post_notes(
        post,
        [
            {'polygon': [[0, 0], [0, 1], [1, 0], [0, 0]], 'text': 'text1'},
            {'polygon': [[0, 0], [0, 1], [1, 0], [0, 0]], 'text': 'text2'},
        ])
    assert len(post.notes) == 2
    assert post.notes[0].polygon == [[0, 0], [0, 1], [1, 0], [0, 0]]
    assert post.notes[0].text == 'text1'
    assert post.notes[1].polygon == [[0, 0], [0, 1], [1, 0], [0, 0]]
    assert post.notes[1].text == 'text2'
示例#10
0
def test_update_post_notes():
    post = model.Post()
    posts.update_post_notes(
        post,
        [
            {"polygon": [[0, 0], [0, 1], [1, 0], [0, 0]], "text": "text1"},
            {"polygon": [[0, 0], [0, 1], [1, 0], [0, 0]], "text": "text2"},
        ],
    )
    assert len(post.notes) == 2
    assert post.notes[0].polygon == [[0, 0], [0, 1], [1, 0], [0, 0]]
    assert post.notes[0].text == "text1"
    assert post.notes[1].polygon == [[0, 0], [0, 1], [1, 0], [0, 0]]
    assert post.notes[1].text == "text2"
示例#11
0
def create_post(
        content: bytes, tag_names: List[str],
        user: Optional[model.User]) -> Tuple[model.Post, List[model.Tag]]:
    post = model.Post()
    post.safety = model.Post.SAFETY_SAFE
    post.user = user
    post.creation_time = datetime.utcnow()
    post.flags = []

    post.type = ''
    post.checksum = ''
    post.mime_type = ''
    db.session.add(post)

    update_post_content(post, content)
    new_tags = update_post_tags(post, tag_names)
    return (post, new_tags)
示例#12
0
def test_saving_post(post_factory, user_factory, tag_factory):
    user = user_factory()
    tag1 = tag_factory()
    tag2 = tag_factory()
    related_post1 = post_factory()
    related_post2 = post_factory()
    post = model.Post()
    post.safety = 'safety'
    post.type = 'type'
    post.checksum = 'deadbeef'
    post.creation_time = datetime(1997, 1, 1)
    post.last_edit_time = datetime(1998, 1, 1)
    post.mime_type = 'application/whatever'
    db.session.add_all([user, tag1, tag2, related_post1, related_post2, post])

    post.user = user
    post.tags.append(tag1)
    post.tags.append(tag2)
    post.relations.append(related_post1)
    post.relations.append(related_post2)
    db.session.commit()

    db.session.refresh(post)
    db.session.refresh(related_post1)
    db.session.refresh(related_post2)
    assert not db.session.dirty
    assert post.user.user_id is not None
    assert post.safety == 'safety'
    assert post.type == 'type'
    assert post.checksum == 'deadbeef'
    assert post.creation_time == datetime(1997, 1, 1)
    assert post.last_edit_time == datetime(1998, 1, 1)
    assert len(post.relations) == 2
    # relation bidirectionality is realized on business level in func.posts
    assert len(related_post1.relations) == 0
    assert len(related_post2.relations) == 0
示例#13
0
def test_serialize_post(
    user_factory,
    comment_factory,
    tag_factory,
    tag_category_factory,
    pool_factory,
    pool_category_factory,
    config_injector,
):
    config_injector({"data_url": "http://example.com/", "secret": "test"})
    with patch("szurubooru.func.comments.serialize_comment"), patch(
            "szurubooru.func.users.serialize_micro_user"), patch(
                "szurubooru.func.posts.files.has"):
        files.has.return_value = True
        users.serialize_micro_user.side_effect = (
            lambda user, auth_user: user.name)
        comments.serialize_comment.side_effect = (
            lambda comment, auth_user: comment.user.name)

        auth_user = user_factory(name="auth user")
        post = model.Post()
        post.post_id = 1
        post.creation_time = datetime(1997, 1, 1)
        post.last_edit_time = datetime(1998, 1, 1)
        post.tags = [
            tag_factory(
                names=["tag1", "tag2"],
                category=tag_category_factory("test-cat1"),
            ),
            tag_factory(names=["tag3"],
                        category=tag_category_factory("test-cat2")),
        ]
        post.safety = model.Post.SAFETY_SAFE
        post.source = "4gag"
        post.type = model.Post.TYPE_IMAGE
        post.checksum = "deadbeef"
        post.mime_type = "image/jpeg"
        post.file_size = 100
        post.user = user_factory(name="post author")
        post.canvas_width = 200
        post.canvas_height = 300
        post.flags = ["loop"]
        db.session.add(post)

        db.session.flush()
        db.session.add_all([
            comment_factory(
                user=user_factory(name="commenter1"),
                post=post,
                time=datetime(1999, 1, 1),
            ),
            comment_factory(
                user=user_factory(name="commenter2"),
                post=post,
                time=datetime(1999, 1, 2),
            ),
            model.PostFavorite(
                post=post,
                user=user_factory(name="fav1"),
                time=datetime(1800, 1, 1),
            ),
            model.PostFeature(post=post,
                              user=user_factory(),
                              time=datetime(1999, 1, 1)),
            model.PostScore(
                post=post,
                user=auth_user,
                score=-1,
                time=datetime(1800, 1, 1),
            ),
            model.PostScore(
                post=post,
                user=user_factory(),
                score=1,
                time=datetime(1800, 1, 1),
            ),
            model.PostScore(
                post=post,
                user=user_factory(),
                score=1,
                time=datetime(1800, 1, 1),
            ),
        ])
        db.session.flush()

        pool1 = pool_factory(
            id=1,
            names=["pool1", "pool2"],
            description="desc",
            category=pool_category_factory("test-cat1"),
        )
        pool1.last_edit_time = datetime(1998, 1, 1)
        pool1.posts.append(post)

        pool2 = pool_factory(
            id=2,
            names=["pool3"],
            description="desc2",
            category=pool_category_factory("test-cat2"),
        )
        pool2.last_edit_time = datetime(1998, 1, 1)
        pool2.posts.append(post)

        db.session.add_all([pool1, pool2])
        db.session.flush()

        result = posts.serialize_post(post, auth_user)
        result["tags"].sort(key=lambda tag: tag["names"][0])

        assert result == {
            "id":
            1,
            "version":
            1,
            "creationTime":
            datetime(1997, 1, 1),
            "lastEditTime":
            datetime(1998, 1, 1),
            "safety":
            "safe",
            "source":
            "4gag",
            "type":
            "image",
            "checksum":
            "deadbeef",
            "fileSize":
            100,
            "canvasWidth":
            200,
            "canvasHeight":
            300,
            "contentUrl":
            "http://example.com/posts/1_244c8840887984c4.jpg",
            "thumbnailUrl":
            "http://example.com/"
            "generated-thumbnails/1_244c8840887984c4.jpg",
            "flags": ["loop"],
            "tags": [
                {
                    "names": ["tag1", "tag2"],
                    "category": "test-cat1",
                    "usages": 1,
                },
                {
                    "names": ["tag3"],
                    "category": "test-cat2",
                    "usages": 1,
                },
            ],
            "relations": [],
            "notes": [],
            "pools": [
                {
                    "id": 1,
                    "names": ["pool1", "pool2"],
                    "description": "desc",
                    "category": "test-cat1",
                    "postCount": 1,
                },
                {
                    "id": 2,
                    "names": ["pool3"],
                    "description": "desc2",
                    "category": "test-cat2",
                    "postCount": 1,
                },
            ],
            "user":
            "******",
            "score":
            1,
            "ownFavorite":
            False,
            "ownScore":
            -1,
            "tagCount":
            2,
            "favoriteCount":
            1,
            "commentCount":
            2,
            "noteCount":
            0,
            "featureCount":
            1,
            "relationCount":
            0,
            "lastFeatureTime":
            datetime(1999, 1, 1),
            "favoritedBy": ["fav1"],
            "hasCustomThumbnail":
            True,
            "mimeType":
            "image/jpeg",
            "comments": ["commenter1", "commenter2"],
        }
示例#14
0
def test_update_post_flags_with_invalid_content():
    post = model.Post()
    with pytest.raises(posts.InvalidPostFlagError):
        posts.update_post_flags(post, ["invalid"])
示例#15
0
def test_update_post_flags():
    post = model.Post()
    posts.update_post_flags(post, ["loop"])
    assert post.flags == ["loop"]
示例#16
0
def test_update_post_notes_with_invalid_content(input):
    post = model.Post()
    with pytest.raises(posts.InvalidPostNoteError):
        posts.update_post_notes(post, input)
示例#17
0
def test_update_post_relations_with_nonexisting_posts():
    post = model.Post()
    with pytest.raises(posts.InvalidPostRelationError):
        posts.update_post_relations(post, [100])
示例#18
0
def test_get_post_content_path(input_mime_type, expected_path):
    post = model.Post()
    post.post_id = 1
    post.mime_type = input_mime_type
    assert posts.get_post_content_path(post) == expected_path
示例#19
0
def test_get_post_url(input_mime_type, expected_url, config_injector):
    config_injector({"data_url": "http://example.com/", "secret": "test"})
    post = model.Post()
    post.post_id = 1
    post.mime_type = input_mime_type
    assert posts.get_post_content_url(post) == expected_url
示例#20
0
def test_update_post_source():
    post = model.Post()
    posts.update_post_source(post, "x")
    assert post.source == "x"
示例#21
0
def test_update_post_source_with_too_long_string():
    post = model.Post()
    with pytest.raises(posts.InvalidPostSourceError):
        posts.update_post_source(post, "x" * 3000)
示例#22
0
def test_get_post_thumbnail_path(input_mime_type):
    post = model.Post()
    post.post_id = 1
    post.mime_type = input_mime_type
    assert posts.get_post_thumbnail_path(post) == 'generated-thumbnails/1.jpg'
示例#23
0
def test_get_post_thumbnail_backup_path(input_mime_type):
    post = model.Post()
    post.post_id = 1
    post.mime_type = input_mime_type
    assert posts.get_post_thumbnail_backup_path(post) \
        == 'posts/custom-thumbnails/1.dat'
示例#24
0
def test_update_post_safety(input_safety, expected_safety):
    post = model.Post()
    posts.update_post_safety(post, input_safety)
    assert post.safety == expected_safety
示例#25
0
def test_get_post_url(input_mime_type, expected_url, config_injector):
    config_injector({'data_url': 'http://example.com/', 'secret': 'test'})
    post = model.Post()
    post.post_id = 1
    post.mime_type = input_mime_type
    assert posts.get_post_content_url(post) == expected_url
示例#26
0
def test_update_post_content_with_invalid_content(input_content):
    post = model.Post()
    with pytest.raises(posts.InvalidPostContentError):
        posts.update_post_content(post, input_content)
示例#27
0
def test_update_post_safety_with_invalid_string():
    post = model.Post()
    with pytest.raises(posts.InvalidPostSafetyError):
        posts.update_post_safety(post, "bad")
示例#28
0
def test_serialize_post(
        user_factory, comment_factory, tag_factory, config_injector):
    config_injector({'data_url': 'http://example.com/'})
    with patch('szurubooru.func.comments.serialize_comment'), \
            patch('szurubooru.func.users.serialize_micro_user'), \
            patch('szurubooru.func.posts.files.has'):
        files.has.return_value = True
        users.serialize_micro_user.side_effect \
            = lambda user, auth_user: user.name
        comments.serialize_comment.side_effect \
            = lambda comment, auth_user: comment.user.name

        auth_user = user_factory(name='auth user')
        post = model.Post()
        post.post_id = 1
        post.creation_time = datetime(1997, 1, 1)
        post.last_edit_time = datetime(1998, 1, 1)
        post.tags = [
            tag_factory(names=['tag1', 'tag2']),
            tag_factory(names=['tag3'])
        ]
        post.safety = model.Post.SAFETY_SAFE
        post.source = '4gag'
        post.type = model.Post.TYPE_IMAGE
        post.checksum = 'deadbeef'
        post.mime_type = 'image/jpeg'
        post.file_size = 100
        post.user = user_factory(name='post author')
        post.canvas_width = 200
        post.canvas_height = 300
        post.flags = ['loop']
        db.session.add(post)

        db.session.flush()
        db.session.add_all([
            comment_factory(
                user=user_factory(name='commenter1'),
                post=post,
                time=datetime(1999, 1, 1)),
            comment_factory(
                user=user_factory(name='commenter2'),
                post=post,
                time=datetime(1999, 1, 2)),
            model.PostFavorite(
                post=post,
                user=user_factory(name='fav1'),
                time=datetime(1800, 1, 1)),
            model.PostFeature(
                post=post,
                user=user_factory(),
                time=datetime(1999, 1, 1)),
            model.PostScore(
                post=post,
                user=auth_user,
                score=-1,
                time=datetime(1800, 1, 1)),
            model.PostScore(
                post=post,
                user=user_factory(),
                score=1,
                time=datetime(1800, 1, 1)),
            model.PostScore(
                post=post,
                user=user_factory(),
                score=1,
                time=datetime(1800, 1, 1))])
        db.session.flush()

        result = posts.serialize_post(post, auth_user)
        result['tags'].sort()

        assert result == {
            'id': 1,
            'version': 1,
            'creationTime': datetime(1997, 1, 1),
            'lastEditTime': datetime(1998, 1, 1),
            'safety': 'safe',
            'source': '4gag',
            'type': 'image',
            'checksum': 'deadbeef',
            'fileSize': 100,
            'canvasWidth': 200,
            'canvasHeight': 300,
            'contentUrl': 'http://example.com/posts/1.jpg',
            'thumbnailUrl': 'http://example.com/generated-thumbnails/1.jpg',
            'flags': ['loop'],
            'tags': ['tag1', 'tag3'],
            'relations': [],
            'notes': [],
            'user': '******',
            'score': 1,
            'ownFavorite': False,
            'ownScore': -1,
            'tagCount': 2,
            'favoriteCount': 1,
            'commentCount': 2,
            'noteCount': 0,
            'featureCount': 1,
            'relationCount': 0,
            'lastFeatureTime': datetime(1999, 1, 1),
            'favoritedBy': ['fav1'],
            'hasCustomThumbnail': True,
            'mimeType': 'image/jpeg',
            'comments': ['commenter1', 'commenter2'],
        }