aboutsummaryrefslogtreecommitdiff
path: root/server/szurubooru/tests/api/test_post_creating.py
diff options
context:
space:
mode:
Diffstat (limited to 'server/szurubooru/tests/api/test_post_creating.py')
-rw-r--r--server/szurubooru/tests/api/test_post_creating.py457
1 files changed, 278 insertions, 179 deletions
diff --git a/server/szurubooru/tests/api/test_post_creating.py b/server/szurubooru/tests/api/test_post_creating.py
index 6edcdd3..a1ad4de 100644
--- a/server/szurubooru/tests/api/test_post_creating.py
+++ b/server/szurubooru/tests/api/test_post_creating.py
@@ -1,65 +1,82 @@
from unittest.mock import patch
+
import pytest
-from szurubooru import api, db, model, errors
-from szurubooru.func import posts, tags, snapshots, net
+
+from szurubooru import api, db, errors, model
+from szurubooru.func import net, posts, snapshots, tags
@pytest.fixture(autouse=True)
def inject_config(config_injector):
- config_injector({
- 'privileges': {
- 'posts:create:anonymous': model.User.RANK_REGULAR,
- 'posts:create:identified': model.User.RANK_REGULAR,
- 'tags:create': model.User.RANK_REGULAR,
- },
- })
+ config_injector(
+ {
+ "privileges": {
+ "posts:create:anonymous": model.User.RANK_REGULAR,
+ "posts:create:identified": model.User.RANK_REGULAR,
+ "tags:create": model.User.RANK_REGULAR,
+ "uploads:use_downloader": model.User.RANK_REGULAR,
+ },
+ "allow_broken_uploads": False,
+ }
+ )
-def test_creating_minimal_posts(
- context_factory, post_factory, user_factory):
+def test_creating_minimal_posts(context_factory, post_factory, user_factory):
auth_user = user_factory(rank=model.User.RANK_REGULAR)
post = post_factory()
db.session.add(post)
db.session.flush()
- with patch('szurubooru.func.posts.create_post'), \
- patch('szurubooru.func.posts.update_post_safety'), \
- patch('szurubooru.func.posts.update_post_source'), \
- patch('szurubooru.func.posts.update_post_relations'), \
- patch('szurubooru.func.posts.update_post_notes'), \
- patch('szurubooru.func.posts.update_post_flags'), \
- patch('szurubooru.func.posts.update_post_thumbnail'), \
- patch('szurubooru.func.posts.serialize_post'), \
- patch('szurubooru.func.snapshots.create'):
+ with patch("szurubooru.func.posts.create_post"), patch(
+ "szurubooru.func.posts.update_post_safety"
+ ), patch("szurubooru.func.posts.update_post_source"), patch(
+ "szurubooru.func.posts.update_post_relations"
+ ), patch(
+ "szurubooru.func.posts.update_post_notes"
+ ), patch(
+ "szurubooru.func.posts.update_post_flags"
+ ), patch(
+ "szurubooru.func.posts.update_post_thumbnail"
+ ), patch(
+ "szurubooru.func.posts.serialize_post"
+ ), patch(
+ "szurubooru.func.snapshots.create"
+ ):
posts.create_post.return_value = (post, [])
- posts.serialize_post.return_value = 'serialized post'
+ posts.serialize_post.return_value = "serialized post"
result = api.post_api.create_post(
context_factory(
params={
- 'safety': 'safe',
- 'tags': ['tag1', 'tag2'],
+ "safety": "safe",
+ "tags": ["tag1", "tag2"],
},
files={
- 'content': 'post-content',
- 'thumbnail': 'post-thumbnail',
+ "content": "post-content",
+ "thumbnail": "post-thumbnail",
},
- user=auth_user))
+ user=auth_user,
+ )
+ )
- assert result == 'serialized post'
+ assert result == "serialized post"
posts.create_post.assert_called_once_with(
- 'post-content', ['tag1', 'tag2'], auth_user)
+ "post-content", ["tag1", "tag2"], auth_user
+ )
posts.update_post_thumbnail.assert_called_once_with(
- post, 'post-thumbnail')
- posts.update_post_safety.assert_called_once_with(post, 'safe')
- posts.update_post_source.assert_called_once_with(post, '')
+ post, "post-thumbnail"
+ )
+ posts.update_post_safety.assert_called_once_with(post, "safe")
+ posts.update_post_source.assert_called_once_with(post, "")
posts.update_post_relations.assert_called_once_with(post, [])
posts.update_post_notes.assert_called_once_with(post, [])
posts.update_post_flags.assert_called_once_with(post, [])
posts.update_post_thumbnail.assert_called_once_with(
- post, 'post-thumbnail')
+ post, "post-thumbnail"
+ )
posts.serialize_post.assert_called_once_with(
- post, auth_user, options=[])
+ post, auth_user, options=[]
+ )
snapshots.create.assert_called_once_with(post, auth_user)
@@ -69,232 +86,302 @@ def test_creating_full_posts(context_factory, post_factory, user_factory):
db.session.add(post)
db.session.flush()
- with patch('szurubooru.func.posts.create_post'), \
- patch('szurubooru.func.posts.update_post_safety'), \
- patch('szurubooru.func.posts.update_post_source'), \
- patch('szurubooru.func.posts.update_post_relations'), \
- patch('szurubooru.func.posts.update_post_notes'), \
- patch('szurubooru.func.posts.update_post_flags'), \
- patch('szurubooru.func.posts.serialize_post'), \
- patch('szurubooru.func.snapshots.create'):
+ with patch("szurubooru.func.posts.create_post"), patch(
+ "szurubooru.func.posts.update_post_safety"
+ ), patch("szurubooru.func.posts.update_post_source"), patch(
+ "szurubooru.func.posts.update_post_relations"
+ ), patch(
+ "szurubooru.func.posts.update_post_notes"
+ ), patch(
+ "szurubooru.func.posts.update_post_flags"
+ ), patch(
+ "szurubooru.func.posts.serialize_post"
+ ), patch(
+ "szurubooru.func.snapshots.create"
+ ):
posts.create_post.return_value = (post, [])
- posts.serialize_post.return_value = 'serialized post'
+ posts.serialize_post.return_value = "serialized post"
result = api.post_api.create_post(
context_factory(
params={
- 'safety': 'safe',
- 'tags': ['tag1', 'tag2'],
- 'relations': [1, 2],
- 'source': 'source',
- 'notes': ['note1', 'note2'],
- 'flags': ['flag1', 'flag2'],
+ "safety": "safe",
+ "tags": ["tag1", "tag2"],
+ "relations": [1, 2],
+ "source": "source",
+ "notes": ["note1", "note2"],
+ "flags": ["flag1", "flag2"],
},
files={
- 'content': 'post-content',
+ "content": "post-content",
},
- user=auth_user))
+ user=auth_user,
+ )
+ )
- assert result == 'serialized post'
+ assert result == "serialized post"
posts.create_post.assert_called_once_with(
- 'post-content', ['tag1', 'tag2'], auth_user)
- posts.update_post_safety.assert_called_once_with(post, 'safe')
- posts.update_post_source.assert_called_once_with(post, 'source')
+ "post-content", ["tag1", "tag2"], auth_user
+ )
+ posts.update_post_safety.assert_called_once_with(post, "safe")
+ posts.update_post_source.assert_called_once_with(post, "source")
posts.update_post_relations.assert_called_once_with(post, [1, 2])
posts.update_post_notes.assert_called_once_with(
- post, ['note1', 'note2'])
+ post, ["note1", "note2"]
+ )
posts.update_post_flags.assert_called_once_with(
- post, ['flag1', 'flag2'])
+ post, ["flag1", "flag2"]
+ )
posts.serialize_post.assert_called_once_with(
- post, auth_user, options=[])
+ post, auth_user, options=[]
+ )
snapshots.create.assert_called_once_with(post, auth_user)
def test_anonymous_uploads(
- config_injector, context_factory, post_factory, user_factory):
+ config_injector, context_factory, post_factory, user_factory
+):
auth_user = user_factory(rank=model.User.RANK_REGULAR)
post = post_factory()
db.session.add(post)
db.session.flush()
- with patch('szurubooru.func.posts.serialize_post'), \
- patch('szurubooru.func.posts.create_post'), \
- patch('szurubooru.func.posts.update_post_source'):
- config_injector({
- 'privileges': {'posts:create:anonymous': model.User.RANK_REGULAR},
- })
+ with patch("szurubooru.func.posts.serialize_post"), patch(
+ "szurubooru.func.posts.create_post"
+ ), patch("szurubooru.func.posts.update_post_source"), patch(
+ "szurubooru.func.snapshots._post_to_webhooks"
+ ):
+ config_injector(
+ {
+ "privileges": {
+ "posts:create:anonymous": model.User.RANK_REGULAR,
+ "uploads:use_downloader": model.User.RANK_POWER,
+ },
+ }
+ )
posts.create_post.return_value = [post, []]
api.post_api.create_post(
context_factory(
params={
- 'safety': 'safe',
- 'tags': ['tag1', 'tag2'],
- 'anonymous': 'True',
+ "safety": "safe",
+ "tags": ["tag1", "tag2"],
+ "anonymous": "True",
},
files={
- 'content': 'post-content',
+ "content": "post-content",
},
- user=auth_user))
+ user=auth_user,
+ )
+ )
posts.create_post.assert_called_once_with(
- 'post-content', ['tag1', 'tag2'], None)
+ "post-content", ["tag1", "tag2"], None
+ )
def test_creating_from_url_saves_source(
- config_injector, context_factory, post_factory, user_factory):
+ config_injector, context_factory, post_factory, user_factory
+):
auth_user = user_factory(rank=model.User.RANK_REGULAR)
post = post_factory()
db.session.add(post)
db.session.flush()
- with patch('szurubooru.func.net.download'), \
- patch('szurubooru.func.posts.serialize_post'), \
- patch('szurubooru.func.posts.create_post'), \
- patch('szurubooru.func.posts.update_post_source'):
- config_injector({
- 'privileges': {'posts:create:identified': model.User.RANK_REGULAR},
- })
- net.download.return_value = b'content'
+ with patch("szurubooru.func.net.download"), patch(
+ "szurubooru.func.posts.serialize_post"
+ ), patch("szurubooru.func.posts.create_post"), patch(
+ "szurubooru.func.posts.update_post_source"
+ ), patch(
+ "szurubooru.func.snapshots._post_to_webhooks"
+ ):
+ config_injector(
+ {
+ "privileges": {
+ "posts:create:identified": model.User.RANK_REGULAR,
+ "uploads:use_downloader": model.User.RANK_POWER,
+ },
+ }
+ )
+ net.download.return_value = b"content"
posts.create_post.return_value = [post, []]
api.post_api.create_post(
context_factory(
params={
- 'safety': 'safe',
- 'tags': ['tag1', 'tag2'],
- 'contentUrl': 'example.com',
+ "safety": "safe",
+ "tags": ["tag1", "tag2"],
+ "contentUrl": "example.com",
},
- user=auth_user))
- net.download.assert_called_once_with('example.com')
+ user=auth_user,
+ )
+ )
+ net.download.assert_called_once_with(
+ "example.com", use_video_downloader=False
+ )
posts.create_post.assert_called_once_with(
- b'content', ['tag1', 'tag2'], auth_user)
- posts.update_post_source.assert_called_once_with(post, 'example.com')
+ b"content", ["tag1", "tag2"], auth_user
+ )
+ posts.update_post_source.assert_called_once_with(post, "example.com")
def test_creating_from_url_with_source_specified(
- config_injector, context_factory, post_factory, user_factory):
+ config_injector, context_factory, post_factory, user_factory
+):
auth_user = user_factory(rank=model.User.RANK_REGULAR)
post = post_factory()
db.session.add(post)
db.session.flush()
- with patch('szurubooru.func.net.download'), \
- patch('szurubooru.func.posts.serialize_post'), \
- patch('szurubooru.func.posts.create_post'), \
- patch('szurubooru.func.posts.update_post_source'):
- config_injector({
- 'privileges': {'posts:create:identified': model.User.RANK_REGULAR},
- })
- net.download.return_value = b'content'
+ with patch("szurubooru.func.net.download"), patch(
+ "szurubooru.func.posts.serialize_post"
+ ), patch("szurubooru.func.posts.create_post"), patch(
+ "szurubooru.func.posts.update_post_source"
+ ), patch(
+ "szurubooru.func.snapshots._post_to_webhooks"
+ ):
+ config_injector(
+ {
+ "privileges": {
+ "posts:create:identified": model.User.RANK_REGULAR,
+ "uploads:use_downloader": model.User.RANK_REGULAR,
+ },
+ }
+ )
+ net.download.return_value = b"content"
posts.create_post.return_value = [post, []]
api.post_api.create_post(
context_factory(
params={
- 'safety': 'safe',
- 'tags': ['tag1', 'tag2'],
- 'contentUrl': 'example.com',
- 'source': 'example2.com',
+ "safety": "safe",
+ "tags": ["tag1", "tag2"],
+ "contentUrl": "example.com",
+ "source": "example2.com",
},
- user=auth_user))
- net.download.assert_called_once_with('example.com')
+ user=auth_user,
+ )
+ )
+ net.download.assert_called_once_with(
+ "example.com", use_video_downloader=True
+ )
posts.create_post.assert_called_once_with(
- b'content', ['tag1', 'tag2'], auth_user)
- posts.update_post_source.assert_called_once_with(post, 'example2.com')
+ b"content", ["tag1", "tag2"], auth_user
+ )
+ posts.update_post_source.assert_called_once_with(post, "example2.com")
-@pytest.mark.parametrize('field', ['safety'])
+@pytest.mark.parametrize("field", ["safety"])
def test_trying_to_omit_mandatory_field(context_factory, user_factory, field):
params = {
- 'safety': 'safe',
+ "safety": "safe",
}
del params[field]
with pytest.raises(errors.MissingRequiredParameterError):
api.post_api.create_post(
context_factory(
params=params,
- files={'content': '...'},
- user=user_factory(rank=model.User.RANK_REGULAR)))
+ files={"content": "..."},
+ user=user_factory(rank=model.User.RANK_REGULAR),
+ )
+ )
@pytest.mark.parametrize(
- 'field', ['tags', 'relations', 'source', 'notes', 'flags'])
+ "field", ["tags", "relations", "source", "notes", "flags"]
+)
def test_omitting_optional_field(
- field, context_factory, post_factory, user_factory):
+ field, context_factory, post_factory, user_factory
+):
auth_user = user_factory(rank=model.User.RANK_REGULAR)
post = post_factory()
db.session.add(post)
db.session.flush()
params = {
- 'safety': 'safe',
- 'tags': ['tag1', 'tag2'],
- 'relations': [1, 2],
- 'source': 'source',
- 'notes': ['note1', 'note2'],
- 'flags': ['flag1', 'flag2'],
+ "safety": "safe",
+ "tags": ["tag1", "tag2"],
+ "relations": [1, 2],
+ "source": "source",
+ "notes": ["note1", "note2"],
+ "flags": ["flag1", "flag2"],
}
del params[field]
- with patch('szurubooru.func.posts.create_post'), \
- patch('szurubooru.func.posts.update_post_safety'), \
- patch('szurubooru.func.posts.update_post_source'), \
- patch('szurubooru.func.posts.update_post_relations'), \
- patch('szurubooru.func.posts.update_post_notes'), \
- patch('szurubooru.func.posts.update_post_flags'), \
- patch('szurubooru.func.posts.serialize_post'), \
- patch('szurubooru.func.snapshots.create'):
+ with patch("szurubooru.func.posts.create_post"), patch(
+ "szurubooru.func.posts.update_post_safety"
+ ), patch("szurubooru.func.posts.update_post_source"), patch(
+ "szurubooru.func.posts.update_post_relations"
+ ), patch(
+ "szurubooru.func.posts.update_post_notes"
+ ), patch(
+ "szurubooru.func.posts.update_post_flags"
+ ), patch(
+ "szurubooru.func.posts.serialize_post"
+ ), patch(
+ "szurubooru.func.snapshots.create"
+ ):
posts.create_post.return_value = (post, [])
- posts.serialize_post.return_value = 'serialized post'
+ posts.serialize_post.return_value = "serialized post"
result = api.post_api.create_post(
context_factory(
params=params,
- files={'content': 'post-content'},
- user=auth_user))
- assert result == 'serialized post'
+ files={"content": "post-content"},
+ user=auth_user,
+ )
+ )
+ assert result == "serialized post"
def test_errors_not_spending_ids(
- config_injector, tmpdir, context_factory, read_asset, user_factory,
- skip_post_hashing):
- config_injector({
- 'data_dir': str(tmpdir.mkdir('data')),
- 'data_url': 'example.com',
- 'thumbnails': {
- 'post_width': 300,
- 'post_height': 300,
- },
- 'privileges': {
- 'posts:create:identified': model.User.RANK_REGULAR,
- },
- 'secret': 'test',
- })
+ config_injector, tmpdir, context_factory, read_asset, user_factory
+):
+ config_injector(
+ {
+ "data_dir": str(tmpdir.mkdir("data")),
+ "data_url": "example.com",
+ "thumbnails": {
+ "post_width": 300,
+ "post_height": 300,
+ },
+ "privileges": {
+ "posts:create:identified": model.User.RANK_REGULAR,
+ "uploads:use_downloader": model.User.RANK_POWER,
+ },
+ "secret": "test",
+ }
+ )
auth_user = user_factory(rank=model.User.RANK_REGULAR)
# successful request
- with patch('szurubooru.func.posts.serialize_post'), \
- patch('szurubooru.func.posts.update_post_tags'):
+ with patch("szurubooru.func.posts.serialize_post"), patch(
+ "szurubooru.func.posts.update_post_tags"
+ ), patch("szurubooru.func.snapshots._post_to_webhooks"):
posts.serialize_post.side_effect = lambda post, *_, **__: post.post_id
post1_id = api.post_api.create_post(
context_factory(
- params={'safety': 'safe', 'tags': []},
- files={'content': read_asset('png.png')},
- user=auth_user))
- db.session.commit()
+ params={"safety": "safe", "tags": []},
+ files={"content": read_asset("png.png")},
+ user=auth_user,
+ )
+ )
# erroreous request (duplicate post)
with pytest.raises(posts.PostAlreadyUploadedError):
api.post_api.create_post(
context_factory(
- params={'safety': 'safe', 'tags': []},
- files={'content': read_asset('png.png')},
- user=auth_user))
- db.session.rollback()
+ params={"safety": "safe", "tags": []},
+ files={"content": read_asset("png.png")},
+ user=auth_user,
+ )
+ )
# successful request
- with patch('szurubooru.func.posts.serialize_post'), \
- patch('szurubooru.func.posts.update_post_tags'):
+ with patch("szurubooru.func.posts.serialize_post"), patch(
+ "szurubooru.func.posts.update_post_tags"
+ ), patch("szurubooru.func.snapshots._post_to_webhooks"):
posts.serialize_post.side_effect = lambda post, *_, **__: post.post_id
post2_id = api.post_api.create_post(
context_factory(
- params={'safety': 'safe', 'tags': []},
- files={'content': read_asset('jpeg.jpg')},
- user=auth_user))
+ params={"safety": "safe", "tags": []},
+ files={"content": read_asset("jpeg.jpg")},
+ user=auth_user,
+ )
+ )
assert post1_id > 0
assert post2_id > 0
@@ -306,40 +393,52 @@ def test_trying_to_omit_content(context_factory, user_factory):
api.post_api.create_post(
context_factory(
params={
- 'safety': 'safe',
- 'tags': ['tag1', 'tag2'],
+ "safety": "safe",
+ "tags": ["tag1", "tag2"],
},
- user=user_factory(rank=model.User.RANK_REGULAR)))
+ user=user_factory(rank=model.User.RANK_REGULAR),
+ )
+ )
def test_trying_to_create_post_without_privileges(
- context_factory, user_factory):
+ context_factory, user_factory
+):
with pytest.raises(errors.AuthError):
- api.post_api.create_post(context_factory(
- params='whatever',
- user=user_factory(rank=model.User.RANK_ANONYMOUS)))
+ api.post_api.create_post(
+ context_factory(
+ params="whatever",
+ user=user_factory(rank=model.User.RANK_ANONYMOUS),
+ )
+ )
def test_trying_to_create_tags_without_privileges(
- config_injector, context_factory, user_factory):
- config_injector({
- 'privileges': {
- 'posts:create:anonymous': model.User.RANK_REGULAR,
- 'posts:create:identified': model.User.RANK_REGULAR,
- 'tags:create': model.User.RANK_ADMINISTRATOR,
- },
- })
- with pytest.raises(errors.AuthError), \
- patch('szurubooru.func.posts.update_post_content'), \
- patch('szurubooru.func.posts.update_post_tags'):
- posts.update_post_tags.return_value = ['new-tag']
+ config_injector, context_factory, user_factory
+):
+ config_injector(
+ {
+ "privileges": {
+ "posts:create:anonymous": model.User.RANK_REGULAR,
+ "posts:create:identified": model.User.RANK_REGULAR,
+ "tags:create": model.User.RANK_ADMINISTRATOR,
+ "uploads:use_downloader": model.User.RANK_POWER,
+ },
+ }
+ )
+ with pytest.raises(errors.AuthError), patch(
+ "szurubooru.func.posts.update_post_content"
+ ), patch("szurubooru.func.posts.update_post_tags"):
+ posts.update_post_tags.return_value = ["new-tag"]
api.post_api.create_post(
context_factory(
params={
- 'safety': 'safe',
- 'tags': ['tag1', 'tag2'],
+ "safety": "safe",
+ "tags": ["tag1", "tag2"],
},
files={
- 'content': posts.EMPTY_PIXEL,
+ "content": posts.EMPTY_PIXEL,
},
- user=user_factory(rank=model.User.RANK_REGULAR)))
+ user=user_factory(rank=model.User.RANK_REGULAR),
+ )
+ )

© 2015 - 2026 Jakob L. Kreuze