2016-04-16 08:57:42 +00:00
|
|
|
import datetime
|
2016-04-17 10:53:58 +00:00
|
|
|
import uuid
|
2016-04-18 20:41:39 +00:00
|
|
|
from contextlib import contextmanager
|
2016-04-15 12:36:00 +00:00
|
|
|
import pytest
|
2016-04-18 17:42:24 +00:00
|
|
|
import freezegun
|
2016-04-15 12:36:00 +00:00
|
|
|
import sqlalchemy
|
2016-04-15 15:54:21 +00:00
|
|
|
from szurubooru import api, config, db
|
2016-04-15 12:36:00 +00:00
|
|
|
from szurubooru.util import misc
|
|
|
|
|
2016-04-19 13:45:12 +00:00
|
|
|
class QueryCounter(object):
|
|
|
|
def __init__(self):
|
|
|
|
self._statements = []
|
|
|
|
|
|
|
|
def __enter__(self):
|
|
|
|
self._statements = []
|
|
|
|
|
|
|
|
def __exit__(self, *args, **kwargs):
|
|
|
|
self._statements = []
|
|
|
|
|
|
|
|
def create_before_cursor_execute(self):
|
|
|
|
def before_cursor_execute(
|
|
|
|
_conn, _cursor, statement, _parameters, _context, _executemany):
|
|
|
|
self._statements.append(statement)
|
|
|
|
return before_cursor_execute
|
|
|
|
|
|
|
|
@property
|
|
|
|
def statements(self):
|
|
|
|
return self._statements
|
|
|
|
|
|
|
|
_query_counter = QueryCounter()
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def query_counter():
|
|
|
|
return _query_counter
|
|
|
|
|
2016-04-17 10:53:58 +00:00
|
|
|
def get_unique_name():
|
|
|
|
return str(uuid.uuid4())
|
|
|
|
|
2016-04-16 08:57:42 +00:00
|
|
|
@pytest.fixture
|
2016-04-18 17:42:24 +00:00
|
|
|
def fake_datetime():
|
2016-04-18 20:41:39 +00:00
|
|
|
@contextmanager
|
2016-04-16 08:57:42 +00:00
|
|
|
def injector(now):
|
2016-04-18 20:41:39 +00:00
|
|
|
freezer = freezegun.freeze_time(now)
|
|
|
|
freezer.start()
|
|
|
|
yield
|
|
|
|
freezer.stop()
|
2016-04-16 08:57:42 +00:00
|
|
|
return injector
|
|
|
|
|
2016-04-18 20:41:39 +00:00
|
|
|
@pytest.yield_fixture
|
2016-04-19 13:45:12 +00:00
|
|
|
def session(query_counter, autoload=True):
|
2016-04-15 21:21:33 +00:00
|
|
|
import logging
|
|
|
|
logging.basicConfig()
|
|
|
|
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
|
2016-04-15 12:36:00 +00:00
|
|
|
engine = sqlalchemy.create_engine('sqlite:///:memory:')
|
2016-04-19 13:45:12 +00:00
|
|
|
sqlalchemy.event.listen(
|
|
|
|
engine,
|
|
|
|
'before_cursor_execute',
|
|
|
|
query_counter.create_before_cursor_execute())
|
2016-04-15 12:36:00 +00:00
|
|
|
session_maker = sqlalchemy.orm.sessionmaker(bind=engine)
|
2016-04-18 20:41:39 +00:00
|
|
|
session = sqlalchemy.orm.scoped_session(session_maker)
|
|
|
|
db.Base.query = session.query_property()
|
2016-04-15 12:36:00 +00:00
|
|
|
db.Base.metadata.create_all(bind=engine)
|
2016-04-18 20:41:39 +00:00
|
|
|
db.session = session
|
|
|
|
yield session
|
|
|
|
session.remove()
|
2016-04-15 12:36:00 +00:00
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def context_factory(session):
|
2016-04-15 15:54:21 +00:00
|
|
|
def factory(request=None, input=None, files=None, user=None):
|
|
|
|
ctx = api.Context()
|
|
|
|
ctx.input = input or {}
|
|
|
|
ctx.session = session
|
|
|
|
ctx.request = request or {}
|
|
|
|
ctx.files = files or {}
|
|
|
|
ctx.user = user or db.User()
|
|
|
|
return ctx
|
2016-04-15 12:36:00 +00:00
|
|
|
return factory
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def config_injector():
|
|
|
|
def injector(new_config_content):
|
|
|
|
config.config = new_config_content
|
|
|
|
return injector
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def user_factory():
|
2016-04-17 10:53:58 +00:00
|
|
|
def factory(name=None, rank='regular_user', email='dummy'):
|
2016-04-15 12:36:00 +00:00
|
|
|
user = db.User()
|
2016-04-17 10:53:58 +00:00
|
|
|
user.name = name or get_unique_name()
|
2016-04-15 12:36:00 +00:00
|
|
|
user.password_salt = 'dummy'
|
|
|
|
user.password_hash = 'dummy'
|
2016-04-17 10:53:58 +00:00
|
|
|
user.email = email
|
2016-04-15 12:36:00 +00:00
|
|
|
user.rank = rank
|
2016-04-16 08:57:42 +00:00
|
|
|
user.creation_time = datetime.datetime(1997, 1, 1)
|
2016-04-15 12:36:00 +00:00
|
|
|
user.avatar_style = db.User.AVATAR_GRAVATAR
|
|
|
|
return user
|
|
|
|
return factory
|
2016-04-15 18:40:12 +00:00
|
|
|
|
2016-04-19 09:56:09 +00:00
|
|
|
@pytest.fixture
|
|
|
|
def tag_category_factory(session):
|
|
|
|
def factory(name='dummy', color='dummy'):
|
|
|
|
category = db.TagCategory()
|
|
|
|
category.name = name
|
|
|
|
category.color = color
|
|
|
|
return category
|
|
|
|
return factory
|
|
|
|
|
2016-04-15 18:40:12 +00:00
|
|
|
@pytest.fixture
|
2016-04-18 19:41:47 +00:00
|
|
|
def tag_factory(session):
|
2016-04-19 09:56:09 +00:00
|
|
|
def factory(names=None, category=None, category_name='dummy'):
|
|
|
|
if not category:
|
|
|
|
category = db.TagCategory(category_name)
|
|
|
|
session.add(category)
|
2016-04-15 18:40:12 +00:00
|
|
|
tag = db.Tag()
|
2016-04-17 10:53:58 +00:00
|
|
|
tag.names = [db.TagName(name) for name in (names or [get_unique_name()])]
|
2016-04-15 18:40:12 +00:00
|
|
|
tag.category = category
|
2016-04-16 08:57:42 +00:00
|
|
|
tag.creation_time = datetime.datetime(1996, 1, 1)
|
2016-04-15 18:40:12 +00:00
|
|
|
return tag
|
|
|
|
return factory
|
2016-04-17 10:55:07 +00:00
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def post_factory():
|
|
|
|
def factory(
|
|
|
|
safety=db.Post.SAFETY_SAFE,
|
|
|
|
type=db.Post.TYPE_IMAGE,
|
|
|
|
checksum='...'):
|
|
|
|
post = db.Post()
|
|
|
|
post.safety = safety
|
|
|
|
post.type = type
|
|
|
|
post.checksum = checksum
|
|
|
|
post.flags = 0
|
|
|
|
post.creation_time = datetime.datetime(1996, 1, 1)
|
|
|
|
return post
|
|
|
|
return factory
|