def test_handle_corrupt_xml(self):
        """
        Setup has
        1. placed  corrupt file in the cache

        Test
        1. Test file is corrupt
        1. Runs plug
        2. Test file is not corrupt
        """

        # Test file is corrupt
        os.chdir(self.pl_settings_dir)
        cpt_file = glob.glob("data.linz.govt.nz_wmts_[0-9]*.xml")[0]
        cpt_file = os.path.join(self.pl_settings_dir, cpt_file)
        is_corrupt = False
        try:
            ET.parse(cpt_file)
        except ET.ParseError:
            is_corrupt = True
        self.assertTrue(is_corrupt)
        # Run Plugin
        self.ldi.services_loaded = False
        self.ldi.actions[0].trigger()
        QTest.qWait(1000)
        # ensure all services are are present in the table
        data_types = {
            self.ldi.proxy_model.index(row, 2).data()
            for row in range(self.ldi.proxy_model.rowCount())
        }
        self.assertEqual(len(data_types), 2)
        self.assertEqual(sorted([u"WFS", u"WMTS"]), sorted(list(data_types)))
예제 #2
0
    def test_update_service_data_cache(self):
        """
        Test the updating of cache
        """

        self.ldi.services_loaded = False
        self.ldi.run()

        insitu_file_stats = {}
        cached_file_stats = {}

        os.chdir(self.pl_settings_dir)
        for service in ["wfs", "wmts"]:
            files = glob.glob("{0}_{1}*.xml".format(self.domain1, service))
            file = files[-1]
            file_path = os.path.join(self.pl_settings_dir, file)
            insitu_file_stats[file] = os.stat(file_path).st_mtime

        self.ldi.cache_updated = False
        self.ldi.update_cache = True
        self.ldi.update_service_data_cache()
        QTest.qWait(15000)

        for service in ["wfs", "wmts"]:
            files = glob.glob("{0}_{1}*.xml".format(self.domain1, service))
            file = files[-1]
            file_path = os.path.join(self.pl_settings_dir, file)
            cached_file_stats[file] = os.stat(file_path).st_mtime
        self.assertNotEqual(cached_file_stats, insitu_file_stats)
    def setUp(self):
        """
        Runs before each test
        """

        # Get reference to plugin
        self.ldi = plugins.get("linz-data-importer")

        # Dont run cache update
        self.ldi.services_loaded = False
        self.ldi.update_cache = False

        # Domain to run test against (lds only service with all WxS)
        domain = "data.linz.govt.nz"
        self.api_key_instance = self.ldi.api_key_instance
        self.api_key_instance.set_api_keys({domain: API_KEYS[domain]})

        # Test data dir and plugin settigns dir
        self.test_dir = os.path.dirname(os.path.realpath(__file__))
        self.test_data_dir = os.path.join(self.test_dir, "data")
        self.pl_settings_dir = os.path.join(
            QgsApplication.qgisSettingsDirPath(), "linz-data-importer")

        # Delete all service xml files in plugin settigns dir
        os.chdir(self.pl_settings_dir)
        cache_files = glob.glob("*_*_[0-9]*.xml")
        for file in cache_files:
            os.remove(os.path.join(self.pl_settings_dir, file))

        # Copy in /test/data service xml to save time if they exist.
        # In most cases they dont as I can not make available with API Key
        # via github. If these are not avilable wfs will be fetch for data portal
        os.chdir(self.test_data_dir)

        test_files = glob.glob("data.linz.govt.nz_*_[0-9]*.xml")
        for file in test_files:
            file = os.path.join(self.test_data_dir, file)
            # if os.path.exists(file):
            shutil.copy(file, self.pl_settings_dir)

        # Copy in corrupt file for the test
        os.chdir(self.pl_settings_dir)
        wmts_files = glob.glob("data.linz.govt.nz_wmts_*.xml")
        if wmts_files:
            os.remove(os.path.join(self.pl_settings_dir, wmts_files[0]))
        corr_file_name = "data.linz.govt.nz_wmts_corrupt.xml"
        corr_file = os.path.join(self.test_data_dir, corr_file_name)  # src
        shutil.copy(corr_file, self.pl_settings_dir)

        # Rename
        new_corr_file = os.path.join(self.pl_settings_dir, corr_file_name)
        name_file_to = os.path.join(
            self.pl_settings_dir,
            corr_file_name.replace("_corrupt", "_20181025141022"))
        os.rename(new_corr_file, name_file_to)
        QTest.qWait(WAIT)
