Exemplo n.º 1
0
class Test_1_LayerManagerSetters(unittest.TestCase):

    def setUp(self): 
        testlog.debug('Instantiate null address, address.setter list')
        #self.QI = QgisInterface(_Dummy_Canvas())
        qi = ASM.getMock(ASM.ASMenum.QI)()
        controller = Controller(qi)
        self._layermanager = LayerManager(qi,controller)
        
    def tearDown(self):
        testlog.debug('Destroy null layermanager')
        self._layermanager = None        
        
    def test10_instLayerID(self):
        '''Test the layer id setter'''
        testval = 't10'
        testlog.debug('Test_1.10 Instantiate layer ID')
        testlayer = ASM.getMock(ASM.ASMenum.LAYER)(cprv=testval,vlrv=True)

        self._layermanager.setLayerId(testlayer,testval)
        self.assertEqual(self._layermanager.layerId(testlayer),testval, 'Unable to set layer ID {}'.format(testval))

    def test11_instLayerIdRange(self):
        '''Example of success/fail test cases over range of input values'''
        testlog.debug('Test_1.11 Test range of layer ID values')

        testsuccesses = ('A','Z','#$%^&_)_#@)','māori','   ')
        for ts in testsuccesses:
            testlayer = ASM.getMock(ASM.ASMenum.LAYER)(cprv=ts,vlrv=True)
            self._layermanager.setLayerId(testlayer,ts)
            self.assertEqual(self._layermanager.layerId(testlayer),ts, 'Unable to set layer ID {}'.format(ts))
            
        #NB Can't set None as on Mock property since it is interpreted as no value so must be caught
        testfailures = (None,'',0,float('nan'),float('inf'),object,self)
        for tf in testfailures:
            testlayer = ASM.getMock(ASM.ASMenum.LAYER)(cprv=tf)
            #testlayer.customProperty.return_value = tf
            self.assertRaises(InvalidParameterException, self._layermanager.setLayerId, testlayer, tf)
