szurubooru/server/szurubooru/tests/api/test_post_featuring.py
2020-08-13 22:41:43 -04:00

129 lines
4.4 KiB
Python

from unittest.mock import patch
import pytest
from szurubooru import api, db, errors, model
from szurubooru.func import posts, snapshots
@pytest.fixture(autouse=True)
def inject_config(config_injector):
config_injector(
{
"privileges": {
"posts:feature": model.User.RANK_REGULAR,
"posts:view": model.User.RANK_REGULAR,
"posts:view:featured": model.User.RANK_REGULAR,
},
}
)
def test_featuring(user_factory, post_factory, context_factory):
auth_user = user_factory(rank=model.User.RANK_REGULAR)
post = post_factory(id=1)
db.session.add(post)
db.session.flush()
assert not posts.get_post_by_id(1).is_featured
with patch("szurubooru.func.posts.serialize_post"), patch(
"szurubooru.func.snapshots.modify"
):
posts.serialize_post.return_value = "serialized post"
result = api.post_api.set_featured_post(
context_factory(params={"id": 1}, user=auth_user)
)
assert result == "serialized post"
assert posts.try_get_featured_post() is not None
assert posts.try_get_featured_post().post_id == 1
assert posts.get_post_by_id(1).is_featured
result = api.post_api.get_featured_post(
context_factory(user=user_factory(rank=model.User.RANK_REGULAR))
)
assert result == "serialized post"
snapshots.modify.assert_called_once_with(post, auth_user)
def test_trying_to_omit_required_parameter(user_factory, context_factory):
with pytest.raises(errors.MissingRequiredParameterError):
api.post_api.set_featured_post(
context_factory(user=user_factory(rank=model.User.RANK_REGULAR))
)
def test_trying_to_feature_the_same_post_twice(
user_factory, post_factory, context_factory
):
db.session.add(post_factory(id=1))
db.session.commit()
with patch("szurubooru.func.posts.serialize_post"), patch(
"szurubooru.func.snapshots._post_to_webhooks"
):
api.post_api.set_featured_post(
context_factory(
params={"id": 1},
user=user_factory(rank=model.User.RANK_REGULAR),
)
)
with pytest.raises(posts.PostAlreadyFeaturedError):
api.post_api.set_featured_post(
context_factory(
params={"id": 1},
user=user_factory(rank=model.User.RANK_REGULAR),
)
)
def test_featuring_one_post_after_another(
user_factory, post_factory, context_factory, fake_datetime
):
db.session.add(post_factory(id=1))
db.session.add(post_factory(id=2))
db.session.commit()
assert posts.try_get_featured_post() is None
assert not posts.get_post_by_id(1).is_featured
assert not posts.get_post_by_id(2).is_featured
with patch("szurubooru.func.posts.serialize_post"), patch(
"szurubooru.func.snapshots._post_to_webhooks"
):
with fake_datetime("1997"):
api.post_api.set_featured_post(
context_factory(
params={"id": 1},
user=user_factory(rank=model.User.RANK_REGULAR),
)
)
with fake_datetime("1998"):
api.post_api.set_featured_post(
context_factory(
params={"id": 2},
user=user_factory(rank=model.User.RANK_REGULAR),
)
)
assert posts.try_get_featured_post() is not None
assert posts.try_get_featured_post().post_id == 2
assert not posts.get_post_by_id(1).is_featured
assert posts.get_post_by_id(2).is_featured
def test_trying_to_feature_non_existing(user_factory, context_factory):
with pytest.raises(posts.PostNotFoundError):
api.post_api.set_featured_post(
context_factory(
params={"id": 1},
user=user_factory(rank=model.User.RANK_REGULAR),
)
)
def test_trying_to_retrieve_without_privileges(user_factory, context_factory):
with pytest.raises(errors.AuthError):
api.post_api.get_featured_post(
context_factory(user=user_factory(rank=model.User.RANK_ANONYMOUS))
)
def test_trying_to_feature_without_privileges(user_factory, context_factory):
with pytest.raises(errors.AuthError):
api.post_api.set_featured_post(
context_factory(user=user_factory(rank=model.User.RANK_ANONYMOUS))
)