def testProject(self):
        p = QgsProject()
        m = self.createTestMetadata()

        metadata_changed_spy = QSignalSpy(p.metadataChanged)
        p.setMetadata(m)
        self.assertEqual(len(metadata_changed_spy), 1)
        self.checkExpectedMetadata(p.metadata())

        p.clear()
        self.assertEqual(len(metadata_changed_spy), 2)
        self.assertEqual(p.metadata().title(), '')

        # test that the project title is just a shortcut to the metadata title field
        p.setTitle('my title')
        self.assertEqual(p.metadata().title(), 'my title')
        m.setTitle('my title 2')
        p.setMetadata(m)
        self.assertEqual(p.title(), 'my title 2')
    def testProject(self):
        p = QgsProject()
        m = self.createTestMetadata()

        metadata_changed_spy = QSignalSpy(p.metadataChanged)
        p.setMetadata(m)
        self.assertEqual(len(metadata_changed_spy), 1)
        self.checkExpectedMetadata(p.metadata())

        p.clear()
        self.assertEqual(len(metadata_changed_spy), 2)
        self.assertEqual(p.metadata().title(), '')

        # test that the project title is just a shortcut to the metadata title field
        p.setTitle('my title')
        self.assertEqual(p.metadata().title(), 'my title')
        m.setTitle('my title 2')
        p.setMetadata(m)
        self.assertEqual(p.title(), 'my title 2')
    def test_project_server_validator(self):
        """Test project server validator."""
        project = QgsProject()
        layer = QgsVectorLayer('Point?field=fldtxt:string', 'layer_1',
                               'memory')
        project.addMapLayers([layer])

        # Valid
        valid, results = QgsProjectServerValidator.validate(project)
        self.assertTrue(valid)
        self.assertFalse(results)

        layer_1 = QgsVectorLayer('Point?field=fldtxt:string', 'layer_1',
                                 'memory')
        project.addMapLayers([layer_1])

        # Not valid, same layer name
        valid, results = QgsProjectServerValidator.validate(project)
        self.assertFalse(valid)
        self.assertEqual(1, len(results))
        self.assertEqual(QgsProjectServerValidator.DuplicatedNames,
                         results[0].error)

        # Not valid, short name is invalid
        layer_1.setShortName('layer_1_invalid_#')
        valid, results = QgsProjectServerValidator.validate(project)
        self.assertFalse(valid)
        self.assertEqual(1, len(results))
        self.assertEqual(QgsProjectServerValidator.LayerShortName,
                         results[0].error)

        # Not valid, same short name as the first layer name
        layer_1.setShortName('layer_1')
        valid, results = QgsProjectServerValidator.validate(project)
        self.assertFalse(valid)
        self.assertEqual(1, len(results))
        self.assertEqual(QgsProjectServerValidator.DuplicatedNames,
                         results[0].error)

        # Valid
        layer_1.setShortName('layer_1_bis')
        valid, results = QgsProjectServerValidator.validate(project)
        self.assertTrue(valid)
        self.assertEqual(0, len(results))

        # Not valid, a group with same name as the first layer
        group = project.layerTreeRoot().addGroup('layer_1')
        valid, results = QgsProjectServerValidator.validate(project)
        self.assertFalse(valid)
        self.assertEqual(1, len(results))
        self.assertEqual(QgsProjectServerValidator.DuplicatedNames,
                         results[0].error)

        # Valid
        group.setCustomProperty('wmsShortName', 'my_group1')
        valid, results = QgsProjectServerValidator.validate(project)
        self.assertTrue(valid)
        self.assertEqual(0, len(results))

        # Not valid, the project title is invalid
        project.setTitle('@ layer 1')
        valid, results = QgsProjectServerValidator.validate(project)
        self.assertFalse(valid)
        self.assertEqual(1, len(results))
        self.assertEqual(QgsProjectServerValidator.ProjectShortName,
                         results[0].error)

        # Valid project title
        project.setTitle('project_title')
        valid, results = QgsProjectServerValidator.validate(project)
        self.assertTrue(valid)
        self.assertEqual(0, len(results))

        # Valid despite the bad project title, use project short name
        project.setTitle('@ layer 1')
        project.writeEntry('WMSRootName', '/', 'project_short_name')
        valid, results = QgsProjectServerValidator.validate(project)
        self.assertTrue(valid)
        self.assertEqual(0, len(results))

        # Not valid project short name
        project.setTitle('project_title')
        project.writeEntry('WMSRootName', '/', 'project with space')
        valid, results = QgsProjectServerValidator.validate(project)
        self.assertFalse(valid)
        self.assertEqual(1, len(results))
        self.assertEqual(QgsProjectServerValidator.ProjectShortName,
                         results[0].error)

        # Not valid, duplicated project short name
        project.writeEntry('WMSRootName', '/', 'layer_1')
        valid, results = QgsProjectServerValidator.validate(project)
        self.assertEqual(1, len(results))
        self.assertEqual(QgsProjectServerValidator.ProjectRootNameConflict,
                         results[0].error)