Ejemplo n.º 1
0
def upload_tiff(dir, region, geoserver_rest_url, workspace, uname, pwd):

    headers = {
        'Content-type': 'image/tiff',
    }
    spatial_data_engine = GeoServerSpatialDatasetEngine(
        endpoint=geoserver_rest_url, username=uname, password=pwd)

    #Check if workspace exists
    ws_name = workspace
    geoserver_uri = 'www.google.com'
    response = spatial_data_engine.list_workspaces()

    if response['success']:
        workspaces = response['result']

        if ws_name not in workspaces:
            spatial_data_engine.create_workspace(workspace_id=ws_name,
                                                 uri=geoserver_uri)
    for file in os.listdir(
            dir):  #Looping through all the files in the given directory
        if file is None:
            print "No files. Please check directory and try again."
            sys.exit()
        data = open(dir + file, 'rb').read()  #Read the file
        store_name = file.split(
            '.')[0] + '_' + region  #Creating the store name dynamically
        request_url = '{0}workspaces/{1}/coveragestores/{2}/file.geotiff'.format(
            geoserver_rest_url, ws_name, store_name)  #Creating the rest url
        requests.put(request_url,
                     headers=headers,
                     data=data,
                     auth=(uname,
                           pwd))  #Creating the resource on the geoserver
def addZippedTif2Geoserver(geosvr_url_base, uname, upwd, ws_name, store_name, zippedTif_full_path, res_url):

        try:
            geosvr_url_full = geosvr_url_base+"/geoserver/rest/"
            print "GeoServer REST Full URL: "+geosvr_url_full
            coverage_file = zippedTif_full_path

            print "Connect to Geoserver"
            spatial_dataset_engine = GeoServerSpatialDatasetEngine(endpoint=geosvr_url_full, username=uname, password=upwd)
            print "Connected"

            response = None
            result = spatial_dataset_engine.create_workspace(workspace_id=ws_name, uri=res_url)
            if result['success']:
                print "Create workspace " + ws_name + " successfully"
            else:
                print "Create workspace " + ws_name + " failed"
            print result

            store_id = ws_name + ":" + store_name

            result = None
            result = spatial_dataset_engine.create_coverage_resource(store_id=store_id, coverage_file=coverage_file, coverage_type='geotiff')
            if result['success']:
                print "Create store " + store_name + " successfully"
            else:
                print "Create store " + store_name + " failed"
            print result

            spatial_dataset_engine.list_layers(debug=True)

            return True
        except:
            print ("addZippedTif2Geoserver() error")
            return False
Ejemplo n.º 3
0
def region_delete(request):
    """
    Controller for deleting a region.
    """
    if request.is_ajax() and request.method == 'POST':
        # get/check information from AJAX request
        post_info = request.POST
        region_id = post_info.get('region_id')

        # initialize session
        Session = Grace.get_persistent_store_database('main_db',
                                                      as_sessionmaker=True)
        session = Session()
        try:
            # delete region
            try:
                region = session.query(Region).get(region_id)
            except ObjectDeletedError:
                session.close()
                return JsonResponse(
                    {'error': "The geoserver to delete does not exist."})
            display_name = region.display_name
            region_store = ''.join(display_name.split()).lower()
            geoserver_id = region.geoserver_id
            geoserver = session.query(Geoserver).get(geoserver_id)
            geoserver_url = geoserver.url
            uname = geoserver.username
            pwd = geoserver.password

            spatial_dataset_engine = GeoServerSpatialDatasetEngine(
                endpoint=geoserver_url, username=uname, password=pwd)

            stores = spatial_dataset_engine.list_stores()

            for store in stores['result']:
                if store.endswith(region_store):
                    spatial_dataset_engine.delete_store(store,
                                                        purge=True,
                                                        recurse=True)

            FILE_DIR = os.path.join(GRACE_NETCDF_DIR, '')

            region_dir = os.path.join(FILE_DIR + region_store, '')

            session.delete(region)
            session.commit()
            session.close()
        except IntegrityError:
            session.close()
            return JsonResponse({
                'error':
                "This geoserver is connected with a watershed! Must remove connection to delete."
            })
        finally:
            # Delete the temporary directory once the geojson string is created
            if region_dir is not None:
                if os.path.exists(region_dir):
                    shutil.rmtree(region_dir)
        return JsonResponse({'success': "Region sucessfully deleted!"})
    return JsonResponse({'error': "A problem with your request exists."})
Ejemplo n.º 4
0
    def setUp(self):
        # Globals
        self.debug = False

        # Files
        self.tests_root = os.path.abspath(os.path.dirname(__file__))
        self.files_root = os.path.join(self.tests_root, 'files')
        self.shapefile_name = 'test'
        self.shapefile_base = os.path.join(self.files_root, 'shapefile',
                                           self.shapefile_name)

        # Create Test Engine
        self.engine = GeoServerSpatialDatasetEngine(
            endpoint=TEST_GEOSERVER_DATASET_SERVICE['ENDPOINT'],
            username=TEST_GEOSERVER_DATASET_SERVICE['USERNAME'],
            password=TEST_GEOSERVER_DATASET_SERVICE['PASSWORD'])

        # Create Test Workspaces
        # self.test_resource_workspace = random_string_generator(10)
        self.test_resource_workspace = random_string_generator(10)
        self.engine.create_workspace(workspace_id=self.test_resource_workspace,
                                     uri=random_string_generator(5))

        # Create Test Stores/Resources/Layers
        ## Shapefile

        # Store name
        self.test_resource_store = random_string_generator(10)

        # Resource and Layer will take the name of the file
        self.test_resource_name = self.test_resource_store
        self.test_layer_name = self.test_resource_store

        # Identifiers of the form 'workspace:item'
        self.test_store_identifier = '{0}:{1}'.format(
            self.test_resource_workspace, self.test_resource_store)
        self.test_resource_identifier = '{0}:{1}'.format(
            self.test_resource_workspace, self.test_resource_name)

        # Do create shapefile
        self.engine.create_shapefile_resource(
            self.test_store_identifier,
            shapefile_base=self.shapefile_base,
            overwrite=True)

        ## Coverage

        # Create Test Style
        self.test_style_name = 'point'

        # Create Test Layer Groups
        self.test_layer_group_name = random_string_generator(10)
        self.engine.create_layer_group(
            layer_group_id=self.test_layer_group_name,
            layers=(self.test_layer_name, ),
            styles=(self.test_style_name, ))

        # Pause
        pause(10)
Ejemplo n.º 5
0
 def get_engine(self):
     """
     Retrives GeoServer engine
     """
     engine = GeoServerSpatialDatasetEngine(endpoint=self.endpoint,
                                            username=self.username,
                                            password=self.password)
     engine.public_endpoint = self.public_endpoint
     return engine
Ejemplo n.º 6
0
 def get_engine(self):
     """
     Retrives GeoServer engine
     """
     engine = GeoServerSpatialDatasetEngine(endpoint=self.endpoint,
                                            username=self.username,
                                            password=self.password)
     engine.public_endpoint = self.public_endpoint
     return engine
Ejemplo n.º 7
0
    def setUp(self):
        # Files
        self.tests_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        self.files_root = os.path.join(self.tests_root, 'files')

        # GeoServer
        self.gs_endpoint = TEST_GEOSERVER_DATASET_SERVICE['ENDPOINT']
        self.gs_username = TEST_GEOSERVER_DATASET_SERVICE['USERNAME']
        self.gs_password = TEST_GEOSERVER_DATASET_SERVICE['PASSWORD']
        self.catalog = GeoServerCatalog(self.gs_endpoint, username=self.gs_username, password=self.gs_password)

        # Postgis
        self.pg_username = TEST_POSTGIS_SERVICE['USERNAME']
        self.pg_password = TEST_POSTGIS_SERVICE['PASSWORD']
        self.pg_database = TEST_POSTGIS_SERVICE['DATABASE']
        self.pg_table_name = 'points'
        self.pg_host = TEST_POSTGIS_SERVICE['HOST']
        self.pg_port = TEST_POSTGIS_SERVICE['PORT']
        self.pg_url = TEST_POSTGIS_SERVICE['URL']
        self.pg_public_url = TEST_POSTGIS_SERVICE['PUBLIC_URL']

        # Setup a testing workspace
        self.workspace_name = random_string_generator(10)
        self.workspace_uri = 'http://www.tethysplatform.org/{}'.format(self.workspace_name)

        retries = 5
        while retries > 0:
            try:
                self.catalog.create_workspace(self.workspace_name, self.workspace_uri)
                break
            except AssertionError as e:
                if 'Error persisting' in str(e) and retries > 0:
                    print("WARNING: FAILED TO PERSIST WORKSPACE.")
                    retries -= 1
                else:
                    raise

        # Setup Postgis database connection
        self.public_engine = create_engine(self.pg_public_url)
        self.connection = self.public_engine.connect()
        self.transaction = self.connection.begin()

        # Create GeoServer Engine
        self.endpoint = TEST_GEOSERVER_DATASET_SERVICE['ENDPOINT']
        self.geoserver_engine = GeoServerSpatialDatasetEngine(endpoint=self.endpoint,
                                                              username=TEST_GEOSERVER_DATASET_SERVICE['USERNAME'],
                                                              password=TEST_GEOSERVER_DATASET_SERVICE['PASSWORD'])

        self.geometry_column = 'geometry'
        self.geometry_type = 'Point'
        self.srid = 4326
Ejemplo n.º 8
0
def upload_files_to_geoserver(filepaths, geoserver_uri,
                              geoserver_rest_endpoint_url, workspace, username,
                              password):

    if type(geoserver_uri) is unicode:
        geoserver_uri = str(geoserver_uri)

    if type(geoserver_rest_endpoint_url) is unicode:
        geoserver_rest_endpoint_url = str(geoserver_rest_endpoint_url)

    if type(workspace) is unicode:
        workspace = str(workspace)

    if type(username) is unicode:
        username = str(username)

    if type(password) is unicode:
        password = str(password)

    geoserver_engine = GeoServerSpatialDatasetEngine(
        endpoint=geoserver_rest_endpoint_url,
        username=username,
        password=password)
    #create workspace

    response = geoserver_engine.list_workspaces()

    if response['success']:
        workspaces = response['result']

    if workspace not in workspaces:
        print "I did something"
        response = geoserver_engine.create_workspace(workspace_id=workspace,
                                                     uri=geoserver_uri)

    #upload to geoserver
    for filename in filepaths:

        store = filename.split("\\")[-1]
        store_id = workspace + ':' + store

        print 'uploading ' + filename + ' to store ' + store_id + '...'

        response = geoserver_engine.create_coverage_resource(
            store_id=store_id,
            coverage_file=filename,
            coverage_type='worldimage',
            overwrite=True,
            debug=True)

    return