Exemplo n.º 2
0
class Test_2_LayerManagerConnection(unittest.TestCase):
    '''installreflayer->installlayer->findlayer->layers'''
    
    MLAYERS = (('rcl','_rclLayer'),('par','_parLayer'),('loc','_locLayer'),('adr','_adrLayer'))
    
    def setUp(self): 
        testlog.debug('Instantiate null address, address.setter list')
        #self.QI = QgisInterface(_Dummy_Canvas())
        qi = ASM.getMock(ASM.ASMenum.QI)()
        controller = Controller(qi)
        self._layermanager = LayerManager(qi,controller)
        self._layermanager.addressLayerAdded = ASM.getMock(ASM.ASMenum.SIGNAL)()
        Database.setup(DCONF)

        
    def tearDown(self):
        testlog.debug('Destroy null layermanager')
        self._layermanager = None
        Database.setup({name:None for name in DCONF})                 

    def test10_layers_m(self):
        '''tests whether a layer generator is returned and it contains valid mock layers'''
        test_layers = 3*(ASM.getMock(ASM.ASMenum.LAYER)(vlrv=True),)
        with patch(LM_QMLR) as qmlr_mock:
            qmlr_mock.instance.return_value.mapLayers.return_value.values.return_value = test_layers
            for glayer in self._layermanager.layers():
                testlog.debug('T10 - testing layer (fetch) for {}'.format(glayer))
                self.assertEqual(isinstance(glayer, ASM.getMock(ASM.ASMenum.LAYER)().__class__), True,'Object returned not a layer type')    
                
    def test11_layers(self):
        '''tests whether a layer generator is returned and it contains valid layers'''
        #TODO install test layers even though installlayer functionality is untested. in the meantime returns none
        for glayer in self._layermanager.layers():
            testlog.debug('testing layer (fetch) for {}'.format(glayer))
            self.assertEqual(isinstance(glayer, QgsVectorLayer), True,'Object returned not a layer type')
            
            
    def test20_findLayer(self):
        '''tests whether the find layer fiunction returns a named layer, uses layers() gen'''
        test_layerdict = {test_layerid:ASM.getMock(ASM.ASMenum.LAYER)(cprv=test_layerid,vlrv=True) for test_layerid in ('rcl','par','loc','adr')}
        #test_layerlist = len(test_layeridlist)*(ASM.getMock(ASM.ASMenum.LAYER)(vlrv=True),)
        #test_layerdict = {x[0]:x[1] for x in zip(test_layeridlist,test_layerlist)}
        with patch(LM_QMLR) as qmlr_mock:
            qmlr_mock.instance.return_value.mapLayers.return_value.values.return_value = test_layerdict.values()
            for test_layerid in test_layerdict:
                testlog.debug('T20 testing findlayer for layer type {}'.format(test_layerid))
                #test_layerdict[test_layerid].customProperty.return_value = test_layerid
                test_layer = self._layermanager.findLayer(test_layerid)
                self.assertEqual(isinstance(test_layer, ASM.getMock(ASM.ASMenum.LAYER)(vlrv=True).__class__), True,'Object returned not a layer type with name'.format(test_layerid))
    

    def test30_installLayers_find(self):
        '''tests install layer when layer is already installed in Qgis'''
        for test_id in [l[0] for l in self.MLAYERS]:
            test_layer = ASM.getMock(ASM.ASMenum.LAYER)(cprv=test_id,vlrv=True)
            #set up legendinterface to return legend mock!!!
            qlgd_mock =  ASM.getMock(ASM.ASMenum.QLGD)()
            self._layermanager._iface.legendInterface.return_value = qlgd_mock
    
            for lyr_vis in (True,False):
                #set legend visibility
                qlgd_mock.isLayerVisible.return_value = lyr_vis
                with patch(LM_QMLR) as qmlr_mock:
                    testlog.debug('T30 - testing installlayer 1 on layer with name {} and lgd visibility={}'.format(test_id,lyr_vis))
                    #set up findlayer to return test_layer
                    qmlr_mock.instance.return_value.mapLayers.return_value.values.return_value = [test_layer,]
                    res_layer = self._layermanager.installLayer(**getLConf(replace={'id':test_id}))
        
                    self.assertEqual(test_layer,res_layer, 'installlayers and set layers dont match on layer with name {} and lgd visibility={}'.format(test_id,lyr_vis))
                        
    def test31_installLayers_db(self):
        '''tests installlayer's fetch from database if layer not available'''
        #This doesn't test the Database fetch part of the function and just internal logic. It isn't as useful as it could be
        test_layer = ASM.getMock(ASM.ASMenum.LAYER)() 
        for test_id in [l[0] for l in self.MLAYERS]:
            #set layerid to none to bypass active fetch
            with patch(LM_QMLR) as qmlr_mock:
                qmlr_mock.instance.return_value.mapLayers.return_value.values.return_value = ()
                with patch(LM_QVL) as qvl_mock:
                    testlog.debug('T40 - testing installlayer 2 on layer with name {}'.format(test_id))
                    qvl_mock.return_value = test_layer
                    res_layer = self._layermanager.installLayer(**getLConf(replace={'displayname':test_id}))
                    self.assertEqual(test_layer, res_layer, 'installlayers and set layers dont match on fetched layer with name {}'.format(test_id))


    #now that installlayers is tested we can use this to generate test layers
        
    def test32_installLayers_tst(self):
        '''tests whether fake layers have been installed following execution of the installlayers method'''
        test_layer_id = 't32'
        test_layer = self._layermanager.installLayer(**getLConf(replace={'displayname':test_layer_id}))
        #test_layer = ASM.getMock(ASM.ASMenum.LAYER)(cprv=test_layer_id) 
        with patch(LM_QMLR) as qmlr_mock:
            testlog.debug('T32 - testing installlayers on fake layer {}'.format(test_layer_id))
            self._layermanager.setLayerId(test_layer,test_layer_id)
            qmlr_mock.instance.return_value.mapLayers.return_value.values.return_value = (test_layer,)
            found_layer = self._layermanager.findLayer(test_layer_id)
            self.assertEqual(found_layer, test_layer,'returned layer does not match set layer using name {}'.format(test_layer_id))
    
    
    def test40_installRefLayers(self):
        '''tests whether ref layers have been installed following execution of the installreflayers method'''
        ref_layers = {a:b for a,b in zip([l[0] for l in self.MLAYERS][:2], self._layermanager.installRefLayers())}
        
        with patch(LM_QMLR) as qmlr_mock:
            qmlr_mock.instance.return_value.mapLayers.return_value.values.return_value = ref_layers.values()
            for test_layerid in ref_layers:
                testlog.debug('T40 - testing installreflayers for layer type {}'.format(test_layerid))
                self._layermanager.setLayerId(ref_layers[test_layerid],test_layerid)
                found_layer = self._layermanager.findLayer(test_layerid)
                self.assertEqual(found_layer, ref_layers[test_layerid],'returned layer does not match set layer using name {}'.format(test_layerid))
    
        

    def test50_checkNewLayer(self):
        '''tests whether layer is assigned to correct attribute'''
        #NB ('adr','_adrLayer'),#can't easily test adr since it emits a signal and fails with mock parameters
        for ltype in self.MLAYERS:
            testlog.debug('T50 - testing checknewlayer layer type {}'.format(ltype[0]))
            testlayer = ASM.getMock(ASM.ASMenum.LAYER)(cprv=ltype[0])
            #TODO. consider moving id setting to local scope
            self._layermanager.setLayerId(testlayer,ltype[0])
            #testlayer.customProperty.return_value = ltype[0]
            self._layermanager.checkNewLayer(testlayer)
            self.assertEqual(self._layermanager.__getattribute__(ltype[1]),testlayer)
        
    def test60_checkRemovedLayer(self):
        '''checks layers get null'd by first installing a layer then removing it'''
        test_layerdict = {test_layerpair:ASM.getMock(ASM.ASMenum.LAYER)(idrv=test_layerpair[0],cprv=test_layerpair[0],vlrv=True) for test_layerpair in self.MLAYERS}

        for test_layerpair in test_layerdict:
            #test_layerdict[test_layerpair].id.return_value = test_layerpair[0]
            self._layermanager.setLayerId(test_layerdict[test_layerpair],test_layerpair[0])
            self._layermanager.checkNewLayer(test_layerdict[test_layerpair])
            testlog.debug('T60a - testing checkremovelayer is added, layer type {}'.format(test_layerpair[0]))
            self.assertEqual(self._layermanager.__getattribute__(test_layerpair[1]),test_layerdict[test_layerpair],'Layer not initialised')
            
            self._layermanager.checkRemovedLayer(test_layerpair[0])
            testlog.debug('T60b - testing checkremovelayer is removed, layer type {}'.format(test_layerpair[0]))
            self.assertEqual(self._layermanager.__getattribute__(test_layerpair[1]),None,'Layer not removed')
            

    def test70_createFeaturesLayers(self):
        r = {'entities':[{'properties':{'version':1,'components':{},'addressedObject':{'addressPosition':{'coordinates':(0,0)}},'codes':{}}}]}
        #pqvl = patch(LM_QVL)
        #mock_qvl = pqvl.start()
        with patch(LM_QVL) as mock_qvl:
            mock_qvl.customProperty = 'adr'
            with patch(LM_QDP) as mock_qdp:
                with patch(LM_QF) as mock_qf:
                    #with patch(LM_QG) as mock_qg:
                        #mock_qg.fromPoint.return_value = ASM.getMock(ASM.ASMenum.GEOMETRY)()
                        #with patch(LM_QP) as mock_qp:
                            #mock_qp.return_value = ASM.getMock(ASM.ASMenum.POINT)()
                    with patch(LM_QMLR) as mock_qmlr:
                        self._layermanager.createFeaturesLayers(r)
                        #this method doesn't return anything testable so this test method just makes sure it runs without error given minimal input
                        self.assertEqual(True,True,'this cant be false')
                        
    
    def test_80_getAimsFeatures(self):
        self._layermanager._iface.mapCanvas.return_value.extent.return_value = 1000#ext?
        
    def test90_loadAimsFeatures(self):
        self._layermanager._iface.mapCanvas.return_value.mapSettings.return_value.scale.return_value = 9999999
        self._layermanager.loadAimsFeatures()
        self.assertEqual(1,1,'1')