You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
173 lines
4.9 KiB
173 lines
4.9 KiB
import mock
|
|
from mock import patch, Mock, MagicMock
|
|
import unittest
|
|
from unittest import TestCase
|
|
|
|
from couchpotato.core.settings import Settings
|
|
|
|
|
|
class DoNotUseMe:
|
|
""" Do not use this class, it is just for storing Mock ' s of Settings-class
|
|
|
|
Usage:
|
|
Select appropriate Mocks and copy-paste them to your test-method
|
|
"""
|
|
|
|
def __do_not_call(self):
|
|
# s = Settings
|
|
s = Mock()
|
|
|
|
# methods:
|
|
s.isOptionWritable = Mock(return_value=True)
|
|
s.set = Mock(return_value=None)
|
|
s.save = Mock()
|
|
|
|
# props:
|
|
s.log = Mock()
|
|
|
|
# subobjects
|
|
s.p = Mock()
|
|
s.p.getboolean = Mock(return_value=True)
|
|
s.p.has_option = Mock
|
|
|
|
|
|
class SettingsCommon(TestCase):
|
|
|
|
def setUp(self):
|
|
self.s = Settings()
|
|
|
|
def test_get_directories(self):
|
|
s = self.s
|
|
raw = ' /some/directory ::/another/dir '
|
|
exp = ['/some/directory', '/another/dir']
|
|
|
|
sec = 'sec'
|
|
opt = 'opt'
|
|
s.types[sec] = {}
|
|
s.types[sec][opt] = 'directories'
|
|
|
|
s.p = MagicMock()
|
|
s.p.get.return_value = raw
|
|
|
|
act = s.get(option = opt, section = sec)
|
|
|
|
self.assertEqual(act, exp)
|
|
|
|
class SettingsSaveWritableNonWritable(TestCase):
|
|
|
|
def setUp(self):
|
|
self.s = Settings()
|
|
|
|
def test_save_writable(self):
|
|
s = self.s
|
|
|
|
# set up Settings-mocks :
|
|
# lets assume, that option is writable:
|
|
mock_isOptionWritable = s.isOptionWritable = Mock(return_value=True)
|
|
mock_set = s.set = Mock(return_value=None)
|
|
mock_p_save = s.save = Mock()
|
|
|
|
section = 'core'
|
|
option = 'option_non_exist_be_sure'
|
|
value = "1000"
|
|
params = {'section': section, 'name': option, 'value': value}
|
|
|
|
# call method:
|
|
env_mock = Mock()
|
|
|
|
# HERE is an example of mocking LOCAL 'import'
|
|
with patch.dict('sys.modules', {'couchpotato.environment.Env': env_mock}):
|
|
result = s.saveView(**params)
|
|
|
|
self.assertIsInstance(s, Settings)
|
|
self.assertIsInstance(result, dict)
|
|
self.assertTrue(result['success'])
|
|
|
|
# -----------------------------------------
|
|
# check mock
|
|
# -----------------------------------------
|
|
mock_isOptionWritable.assert_called_with(section, option)
|
|
|
|
# check, that Settings tried to save my value:
|
|
mock_set.assert_called_with(section, option, value)
|
|
|
|
def test_save_non_writable(self):
|
|
s = self.s
|
|
|
|
# set up Settings-mocks :
|
|
# lets assume, that option is not writable:
|
|
mock_is_w = s.isOptionWritable = Mock(return_value=False)
|
|
mock_set = s.set = Mock(return_value=None)
|
|
mock_p_save = s.save = Mock()
|
|
mock_log_s = s.log = Mock()
|
|
|
|
section = 'core'
|
|
option = 'option_non_exist_be_sure'
|
|
value = "1000"
|
|
params = {'section': section, 'name': option, 'value': value}
|
|
|
|
# call method:
|
|
env_mock = Mock()
|
|
|
|
# HERE is an example of mocking LOCAL 'import'
|
|
with patch.dict('sys.modules', {'couchpotato.environment.Env': env_mock}):
|
|
result = s.saveView(**params)
|
|
|
|
self.assertIsInstance(s, Settings)
|
|
self.assertIsInstance(result, dict)
|
|
self.assertFalse(result['success'])
|
|
|
|
# -----------------------------------------
|
|
# check mock
|
|
# -----------------------------------------
|
|
# lets check, that 'set'-method was not called:
|
|
self.assertFalse(mock_set.called, 'Method `set` was called')
|
|
mock_is_w.assert_called_with(section, option)
|
|
|
|
|
|
class OptionMetaSuite(TestCase):
|
|
""" tests for ro rw hidden options """
|
|
|
|
def setUp(self):
|
|
self.s = Settings()
|
|
self.meta = self.s.optionMetaSuffix()
|
|
|
|
# hide real config-parser:
|
|
self.s.p = Mock()
|
|
|
|
def test_no_meta_option(self):
|
|
s = self.s
|
|
|
|
section = 'core'
|
|
option = 'url'
|
|
|
|
option_meta = option + self.meta
|
|
# setup mock
|
|
s.p.getboolean = Mock(return_value=True)
|
|
|
|
# there is no META-record for our option:
|
|
s.p.has_option = Mock(side_effect=lambda s, o: not (s == section and o == option_meta))
|
|
|
|
# by default all options are writable and readable
|
|
self.assertTrue(s.isOptionWritable(section, option))
|
|
self.assertTrue(s.isOptionReadable(section, option))
|
|
|
|
def test_non_writable(self):
|
|
s = self.s
|
|
|
|
section = 'core'
|
|
option = 'url'
|
|
|
|
def mock_get_meta_ro(s, o):
|
|
if (s == section and o == option_meta):
|
|
return 'ro'
|
|
return 11
|
|
|
|
option_meta = option + self.meta
|
|
# setup mock
|
|
s.p.has_option = Mock(return_value=True)
|
|
s.p.get = Mock(side_effect=mock_get_meta_ro)
|
|
|
|
# by default all options are writable and readable
|
|
self.assertFalse(s.isOptionWritable(section, option))
|
|
self.assertTrue(s.isOptionReadable(section, option))
|
|
|