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)))
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)
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)
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])
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