Skip to content

Commit

Permalink
Added test case for QgsPolymorphicRelation
Browse files Browse the repository at this point in the history
  • Loading branch information
suricactus committed Jan 12, 2021
1 parent 53ca67a commit 2f5acf2
Show file tree
Hide file tree
Showing 2 changed files with 238 additions and 0 deletions.
1 change: 1 addition & 0 deletions tests/src/python/CMakeLists.txt
Expand Up @@ -258,6 +258,7 @@ ADD_PYTHON_TEST(PyQgsRatioLockButton test_qgsratiolockbutton.py)
ADD_PYTHON_TEST(PyQgsRectangle test_qgsrectangle.py)
ADD_PYTHON_TEST(PyQgsReferencedGeometry test_qgsreferencedgeometry.py)
ADD_PYTHON_TEST(PyQgsRelation test_qgsrelation.py)
ADD_PYTHON_TEST(PyQgsPolymorphicRelation test_qgspolymorphicrelation.py)
ADD_PYTHON_TEST(PyQgsRelationManager test_qgsrelationmanager.py)
ADD_PYTHON_TEST(PyQgsProjectRelationManager test_qgsprojectrelationmanager.py)
ADD_PYTHON_TEST(PyQgsRenderContext test_qgsrendercontext.py)
Expand Down
237 changes: 237 additions & 0 deletions tests/src/python/test_qgspolymorphicrelation.py
@@ -0,0 +1,237 @@
# -*- coding: utf-8 -*-
"""QGIS Unit tests for QgsPolymorphicRelation.
.. note:: This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
"""
__author__ = 'Ivan Ivanov'
__date__ = '11/1/2021'
__copyright__ = 'Copyright 2021, QGIS Project'

import qgis # NOQA

from qgis.core import (QgsVectorLayer,
QgsFeature,
QgsPolymorphicRelation,
QgsGeometry,
QgsPointXY,
QgsAttributeEditorElement,
QgsAttributeEditorRelation,
QgsProject
)
from qgis.testing import start_app, unittest
import os

start_app()


def createReferencingLayer():
layer = QgsVectorLayer("NoGeometry?field=fid:integer&field=referenced_layer:string&field=referenced_fid:string&field=url:string",
"referencinglayer", "memory")
assert layer.isValid()
f1 = QgsFeature()
f1.setFields(layer.fields())
f1.setAttributes([1, "referencedlayer1", "foo", "./file1.jpg"])
f2 = QgsFeature()
f2.setFields(layer.fields())
f2.setAttributes([2, "referencedlayer1", "foo", "./file2.jpg"])
f3 = QgsFeature()
f3.setFields(layer.fields())
f3.setAttributes([3, "referencedlayer1", "bar", "./file3.jpg"])
f4 = QgsFeature()
f4.setFields(layer.fields())
f4.setAttributes([4, "referencedlayer2", "foobar'bar", "./file4.jpg"])
assert layer.dataProvider().addFeatures([f1, f2, f3, f4])
return layer


def createReferencedLayer(layer_name):
layer = QgsVectorLayer(
"Point?field=fid:string&field=value:integer",
layer_name, "memory")
assert layer.isValid()
f1 = QgsFeature()
f1.setFields(layer.fields())
f1.setAttributes(["foo", 123])
f1.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(1, 1)))
f2 = QgsFeature()
f2.setFields(layer.fields())
f2.setAttributes(["bar", 456])
f2.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(2, 2)))
f3 = QgsFeature()
f3.setFields(layer.fields())
f3.setAttributes(["foobar'bar", 789])
f3.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(2, 3)))
assert layer.dataProvider().addFeatures([f1, f2, f3])
return layer


def formatAttributes(attrs):
return repr([str(a) for a in attrs])


class TestQgsRelation(unittest.TestCase):

def setUp(self):
self.referencedLayer1 = createReferencedLayer('referencedlayer1')
self.referencedLayer2 = createReferencedLayer('referencedlayer2')
self.referencingLayer = createReferencingLayer()
QgsProject.instance().addMapLayers([self.referencedLayer1, self.referencedLayer2, self.referencingLayer])

