This repository has been archived on 2025-02-26. You can view files and clone it, but cannot push or open issues or pull requests.
szurubooru/server/szurubooru/tests/api/test_pool_updating.py
2020-06-03 11:55:50 -04:00

131 lines
4.8 KiB
Python

from unittest.mock import patch
import pytest
from szurubooru import api, db, model, errors
from szurubooru.func import pools, posts, snapshots
@pytest.fixture(autouse=True)
def inject_config(config_injector):
config_injector({
'privileges': {
'pools:create': model.User.RANK_REGULAR,
'pools:edit:names': model.User.RANK_REGULAR,
'pools:edit:category': model.User.RANK_REGULAR,
'pools:edit:description': model.User.RANK_REGULAR,
'pools:edit:posts': model.User.RANK_REGULAR,
},
})
def test_simple_updating(user_factory, pool_factory, context_factory):
auth_user = user_factory(rank=model.User.RANK_REGULAR)
pool = pool_factory(id=1, names=['pool1', 'pool2'])
db.session.add(pool)
db.session.commit()
with patch('szurubooru.func.pools.create_pool'), \
patch('szurubooru.func.posts.get_posts_by_ids'), \
patch('szurubooru.func.pools.update_pool_names'), \
patch('szurubooru.func.pools.update_pool_category_name'), \
patch('szurubooru.func.pools.update_pool_description'), \
patch('szurubooru.func.pools.update_pool_posts'), \
patch('szurubooru.func.pools.serialize_pool'), \
patch('szurubooru.func.snapshots.modify'):
posts.get_posts_by_ids.return_value = ([], [])
pools.serialize_pool.return_value = 'serialized pool'
result = api.pool_api.update_pool(
context_factory(
params={
'version': 1,
'names': ['pool3'],
'category': 'series',
'description': 'desc',
'posts': [1, 2]
},
user=auth_user),
{'pool_id': 1})
assert result == 'serialized pool'
pools.create_pool.assert_not_called()
pools.update_pool_names.assert_called_once_with(pool, ['pool3'])
pools.update_pool_category_name.assert_called_once_with(pool, 'series')
pools.update_pool_description.assert_called_once_with(pool, 'desc')
pools.update_pool_posts.assert_called_once_with(pool, [1, 2])
pools.serialize_pool.assert_called_once_with(pool, options=[])
snapshots.modify.assert_called_once_with(pool, auth_user)
@pytest.mark.parametrize(
'field', [
'names',
'category',
'description',
'posts',
])
def test_omitting_optional_field(
user_factory, pool_factory, context_factory, field):
db.session.add(pool_factory(id=1))
db.session.commit()
params = {
'names': ['pool1', 'pool2'],
'category': 'default',
'description': 'desc',
'posts': [],
}
del params[field]
with patch('szurubooru.func.pools.create_pool'), \
patch('szurubooru.func.pools.update_pool_names'), \
patch('szurubooru.func.pools.update_pool_category_name'), \
patch('szurubooru.func.pools.serialize_pool'):
api.pool_api.update_pool(
context_factory(
params={**params, **{'version': 1}},
user=user_factory(rank=model.User.RANK_REGULAR)),
{'pool_id': 1})
def test_trying_to_update_non_existing(user_factory, context_factory):
with pytest.raises(pools.PoolNotFoundError):
api.pool_api.update_pool(
context_factory(
params={'names': ['dummy']},
user=user_factory(rank=model.User.RANK_REGULAR)),
{'pool_id': 9999})
@pytest.mark.parametrize('params', [
{'names': ['whatever']},
{'category': 'whatever'},
{'posts': [1]},
])
def test_trying_to_update_without_privileges(
user_factory, pool_factory, context_factory, params):
db.session.add(pool_factory(id=1))
db.session.commit()
with pytest.raises(errors.AuthError):
api.pool_api.update_pool(
context_factory(
params={**params, **{'version': 1}},
user=user_factory(rank=model.User.RANK_ANONYMOUS)),
{'pool_id': 1})
def test_trying_to_create_pools_without_privileges(
config_injector, context_factory, pool_factory, user_factory):
pool = pool_factory(id=1)
db.session.add(pool)
db.session.commit()
config_injector(
{
'privileges': {
'pools:create': model.User.RANK_ADMINISTRATOR,
'pools:edit:posts': model.User.RANK_REGULAR,
},
'delete_source_files': False,
})
with patch('szurubooru.func.posts.get_posts_by_ids'):
posts.get_posts_by_ids.return_value = ([], ['new-post'])
with pytest.raises(errors.AuthError):
api.pool_api.create_pool(
context_factory(
params={'posts': [1, 2], 'version': 1},
user=user_factory(rank=model.User.RANK_REGULAR)),
{'pool_id': 1})