Browse Source

Merge pull request #6261 from maxkoryukov/develop

Improved tests for settings
pull/6303/head
Ruud Burger 9 years ago
parent
commit
2f47c9b8b9
  1. 18
      couchpotato/core/settings.py
  2. 65
      couchpotato/core/settings_test.py

18
couchpotato/core/settings.py

@ -130,14 +130,15 @@ class Settings(object):
def get(self, option = '', section = 'core', default = None, type = None):
if self.isOptionMeta(section, option):
self.log.warning('set::option "%s.%s" cancelled, since it is a META option', (section, option))
self.log.warning('get::option "%s.%s" cancelled, since it is a META option', (section, option))
return None
tp = type
try:
type = self.getType(section, option) if not type else type
tp = self.getType(section, option) if not tp else tp
if hasattr(self, 'get%s' % type.capitalize()):
return getattr(self, 'get%s' % type.capitalize())(section, option)
if hasattr(self, 'get%s' % tp.capitalize()):
return getattr(self, 'get%s' % tp.capitalize())(section, option)
else:
return self.getUnicode(section, option)
@ -179,6 +180,7 @@ class Settings(object):
def getDirectories(self, section, option):
value = self.p.get(section, option)
if value:
return map(str.strip, str.split(value, self.directories_delimiter))
return []
@ -256,10 +258,10 @@ class Settings(object):
self.types[section][option] = type
def getType(self, section, option):
type = None
try: type = self.types[section][option]
except: type = 'unicode' if not type else type
return type
tp = None
try: tp = self.types[section][option]
except: tp = 'unicode' if not tp else tp
return tp
def addOptions(self, section_name, options):
# no additional actions (related to ro-rw options) are required here

65
couchpotato/core/settings_test.py

@ -1,16 +1,18 @@
import mock
from mock import patch, 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()
@ -27,8 +29,32 @@ class DoNotUseMe:
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()
@ -44,8 +70,8 @@ class SettingsSaveWritableNonWritable(TestCase):
section = 'core'
option = 'option_non_exist_be_sure'
value = "1000"
params = { 'section' : section, 'name' : option, 'value' : value }
params = {'section': section, 'name': option, 'value': value}
# call method:
env_mock = Mock()
@ -65,7 +91,6 @@ class SettingsSaveWritableNonWritable(TestCase):
# 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
@ -79,8 +104,8 @@ class SettingsSaveWritableNonWritable(TestCase):
section = 'core'
option = 'option_non_exist_be_sure'
value = "1000"
params = { 'section' : section, 'name' : option, 'value' : value }
params = {'section': section, 'name': option, 'value': value}
# call method:
env_mock = Mock()
@ -88,7 +113,6 @@ class SettingsSaveWritableNonWritable(TestCase):
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'])
@ -101,14 +125,13 @@ class SettingsSaveWritableNonWritable(TestCase):
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()
@ -121,13 +144,13 @@ class OptionMetaSuite(TestCase):
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) )
# 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) )
self.assertTrue(s.isOptionWritable(section, option))
self.assertTrue(s.isOptionReadable(section, option))
def test_non_writable(self):
s = self.s
@ -135,16 +158,16 @@ class OptionMetaSuite(TestCase):
section = 'core'
option = 'url'
def mock_get_meta_ro (s,o):
if (s==section and o==option_meta):
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)
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) )
self.assertFalse(s.isOptionWritable(section, option))
self.assertTrue(s.isOptionReadable(section, option))

Loading…
Cancel
Save