Ejemplo n.º 9
0
def upload_files_to_geoserver(filepaths, geoserver_uri, geoserver_rest_endpoint_url, workspace, username, password):

    if type(geoserver_uri) is unicode:
        geoserver_uri = str(geoserver_uri)

    if type(geoserver_rest_endpoint_url) is unicode:
        geoserver_rest_endpoint_url = str(geoserver_rest_endpoint_url)

    if type(workspace) is unicode:
        workspace = str(workspace)
            
    if type(username) is unicode:
        username = str(username)

    if type(password) is unicode:
        password = str(password)

   
    geoserver_engine = GeoServerSpatialDatasetEngine(endpoint=geoserver_rest_endpoint_url, 
                                                     username=username, password=password)
    #create workspace

    response = geoserver_engine.list_workspaces()

    if response['success']:
        workspaces = response['result']

    if workspace not in workspaces:
        print "I did something"
        response = geoserver_engine.create_workspace(workspace_id=workspace,uri=geoserver_uri)


    #upload to geoserver
    for filename in filepaths:

        store = filename.split("\\")[-1]
        store_id = workspace + ':' + store

        print 'uploading ' + filename + ' to store ' + store_id + '...'
       
        response = geoserver_engine.create_coverage_resource(store_id=store_id,
                                                              coverage_file = filename,
                                                              coverage_type='worldimage',
                                                              overwrite=True,
                                                              debug=True)
        
    return
Ejemplo n.º 10
0
def geoserver_update(request):
    """
    Controller for updating a geoserver.
    """
    if request.is_ajax() and request.method == 'POST':
        # get/check information from AJAX request
        post_info = request.POST
        geoserver_id = post_info.get('geoserver_id')
        geoserver_name = post_info.get('geoserver_name')
        geoserver_url = post_info.get('geoserver_url')
        geoserver_username = post_info.get('geoserver_username')
        geoserver_password = post_info.get('geoserver_password')
        # check data
        if not geoserver_id or not geoserver_name or not geoserver_url or not \
                geoserver_username or not geoserver_password:
            return JsonResponse({'error': "Missing input data."})
        # make sure id is id
        try:
            int(geoserver_id)
        except ValueError:
            return JsonResponse({'error': 'Geoserver id is faulty.'})

        Session = Grace.get_persistent_store_database('main_db',
                                                      as_sessionmaker=True)
        session = Session()

        geoserver = session.query(Geoserver).get(geoserver_id)
        try:
            spatial_dataset_engine = GeoServerSpatialDatasetEngine(
                endpoint=geoserver_url,
                username=geoserver_username,
                password=geoserver_password)
            layer_list = spatial_dataset_engine.list_layers(debug=True)
            if layer_list:

                geoserver.geoserver_name = geoserver_name
                geoserver.geoserver_url = geoserver_url
                geoserver.geoserver_username = geoserver_username
                geoserver.geoserver_password = geoserver_password

                session.commit()
                session.close()
                return JsonResponse(
                    {'success': "Geoserver sucessfully updated!"})
        except:
            return JsonResponse(
                {'error': "A problem with your request exists."})
Ejemplo n.º 11
0
def addZippedShp2Geoserver(geosvr_url_base, uname, upwd, ws_name, store_name, zippedTif_full_path, res_url):

        try:
            # Specifying the full REST url
            geosvr_url_full = geosvr_url_base+"/geoserver/rest/"
            print "GeoServer REST Full URL: "+ geosvr_url_full
            print "Connect to Geoserver"

            # First get the engine
            spatial_dataset_engine = GeoServerSpatialDatasetEngine(endpoint=geosvr_url_full, username=uname, password=upwd)
            print "Connected"

            response = None
            # Creating the workspace
            result = spatial_dataset_engine.create_workspace(workspace_id=ws_name, uri=res_url)
            if result['success']:
                print "Create workspace " + ws_name + " successfully"
            else:
                print "Create workspace " + ws_name + " failed"
            print result

            store_id = ws_name+":"+store_name

            # Path to the shapefile base
            coverage_file = zippedTif_full_path
            print  zippedTif_full_path

            # Creating a workspace for registering a shapefile in the geoserver
            result = spatial_dataset_engine.create_shapefile_resource(store_id=store_id, shapefile_base=coverage_file)

            # Check if it was successful
            if result['success']:
                print "Create store " + store_name + " successfully"
            else:
                print "Create store " + store_name + " failed"
            print result

            # Debugging
            spatial_dataset_engine.list_layers(debug=True)

            return True
        except:
            print ("addZippedShp2Geoserver() error")
            raise Exception("addZippedShp2Geoserver() error")
Ejemplo n.º 12
0
    def get_engine(self):
        """
        Retrieves spatial dataset engine
        """
        engine = None

        if self.engine == self.GEOSERVER:
            engine = GeoServerSpatialDatasetEngine(endpoint=self.endpoint,
                                                   username=self.username,
                                                   password=self.password)
            engine.public_endpoint = self.public_endpoint

        elif self.engine == self.THREDDS:
            if self.username and self.password:
                session_manager.set_session_options(auth=(str(self.username),
                                                          str(self.password)))

            catalog_endpoint = str(self.endpoint).rstrip('/') + '/catalog.xml'
            engine = TDSCatalog(str(catalog_endpoint))

        return engine
    def setUp(self):
        # Globals
        self.debug = False

        # Files
        self.tests_root = os.path.abspath(os.path.dirname(__file__))
        self.files_root = os.path.join(self.tests_root, 'files')
        self.shapefile_name = 'test'
        self.shapefile_base = os.path.join(self.files_root, 'shapefile', self.shapefile_name)

        # Create Test Engine
        self.engine = GeoServerSpatialDatasetEngine(endpoint=TEST_GEOSERVER_DATASET_SERVICE['ENDPOINT'],
                                                    username=TEST_GEOSERVER_DATASET_SERVICE['USERNAME'],
                                                    password=TEST_GEOSERVER_DATASET_SERVICE['PASSWORD'])

        # Create Test Workspaces
        # self.test_resource_workspace = random_string_generator(10)
        self.test_resource_workspace = random_string_generator(10)
        self.engine.create_workspace(workspace_id=self.test_resource_workspace, uri=random_string_generator(5))

        # Create Test Stores/Resources/Layers
        ## Shapefile

        # Store name
        self.test_resource_store = random_string_generator(10)

        # Resource and Layer will take the name of the file
        self.test_resource_name = self.test_resource_store
        self.test_layer_name = self.test_resource_store

        # Identifiers of the form 'workspace:item'
        self.test_store_identifier = '{0}:{1}'.format(self.test_resource_workspace, self.test_resource_store)
        self.test_resource_identifier = '{0}:{1}'.format(self.test_resource_workspace, self.test_resource_name)

        # Do create shapefile
        self.engine.create_shapefile_resource(self.test_store_identifier, shapefile_base=self.shapefile_base,
                                              overwrite=True)

        ## Coverage

        # Create Test Style
        self.test_style_name = 'point'

        # Create Test Layer Groups
        self.test_layer_group_name = random_string_generator(10)
        self.engine.create_layer_group(layer_group_id=self.test_layer_group_name,
                                       layers=(self.test_layer_name,),
                                       styles=(self.test_style_name,))

        # Pause
        pause(10)
Ejemplo n.º 14
0
def geoserver_add(request):

    response = {}

    if request.is_ajax() and request.method == 'POST':
        info = request.POST

        geoserver_name = info.get('geoserver_name')
        geoserver_url = info.get('geoserver_url')
        geoserver_username = info.get('geoserver_username')
        geoserver_password = info.get('geoserver_password')

        try:
            spatial_dataset_engine = GeoServerSpatialDatasetEngine(
                endpoint=geoserver_url,
                username=geoserver_username,
                password=geoserver_password)
            layer_list = spatial_dataset_engine.list_layers(debug=True)
            if layer_list:
                Session = Grace.get_persistent_store_database(
                    'main_db', as_sessionmaker=True)
                session = Session()
                geoserver = Geoserver(name=geoserver_name,
                                      url=geoserver_url,
                                      username=geoserver_username,
                                      password=geoserver_password)
                session.add(geoserver)
                session.commit()
                session.close()
                response = {"data": geoserver_name, "success": "Success"}
        except:
            response = {
                "error":
                "Error processing the Geoserver URL. Please check the url,username and password."
            }

        return JsonResponse(response)
Ejemplo n.º 15
0
def delete_old_watershed_geoserver_files(watershed):
    """
    Removes old watershed geoserver files from system
    """
    engine = GeoServerSpatialDatasetEngine(
        endpoint="%s/rest" % watershed.geoserver.url,
        username=watershed.geoserver.username,
        password=watershed.geoserver.password)

    if watershed.geoserver_drainage_line_uploaded:
        purge_remove_geoserver_layer(watershed.geoserver_drainage_line_layer,
                                     engine)

    if watershed.geoserver_catchment_uploaded:
        purge_remove_geoserver_layer(watershed.geoserver_catchment_layer,
                                     engine)

    if watershed.geoserver_gage_uploaded:
        purge_remove_geoserver_layer(watershed.geoserver_gage_layer, engine)

    if watershed.geoserver_ahps_station_uploaded:
        purge_remove_geoserver_layer(watershed.geoserver_ahps_station_layer,
                                     engine)
Ejemplo n.º 16
0
def addZippedShapefile2Geoserver(geosvr_url_base, uname, upwd, ws_name,
                                 store_name, zippedTif_full_path, res_url):

    try:
        geosvr_url_full = geosvr_url_base + "/geoserver/rest/"
        logger.debug("GeoServer REST Full URL: " + geosvr_url_full)
        coverage_file = zippedTif_full_path

        logger.debug("Connect to Geoserver")
        spatial_dataset_engine = GeoServerSpatialDatasetEngine(
            endpoint=geosvr_url_full, username=uname, password=upwd)
        logger.debug("Connected")

        response = None
        result = spatial_dataset_engine.create_workspace(workspace_id=ws_name,
                                                         uri=res_url)
        if result['success']:
            logger.debug("Create workspace " + ws_name + " successfully")
        else:
            logger.debug("Create workspace " + ws_name + " failed")
        logger.debug(result)

        store_id = ws_name + ":" + store_name

        result = None
        result = spatial_dataset_engine.create_shapefile_resource(
            store_id=store_id, shapefile_zip=coverage_file)
        if result['success']:
            logger.debug("Create store " + store_name + " successfully")
        else:
            logger.debug("Create store " + store_name + " failed")
            logger.debug(result)

        spatial_dataset_engine.list_layers(debug=True)

        return True
    except:
        logger.exception("addZippedTif2Geoserver() error")
        return False
Ejemplo n.º 17
0
def delete(request):
    list = {}

    session = SessionMaker()

    # Query DB for hydroservers
    if request.is_ajax() and request.method == 'POST':
        title = request.POST['server']
        geo_url = geo_url_base + "/geoserver/rest/"
        spatial_dataset_engine = GeoServerSpatialDatasetEngine(
            endpoint=geo_url, username=geo_user, password=geo_pw)
        store_string = "catalog" + ":" + str(title)
        spatial_dataset_engine.delete_layer(layer_id=store_string, purge=True)
        spatial_dataset_engine.delete_store(store_id=store_string, purge=True)
        hydroservers = session.query(Catalog).filter(
            Catalog.title == title).delete(synchronize_session='evaluate')
        session.commit()
        session.close()

        # spatial_dataset_engine.delete_store(title,purge=True,debug=True)
        list["title"] = title
    return JsonResponse(list)
