tests/config.py
author Sandro Knauß <knauss@netzguerilla.net>
Sat, 10 Mar 2012 19:01:31 +0100
branchdevel
changeset 220 602720314930
parent 188 4d6130d91e56
permissions -rw-r--r--
adding config.Config.sampleConf for creating a sample configuration

from mock import patch, Mock
from twisted.trial import unittest
import signal
import io
import ConfigParser
from  iro import config, error 
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('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):
                Provider.__init__(self,name)
                self.options.update({"test":config.Option(v)})
        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 testSame(self):
        c1 = config.Config("1")
        c1.port = 1
        c1.dburl = "dburl1"
        c2 = config.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 = config.Config("1")
        self.assertEqual(c1.sampleConf(),["[1]",
            "# Connection URL to database",
            "dburl = ","",
            "# Port under that twisted is running",
            "port = ",""])

    def testsampleConfDefault(self):
        c1 = config.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",""])