예제 #4
0
    def tearDown(self):
        """
        Runs after each test
        """

        QTest.qWait(WAIT)  # Just because I want to watch it open and close
        self.ldi.dlg.uTextFilter.setText("")
        self.ldi.dlg.close()
        QgsProject.instance().removeAllMapLayers()
        self.ldi.clear_settings()
        self.ldi.wmts_epsg = "EPSG:3857"
        self.ldi.selection_model.blockSignals(False)
예제 #5
0
    def tearDown(self):
        """
        Runs after each test
        """

        QTest.qWait(WAIT)  # Just because I want to watch it open a close
        self.ldi.dlg.close()
        self.ldi.services_loaded = False

        # Remove filter set tab back to "ALL"
        item = self.ldi.dlg.uListOptions.findItems("ALL", Qt.MatchFixedString)[0]
        self.ldi.dlg.uListOptions.itemClicked.emit(item)
        self.assertEqual(self.ldi.dlg.uStackedWidget.currentIndex(), 0)
    def tearDown(self):
        """
        Runs after each test
        """

        QTest.qWait(WAIT)  # Just because I want to watch it open a close
        self.ldi.dlg.uTextFilter.setText("")
        self.ldi.dlg.close()
        QgsProject.instance().removeAllMapLayers()
        self.ldi.services_loaded = False
        item = self.ldi.dlg.uListOptions.findItems("ALL",
                                                   Qt.MatchFixedString)[0]
        self.ldi.dlg.uListOptions.itemClicked.emit(item)
    def import_service(self, service):
        """
        Executes tests for all "test_w<x>s_import" methods
        """

        # Select WxS table view
        item = self.ldi.dlg.uListOptions.findItems(service.upper(),
                                                   Qt.MatchFixedString)[0]
        self.ldi.dlg.uListOptions.itemClicked.emit(item)

        # Test the tableview widget is current stackedWidget
        self.assertEqual(self.ldi.dlg.uStackedWidget.currentIndex(), 0)

        # Test there is data
        self.assertNotEqual(self.ldi.table_model.rowCount(None), 0)

        # Test there is no error
        self.assertEqual(self.ldi.dlg.uLabelWarning.text(), "")

        # Ensure all records are of the selected type
        data_types = {
            self.ldi.proxy_model.index(row, 2).data()
            for row in range(self.ldi.proxy_model.rowCount())
        }
        self.assertEqual(len(data_types), 1)
        self.assertEqual(service.upper(), list(data_types)[0])

        nconfs = len(TEST_CONF[service])
        for i in range(nconfs):

            layer_name = TEST_CONF[service][i]

            # Filter
            self.ldi.dlg.uTextFilter.setText(layer_name)
            QTest.qWait(WAIT)

            # Check we have a single row in the view, upon filtering
            self.assertEqual(self.ldi.proxy_model.rowCount(), 1)

            # Import the first row
            self.ldi.dlg.uTableView.selectRow(0)
            self.ldi.dlg.uBtnImport.clicked.emit(True)

        names = [
            layer.name()
            for layer in QgsProject.instance().mapLayers().values()
        ]
        self.assertEqual(len(names), nconfs)

        # Test the LayerRegistry to ensure all the layers have been imported
        self.assertEqual(set(names), set(TEST_CONF[service]))
    def filter_domain(self, domain):
        """
        Executes tests for filtering by domain
        """

        # Select 'ALL' table view
        item = self.ldi.dlg.uListOptions.findItems("ALL",
                                                   Qt.MatchFixedString)[0]
        self.ldi.dlg.uListOptions.itemClicked.emit(item)

        # Test the tableview widget is current stackedWidget
        self.assertEqual(self.ldi.dlg.uStackedWidget.currentIndex(), 0)

        # Test there is data
        all_rows = self.ldi.table_model.rowCount(None)
        self.assertNotEqual(all_rows, 0)

        # Test there is no error
        self.assertEqual(self.ldi.dlg.uLabelWarning.text(), "")

        # Ensure the domain exists in the table
        domains = {
            self.ldi.proxy_model.index(row, 0).data()
            for row in range(self.ldi.proxy_model.rowCount())
        }
        self.assertGreater(len(domains), 0)
        self.assertIn(domain.lower(), list(domains))

        # Filter
        self.ldi.dlg.uTextFilter.setText(domain)
        QTest.qWait(WAIT)

        # Check we have more than 0 rows
        self.assertGreater(self.ldi.proxy_model.rowCount(), 0)

        # Check that we have less rows than before we applied the filter
        self.assertLess(self.ldi.proxy_model.rowCount(), all_rows)

        # Check that there is only one domain and it matches the filtered domain
        domains = {
            self.ldi.proxy_model.index(row, 0).data()
            for row in range(self.ldi.proxy_model.rowCount())
        }
        self.assertEqual(len(domains), 1)
        self.assertEqual(domain.lower(), list(domains)[0])