Ejemplo n.º 18
0
class TestGeoServerDatasetEngine(unittest.TestCase):
    def setUp(self):
        # Globals
        self.debug = False

        # Files
        self.tests_root = os.path.abspath(os.path.dirname(__file__))
        self.files_root = os.path.join(self.tests_root, 'files')
        self.shapefile_name = 'test'
        self.shapefile_base = os.path.join(self.files_root, 'shapefile',
                                           self.shapefile_name)

        # Create Test Engine
        self.engine = GeoServerSpatialDatasetEngine(
            endpoint=TEST_GEOSERVER_DATASET_SERVICE['ENDPOINT'],
            username=TEST_GEOSERVER_DATASET_SERVICE['USERNAME'],
            password=TEST_GEOSERVER_DATASET_SERVICE['PASSWORD'])

        # Create Test Workspaces
        # self.test_resource_workspace = random_string_generator(10)
        self.test_resource_workspace = random_string_generator(10)
        self.engine.create_workspace(workspace_id=self.test_resource_workspace,
                                     uri=random_string_generator(5))

        # Create Test Stores/Resources/Layers
        ## Shapefile

        # Store name
        self.test_resource_store = random_string_generator(10)

        # Resource and Layer will take the name of the file
        self.test_resource_name = self.test_resource_store
        self.test_layer_name = self.test_resource_store

        # Identifiers of the form 'workspace:item'
        self.test_store_identifier = '{0}:{1}'.format(
            self.test_resource_workspace, self.test_resource_store)
        self.test_resource_identifier = '{0}:{1}'.format(
            self.test_resource_workspace, self.test_resource_name)

        # Do create shapefile
        self.engine.create_shapefile_resource(
            self.test_store_identifier,
            shapefile_base=self.shapefile_base,
            overwrite=True)

        ## Coverage

        # Create Test Style
        self.test_style_name = 'point'

        # Create Test Layer Groups
        self.test_layer_group_name = random_string_generator(10)
        self.engine.create_layer_group(
            layer_group_id=self.test_layer_group_name,
            layers=(self.test_layer_name, ),
            styles=(self.test_style_name, ))

        # Pause
        pause(10)

    def tearDown(self):
        # Delete test layer groups
        self.engine.delete_layer_group(
            layer_group_id=self.test_layer_group_name)

        # Delete test resources & layers
        self.engine.delete_resource(self.test_resource_identifier,
                                    recurse=True)

        # Delete stores
        self.engine.delete_store(self.test_store_identifier)

        # Delete test workspace
        self.engine.delete_workspace(self.test_resource_workspace)

    def assert_valid_response_object(self, response_object):
        # Response object should be a dictionary with the keys 'success' and either 'result' if success is True
        # or 'error' if success is False
        self.assertIsInstance(response_object, dict)
        self.assertIn('success', response_object)

        if isinstance(response_object, dict) and 'success' in response_object:
            if response_object['success'] is True:
                self.assertIn('result', response_object)
            elif response_object['success'] is False:
                self.assertIn('error', response_object)

    def test_list_resources(self):
        pause(10)
        # Execute
        response = self.engine.list_resources(debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Returns list
        self.assertIsInstance(result, list)

        # List of strings
        if len(result) > 0:
            self.assertIsInstance(result[0], str)

        # Test layer listed
        self.assertIn(self.test_resource_name, result)

    def test_list_resources_with_properties(self):
        # Execute
        response = self.engine.list_resources(with_properties=True)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Returns list
        self.assertIsInstance(result, list)

        # List of dictionaries
        if len(result) > 0:
            self.assertIsInstance(result[0], dict)

        # Test layer included
        test_resource_in = False

        for r in result:
            if r['name'] == self.test_resource_name:
                test_resource_in = True
                break

        self.assertTrue(test_resource_in)

    def test_list_layers(self):
        # Execute
        response = self.engine.list_layers(debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Returns list
        self.assertIsInstance(result, list)

        # List of strings
        if len(result) > 0:
            self.assertIsInstance(result[0], str)

        # Test layer listed
        self.assertIn(self.test_layer_name, result)

    def test_list_layers_with_properties(self):
        # Execute
        response = self.engine.list_layers(with_properties=True)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Returns list
        self.assertIsInstance(result, list)

        # List of dictionaries
        if len(result) > 0:
            self.assertIsInstance(result[0], dict)

        # Test layer included
        test_layer_in = False

        for r in result:
            if r['name'] == self.test_layer_name:
                test_layer_in = True
                break

        self.assertTrue(test_layer_in)

    def test_list_layer_groups(self):
        # Execute
        response = self.engine.list_layer_groups(debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # List of strings
        if len(result) > 0:
            self.assertIsInstance(result[0], str)

        # Test layer group listed
        self.assertIn(self.test_layer_group_name, result)

    def test_list_layer_groups_with_properties(self):
        # Execute
        response = self.engine.list_layer_groups(with_properties=True,
                                                 debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Returns list
        self.assertIsInstance(result, list)

        # List of dictionaries
        if len(result) > 0:
            self.assertIsInstance(result[0], dict)

        # Test layer included
        test_layer_group_in = False

        for r in result:
            if r['name'] == self.test_layer_group_name:
                test_layer_group_in = True
                break

        self.assertTrue(test_layer_group_in)

    def test_list_workspaces(self):
        pass

    def test_list_stores(self):
        pass

    def test_list_styles(self):
        pass

    def test_get_resource(self):
        # Execute
        response = self.engine.get_resource(
            resource_id=self.test_resource_name, debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Type
        self.assertIsInstance(result, dict)

        # Properties
        self.assertIn('workspace', result)
        self.assertEqual(result['workspace'], self.test_resource_workspace)

    def test_get_resource_with_workspace(self):
        # Execute
        response = self.engine.get_resource(
            resource_id=self.test_resource_identifier, debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Type
        self.assertIsInstance(result, dict)

        # Properties
        self.assertIn('name', result)
        self.assertIn('workspace', result)
        self.assertEqual(result['name'], self.test_resource_name)
        self.assertEqual(result['workspace'], self.test_resource_workspace)

    def test_get_resource_with_store(self):
        # Execute
        response = self.engine.get_resource(
            resource_id=self.test_resource_name,
            store=self.test_resource_store,
            debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Type
        self.assertIsInstance(result, dict)

        # Properties
        self.assertIn('name', result)
        self.assertIn('store', result)
        self.assertEqual(result['name'], self.test_resource_name)
        self.assertEqual(result['store'], self.test_resource_store)

    def test_get_resource_multiple_with_name(self):
        pass

    def test_get_layer(self):
        # Execute
        response = self.engine.get_layer(layer_id=self.test_layer_name,
                                         debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Type
        self.assertIsInstance(result, dict)

        # Properties
        self.assertIn('name', result)
        self.assertEqual(result['name'], self.test_layer_name)

    def test_get_layer_group(self):
        # Execute
        response = self.engine.get_layer_group(
            layer_group_id=self.test_layer_group_name, debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Type
        self.assertIsInstance(result, dict)

        # Properties
        self.assertIn('name', result)
        self.assertEqual(result['name'], self.test_layer_group_name)

    def test_get_store(self):
        pass

    def test_get_workspace(self):
        pass

    def test_get_style(self):
        pass

    def test_update_resource(self):
        # Setup
        new_title = random_string_generator(15)

        # Execute
        response = self.engine.update_resource(
            resource_id=self.test_resource_name,
            title=new_title,
            debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Get new resource
        updated_response = self.engine.get_resource(
            resource_id=self.test_resource_name, debug=self.debug)
        updated_result = updated_response['result']

        # Properties
        self.assertEqual(result['title'], new_title)
        self.assertEqual(updated_result['title'], new_title)
        self.assertEqual(result['title'], updated_result['title'])
        self.assertEqual(result, updated_result)

    def test_update_resource_workspace(self):
        # Setup
        new_title = random_string_generator(15)

        # Execute
        response = self.engine.update_resource(
            resource_id=self.test_resource_identifier,
            title=new_title,
            debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Get new resource
        updated_response = self.engine.get_resource(
            resource_id=self.test_resource_identifier, debug=self.debug)
        updated_result = updated_response['result']

        # Properties
        self.assertEqual(result['title'], new_title)
        self.assertEqual(updated_result['title'], new_title)
        self.assertEqual(result['title'], updated_result['title'])
        self.assertEqual(result, updated_result)

    def test_update_resource_store(self):
        pause(10)
        # Setup
        new_title = random_string_generator(15)

        # Execute
        response = self.engine.update_resource(
            resource_id=self.test_resource_name,
            store=self.test_resource_store,
            title=new_title,
            debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Get new resource
        updated_response = self.engine.get_resource(
            resource_id=self.test_resource_name,
            store=self.test_resource_store,
            debug=self.debug)
        updated_result = updated_response['result']

        # Properties
        self.assertEqual(result['title'], new_title)
        self.assertEqual(updated_result['title'], new_title)
        self.assertEqual(result['title'], updated_result['title'])
        self.assertEqual(result, updated_result)

    def test_update_layer(self):
        # Get original
        old_response = self.engine.get_layer(layer_id=self.test_layer_name)

        # Update
        new_default_style = self.test_style_name
        response = self.engine.update_layer(layer_id=self.test_layer_name,
                                            default_style=new_default_style,
                                            debug=self.debug)

        # Update should succeed
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])

        old_result = old_response['result']
        result = response['result']
        self.assertEqual(result['default_style'], new_default_style)
        self.assertNotEqual(old_result['default_style'],
                            result['default_style'])

    def test_update_layer_group(self):
        pass

    def test_delete_resource(self):
        # Must delete layer group and layer first
        self.engine.delete_layer_group(
            layer_group_id=self.test_layer_group_name)
        self.engine.delete_layer(layer_id=self.test_layer_name)

        # Do delete
        response = self.engine.delete_resource(
            resource_id=self.test_resource_identifier)

        # Should succeed
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])
        self.assertIsNone(response['result'])

    def test_delete_resource_belongs_to_layer(self):
        # Do delete without deleting layer group and layer
        response = self.engine.delete_resource(
            resource_id=self.test_resource_identifier)

        # Should fail
        self.assert_valid_response_object(response)
        self.assertFalse(response['success'])

    def test_delete_resource_recurse(self):
        # Force delete with recurse
        response = self.engine.delete_resource(
            resource_id=self.test_resource_identifier, recurse=True)

        # Should succeed
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])
        self.assertIsNone(response['result'])

    def test_delete_resource_does_not_exist(self):
        # Do delete
        response = self.engine.delete_resource(resource_id='iDontExist')

        # Should fail
        self.assert_valid_response_object(response)
        self.assertFalse(response['success'])

    def test_delete_layer(self):
        # Delete layer group first
        self.engine.delete_layer_group(
            layer_group_id=self.test_layer_group_name)

        # Do delete
        response = self.engine.delete_layer(layer_id=self.test_layer_name)

        # Should succeed
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])
        self.assertIsNone(response['result'])

    def test_delete_layer_belongs_to_group(self):
        # Do delete without deleting layer group
        response = self.engine.delete_layer(layer_id=self.test_layer_name)

        # Should fail
        self.assert_valid_response_object(response)
        self.assertFalse(response['success'])

    def test_delete_layer_recurse(self):
        # Force delete with recurse
        response = self.engine.delete_layer(layer_id=self.test_layer_name,
                                            recurse=True)

        # Should succeed
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])
        self.assertIsNone(response['result'])

    def test_delete_layer_does_not_exist(self):
        # Delete layer group first
        self.engine.delete_layer_group(
            layer_group_id=self.test_layer_group_name)

        # Do delete
        response = self.engine.delete_layer(layer_id='iDontExist')

        # Should fail
        self.assert_valid_response_object(response)
        self.assertFalse(response['success'])

    def test_delete_layer_group(self):
        # Do delete
        response = self.engine.delete_layer_group(
            layer_group_id=self.test_layer_group_name)

        # Should succeed
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])
        self.assertIsNone(response['result'])

    def test_delete_layer_group_does_not_exist(self):
        # Do delete
        response = self.engine.delete_layer_group(layer_group_id='iDontExist')

        # Should fail
        self.assert_valid_response_object(response)
        self.assertFalse(response['success'])

    def test_delete_workspace(self):
        pass

    def test_delete_store(self):
        pass

    def test_delete_style(self):
        pass

    def test_create_layer_group(self):
        # Do create
        name = random_string_generator(10)
        layers = (self.test_layer_name, )
        styles = (self.test_style_name, )
        response = self.engine.create_layer_group(layer_group_id=name,
                                                  layers=layers,
                                                  styles=styles)

        # Should succeed
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])

        # Validate
        result = response['result']
        self.assertEqual(result['name'], name)
        self.assertEqual(result['layers'], layers)
        self.assertEqual(result['styles'], [])

        # Clean up
        self.engine.delete_layer_group(layer_group_id=name)

    def test_create_layer_group_mismatch_layers_styles(self):
        # Do create with differing number of styles and layers
        name = random_string_generator(10)
        layers = (self.test_layer_name, )
        styles = (self.test_style_name, self.test_style_name)
        response = self.engine.create_layer_group(layer_group_id=name,
                                                  layers=layers,
                                                  styles=styles)

        # Should fail
        self.assert_valid_response_object(response)
        self.assertFalse(response['success'])

    def test_create_shapefile_resource(self):
        self.assertTrue(False)

    def test_create_coverage_resource(self):
        self.assertTrue(False)

    def test_create_workspace(self):
        self.assertTrue(False)

    def test_create_style(self):
        self.assertTrue(False)

    def test_create_sql_view(self):
        self.assertTrue(False)
