iro/tests/config.py
author Sandro Knauß <knauss@netzguerilla.net>
Fri, 30 Mar 2012 15:55:44 +0200
branchdevel
changeset 269 0d134b173cb1
parent 239 4cf5e664c847
child 282 50cc13814bfb
permissions -rw-r--r--
iro.config: using OrderedDict instead of Dict + List for Options.

from mock import patch, Mock
from twisted.trial import unittest
import signal
import io
import ConfigParser
from collections import OrderedDict
from functools import partial

from iro import config, error, validate 
from iro.offer.provider import Provider, providers

class TestModuleConfig(unittest.TestCase):
    '''test config class'''
 
    def setUp(self):
        self._reloadList=config.configParser.reloadList
        config.configParser.reloadList=[]

    def tearDown(self):
        config.configParser.reloadList = self._reloadList

    @patch('iro.config.main')
    @patch('iro.config.configParser')
    def testReadConfig(self,pConfig,pMain):
        pMain._init = True
        config.readConfig()
        self.assertEqual([i[0] for i in pConfig.method_calls],["read","reload_","items"])
        pConfig.read.assert_called_once_with(config.confFiles)
        pConfig.items.assert_called_once_with("main")
        pConfig.reload_.assert_called_once_with()
        self.assertEqual(pMain.load.called,1)

    @patch('iro.config.main')
    @patch('iro.config.configParser')
    def testReadConfigInit(self,pConfig,pMain):
        pConfig.items.return_value = [('dburl',''),("port",1000)]
        pMain._init = False
        config.readConfig()
        self.assertEqual([i[0] for i in pConfig.method_calls],["read","reload_","items"])
        self.assertEqual([i[0] for i in pMain.method_calls],["same"])
        sa = pMain.same.call_args_list[0][0][0]
        self.assertEqual(sa.port,1000)
        self.assertEqual(sa.dburl,'')
        pMain.same.return_value = False
        self.assertRaises(Exception,config.readConfig,)

    @patch('iro.config.main')
    @patch('iro.config.configParser')
    def testInit(self,pConfig,pMain):
        pMain._init = False
        config.init()
        self.assertEqual([i[0] for i in pConfig.method_calls],["read", "items"])
        pConfig.read.assert_called_once_with(config.confFiles)
        pConfig.items.assert_called_once_with("main")
        self.assertEqual(pMain.load.called,1)


    @patch('signal.signal')
    @patch('iro.config.readConfig')
    def testRegisterSignal(self, pReadConfig, pSignal):
        config.registerSignal()
        self.assertEqual(pSignal.call_args[0][0],signal.SIGUSR2)
        self.assertEqual(pReadConfig.called,0)
        pSignal.call_args[0][1](None, None)
        pReadConfig.assert_called_once_with()

    def testRegisterReload(self):
        def x():
            pass
        config.configParser.registerReload(x)
        self.assertEqual(config.configParser.reloadList,[x])

    def testReload(self):
        x = Mock()
        config.configParser.reloadList = [x] 
        config.configParser.reload_()
        x.assert_called_once_with()


class TestRead(unittest.TestCase):



    def tearDown(self):
        for s in config.configParser.sections():
            config.configParser.remove_section(s)

    @patch('iro.config.ConfigParser.read')
    def testMain(self,pRead):
        sample_config = """[main]
port = 8000
dburl = sdfdsafgsfdg
"""
        config.configParser.readfp(io.BytesIO(sample_config))
        config.configParser.read([])
        pRead.assert_called_once_with(config.configParser,[])

    @patch('iro.config.ConfigParser.read')
    def testMainBadPort(self,pRead):
        sample_config = """[main]
port = -8000
dburl = sadfaserasg
"""
        config.configParser.readfp(io.BytesIO(sample_config))
        self.assertRaises(error.ValidateException, config.configParser.read, [])

    @patch('iro.config.ConfigParser.read')
    def testMainNoMust(self,pRead):
        sample_config = """[main]
port = 8000
"""
        config.configParser.readfp(io.BytesIO(sample_config))
        self.assertRaises(config.NeededOption, config.configParser.read, [])

    @patch('iro.config.ConfigParser.read')
    def testMust(self,pRead):
        v=Mock()
        config.main.options["test"] = config.Option(v,default="jehei")
        try:
            sample_config = """[main]
dburl = sdfawersdf
port = 8000
"""
            config.configParser.readfp(io.BytesIO(sample_config))
            config.configParser.read([])
            self.assertEqual(v.called,0)
            config.main.load(config.configParser.items("main"))
            self.assertEqual(config.main.test,'jehei')
            sample_config = """[main]
dburl = adfgsdftsfg
port = 8000
test = foohu
    """
            config.configParser.readfp(io.BytesIO(sample_config))
            config.configParser.read([])
            v.assert_called_once_with("foohu","test")
        finally:
            del(config.main.options["test"])

    @patch('iro.config.ConfigParser.read')
    def testProviders(self, pRead):
        v=Mock()
        class TestProvider(Provider):
            def __init__(self,name):
                o = [("test",config.Option(v))]
                Provider.__init__(self, name, options=o)
        providers["test"]=TestProvider
        try:
            sample_config = """[p]
"""
            config.configParser.readfp(io.BytesIO(sample_config))
            self.assertRaises(ConfigParser.NoOptionError, config.configParser.read, [])  
            self.assertEqual(v.called,0)
            sample_config = """[p]
typ= test
test= foo
"""
            config.configParser.readfp(io.BytesIO(sample_config))
            config.configParser.read([])
            v.assert_called_once_with("foo","test")
        finally:
            del(providers["test"])


class TestConfig(unittest.TestCase):

    def config(self,name):
        return config.Config(name, OrderedDict([
                ("dburl",config.Option(lambda x,y:x,long="Connection URL to database",must=True)),
                ("port",config.Option(partial(validate.vInteger,minv=0),long="Port under that twisted is running",must=True)),
                ])
            )

    def testSame(self):
        c1 = self.config("1")
        c1.port = 1
        c1.dburl = "dburl1"
        c2 = self.config("2")
        c2.port = 1
        c2.dburl = "dburl1"
        self.assertTrue(c1.same(c2))
        self.assertTrue(c1.same(c1))
        self.assertTrue(c2.same(c1))
        c2.port = 2
        self.assertFalse(c2.same(c1))
        self.assertFalse(c1.same(c2))
        c2.port = 1
        c2.dburl = "dburl2"
        self.assertFalse(c2.same(c1))
        self.assertFalse(c1.same(c2))

    def testSampleConf(self):
        c1 = self.config("1")
        self.assertEqual(c1.sampleConf(),["[1]",
            "# Connection URL to database",
            "dburl = ","",
            "# Port under that twisted is running",
            "port = ",""])

    def testSampleConfDefault(self):
        c1 = self.config("1")
        c1.options["port"].default = 12345
        c1.options["port"].must = False
        c1.options["dburl"].default = True
        self.assertEqual(c1.sampleConf(),["[1]",
            "# Connection URL to database",
            "dburl = True","",
            "# Port under that twisted is running",
            "# port = 12345",""])