예제 #9
0
    def test_add_new_domain(self):
        """
        Test UI functionality for adding new settings details
        """

        idx = self.ldi.dlg.uComboBoxDomain.findText(self.domain2)
        self.ldi.dlg.uComboBoxDomain.setCurrentIndex(idx)
        self.assertEqual(self.ldi.dlg.uComboBoxDomain.currentText(),
                         self.domain2)
        # Test the method
        self.ldi.dlg.uBtnAddDomain.clicked.emit(True)
        QTest.qWait(2000)
        self.assertEqual(self.ldi.dlg.uTextDomain2.text(), self.domain2)
        # Other rows should be hidden
        for entry in range(3, 11):
            self.assertFalse(
                getattr(self.ldi.dlg,
                        "uTextDomain{0}".format(entry)).isVisible())
            self.assertFalse(
                getattr(self.ldi.dlg,
                        "uTextAPIKey{0}".format(entry)).isVisible())
    def test_should_filter_wfs_by_map_bbox(self):
        """
        Test wfs filter by bounding box of map window
        """

        layer_name = "NZ Primary Parcels"

        # Test the tableview widget is current stackedWidget
        self.assertEqual(self.ldi.dlg.uStackedWidget.currentIndex(), 0)

        # Test there is data
        self.assertNotEqual(self.ldi.table_model.rowCount(None), 0)

        # Test there is no error
        self.assertEqual(self.ldi.dlg.uLabelWarning.text(), "")

        # Filter
        self.ldi.dlg.uTextFilter.setText(layer_name)
        QTest.qWait(WAIT)

        # Check we have a single row in the view, upon filtering
        self.assertEqual(self.ldi.proxy_model.rowCount(), 1)

        # Import the first row
        self.ldi.dlg.uTableView.selectRow(0)
        self.ldi.dlg.uBtnImport.clicked.emit(True)
        QTest.qWait(WAIT)

        # Turn layer off
        layer = QgsProject.instance().mapLayersByName(layer_name)[0]
        QgsProject.instance().layerTreeRoot().findLayer(
            layer.id()).setItemVisibilityChecked(False)
        QTest.qWait(WAIT)

        # Set the map extent for testing
        canvas = iface.mapCanvas()
        test_area = QgsRectangle(176.288040, -38.144193, 176.292429,
                                 -38.141301)
        canvas.setExtent(test_area)

        # Connect to map refreshed signal
        canvas.mapCanvasRefreshed.connect(self.map_refreshed)

        # Test the layer has some features
        self.assertEqual(layer.hasFeatures(), 1)

        # Turn on the layer
        QgsProject.instance().layerTreeRoot().findLayer(
            layer.id()).setItemVisibilityChecked(True)
        QTest.qWait(WAIT)

        # Refresh the map
        UserWorkFlows.refreshed = False
        canvas.refreshAllLayers()
        QTest.qWait(MAP_REFRESH_WAIT)

        # Disconnect signal
        canvas.mapCanvasRefreshed.disconnect()

        # Assert if map has refreshed
        self.assertTrue(UserWorkFlows.refreshed)
 def tearDown(self):
     """Runs after each test"""
     QTest.qWait(WAIT)
     self.ldi.dlg.uTextFilter.setText("")
     self.ldi.dlg.close()
     self.ldi.services_loaded = False