Ejemplo n.º 19
0
#-------------------------------------------------------------------------------
# Name:        module1
# Purpose:
#
# Author:      mscott90
#
# Created:     21/02/2014
# Copyright:   (c) mscott90 2014
# Licence:     <your licence>
#-------------------------------------------------------------------------------
import shutil, sys, re, subprocess, time, os
from tethys_dataset_services.engines import GeoServerSpatialDatasetEngine
from zipfile import ZipFile

geoserver_engine = GeoServerSpatialDatasetEngine(endpoint='http://ciwmap.chpc.utah.edu:8080/geoserver/rest', username='******', password='******')

GSSHA_EXE = 'gssha.exe'

def main(prj, job_id):
    os.chdir('gssha_provo_flood')
    runGSSHA(prj)
    reformat(prj, job_id)
    zip_floodmap(job_id)
    upload_to_geoserver(job_id)
    os.chdir('..')

def runGSSHA(prjFile):
    #outFile = "run.out"
    #out = open(outFile, 'w')
    process = subprocess.Popen([GSSHA_EXE, prjFile])
    process.wait()
Ejemplo n.º 20
0
def genShapeFile(input,title,geo_url,username,password,hs_url):
    try:
        file_name = 'hs_sites'
        temp_dir = tempfile.mkdtemp()
        file_location = temp_dir+"/"+file_name
        w = sf.Writer(sf.POINT)
        w.field('sitename')
        w.field('sitecode')
        w.field('network')
        w.field('service')
        w.field('url','C',200)
        # w.field('elevation')

        for item in input:
            w.point(float(item['longitude']),float(item['latitude']))
            site_name = item['sitename']
            site_name.decode("utf-8")
            w.record(item['sitename'],item['sitecode'],item['network'],item['service'],hs_url, 'Point')

        w.save(file_location)
        prj = open("%s.prj" % file_location, "w")
        epsg = 'GEOGCS["WGS84",DATUM["WGS_1984",SPHEROID["WGS84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]'
        prj.write(epsg)
        prj.close()

        file_list = os.listdir(temp_dir)

        zip_file_full_path = temp_dir + "/" + "shapefile.zip"

        with zipfile.ZipFile(zip_file_full_path, 'a') as myzip:
            for fn in file_list:
                shapefile_fp = temp_dir + "/"+ fn  # tif full path
                new_file_name = title + os.path.splitext(fn)[1]
                myzip.write(shapefile_fp, arcname=new_file_name)

        #Connecting to geoserver
        spatial_dataset_engine = GeoServerSpatialDatasetEngine(endpoint=geo_url, username=username, password=password)
        layer_metadata = {}

        response = None
        ws_name = "catalog"
        result = spatial_dataset_engine.create_workspace(workspace_id=ws_name, uri="www.servir.org")
        if result['success']:
            print "Created workspace " + ws_name + " successfully"
        else:
            print "Creating workspace " + ws_name + " failed"
        #print result

        store_id = ws_name + ":" + title

        result = None
        result = spatial_dataset_engine.create_shapefile_resource(store_id=store_id, shapefile_zip=zip_file_full_path)
        if result['success']:
            print "Created store " + title + " successfully"
        else:
            print "Creating store " + title + " failed"


        #find the bbox area
        wms_rest_url = '{}workspaces/{}/datastores/{}/featuretypes/{}.json'.format(geo_url,ws_name,title,title)
        print wms_rest_url
        r = requests.get(wms_rest_url, auth=(username,password))
        if r.status_code != 200:
            print 'The Geoserver appears to be down.'
        else:
            json = r.json()
            extents = json['featureType']['latLonBoundingBox']
        # wms_response = urllib2.urlopen(wms_rest_url)
        # wms_data = wms_response.read()
        # print wms_data
        layer_metadata["layer"] = store_id
        layer_metadata["extents"] = extents

        return layer_metadata

    except:

        return False
    finally:
        if temp_dir is not None:
            if os.path.exists(temp_dir):
                shutil.rmtree(temp_dir)