def tearDown(self):
QgsProject.instance().removeAllMapLayers()

def test_isValid(self):
poly_rel = QgsPolymorphicRelation()
self.assertFalse(poly_rel.isValid())

poly_rel.setId('poly_rel1')
self.assertFalse(poly_rel.isValid())

poly_rel.setName('Polymorphic Relation Number One')
self.assertFalse(poly_rel.isValid())

poly_rel.setReferencingLayer(self.referencingLayer.id())
self.assertFalse(poly_rel.isValid())

poly_rel.setReferencedLayerIds([self.referencedLayer1.id(), self.referencedLayer2.id()])
self.assertFalse(poly_rel.isValid())

poly_rel.setReferencedLayerField('referenced_layer')
self.assertFalse(poly_rel.isValid())

poly_rel.setReferencedLayerExpression('@layer_name')
self.assertFalse(poly_rel.isValid())

poly_rel.addFieldPair('referenced_fid', 'fid')
self.assertTrue(poly_rel.isValid())

def test_setId(self):
poly_rel = QgsPolymorphicRelation()
self.assertEqual(poly_rel.id(), '')
poly_rel.setId('poly_rel_1')
self.assertEqual(poly_rel.id(), 'poly_rel_1')

def test_setName(self):
poly_rel = QgsPolymorphicRelation()
self.assertEqual(poly_rel.name(), 'Polymorphic relations for "<NO LAYER>"')
poly_rel.setReferencingLayer(self.referencingLayer.id())
self.assertEqual(poly_rel.name(), 'Polymorphic relations for "referencinglayer"')
poly_rel.setName('Polymorphic Relation 1')
self.assertEqual(poly_rel.name(), 'Polymorphic Relation 1')

def test_setReferencingLayer(self):
poly_rel = QgsPolymorphicRelation()
self.assertEqual(poly_rel.referencingLayerId(), '')
poly_rel.setReferencingLayer(self.referencingLayer.id())
self.assertEqual(poly_rel.referencingLayerId(), self.referencingLayer.id())

def test_setReferencedLayerIds(self):
poly_rel = QgsPolymorphicRelation()
self.assertListEqual(poly_rel.referencedLayerIds(), [])
poly_rel.setReferencedLayerIds([self.referencedLayer1.id(), self.referencedLayer2.id()])
self.assertListEqual(poly_rel.referencedLayerIds(), [self.referencedLayer1.id(), self.referencedLayer2.id()])

def test_setReferencedLayerField(self):
poly_rel = QgsPolymorphicRelation()
self.assertEqual(poly_rel.referencedLayerField(), '')
poly_rel.setReferencedLayerField(self.referencingLayer.id())
self.assertEqual(poly_rel.referencedLayerField(), self.referencingLayer.id())

def test_setReferencedLayerExpression(self):
poly_rel = QgsPolymorphicRelation()
self.assertEqual(poly_rel.referencedLayerExpression(), '')
poly_rel.setReferencedLayerExpression('@layer_name')
self.assertEqual(poly_rel.referencedLayerExpression(), '@layer_name')

def test_addFieldPair(self):
poly_rel = QgsPolymorphicRelation()
self.assertEqual(poly_rel.fieldPairs(), {})
poly_rel.addFieldPair('referenced_fid', 'fid')
self.assertEqual(poly_rel.fieldPairs(), {'referenced_fid': 'fid'})

def test_layerRepresentation(self):
poly_rel = QgsPolymorphicRelation()
poly_rel.setId('poly_rel1')
poly_rel.setName('Polymorphic Relation Number One')
poly_rel.setReferencingLayer(self.referencingLayer.id())
poly_rel.setReferencedLayerIds([self.referencedLayer1.id(), self.referencedLayer2.id()])
poly_rel.setReferencedLayerField('referenced_layer')
poly_rel.setReferencedLayerExpression('@layer_name')
poly_rel.addFieldPair('referenced_fid', 'fid')

self.assertEqual(poly_rel.layerRepresentation(self.referencedLayer1), 'referencedlayer1')

