iro/tests/install.py
author Sandro Knauß <knauss@netzguerilla.net>
Fri, 23 Mar 2012 16:18:12 +0100
branchdevel
changeset 242 745d829d1e02
parent 241 546316b0b09c
child 294 0e75bd39767d
permissions -rw-r--r--
tests for iro.install.getAllRoutes added

#from mock import patch, Mock
from twisted.trial import unittest
from sqlalchemy import create_engine
from sets import Set
import io
import os

from iro import install
from iro import config
from iro.model.schema import Base, Offer
from iro.model.utils import WithSession
from iro.offer.provider import providers, Provider
from ..test_helpers.dbtestcase import md, SampleDatabase
from ..test_helpers.utils import DummyObserver

class TestInstallation(unittest.TestCase):
    '''test install script'''
   
    def setUp(self):
        md.setUp()
        if not hasattr(md,"db2"):
            md.db2=SampleDatabase("test2","test2",'%s/my.cnf'%md.tdir)
            md.dburl2='mysql://test2:test@localhost/test2?unix_socket=%s/socket'%md.tdir
            md.db2.create()
        self.log = DummyObserver()
        self.log.start()
        self.engine = None

    def tearDown(self):
        self.log.stop()
        if self.engine:
            Base.metadata.drop_all(self.engine)
            self.engine = None
        try:
            os.remove("iro.conf")
        except OSError as e:
            if e.errno != 2:
                raise

        

    def testCheckConfig(self):
        self.assertEqual(install.checkConfig(),False)
        with open("iro.conf",'w') as fp:
            fp.write("""[main]
dburl=foo""")
        self.assertEqual(install.checkConfig(),False)
        self.assertEqual(len(self.log.e),1)
        self.assertEqual(self.log.e[0]['message'], ("Error while processing config file: Option 'port' in section 'main' is missing.",))
        with open("iro.conf",'w') as fp:
            fp.write("""[main]
dburl=foo
port=123456
""")
        self.assertEqual(install.checkConfig(),True)

    def testCheckDatabase(self):
        config.main.dburl=md.dburl2
        self.assertTrue(install.checkDatabaseConnection())
        self.assertFalse(install.checkDatabase())
        self.engine = create_engine(md.dburl2)
        Base.metadata.create_all(self.engine)
        self.assertTrue(install.checkDatabase())

    def testCheckDatabaseConnection(self):
        config.main.dburl="mysql://t@localhost/test"
        self.assertFalse(install.checkDatabaseConnection())
        self.assertEqual(len(self.log.e),1)
        self.assertTrue(self.log.e[0]['message'][0].startswith("Error while trying to connect to database\n"))
        config.main.dburl="sqlite://"
        self.assertTrue(install.checkDatabaseConnection())


    def testCreateDatabase(self):
        config.main.dburl=md.dburl2
        self.assertTrue(install.checkDatabaseConnection())
        self.assertFalse(install.checkDatabase())
        install.createDatabase()
        self.assertTrue(install.checkDatabase())
   
    def testCreateSampleConfig(self):
        install.createSampleConfig()
        with open("iro.conf",'r') as fp:
            c = fp.read()
        with open(os.path.abspath("../iro.conf.inst"),"r") as fp:
            self.assertEqual(c,fp.read())

    def testNoOverwrite(self):
        with open("iro.conf","w") as fp:
            fp.write("muhaha")
        install.createSampleConfig()
        with open("iro.conf",'r') as fp:
            self.assertEqual(fp.read(),"muhaha")
        self.assertEqual(len(self.log.e),1)
        self.assertEqual(self.log.e[0]['message'], ("iro.conf exists and will not be overwritten.",))

    def testGetAllRoutesNone(self):
        config.main.dburl=md.dburl2
        install.createDatabase()
        self.assertEqual(install.getAllRoutes([]),{"orphand":Set(),"added":Set()})
        
    def testGetAllRoutesOrphand(self):
        config.main.dburl=md.dburl2
        install.createDatabase()
        self.engine = create_engine(md.dburl2)
        with WithSession(self.engine,True) as session:
            session.add(Offer(provider="p",route="r",typ="t",name="test"))
            session.add(Offer(provider="p",route="r2",typ="t",name="test2"))
        self.assertEqual(install.getAllRoutes([]),{"orphand":Set(["test","test2"]),"added":Set()})

    def testGetAllRoutesAdded(self):
        config.main.dburl=md.dburl2
        install.createDatabase()
        self.engine = create_engine(md.dburl2)
        class TestProvider(Provider):
            def __init__(self, name):       
                Provider.__init__(self, name, {"r":["1","2","3"]})
        providers["test"]=TestProvider
        sample_config = """[p]
typ= test
test= foo
"""
        config.configParser.readfp(io.BytesIO(sample_config))
        self.assertEqual(install.getAllRoutes(["p"]),{"orphand":Set(),"added":Set(["p_r_1","p_r_2","p_r_3"])}) 
        
        #test writing
        self.assertEqual(install.getAllRoutes(["p"],True),{"orphand":Set(),"added":Set(["p_r_1","p_r_2","p_r_3"])})
        with WithSession(self.engine,True) as session:
            o = Set([i[0] for i in session.query(Offer.name).all()])
            self.assertEqual(o,Set(["p_r_1","p_r_2","p_r_3"]))

        #nothing to do anymore
        self.assertEqual(install.getAllRoutes(["p"]),{"orphand":Set(),"added":Set()}) 

    def testGetAllRoutesOaA(self):
        config.main.dburl=md.dburl2
        install.createDatabase()
        self.engine = create_engine(md.dburl2)
        class TestProvider(Provider):
            def __init__(self, name):       
                Provider.__init__(self, name, {"r":["1","2","3"]})
        providers["test"]=TestProvider
        sample_config = """[p]
typ= test
test= foo
"""
        config.configParser.readfp(io.BytesIO(sample_config))

        with WithSession(self.engine,True) as session:
            session.add(Offer(provider="q",route="r",typ="t",name="test"))
            session.add(Offer(provider="q",route="r2",typ="t",name="test2"))
            session.add(Offer(provider="p",route="1",typ="r",name="foo"))
        self.assertEqual(install.getAllRoutes(["p"]),{"orphand":Set(["test","test2"]),"added":Set(["p_r_2","p_r_3"])}) 
        
        #test writing
        self.assertEqual(install.getAllRoutes(["p"],True),{"orphand":Set(["test","test2"]),"added":Set(["p_r_2","p_r_3"])})
        with WithSession(self.engine,True) as session:
            o = Set([i[0] for i in session.query(Offer.name).all()])
            self.assertEqual(o,Set(["test","test2","foo","p_r_2","p_r_3"]))

        self.assertEqual(install.getAllRoutes(["p"]),{"orphand":Set(["test","test2"]),"added":Set()})