Ejemplo n.º 21
0
class GeoServerDatasetEngineEnd2EndTests(unittest.TestCase):

    def setUp(self):
        # Files
        self.tests_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        self.files_root = os.path.join(self.tests_root, 'files')

        # GeoServer
        self.gs_endpoint = TEST_GEOSERVER_DATASET_SERVICE['ENDPOINT']
        self.gs_username = TEST_GEOSERVER_DATASET_SERVICE['USERNAME']
        self.gs_password = TEST_GEOSERVER_DATASET_SERVICE['PASSWORD']
        self.catalog = GeoServerCatalog(self.gs_endpoint, username=self.gs_username, password=self.gs_password)

        # Postgis
        self.pg_username = TEST_POSTGIS_SERVICE['USERNAME']
        self.pg_password = TEST_POSTGIS_SERVICE['PASSWORD']
        self.pg_database = TEST_POSTGIS_SERVICE['DATABASE']
        self.pg_table_name = 'points'
        self.pg_host = TEST_POSTGIS_SERVICE['HOST']
        self.pg_port = TEST_POSTGIS_SERVICE['PORT']
        self.pg_url = TEST_POSTGIS_SERVICE['URL']
        self.pg_public_url = TEST_POSTGIS_SERVICE['PUBLIC_URL']

        # Setup a testing workspace
        self.workspace_name = random_string_generator(10)
        self.workspace_uri = 'http://www.tethysplatform.org/{}'.format(self.workspace_name)

        retries = 5
        while retries > 0:
            try:
                self.catalog.create_workspace(self.workspace_name, self.workspace_uri)
                break
            except AssertionError as e:
                if 'Error persisting' in str(e) and retries > 0:
                    print("WARNING: FAILED TO PERSIST WORKSPACE.")
                    retries -= 1
                else:
                    raise

        # Setup Postgis database connection
        self.public_engine = create_engine(self.pg_public_url)
        self.connection = self.public_engine.connect()
        self.transaction = self.connection.begin()

        # Create GeoServer Engine
        self.endpoint = TEST_GEOSERVER_DATASET_SERVICE['ENDPOINT']
        self.geoserver_engine = GeoServerSpatialDatasetEngine(endpoint=self.endpoint,
                                                              username=TEST_GEOSERVER_DATASET_SERVICE['USERNAME'],
                                                              password=TEST_GEOSERVER_DATASET_SERVICE['PASSWORD'])

        self.geometry_column = 'geometry'
        self.geometry_type = 'Point'
        self.srid = 4326

    def assert_valid_response_object(self, response_object):
        # Response object should be a dictionary with the keys 'success' and either 'result' if success is True
        # or 'error' if success is False
        self.assertIsInstance(response_object, dict)
        self.assertIn('success', response_object)

        if isinstance(response_object, dict) and 'success' in response_object:
            if response_object['success'] is True:
                self.assertIn('result', response_object)
            elif response_object['success'] is False:
                self.assertIn('error', response_object)

    def tearDown(self):
        # Clean up GeoServer
        workspace = self.catalog.get_workspace(self.workspace_name)
        self.catalog.delete(workspace, recurse=True, purge=True)

        # Clean up Postgis database
        self.transaction.rollback()
        self.connection.close()
        self.public_engine.dispose()

    def setup_postgis_table(self):
        """
        Creates table in the database named "points" with two entries. The table has three columns:
        "id", "name", and "geometry." Use this table for the tests that require a database.
        """
        # Clean up
        delete_sql = "DROP TABLE IF EXISTS {table}".\
            format(table=self.pg_table_name)
        self.connection.execute(delete_sql)

        # Create table
        geom_table_sql = "CREATE TABLE IF NOT EXISTS {table} (" \
                         "id integer CONSTRAINT points_primary_key PRIMARY KEY, " \
                         "name varchar(20)" \
                         "); " \
                         "SELECT AddGeometryColumn('public', '{table}', 'geometry', 4326, 'POINT', 2);". \
            format(table=self.pg_table_name)

        self.connection.execute(geom_table_sql)

        insert_sql = "INSERT INTO {table} VALUES ({id}, '{name}', ST_GeomFromText('POINT({lon} {lat})', 4326));"
        rows = [
            {"id": 1, "name": "Aquaveo", "lat": 40.276039, "lon": -111.651120},
            {"id": 2, "name": "BYU", "lat": 40.252335, "lon": -111.649326},
        ]

        for r in rows:
            sql = insert_sql.format(
                table=self.pg_table_name,
                id=r['id'],
                name=r['name'],
                lat=r['lat'],
                lon=r['lon']
            )
            self.connection.execute(sql)
        self.transaction.commit()

    def test_create_shapefile_resource_base(self):
        # call methods: create_shapefile_resource, list_resources, get_resource, delete_resource

        # TEST create shapefile

        # Setup
        filename = 'test'
        shapefile_name = os.path.join(self.files_root, 'shapefile', filename)
        workspace = self.workspace_name
        store_id = random_string_generator(10)
        store_id_name = '{}:{}'.format(workspace, store_id)
        # store_id_name = store_id

        # Execute
        response = self.geoserver_engine.create_shapefile_resource(store_id=store_id_name,
                                                                   shapefile_base=shapefile_name,
                                                                   overwrite=True)
        # Validate response object
        self.assert_valid_response_object(response)

        # Should succeed
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)
        self.assertIn(store_id, r['name'])
        self.assertIn(store_id, r['store'])

        # TEST list_resources

        # Execute
        response = self.geoserver_engine.list_resources()

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Returns list
        self.assertIsInstance(result, list)

        # layer listed
        self.assertIn(store_id, result)

        # TEST get_resources

        # Execute
        # Geoserver uses the store_id as the layer/resource name (not the filename)
        resource_id_name = '{}:{}'.format(workspace, store_id)
        response = self.geoserver_engine.get_resource(resource_id=resource_id_name)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)

        # Properties
        self.assertIn('name', r)
        self.assertEquals(store_id, r['name'])
        self.assertIn(store_id, r['wfs']['shapefile'])

        # TEST delete_resource
        # Execute
        # This case the resource id is the same as the store id.
        response = self.geoserver_engine.delete_resource(resource_id=resource_id_name,
                                                         store_id=store_id)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        # TODO: delete_resource is returning a 403 error: not authorized.
        # self.assertTrue(response['success'])

    def test_create_shapefile_resource_zip(self):
        # call methods: create_shapefile_resource, list_layers, get_layer, delete_layer

        # TEST create_shapefile_resource
        # Test1.zip

        # Setup
        shapefile_zip = os.path.join(self.files_root, 'shapefile', "test1.zip")
        shapefile = "test1"
        workspace = self.workspace_name
        store_id = random_string_generator(10)
        store_id_name = '{}:{}'.format(workspace, store_id)

        # Execute
        response = self.geoserver_engine.create_shapefile_resource(store_id=store_id_name,
                                                                   shapefile_zip=shapefile_zip,
                                                                   overwrite=True)
        # Validate response object
        self.assert_valid_response_object(response)

        # Should succeed
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        filename = os.path.splitext(os.path.basename(shapefile_zip))[0]
        self.assertIsInstance(r, dict)
        self.assertIn(filename, r['name'])
        self.assertIn(store_id, r['store'])

        # TEST list_layers test
        # Execute
        response = self.geoserver_engine.list_layers()

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Returns list
        self.assertIsInstance(result, list)

        # Get the last item from result
        layer_id = '{}:{}'.format(workspace, shapefile)

        # TEST get layers test
        # Execute
        response = self.geoserver_engine.get_layer(layer_id=layer_id,
                                                   store_id=store_id)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)

        self.assertIn(filename, r['name'])
        self.assertIn(self.workspace_name, r['name'])

        # TEST delete_layer
        self.geoserver_engine.delete_layer(layer_id=layer_id,
                                           store_id=store_id)

        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])

    def test_create_shapefile_resource_upload(self):
        # call methods: create_shapefile_resource, list_stores, get_store, delete_store

        # TEST create_shapefile_resource

        # Use in memory file list: test.shp and friends
        # Setup
        shapefile_cst = os.path.join(self.files_root, 'shapefile', 'test.cst')
        shapefile_dbf = os.path.join(self.files_root, 'shapefile', 'test.dbf')
        shapefile_prj = os.path.join(self.files_root, 'shapefile', 'test.prj')
        shapefile_shp = os.path.join(self.files_root, 'shapefile', 'test.shp')
        shapefile_shx = os.path.join(self.files_root, 'shapefile', 'test.shx')

        # Workspace is given
        store_rand = random_string_generator(10)
        store_id = '{}:{}'.format(self.workspace_name, store_rand)

        with open(shapefile_cst, 'rb') as cst_upload,\
                open(shapefile_dbf, 'rb') as dbf_upload,\
                open(shapefile_prj, 'rb') as prj_upload,\
                open(shapefile_shp, 'rb') as shp_upload,\
                open(shapefile_shx, 'rb') as shx_upload:
            upload_list = [cst_upload, dbf_upload, prj_upload, shp_upload, shx_upload]
            response = self.geoserver_engine.create_shapefile_resource(store_id=store_id,
                                                                       shapefile_upload=upload_list,
                                                                       overwrite=True)
        # Should succeed
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)
        self.assertIn(store_rand, r['name'])
        self.assertIn(store_rand, r['store'])

        # TEST list_stores

        # Execute

        response = self.geoserver_engine.list_stores()

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # layer group listed
        self.assertIn(store_rand, result)

        # TEST get store

        # Execute
        response = self.geoserver_engine.get_store(store_id=store_id)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)

        # Properties
        self.assertIn('name', r)
        self.assertIn(r['name'], store_rand)
        self.assertIn('workspace', r)
        self.assertEqual(self.workspace_name, r['workspace'])

        # TEST delete_store
        response = self.geoserver_engine.delete_store(store_id=store_id, purge=True, recurse=True)

        # Failure Check
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])

    def test_create_coverage_resource_arcgrid(self):
        # call methods: create_coverage_resource, list_resources, get_resource, delete_resource

        # TEST create_coverage_resource
        # precip30min.zip
        store_name = random_string_generator(10)
        expected_store_id = '{}:{}'.format(self.workspace_name, store_name)
        expected_coverage_type = 'arcgrid'
        coverage_file_name = 'precip30min.zip'
        coverage_name = coverage_file_name.split('.')[0]
        coverage_file = os.path.join(self.files_root, "arc_sample", coverage_file_name)

        with open(coverage_file, 'rb') as coverage_upload:
            # Execute
            response = self.geoserver_engine.create_coverage_resource(store_id=expected_store_id,
                                                                      coverage_type=expected_coverage_type,
                                                                      coverage_upload=coverage_upload,
                                                                      overwrite=True)
        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)

        # Values
        self.assertEqual(coverage_name, r['name'])
        self.assertEqual(self.workspace_name, r['workspace'])

        # TEST list_resources

        # Execute
        response = self.geoserver_engine.list_resources()

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Returns list
        self.assertIsInstance(result, list)

        # layer listed
        self.assertIn(coverage_name, result)

        # TEST get_resource

        # Execute
        resource_id = '{}:{}'.format(self.workspace_name, coverage_name)

        response = self.geoserver_engine.get_resource(resource_id=resource_id,
                                                      store_id=store_name)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        self.assertIn('ArcGrid', r['keywords'])
        self.assertEqual(coverage_name, r['title'])
        self.assertEqual('coverage', r['resource_type'])

        # delete_resource
        # TODO: delete_resource is returning a 403 error: not authorized.
        # Execute
        resource_id = '{}:{}'.format(self.workspace_name, coverage_name)
        response = self.geoserver_engine.delete_resource(resource_id=resource_id,
                                                         store_id=store_name)

        # # Validate response object
        self.assert_valid_response_object(response)

        # # Success
        # self.assertTrue(response['success'])

    def test_create_coverage_resource_grassgrid(self):
        # call methods: create_coverage_resource, list_layers, get_layer, delete_layer

        # TEST create_coverage resource
        # my_grass.zip
        store_name = random_string_generator(10)
        expected_store_id = '{}:{}'.format(self.workspace_name, store_name)
        expected_coverage_type = 'grassgrid'
        coverage_file_name = 'my_grass.zip'
        coverage_name = coverage_file_name.split('.')[0]
        coverage_file = os.path.join(self.files_root, "grass_ascii", coverage_file_name)

        # Execute
        response = self.geoserver_engine.create_coverage_resource(store_id=expected_store_id,
                                                                  coverage_type=expected_coverage_type,
                                                                  coverage_file=coverage_file,
                                                                  overwrite=True)
        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)

        # Tests
        self.assertIn(coverage_name, r['name'])
        self.assertEqual(self.workspace_name, r['workspace'])

        #  TEST list_layers

        #  Execute
        response = self.geoserver_engine.list_layers()

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Returns list
        self.assertIsInstance(result, list)

        # Check if layer is in list
        self.assertIn(coverage_name, result)

        # TEST get_layer

        # Execute
        layer_id = '{}:{}'.format(self.workspace_name, coverage_name)
        response = self.geoserver_engine.get_layer(layer_id=layer_id,
                                                   store_id=store_name)
        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)
        self.assertIn(store_name, r['store'])
        self.assertIn(self.workspace_name, r['name'])

        # TEST delete_layer
        self.geoserver_engine.delete_layer(layer_id=layer_id,
                                           store_id=store_name)

        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])

    def test_create_coverage_resource_geotiff(self):
        # adem.tif
        # call methods: create_coverage_resource, list_stores, get_store, delete_store

        # TEST create_coverage_resource

        store_name = random_string_generator(10)
        expected_store_id = '{}:{}'.format(self.workspace_name, store_name)
        expected_coverage_type = 'geotiff'
        coverage_file_name = 'adem.tif'
        coverage_name = coverage_file_name.split('.')[0]
        coverage_file = os.path.join(self.files_root, coverage_file_name)

        with open(coverage_file, 'rb') as coverage_upload:
            # Execute
            response = self.geoserver_engine.create_coverage_resource(store_id=expected_store_id,
                                                                      coverage_type=expected_coverage_type,
                                                                      coverage_upload=coverage_upload,
                                                                      overwrite=True)
        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)

        # Values
        self.assertEqual(coverage_name, r['name'])
        self.assertEqual(self.workspace_name, r['workspace'])

        # TEST list_stores

        # Execute

        response = self.geoserver_engine.list_stores()

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # TEST layer group listed
        self.assertIn(store_name, result)

        # TEST get store

        # Execute
        response = self.geoserver_engine.get_store(store_id=expected_store_id)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)

        # Properties
        self.assertIn('name', r)
        self.assertIn(r['name'], store_name)
        self.assertIn('workspace', r)
        self.assertEqual(self.workspace_name, r['workspace'])

        # TEST delete_store
        response = self.geoserver_engine.delete_store(store_id=expected_store_id, purge=True, recurse=True)

        # Failure Check
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])

    def test_create_coverage_resource_world_file_tif(self):
        # pk50095.zip
        # call methods: create_coverage_resource, list_layers, get_layer, delete_layer
        # TEST create_coverage resource
        store_name = random_string_generator(10)
        expected_store_id = '{}:{}'.format(self.workspace_name, store_name)
        expected_coverage_type = 'worldimage'
        coverage_file_name = 'Pk50095.zip'
        coverage_name = coverage_file_name.split('.')[0]
        coverage_file = os.path.join(self.files_root, "img_sample", coverage_file_name)

        # Execute
        response = self.geoserver_engine.create_coverage_resource(store_id=expected_store_id,
                                                                  coverage_type=expected_coverage_type,
                                                                  coverage_file=coverage_file,
                                                                  overwrite=True)
        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)

        # Tests
        self.assertIn(coverage_name, r['name'])
        self.assertEqual(self.workspace_name, r['workspace'])

        #  TEST list_layers

        #  Execute
        response = self.geoserver_engine.list_layers()

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Returns list
        self.assertIsInstance(result, list)

        # Check if layer is in list
        self.assertIn(coverage_name, result)

        # TEST get_layer

        # Execute
        layer_id = '{}:{}'.format(self.workspace_name, coverage_name)
        response = self.geoserver_engine.get_layer(layer_id=layer_id,
                                                   store_id=store_name)
        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)
        self.assertIn(store_name, r['store'])
        self.assertIn(self.workspace_name, self.workspace_name)

        # TEST delete_layer
        self.geoserver_engine.delete_layer(layer_id=coverage_name,
                                           store_id=store_name)

        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])

    def test_create_coverage_resource_upload(self):
        # DO NOT MOCK
        # Use in memory file list: precip30min.prj & precip30min.asc
        # call methods: create_coverage_resource, list_resources, get_resource, delete_resource
        store_id_name = random_string_generator(10)
        expected_store_id = '{}:{}'.format(self.workspace_name, store_id_name)
        expected_coverage_type = 'arcgrid'
        coverage_file_name = 'precip30min.asc'
        prj_file_name = 'precip30min.prj'
        coverage_name = coverage_file_name.split('.')[0]
        arc_sample = os.path.join(self.files_root, "arc_sample")
        coverage_file = os.path.join(arc_sample, coverage_file_name)
        prj_file = os.path.join(arc_sample, prj_file_name)

        with open(coverage_file, 'rb') as coverage_upload:
            with open(prj_file, 'rb') as prj_upload:
                upload_list = [coverage_upload, prj_upload]

                # Execute
                response = self.geoserver_engine.create_coverage_resource(store_id=expected_store_id,
                                                                          coverage_type=expected_coverage_type,
                                                                          coverage_upload=upload_list,
                                                                          overwrite=True)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)

        # Values
        self.assertEqual(coverage_name, r['name'])
        self.assertEqual(self.workspace_name, r['workspace'])

        # TEST list_resources

        # Execute
        response = self.geoserver_engine.list_resources()

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Returns list
        self.assertIsInstance(result, list)

        # layer listed
        self.assertIn(coverage_name, result)

        # TEST get_resources

        # Execute
        resource_id = "{}:{}".format(self.workspace_name, coverage_name)
        response = self.geoserver_engine.get_resource(resource_id=resource_id,
                                                      store_id=store_id_name)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)

        # Properties
        self.assertIn('name', r)
        self.assertEquals(coverage_name, r['name'])
        self.assertIn(coverage_name, r['wcs']['arcgrid'])

        # TEST delete_resource
        # TODO: delete_resource is returning a 403 error: not authorized.
        # Execute
        # This case the resource id is the same as the filename.
        resource_id = '{}:{}'.format(self.workspace_name, coverage_name)
        response = self.geoserver_engine.delete_resource(resource_id=resource_id,
                                                         store_id=store_id_name)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        # self.assertTrue(response['success'])

    def test_create_layer_group(self):

        # call methods: create_layer_group, list_layer_groups, get_layer_group, delete_layer_group

        # create_layer_group
        # Use existing layers and styles in geoserver:
        # layers: sf:roads, sf:bugsites, sf:streams;
        # styles: simple_roads, capitals, simple_streams

        # TEST create_layer_group

        # Do create
        # expected_layer_group_id = '{}:{}'.format(self.workspace_name, random_string_generator(10))

        expected_layer_group_id = random_string_generator(10)
        expected_layers = ['roads', 'bugsites', 'streams']
        expected_styles = ['simple_roads', 'capitals', 'simple_streams']

        # TODO: create_layer_group: fails on catalog.save() when workspace is given.
        response = self.geoserver_engine.create_layer_group(layer_group_id=expected_layer_group_id,
                                                            layers=expected_layers,
                                                            styles=expected_styles)
        # Should succeed
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])

        # Validate
        result = response['result']

        self.assertEquals(result['name'], expected_layer_group_id)
        self.assertEquals(result['layers'], expected_layers)
        self.assertEquals(result['styles'], expected_styles)

        # TEST list_layer_groups

        # Execute
        response = self.geoserver_engine.list_layer_groups()

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # layer group listed
        self.assertIn(expected_layer_group_id, result)

        # TEST get layer_group

        # Execute
        response = self.geoserver_engine.get_layer_group(layer_group_id=expected_layer_group_id)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)

        # List of dictionaries
        self.assertIn('workspace', r)
        self.assertEqual(None, r['workspace'])
        self.assertIn('layers', r)
        self.assertEqual(expected_layers, r['layers'])
        self.assertIn('styles', r)
        self.assertEqual(expected_styles, r['styles'])
        self.assertNotIn('dom', r)

        # TEST delete layer group
        # Clean up
        self.geoserver_engine.delete_layer_group(layer_group_id=expected_layer_group_id)
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])
        # self.assertIsNone(response['result'])

    def test_create_workspace(self):
        # call methods: create_workspace, list_workspaces, get_workspace, delete_workspace

        # TEST create workspace
        expected_workspace_id = random_string_generator(10)

        expected_uri = 'http://www.tethysplatform.org/{}'.format(expected_workspace_id)

        # create workspace test
        response = self.geoserver_engine.create_workspace(workspace_id=expected_workspace_id, uri=expected_uri)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)

        self.assertIn('name', r)

        self.assertEqual(expected_workspace_id, r['name'])

        # TEST list workspace

        # Execute
        response = self.geoserver_engine.list_workspaces()

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # TEST layer group listed
        self.assertIn(expected_workspace_id, result)

        # TEST get_workspace

        # Execute
        response = self.geoserver_engine.get_workspace(workspace_id=expected_workspace_id)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)

        # Properties
        self.assertIn('name', r)
        self.assertIn(r['name'], expected_workspace_id)

        # TEST delete work_space

        # Do delete
        response = self.geoserver_engine.delete_workspace(workspace_id=expected_workspace_id)

        # Should succeed
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])
        self.assertIsNone(response['result'])

    def test_create_style(self):
        # call methods: create_style, list_styles, get_style, delete_style

        # TEST create_style
        expected_style_id_name = random_string_generator(10)
        expected_style_id = '{}:{}'.format(self.workspace_name, expected_style_id_name)
        style_file_name = 'point.sld'
        expected_sld = os.path.join(self.files_root, style_file_name)

        # Execute
        with open(expected_sld, 'r') as sld_file:
            sld_string = sld_file.read()
            # TODO: create_style: Fails on when overwrite is False.
            response = self.geoserver_engine.create_style(style_id=expected_style_id, sld=sld_string, overwrite=True)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)

        # TEST list_styles

        # Execute
        response = self.geoserver_engine.list_styles(workspace=self.workspace_name)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Returns list
        self.assertIsInstance(result, list)

        # TEST layer listed
        self.assertIn(expected_style_id_name, result)

        # TEST get_style

        # Execute
        response = self.geoserver_engine.get_style(style_id=expected_style_id)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)

        # Properties
        self.assertIn('name', r)
        self.assertIn(r['name'], expected_style_id)
        self.assertIn('workspace', r)
        self.assertEqual(self.workspace_name, r['workspace'])

        # TEST delete_style

        # Do delete
        response = self.geoserver_engine.delete_style(style_id=expected_style_id)

        # Should succeed
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])
        self.assertIsNone(response['result'])

    def test_link_and_add_table(self):
        # call methods: link_sqlalchemy_db_to_geoserver, add_table_to_postgis_store, list_stores, get_store,
        # delete_store
        self.setup_postgis_table()

        # TEST link_sqlalchemy_db_to_geoserver
        store_id_name = random_string_generator(10)
        store_id = '{}:{}'.format(self.workspace_name, store_id_name)
        sqlalchemy_engine = create_engine(self.pg_url)

        response = self.geoserver_engine.link_sqlalchemy_db_to_geoserver(store_id=store_id,
                                                                         sqlalchemy_engine=sqlalchemy_engine,
                                                                         docker=True)

        # Check for success response
        self.assertTrue(response['success'])
        sqlalchemy_engine.dispose()

        # TEST add_table_to_postgis_store

        # Execute
        response = self.geoserver_engine.add_table_to_postgis_store(store_id=store_id,
                                                                    table=self.pg_table_name)

        # Check for success response
        self.assertTrue(response['success'])

        # TEST list_stores

        # Execute

        response = self.geoserver_engine.list_stores()

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # layer group listed
        self.assertIn(store_id_name, result)

        # TEST get store

        # Execute
        response = self.geoserver_engine.get_store(store_id=store_id)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)

        # Properties
        self.assertIn('name', r)
        self.assertIn(store_id_name, r['name'])
        self.assertIn('workspace', r)
        self.assertEqual(self.workspace_name, r['workspace'])

        # TEST delete_store
        response = self.geoserver_engine.delete_store(store_id=store_id, purge=True, recurse=True)

        # Failure Check
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])

    def test_create_postgis_feature_resource(self):
        # call methods: create_postgis_feature_resource (with table), list_stores, get_store, delete_store
        self.setup_postgis_table()

        # TEST create_postgis_feature_resource (with table)
        store_id_name = random_string_generator(10)
        store_id = '{}:{}'.format(self.workspace_name, store_id_name)

        response = self.geoserver_engine.create_postgis_feature_resource(store_id=store_id,
                                                                         host=self.pg_host,
                                                                         port=self.pg_port,
                                                                         database=self.pg_database,
                                                                         user=self.pg_username,
                                                                         password=self.pg_password,
                                                                         table=self.pg_table_name)

        self.assertTrue(response['success'])

        # TEST list_stores

        # Execute

        response = self.geoserver_engine.list_stores()

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # layer group listed
        self.assertIn(store_id_name, result)

        # TEST get store

        # Execute
        response = self.geoserver_engine.get_store(store_id=store_id)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)

        # Properties
        self.assertIn('name', r)
        self.assertIn(store_id_name, r['name'])
        self.assertIn('workspace', r)
        self.assertEqual(self.workspace_name, r['workspace'])

        # TEST delete_store
        response = self.geoserver_engine.delete_store(store_id=store_id, purge=True, recurse=True)

        # Failure Check
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])

    def test_create_sql_view(self):
        # call methods: create_sql_view, list_resources, list_stores, list_layers
        self.setup_postgis_table()

        # TEST create_postgis_feature_resource (with table)
        store_id_name = random_string_generator(10)
        store_id = '{}:{}'.format(self.workspace_name, store_id_name)

        response = self.geoserver_engine.create_postgis_feature_resource(store_id=store_id,
                                                                         host=self.pg_host,
                                                                         port=self.pg_port,
                                                                         database=self.pg_database,
                                                                         user=self.pg_username,
                                                                         password=self.pg_password,
                                                                         table=self.pg_table_name)
        self.assertTrue(response['success'])

        feature_type_name = random_string_generator(10)
        postgis_store_id = '{}:{}'.format(self.workspace_name, store_id_name)
        sql = "SELECT * FROM {}".format(self.pg_table_name)
        geometry_column = self.geometry_column
        geometry_type = self.geometry_type

        response = self.geoserver_engine.create_sql_view(feature_type_name=feature_type_name,
                                                         postgis_store_id=postgis_store_id,
                                                         sql=sql,
                                                         geometry_column=geometry_column,
                                                         geometry_type=geometry_type)

        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)

        self.assertIn('name', r)
        self.assertIn(feature_type_name, r['name'])

        # TEST list_resources

        # Execute
        response = self.geoserver_engine.list_resources()

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Returns list
        self.assertIsInstance(result, list)

        # layer listed
        self.assertIn(feature_type_name, result)

        # TEST get_resources

        # Execute
        # Geoserver uses the store_id as the layer/resource name (not the filename)
        resource_id_name = '{}:{}'.format(self.workspace_name, feature_type_name)
        response = self.geoserver_engine.get_resource(resource_id=resource_id_name)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        r = response['result']

        # Type
        self.assertIsInstance(r, dict)

        # Properties
        self.assertIn('name', r)
        self.assertEquals(feature_type_name, r['name'])
        self.assertIn(feature_type_name, r['wfs']['shapefile'])

        # TEST delete_resource
        # Execute
        # This case the resource id is the same as the store id.
        response = self.geoserver_engine.delete_resource(resource_id=resource_id_name,
                                                         store_id=store_id_name)

        # Validate response object
        self.assert_valid_response_object(response)
