1
0
mirror of https://github.com/spl0k/supysonic.git synced 2024-09-20 03:11:04 +00:00
supysonic/tests/testbase.py

134 lines
3.6 KiB
Python
Raw Normal View History

2017-11-17 22:26:25 +00:00
# -*- coding: utf-8 -*-
# vim:fenc=utf-8
#
# This file is part of Supysonic.
# Supysonic is a Python implementation of the Subsonic server API.
#
# Copyright (C) 2017-2018 Alban 'spl0k' Féron
2017-11-17 22:26:25 +00:00
#
# Distributed under terms of the GNU AGPLv3 license.
2017-12-05 22:18:39 +00:00
import inspect
2017-11-27 21:30:13 +00:00
import io
2017-12-19 22:16:55 +00:00
import os
2017-11-27 21:55:18 +00:00
import shutil
2017-11-17 22:26:25 +00:00
import sys
2017-11-27 21:30:13 +00:00
import unittest
2017-11-27 21:55:18 +00:00
import tempfile
2017-11-17 22:26:25 +00:00
from contextlib import contextmanager
2017-12-19 22:16:55 +00:00
from supysonic.db import init_database, release_database
2017-11-27 21:30:13 +00:00
from supysonic.config import DefaultConfig
2017-11-17 22:26:25 +00:00
from supysonic.managers.user import UserManager
2017-12-19 22:16:55 +00:00
from supysonic.web import create_application
2017-11-27 21:30:13 +00:00
class TestConfig(DefaultConfig):
TESTING = True
LOGGER_HANDLER_POLICY = 'never'
MIMETYPES = {
'mp3': 'audio/mpeg',
'weirdextension': 'application/octet-stream'
}
2017-12-07 22:33:32 +00:00
TRANSCODING = {
'transcoder_mp3_mp3': 'echo -n %srcpath %outrate',
'decoder_mp3': 'echo -n Pushing out some mp3 data...',
'encoder_cat': 'cat -',
'encoder_md5': 'md5sum'
}
2017-11-27 21:30:13 +00:00
def __init__(self, with_webui, with_api):
2017-12-05 08:11:53 +00:00
super(TestConfig, self).__init__()
2017-12-05 22:18:39 +00:00
for cls in reversed(inspect.getmro(self.__class__)):
for attr, value in cls.__dict__.items():
2017-12-05 22:18:39 +00:00
if attr.startswith('_') or attr != attr.upper():
continue
2017-12-05 08:11:53 +00:00
2017-12-05 22:18:39 +00:00
if isinstance(value, dict):
setattr(self, attr, value.copy())
else:
setattr(self, attr, value)
2017-11-17 22:26:25 +00:00
2017-11-27 21:30:13 +00:00
self.WEBAPP.update({
'mount_webui': with_webui,
'mount_api': with_api
})
2017-11-17 22:26:25 +00:00
class MockResponse(object):
def __init__(self, response):
self.__status_code = response.status_code
self.__data = response.get_data(as_text = True)
self.__mimetype = response.mimetype
@property
def status_code(self):
return self.__status_code
@property
def data(self):
return self.__data
@property
def mimetype(self):
return self.__mimetype
def patch_method(f):
original = f
def patched(*args, **kwargs):
rv = original(*args, **kwargs)
return MockResponse(rv)
return patched
2017-11-17 22:26:25 +00:00
class TestBase(unittest.TestCase):
2017-11-27 21:30:13 +00:00
__with_webui__ = False
__with_api__ = False
2017-11-17 22:26:25 +00:00
def setUp(self):
2017-12-19 22:16:55 +00:00
self.__dbfile = tempfile.mkstemp()[1]
2017-11-27 21:55:18 +00:00
self.__dir = tempfile.mkdtemp()
config = TestConfig(self.__with_webui__, self.__with_api__)
2017-12-19 22:16:55 +00:00
config.BASE['database_uri'] = 'sqlite:///' + self.__dbfile
2017-11-27 21:55:18 +00:00
config.WEBAPP['cache_dir'] = self.__dir
2017-12-19 22:16:55 +00:00
init_database(config.BASE['database_uri'], True)
release_database()
2017-11-27 21:30:13 +00:00
self.__app = create_application(config)
self.__ctx = self.__app.app_context()
2017-12-21 22:29:00 +00:00
self.__ctx.push()
2017-11-17 22:26:25 +00:00
self.client = self.__app.test_client()
2017-11-17 22:26:25 +00:00
2017-12-19 22:16:55 +00:00
UserManager.add('alice', 'Alic3', 'test@example.com', True)
UserManager.add('bob', 'B0b', 'bob@example.com', False)
def _patch_client(self):
self.client.get = patch_method(self.client.get)
self.client.post = patch_method(self.client.post)
@contextmanager
def request_context(self, *args, **kwargs):
ctx = self.__app.test_request_context(*args, **kwargs)
ctx.push()
yield
ctx.pop()
2017-12-19 22:16:55 +00:00
@staticmethod
def __should_unload_module(module):
if module.startswith('supysonic'):
return not module.startswith('supysonic.db')
return False
2017-11-17 22:26:25 +00:00
def tearDown(self):
2017-12-21 22:29:00 +00:00
self.__ctx.pop()
2017-12-19 22:16:55 +00:00
release_database()
2017-11-27 21:55:18 +00:00
shutil.rmtree(self.__dir)
2017-12-19 22:16:55 +00:00
os.remove(self.__dbfile)
2017-11-27 21:30:13 +00:00
2017-12-19 22:16:55 +00:00
to_unload = [ m for m in sorted(sys.modules) if self.__should_unload_module(m) ]
2017-11-17 22:26:25 +00:00
for m in to_unload:
del sys.modules[m]