1"""QGIS Unit tests for QgsProjectServerValidator
2
3From build dir, run:
4ctest -R PyQgsProjectServerValidator -V
5
6.. note:: This program is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2 of the License, or
9(at your option) any later version.
10"""
11__author__ = 'Etienne Trimaille'
12__date__ = '27/03/2020'
13__copyright__ = 'Copyright 2020, The QGIS Project'
14
15from qgis.core import (
16    QgsProject,
17    QgsVectorLayer,
18    QgsProjectServerValidator,
19)
20from qgis.testing import start_app, unittest
21
22app = start_app()
23
24
25class TestQgsprojectServerValidator(unittest.TestCase):
26
27    def test_project_server_validator(self):
28        """Test project server validator."""
29        project = QgsProject()
30        layer = QgsVectorLayer('Point?field=fldtxt:string', 'layer_1', 'memory')
31        project.addMapLayers([layer])
32
33        # Valid
34        valid, results = QgsProjectServerValidator.validate(project)
35        self.assertTrue(valid)
36        self.assertFalse(results)
37
38        layer_1 = QgsVectorLayer('Point?field=fldtxt:string', 'layer_1', 'memory')
39        project.addMapLayers([layer_1])
40
41        # Not valid, same layer name
42        valid, results = QgsProjectServerValidator.validate(project)
43        self.assertFalse(valid)
44        self.assertEqual(1, len(results))
45        self.assertEqual(QgsProjectServerValidator.DuplicatedNames, results[0].error)
46
47        # Not valid, short name is invalid
48        layer_1.setShortName('layer_1_invalid_#')
49        valid, results = QgsProjectServerValidator.validate(project)
50        self.assertFalse(valid)
51        self.assertEqual(1, len(results))
52        self.assertEqual(QgsProjectServerValidator.LayerShortName, results[0].error)
53
54        # Not valid, same short name as the first layer name
55        layer_1.setShortName('layer_1')
56        valid, results = QgsProjectServerValidator.validate(project)
57        self.assertFalse(valid)
58        self.assertEqual(1, len(results))
59        self.assertEqual(QgsProjectServerValidator.DuplicatedNames, results[0].error)
60
61        # Valid
62        layer_1.setShortName('layer_1_bis')
63        valid, results = QgsProjectServerValidator.validate(project)
64        self.assertTrue(valid)
65        self.assertEqual(0, len(results))
66
67        # Not valid, a group with same name as the first layer
68        group = project.layerTreeRoot().addGroup('layer_1')
69        valid, results = QgsProjectServerValidator.validate(project)
70        self.assertFalse(valid)
71        self.assertEqual(1, len(results))
72        self.assertEqual(QgsProjectServerValidator.DuplicatedNames, results[0].error)
73
74        # Valid
75        group.setCustomProperty('wmsShortName', 'my_group1')
76        valid, results = QgsProjectServerValidator.validate(project)
77        self.assertTrue(valid)
78        self.assertEqual(0, len(results))
79
80        # Not valid, the project title is invalid
81        project.setTitle('@ layer 1')
82        valid, results = QgsProjectServerValidator.validate(project)
83        self.assertFalse(valid)
84        self.assertEqual(1, len(results))
85        self.assertEqual(QgsProjectServerValidator.ProjectShortName, results[0].error)
86
87        # Valid project title
88        project.setTitle('project_title')
89        valid, results = QgsProjectServerValidator.validate(project)
90        self.assertTrue(valid)
91        self.assertEqual(0, len(results))
92
93        # Valid despite the bad project title, use project short name
94        project.setTitle('@ layer 1')
95        project.writeEntry('WMSRootName', '/', 'project_short_name')
96        valid, results = QgsProjectServerValidator.validate(project)
97        self.assertTrue(valid)
98        self.assertEqual(0, len(results))
99
100        # Not valid project short name
101        project.setTitle('project_title')
102        project.writeEntry('WMSRootName', '/', 'project with space')
103        valid, results = QgsProjectServerValidator.validate(project)
104        self.assertFalse(valid)
105        self.assertEqual(1, len(results))
106        self.assertEqual(QgsProjectServerValidator.ProjectShortName, results[0].error)
107
108        # Not valid, duplicated project short name
109        project.writeEntry('WMSRootName', '/', 'layer_1')
110        valid, results = QgsProjectServerValidator.validate(project)
111        self.assertEqual(1, len(results))
112        self.assertEqual(QgsProjectServerValidator.ProjectRootNameConflict, results[0].error)
113
114
115if __name__ == '__main__':
116    unittest.main()
117