def map(request):
    """
    Controller for the app map page.
    """
    if request.method == "GET":
        # get/check information from AJAX request
        post_info = request.GET
        watershed_ids = post_info.getlist("watershed_select")
        group_id = post_info.get("watershed_group_select")
        if not watershed_ids and not group_id:
            return redirect("/apps/adhydro_streamflow/")
        # get the base layer information
        session = SettingsSessionMaker()
        if watershed_ids:
            # Query DB for settings
            watersheds = (
                session.query(Watershed)
                .order_by(Watershed.watershed_name, Watershed.subbasin_name)
                .filter(Watershed.id.in_(watershed_ids))
                .all()
            )
        elif group_id:
            # Query DB for settings
            watersheds = (
                session.query(Watershed)
                .order_by(Watershed.watershed_name, Watershed.subbasin_name)
                .filter(Watershed.watershed_groups.any(WatershedGroup.id == group_id))
                .all()
            )

        ##find all kml files to add to page
        kml_file_location = os.path.join(os.path.dirname(os.path.realpath(__file__)), "public", "kml")
        layers_info = []
        # add kml urls to list and add their navigation items as well
        group_id = 0
        for watershed in watersheds:
            # if on the local server
            if watershed.geoserver_id == 1:
                file_path = os.path.join(kml_file_location, format_name(watershed.watershed_name))
                kml_info = {"watershed": watershed.folder_name, "subbasin": watershed.file_name}
                # prepare kml files
                drainage_line_kml = os.path.join(file_path, watershed.kml_drainage_line_layer)
                if os.path.exists(drainage_line_kml) and watershed.kml_drainage_line_layer:
                    drainage_line_kml = os.path.basename(drainage_line_kml)
                    kml_info["drainage_line"] = "/static/adhydro_streamflow/kml/%s/%s" % (
                        watershed.folder_name,
                        watershed.kml_drainage_line_layer,
                    )
                catchment_kml = os.path.join(file_path, watershed.kml_catchment_layer)
                if os.path.exists(catchment_kml) and watershed.kml_catchment_layer:
                    catchment_kml = os.path.basename(catchment_kml)
                    kml_info["catchment"] = "/static/adhydro_streamflow/kml/%s/%s" % (
                        watershed.folder_name,
                        watershed.kml_catchment_layer,
                    )
                gage_kml = os.path.join(file_path, watershed.kml_gage_layer)
                if os.path.exists(gage_kml) and watershed.kml_gage_layer:
                    catchment_kml = os.path.basename(gage_kml)
                    kml_info["gage"] = "/static/adhydro_streamflow/kml/%s/%s" % (
                        watershed.folder_name,
                        watershed.kml_gage_layer,
                    )

                kml_info["title"] = format_watershed_title(watershed.watershed_name, watershed.subbasin_name)
                layers_info.append(kml_info)
            # if geoserver
            else:  # (get geoserver info)
                geoserver_info = {
                    "watershed": watershed.folder_name,
                    "subbasin": watershed.file_name,
                    "geoserver_url": "%s/wms" % watershed.geoserver.url,
                }
                engine = GeoServerSpatialDatasetEngine(
                    endpoint="%s/rest" % watershed.geoserver.url,
                    username=watershed.geoserver.username,
                    password=watershed.geoserver.password,
                )
                # load drainage line layer if exists
                drainage_line_info = engine.get_resource(resource_id=watershed.geoserver_drainage_line_layer.strip())
                if drainage_line_info["success"]:
                    # check layers attributes to see if valid
                    layer_attributes = drainage_line_info["result"]["attributes"]
                    missing_attributes = []
                    contained_attributes = []
                    # check required attributes
                    # necessary_attributes = ['COMID','watershed', 'subbasin', 'wwatershed','wsubbasin']

                    def find_add_attribute_ci(attribute, layer_attributes, contained_attributes):
                        """
                        Case insensitive attribute search and add
                        """
                        for layer_attribute in layer_attributes:
                            if layer_attribute.lower() == attribute.lower():
                                contained_attributes.append(layer_attribute)
                                return True
                        return False

                    # check COMID/HydroID attribute
                    if not find_add_attribute_ci("COMID", layer_attributes, contained_attributes):
                        missing_attributes.append("COMID")
                        if not find_add_attribute_ci("HydroID", layer_attributes, contained_attributes):
                            missing_attributes.append("HydroID")

                    # check ADHydro watershed/subbasin attributes
                    if not find_add_attribute_ci(
                        "watershed", layer_attributes, contained_attributes
                    ) or not find_add_attribute_ci("subbasin", layer_attributes, contained_attributes):
                        missing_attributes.append("watershed")
                        missing_attributes.append("subbasin")

                    # check optional attributes
                    optional_attributes = ["usgs_id", "nws_id", "hydroserve"]
                    for optional_attribute in optional_attributes:
                        find_add_attribute_ci(optional_attribute, layer_attributes, contained_attributes)

                    latlon_bbox = drainage_line_info["result"]["latlon_bbox"][:4]
                    geoserver_info["drainage_line"] = {
                        "name": watershed.geoserver_drainage_line_layer,
                        "geojsonp": drainage_line_info["result"]["wfs"]["geojsonp"],
                        "latlon_bbox": [latlon_bbox[0], latlon_bbox[2], latlon_bbox[1], latlon_bbox[3]],
                        "projection": drainage_line_info["result"]["projection"],
                        "contained_attributes": contained_attributes,
                        "missing_attributes": missing_attributes,
                    }
                    # check if needed attribute is there to perfrom query based rendering of layer
                    if "Natur_Flow" not in layer_attributes:
                        geoserver_info["drainage_line"]["geoserver_method"] = "simple"
                    else:
                        geoserver_info["drainage_line"]["geoserver_method"] = "natur_flow_query"

                # load catchment layer if exists
                catchment_info = engine.get_resource(resource_id=watershed.geoserver_catchment_layer.strip())
                if catchment_info["success"]:
                    latlon_bbox = catchment_info["result"]["latlon_bbox"][:4]
                    geoserver_info["catchment"] = {
                        "name": watershed.geoserver_catchment_layer,
                        "latlon_bbox": [latlon_bbox[0], latlon_bbox[2], latlon_bbox[1], latlon_bbox[3]],
                        "projection": catchment_info["result"]["projection"],
                    }
                # load gage layer if exists
                gage_info = engine.get_resource(resource_id=watershed.geoserver_gage_layer.strip())
                if gage_info["success"]:
                    latlon_bbox = gage_info["result"]["latlon_bbox"][:4]
                    geoserver_info["gage"] = {
                        "name": watershed.geoserver_gage_layer,
                        "latlon_bbox": [latlon_bbox[0], latlon_bbox[2], latlon_bbox[1], latlon_bbox[3]],
                        "projection": gage_info["result"]["projection"],
                    }
                geoserver_info["title"] = format_watershed_title(watershed.watershed_name, watershed.subbasin_name)
                layers_info.append(geoserver_info)

            group_id += 1

        watershed_list = []
        for watershed in watersheds:
            watershed_list.append(
                (
                    "%s (%s)" % (watershed.watershed_name, watershed.subbasin_name),
                    "%s:%s" % (watershed.folder_name, watershed.file_name),
                )
            )
        watershed_select = {
            "display_text": "Select Watershed",
            "name": "watershed_select",
            "options": watershed_list,
            "placeholder": "Select Watershed",
        }

        units_toggle_switch = {
            "display_text": "Units",
            "name": "units-toggle",
            "on_label": "Metric",
            "off_label": "English",
            "initial": True,
        }

        # Query DB for settings
        main_settings = session.query(MainSettings).order_by(MainSettings.id).first()
        base_layer = main_settings.base_layer
        session.close()

        base_layer_info = {"name": base_layer.name, "api_key": base_layer.api_key}

        context = {
            "layers_info_json": json.dumps(layers_info),
            "layers_info": layers_info,
            "base_layer_info": json.dumps(base_layer_info),
            "watershed_select": watershed_select,
            "units_toggle_switch": units_toggle_switch,
        }

        return render(request, "adhydro_streamflow/map.html", context)
    # send them home
    return redirect("/apps/adhydro_streamflow/")