def test_getGeneratedRelations(self):
poly_rel = QgsPolymorphicRelation()
poly_rel.setId('poly_rel1')
poly_rel.setName('Polymorphic Relation Number One')
poly_rel.setReferencingLayer(self.referencingLayer.id())
poly_rel.setReferencedLayerIds([self.referencedLayer1.id(), self.referencedLayer2.id()])
poly_rel.setReferencedLayerField('referenced_layer')
poly_rel.setReferencedLayerExpression('@layer_name')
poly_rel.addFieldPair('referenced_fid', 'fid')

QgsProject.instance().relationManager().addPolymorphicRelation(poly_rel)

self.assertTrue(poly_rel.isValid())

rels = poly_rel.getGeneratedRelations()

self.assertEqual(len(rels), 2)

rel1, rel2 = rels

self.assertTrue(rel1.isValid())
self.assertEqual(rel1.polymorphicRelationId(), poly_rel.id())
self.assertEqual(rel1.referencingLayer(), poly_rel.referencingLayer())
self.assertEqual(rel1.referencedLayer(), self.referencedLayer1)
self.assertEqual(rel1.fieldPairs(), {'referenced_fid': 'fid'})

features = list(self.referencedLayer1.getFeatures())
self.assertEqual(len(features), 3)
self.assertEqual(rel1.getRelatedFeaturesFilter(features[0]), '"referenced_layer" = \'referencedlayer1\' AND "referenced_fid" = \'foo\'')
it = rel1.getRelatedFeatures(features[0])
self.assertListEqual([f.attributes() for f in it], [
[1, 'referencedlayer1', 'foo', './file1.jpg'],
[2, 'referencedlayer1', 'foo', './file2.jpg'],
])

self.assertEqual(rel1.getRelatedFeaturesFilter(features[1]), '"referenced_layer" = \'referencedlayer1\' AND "referenced_fid" = \'bar\'')
it = rel1.getRelatedFeatures(features[1])
self.assertListEqual([f.attributes() for f in it], [
[3, 'referencedlayer1', 'bar', './file3.jpg'],
])

self.assertEqual(rel1.getRelatedFeaturesFilter(features[2]), '"referenced_layer" = \'referencedlayer1\' AND "referenced_fid" = \'foobar\'\'bar\'')
it = rel1.getRelatedFeatures(features[2])
self.assertListEqual([f.attributes() for f in it], [])

self.assertTrue(rel2.isValid())
self.assertEqual(rel2.polymorphicRelationId(), poly_rel.id())
self.assertEqual(rel2.polymorphicRelationId(), poly_rel.id())
self.assertEqual(rel2.referencingLayer(), poly_rel.referencingLayer())
self.assertEqual(rel2.referencedLayer(), self.referencedLayer2)
self.assertEqual(rel2.fieldPairs(), {'referenced_fid': 'fid'})

features = list(self.referencedLayer2.getFeatures())
self.assertEqual(len(features), 3)
self.assertEqual(rel2.getRelatedFeaturesFilter(features[0]), '"referenced_layer" = \'referencedlayer2\' AND "referenced_fid" = \'foo\'')
it = rel2.getRelatedFeatures(features[0])
self.assertListEqual([f.attributes() for f in it], [])

self.assertEqual(rel2.getRelatedFeaturesFilter(features[1]), '"referenced_layer" = \'referencedlayer2\' AND "referenced_fid" = \'bar\'')
it = rel2.getRelatedFeatures(features[1])
self.assertListEqual([f.attributes() for f in it], [])

self.assertEqual(rel2.getRelatedFeaturesFilter(features[2]), '"referenced_layer" = \'referencedlayer2\' AND "referenced_fid" = \'foobar\'\'bar\'')
it = rel2.getRelatedFeatures(features[2])
self.assertListEqual([f.attributes() for f in it], [
[4, 'referencedlayer2', "foobar'bar", './file4.jpg']
])


if __name__ == '__main__':
unittest.main()

0 comments on commit 2f5acf2

Please sign in to comment.