class TestGeoServerDatasetEngine(unittest.TestCase):

    def setUp(self):
        # Globals
        self.debug = False

        # Files
        self.tests_root = os.path.abspath(os.path.dirname(__file__))
        self.files_root = os.path.join(self.tests_root, 'files')
        self.shapefile_name = 'test'
        self.shapefile_base = os.path.join(self.files_root, 'shapefile', self.shapefile_name)

        # Create Test Engine
        self.engine = GeoServerSpatialDatasetEngine(endpoint=TEST_GEOSERVER_DATASET_SERVICE['ENDPOINT'],
                                                    username=TEST_GEOSERVER_DATASET_SERVICE['USERNAME'],
                                                    password=TEST_GEOSERVER_DATASET_SERVICE['PASSWORD'])

        # Create Test Workspaces
        # self.test_resource_workspace = random_string_generator(10)
        self.test_resource_workspace = random_string_generator(10)
        self.engine.create_workspace(workspace_id=self.test_resource_workspace, uri=random_string_generator(5))

        # Create Test Stores/Resources/Layers
        ## Shapefile

        # Store name
        self.test_resource_store = random_string_generator(10)

        # Resource and Layer will take the name of the file
        self.test_resource_name = self.test_resource_store
        self.test_layer_name = self.test_resource_store

        # Identifiers of the form 'workspace:item'
        self.test_store_identifier = '{0}:{1}'.format(self.test_resource_workspace, self.test_resource_store)
        self.test_resource_identifier = '{0}:{1}'.format(self.test_resource_workspace, self.test_resource_name)

        # Do create shapefile
        self.engine.create_shapefile_resource(self.test_store_identifier, shapefile_base=self.shapefile_base,
                                              overwrite=True)

        ## Coverage

        # Create Test Style
        self.test_style_name = 'point'

        # Create Test Layer Groups
        self.test_layer_group_name = random_string_generator(10)
        self.engine.create_layer_group(layer_group_id=self.test_layer_group_name,
                                       layers=(self.test_layer_name,),
                                       styles=(self.test_style_name,))

        # Pause
        pause(10)

    def tearDown(self):
        # Delete test layer groups
        self.engine.delete_layer_group(layer_group_id=self.test_layer_group_name)

        # Delete test resources & layers
        self.engine.delete_resource(self.test_resource_identifier, recurse=True)

        # Delete stores
        self.engine.delete_store(self.test_store_identifier)

        # Delete test workspace
        self.engine.delete_workspace(self.test_resource_workspace)

    def assert_valid_response_object(self, response_object):
        # Response object should be a dictionary with the keys 'success' and either 'result' if success is True
        # or 'error' if success is False
        self.assertIsInstance(response_object, dict)
        self.assertIn('success', response_object)

        if isinstance(response_object, dict) and 'success' in response_object:
            if response_object['success'] is True:
                self.assertIn('result', response_object)
            elif response_object['success'] is False:
                self.assertIn('error', response_object)

    def test_list_resources(self):
        pause(10)
        # Execute
        response = self.engine.list_resources(debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Returns list
        self.assertIsInstance(result, list)

        # List of strings
        if len(result) > 0:
            self.assertIsInstance(result[0], str)

        # Test layer listed
        self.assertIn(self.test_resource_name, result)

    def test_list_resources_with_properties(self):
        # Execute
        response = self.engine.list_resources(with_properties=True)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Returns list
        self.assertIsInstance(result, list)

        # List of dictionaries
        if len(result) > 0:
            self.assertIsInstance(result[0], dict)

        # Test layer included
        test_resource_in = False

        for r in result:
            if r['name'] == self.test_resource_name:
                test_resource_in = True
                break

        self.assertTrue(test_resource_in)

    def test_list_layers(self):
        # Execute
        response = self.engine.list_layers(debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Returns list
        self.assertIsInstance(result, list)

        # List of strings
        if len(result) > 0:
            self.assertIsInstance(result[0], str)

        # Test layer listed
        self.assertIn(self.test_layer_name, result)

    def test_list_layers_with_properties(self):
        # Execute
        response = self.engine.list_layers(with_properties=True)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Returns list
        self.assertIsInstance(result, list)

        # List of dictionaries
        if len(result) > 0:
            self.assertIsInstance(result[0], dict)

        # Test layer included
        test_layer_in = False

        for r in result:
            if r['name'] == self.test_layer_name:
                test_layer_in = True
                break

        self.assertTrue(test_layer_in)

    def test_list_layer_groups(self):
        # Execute
        response = self.engine.list_layer_groups(debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # List of strings
        if len(result) > 0:
            self.assertIsInstance(result[0], str)

        # Test layer group listed
        self.assertIn(self.test_layer_group_name, result)

    def test_list_layer_groups_with_properties(self):
        # Execute
        response = self.engine.list_layer_groups(with_properties=True, debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Returns list
        self.assertIsInstance(result, list)

        # List of dictionaries
        if len(result) > 0:
            self.assertIsInstance(result[0], dict)

        # Test layer included
        test_layer_group_in = False

        for r in result:
            if r['name'] == self.test_layer_group_name:
                test_layer_group_in = True
                break

        self.assertTrue(test_layer_group_in)

    def test_list_workspaces(self):
        pass

    def test_list_stores(self):
        pass

    def test_list_styles(self):
        pass

    def test_get_resource(self):
        # Execute
        response = self.engine.get_resource(resource_id=self.test_resource_name, debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Type
        self.assertIsInstance(result, dict)

        # Properties
        self.assertIn('workspace', result)
        self.assertEqual(result['workspace'], self.test_resource_workspace)

    def test_get_resource_with_workspace(self):
        # Execute
        response = self.engine.get_resource(resource_id=self.test_resource_identifier,
                                            debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Type
        self.assertIsInstance(result, dict)

        # Properties
        self.assertIn('name', result)
        self.assertIn('workspace', result)
        self.assertEqual(result['name'], self.test_resource_name)
        self.assertEqual(result['workspace'], self.test_resource_workspace)

    def test_get_resource_with_store(self):
        # Execute
        response = self.engine.get_resource(resource_id=self.test_resource_name,
                                            store=self.test_resource_store,
                                            debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Type
        self.assertIsInstance(result, dict)

        # Properties
        self.assertIn('name', result)
        self.assertIn('store', result)
        self.assertEqual(result['name'], self.test_resource_name)
        self.assertEqual(result['store'], self.test_resource_store)

    def test_get_resource_multiple_with_name(self):
        pass

    def test_get_layer(self):
        # Execute
        response = self.engine.get_layer(layer_id=self.test_layer_name, debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Type
        self.assertIsInstance(result, dict)

        # Properties
        self.assertIn('name', result)
        self.assertEqual(result['name'], self.test_layer_name)

    def test_get_layer_group(self):
        # Execute
        response = self.engine.get_layer_group(layer_group_id=self.test_layer_group_name, debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Type
        self.assertIsInstance(result, dict)

        # Properties
        self.assertIn('name', result)
        self.assertEqual(result['name'], self.test_layer_group_name)

    def test_get_store(self):
        pass

    def test_get_workspace(self):
        pass

    def test_get_style(self):
        pass

    def test_update_resource(self):
        # Setup
        new_title = random_string_generator(15)

        # Execute
        response = self.engine.update_resource(resource_id=self.test_resource_name,
                                               title=new_title,
                                               debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Get new resource
        updated_response = self.engine.get_resource(resource_id=self.test_resource_name, debug=self.debug)
        updated_result = updated_response['result']

        # Properties
        self.assertEqual(result['title'], new_title)
        self.assertEqual(updated_result['title'], new_title)
        self.assertEqual(result['title'], updated_result['title'])
        self.assertEqual(result, updated_result)

    def test_update_resource_workspace(self):
        # Setup
        new_title = random_string_generator(15)

        # Execute
        response = self.engine.update_resource(resource_id=self.test_resource_identifier,
                                               title=new_title,
                                               debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Get new resource
        updated_response = self.engine.get_resource(resource_id=self.test_resource_identifier,
                                                    debug=self.debug)
        updated_result = updated_response['result']

        # Properties
        self.assertEqual(result['title'], new_title)
        self.assertEqual(updated_result['title'], new_title)
        self.assertEqual(result['title'], updated_result['title'])
        self.assertEqual(result, updated_result)

    def test_update_resource_store(self):
        pause(10)
        # Setup
        new_title = random_string_generator(15)

        # Execute
        response = self.engine.update_resource(resource_id=self.test_resource_name,
                                               store=self.test_resource_store,
                                               title=new_title,
                                               debug=self.debug)

        # Validate response object
        self.assert_valid_response_object(response)

        # Success
        self.assertTrue(response['success'])

        # Extract Result
        result = response['result']

        # Get new resource
        updated_response = self.engine.get_resource(resource_id=self.test_resource_name,
                                                    store=self.test_resource_store,
                                                    debug=self.debug)
        updated_result = updated_response['result']

        # Properties
        self.assertEqual(result['title'], new_title)
        self.assertEqual(updated_result['title'], new_title)
        self.assertEqual(result['title'], updated_result['title'])
        self.assertEqual(result, updated_result)

    def test_update_layer(self):
        # Get original
        old_response = self.engine.get_layer(layer_id=self.test_layer_name)

        # Update
        new_default_style = self.test_style_name
        response = self.engine.update_layer(layer_id=self.test_layer_name,
                                            default_style=new_default_style,
                                            debug=self.debug)

        # Update should succeed
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])

        old_result = old_response['result']
        result = response['result']
        self.assertEqual(result['default_style'], new_default_style)
        self.assertNotEqual(old_result['default_style'], result['default_style'])

    def test_update_layer_group(self):
        pass

    def test_delete_resource(self):
        # Must delete layer group and layer first
        self.engine.delete_layer_group(layer_group_id=self.test_layer_group_name)
        self.engine.delete_layer(layer_id=self.test_layer_name)

        # Do delete
        response = self.engine.delete_resource(resource_id=self.test_resource_identifier)

        # Should succeed
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])
        self.assertIsNone(response['result'])

    def test_delete_resource_belongs_to_layer(self):
        # Do delete without deleting layer group and layer
        response = self.engine.delete_resource(resource_id=self.test_resource_identifier)

        # Should fail
        self.assert_valid_response_object(response)
        self.assertFalse(response['success'])

    def test_delete_resource_recurse(self):
        # Force delete with recurse
        response = self.engine.delete_resource(resource_id=self.test_resource_identifier, recurse=True)

        # Should succeed
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])
        self.assertIsNone(response['result'])

    def test_delete_resource_does_not_exist(self):
        # Do delete
        response = self.engine.delete_resource(resource_id='iDontExist')

        # Should fail
        self.assert_valid_response_object(response)
        self.assertFalse(response['success'])

    def test_delete_layer(self):
        # Delete layer group first
        self.engine.delete_layer_group(layer_group_id=self.test_layer_group_name)

        # Do delete
        response = self.engine.delete_layer(layer_id=self.test_layer_name)

        # Should succeed
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])
        self.assertIsNone(response['result'])

    def test_delete_layer_belongs_to_group(self):
        # Do delete without deleting layer group
        response = self.engine.delete_layer(layer_id=self.test_layer_name)

        # Should fail
        self.assert_valid_response_object(response)
        self.assertFalse(response['success'])

    def test_delete_layer_recurse(self):
        # Force delete with recurse
        response = self.engine.delete_layer(layer_id=self.test_layer_name, recurse=True)

        # Should succeed
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])
        self.assertIsNone(response['result'])

    def test_delete_layer_does_not_exist(self):
        # Delete layer group first
        self.engine.delete_layer_group(layer_group_id=self.test_layer_group_name)

        # Do delete
        response = self.engine.delete_layer(layer_id='iDontExist')

        # Should fail
        self.assert_valid_response_object(response)
        self.assertFalse(response['success'])

    def test_delete_layer_group(self):
        # Do delete
        response = self.engine.delete_layer_group(layer_group_id=self.test_layer_group_name)

        # Should succeed
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])
        self.assertIsNone(response['result'])

    def test_delete_layer_group_does_not_exist(self):
        # Do delete
        response = self.engine.delete_layer_group(layer_group_id='iDontExist')

        # Should fail
        self.assert_valid_response_object(response)
        self.assertFalse(response['success'])

    def test_delete_workspace(self):
        pass

    def test_delete_store(self):
        pass

    def test_delete_style(self):
        pass

    def test_create_layer_group(self):
        # Do create
        name = random_string_generator(10)
        layers = (self.test_layer_name,)
        styles = (self.test_style_name,)
        response = self.engine.create_layer_group(layer_group_id=name, layers=layers, styles=styles)

        # Should succeed
        self.assert_valid_response_object(response)
        self.assertTrue(response['success'])

        # Validate
        result = response['result']
        self.assertEqual(result['name'], name)
        self.assertEqual(result['layers'], layers)
        self.assertEqual(result['styles'], [])

        # Clean up
        self.engine.delete_layer_group(layer_group_id=name)

    def test_create_layer_group_mismatch_layers_styles(self):
        # Do create with differing number of styles and layers
        name = random_string_generator(10)
        layers = (self.test_layer_name,)
        styles = (self.test_style_name, self.test_style_name)
        response = self.engine.create_layer_group(layer_group_id=name, layers=layers, styles=styles)

        # Should fail
        self.assert_valid_response_object(response)
        self.assertFalse(response['success'])

    def test_create_shapefile_resource(self):
        self.assertTrue(False)

    def test_create_coverage_resource(self):
        self.assertTrue(False)

    def test_create_workspace(self):
        self.assertTrue(False)

    def test_create_style(self):
        self.assertTrue(False)

    def test_create_sql_view(self):
        self.assertTrue(False)