示例#1
0
    def set_up(self):
        self.test_app = TethysApp.objects.get(package='test_app')
        self.wps = WebProcessingService(
            name='test_wps',
            endpoint='http://localhost/wps/WebProcessingService',
            username='******',
            password='******')
        self.wps.save()

        self.sds = SpatialDatasetService(
            name='test_sds',
            endpoint='http://localhost/geoserver/rest/',
            username='******',
            password='******')
        self.sds.save()

        self.ds = DatasetService(
            name='test_ds',
            endpoint='http://localhost/api/3/action/',
            apikey='foo',
        )
        self.ds.save()

        self.ps = PersistentStoreService(name='test_ps',
                                         host='localhost',
                                         port='5432',
                                         username='******',
                                         password='******')
        self.ps.save()
    def test_get_value(self):
        sds = SpatialDatasetService(
            name='test_sds',
            endpoint='http://localhost/geoserver/rest/',
            public_endpoint='http://publichost/geoserver/rest/',
            apikey='test_api',
            username='******',
            password='******',
        )
        sds.save()
        sds_setting = self.test_app.settings_set.select_subclasses().get(
            name='primary_geoserver')
        sds_setting.spatial_dataset_service = sds
        sds_setting.save()

        ret = self.test_app.settings_set.select_subclasses().get(
            name='primary_geoserver').get_value()

        # Check result
        self.assertEqual('test_sds', ret.name)
        self.assertEqual('http://localhost/geoserver/rest/', ret.endpoint)
        self.assertEqual('http://publichost/geoserver/rest/',
                         ret.public_endpoint)
        self.assertEqual('test_api', ret.apikey)
        self.assertEqual('foo', ret.username)
        self.assertEqual('password', ret.password)
示例#3
0
def services_create_spatial_command(args):
    """
    Interact with Tethys Services (Spatial/Persistent Stores) to create them and/or link them to existing apps
    """
    load_apps()
    from tethys_services.models import SpatialDatasetService
    name = None

    try:
        name = args.name
        connection = args.connection
        parts = connection.split('@')
        cred_parts = parts[0].split(':')
        service_username = cred_parts[0]
        service_password = cred_parts[1]
        endpoint = parts[1]
        public_endpoint = args.public_endpoint or ''
        apikey = args.apikey or ''

        if 'http' not in endpoint or '://' not in endpoint:
            raise IndexError()
        if public_endpoint and 'http' not in public_endpoint or '://' not in public_endpoint:
            raise FormatError()

        endpoint = add_geoserver_rest_to_endpoint(endpoint)
        if public_endpoint:
            public_endpoint = add_geoserver_rest_to_endpoint(public_endpoint)

        new_persistent_service = SpatialDatasetService(
            name=name,
            endpoint=endpoint,
            public_endpoint=public_endpoint,
            apikey=apikey,
            username=service_username,
            password=service_password)
        new_persistent_service.save()

        with pretty_output(FG_GREEN) as p:
            p.write('Successfully created new Spatial Dataset Service!')
    except IndexError:
        with pretty_output(FG_RED) as p:
            p.write('The connection argument (-c) must be of the form '
                    '"<username>:<password>@<protocol>//<host>:<port>".')
    except FormatError:
        with pretty_output(FG_RED) as p:
            p.write(
                'The public_endpoint argument (-p) must be of the form "<protocol>//<host>:<port>".'
            )
    except IntegrityError:
        with pretty_output(FG_RED) as p:
            p.write(
                'Spatial Dataset Service with name "{0}" already exists. Command aborted.'
                .format(name))
    def test_get_value_check_if_thredds(self, mock_TDSCatalog):
        sds = SpatialDatasetService(
            name='test_sds',
            engine=SpatialDatasetService.THREDDS,
            endpoint='http://localhost/thredds/',
            public_endpoint='http://publichost/thredds/',
            apikey='test_api',
            username='******',
            password='******',
        )
        sds.save()
        sds_setting = self.test_app.settings_set.select_subclasses().get(
            name='primary_thredds')
        sds_setting.spatial_dataset_service = sds
        sds_setting.save()

        # Check as_engine
        ret = self.test_app.settings_set.select_subclasses().get(
            name='primary_thredds').get_value(as_engine=True)
        # Check result
        mock_TDSCatalog.assert_called_with(
            'http://localhost/thredds/catalog.xml')
        self.assertEqual(mock_TDSCatalog(), ret)

        # Check as wms
        ret = self.test_app.settings_set.select_subclasses().get(
            name='primary_thredds').get_value(as_wms=True)
        # Check result
        self.assertEqual('http://localhost/thredds/wms', ret)

        # Check as wfs
        self.assertRaises(ValueError,
                          self.test_app.settings_set.select_subclasses().get(
                              name='primary_thredds').get_value,
                          as_wfs=True)

        # Check as wcs
        ret = self.test_app.settings_set.select_subclasses().get(
            name='primary_thredds').get_value(as_wcs=True)
        # Check result
        self.assertEqual('http://localhost/thredds/wcs', ret)

        # Check as_endpoint
        ret = self.test_app.settings_set.select_subclasses().get(
            name='primary_thredds').get_value(as_endpoint=True)
        # Check result
        self.assertEqual('http://localhost/thredds/', ret)

        # Check as_endpoint
        ret = self.test_app.settings_set.select_subclasses().get(name='primary_thredds').\
            get_value(as_public_endpoint=True)
        # Check result
        self.assertEqual('http://publichost/thredds/', ret)
    def test_get_value_check_if_geoserver(self):
        sds = SpatialDatasetService(
            name='test_sds',
            engine=SpatialDatasetService.GEOSERVER,
            endpoint='http://localhost/geoserver/rest/',
            public_endpoint='http://publichost/geoserver/rest/',
            apikey='test_api',
            username='******',
            password='******',
        )
        sds.save()
        sds_setting = self.test_app.settings_set.select_subclasses().get(
            name='primary_geoserver')
        sds_setting.spatial_dataset_service = sds
        sds_setting.save()

        # Check as_engine
        ret = self.test_app.settings_set.select_subclasses().get(
            name='primary_geoserver').get_value(as_engine=True)
        # Check result
        self.assertEqual('GEOSERVER', ret.type)
        self.assertEqual('http://localhost/geoserver/rest/', ret.endpoint)

        # Check as wms
        ret = self.test_app.settings_set.select_subclasses().get(
            name='primary_geoserver').get_value(as_wms=True)
        # Check result
        self.assertEqual('http://localhost/geoserver/wms', ret)

        # Check as wfs
        ret = self.test_app.settings_set.select_subclasses().get(
            name='primary_geoserver').get_value(as_wfs=True)
        # Check result
        self.assertEqual('http://localhost/geoserver/ows', ret)

        # Check as wcs
        ret = self.test_app.settings_set.select_subclasses().get(
            name='primary_geoserver').get_value(as_wcs=True)
        # Check result
        self.assertEqual('http://localhost/geoserver/wcs', ret)

        # Check as_endpoint
        ret = self.test_app.settings_set.select_subclasses().get(
            name='primary_geoserver').get_value(as_endpoint=True)
        # Check result
        self.assertEqual('http://localhost/geoserver/rest/', ret)

        # Check as_endpoint
        ret = self.test_app.settings_set.select_subclasses().get(name='primary_geoserver').\
            get_value(as_public_endpoint=True)
        # Check result
        self.assertEqual('http://publichost/geoserver/rest/', ret)
示例#6
0
    def set_up(self):
        self.test_app = TethysApp.objects.get(package='test_app')
        self.wps = WebProcessingService(
            name='test_wps',
            endpoint='http://localhost/wps/WebProcessingService',
            username='******',
            password='******'

        )
        self.wps.save()

        self.sds = SpatialDatasetService(
            name='test_sds',
            endpoint='http://localhost/geoserver/rest/',
            username='******',
            password='******'
        )
        self.sds.save()

        self.ds = DatasetService(
            name='test_ds',
            endpoint='http://localhost/api/3/action/',
            apikey='foo',
        )
        self.ds.save()

        self.ps = PersistentStoreService(
            name='test_ps',
            host='localhost',
            port='5432',
            username='******',
            password='******'
        )
        self.ps.save()
示例#7
0
def services_create_spatial_command(args):
    """
    Interact with Tethys Services (Spatial/Persistent Stores) to create them and/or link them to existing apps
    """
    from tethys_services.models import SpatialDatasetService
    name = None

    try:
        name = args.name
        connection = args.connection
        parts = connection.split('@')
        cred_parts = parts[0].split(':')
        service_username = cred_parts[0]
        service_password = cred_parts[1]
        endpoint = parts[1]
        public_endpoint = args.public_endpoint or ''
        apikey = args.apikey or ''

        if 'http' not in endpoint or '://' not in endpoint:
            raise IndexError()
        if public_endpoint and 'http' not in public_endpoint or '://' not in public_endpoint:
            raise FormatError()

        endpoint = add_geoserver_rest_to_endpoint(endpoint)
        if public_endpoint:
            public_endpoint = add_geoserver_rest_to_endpoint(public_endpoint)

        new_persistent_service = SpatialDatasetService(name=name, endpoint=endpoint, public_endpoint=public_endpoint,
                                                       apikey=apikey, username=service_username,
                                                       password=service_password)
        new_persistent_service.save()

        with pretty_output(FG_GREEN) as p:
            p.write('Successfully created new Spatial Dataset Service!')
    except IndexError:
        with pretty_output(FG_RED) as p:
            p.write('The connection argument (-c) must be of the form '
                    '"<username>:<password>@<protocol>//<host>:<port>".')
    except FormatError:
        with pretty_output(FG_RED) as p:
            p.write('The public_endpoint argument (-p) must be of the form '
                    '"<protocol>//<host>:<port>".')
    except IntegrityError:
        with pretty_output(FG_RED) as p:
            p.write('Spatial Dataset Service with name "{0}" already exists. Command aborted.'.format(name))
    def test_get_value_check_if(self):
        sds = SpatialDatasetService(
            name='test_sds',
            endpoint='http://localhost/geoserver/rest/',
            public_endpoint='http://publichost/geoserver/rest/',
            apikey='test_api',
            username='******',
            password='******',
        )
        sds.save()
        sds_setting = self.test_app.settings_set.select_subclasses().get(name='primary_geoserver')
        sds_setting.spatial_dataset_service = sds
        sds_setting.save()

        # Check as_engine
        ret = self.test_app.settings_set.select_subclasses().get(name='primary_geoserver').get_value(as_engine=True)
        # Check result
        self.assertEqual('GEOSERVER', ret.type)
        self.assertEqual('http://localhost/geoserver/rest/', ret.endpoint)

        # Check as wms
        ret = self.test_app.settings_set.select_subclasses().get(name='primary_geoserver').get_value(as_wms=True)
        # Check result
        self.assertEqual('http://localhost/geoserver/wms', ret)

        # Check as wfs
        ret = self.test_app.settings_set.select_subclasses().get(name='primary_geoserver').get_value(as_wfs=True)
        # Check result
        self.assertEqual('http://localhost/geoserver/ows', ret)

        # Check as_endpoint
        ret = self.test_app.settings_set.select_subclasses().get(name='primary_geoserver').get_value(as_endpoint=True)
        # Check result
        self.assertEqual('http://localhost/geoserver/rest/', ret)

        # Check as_endpoint
        ret = self.test_app.settings_set.select_subclasses().get(name='primary_geoserver').\
            get_value(as_public_endpoint=True)
        # Check result
        self.assertEqual('http://publichost/geoserver/rest/', ret)
    def test_get_value(self):
        sds = SpatialDatasetService(
            name='test_sds',
            endpoint='http://localhost/geoserver/rest/',
            public_endpoint='http://publichost/geoserver/rest/',
            apikey='test_api',
            username='******',
            password='******',
        )
        sds.save()
        sds_setting = self.test_app.settings_set.select_subclasses().get(name='primary_geoserver')
        sds_setting.spatial_dataset_service = sds
        sds_setting.save()

        ret = self.test_app.settings_set.select_subclasses().get(name='primary_geoserver').get_value()

        # Check result
        self.assertEqual('test_sds', ret.name)
        self.assertEqual('http://localhost/geoserver/rest/', ret.endpoint)
        self.assertEqual('http://publichost/geoserver/rest/', ret.public_endpoint)
        self.assertEqual('test_api', ret.apikey)
        self.assertEqual('foo', ret.username)
        self.assertEqual('password', ret.password)
示例#10
0
class TethysAppTests(TethysTestCase):
    def set_up(self):
        self.test_app = TethysApp.objects.get(package='test_app')
        self.wps = WebProcessingService(
            name='test_wps',
            endpoint='http://localhost/wps/WebProcessingService',
            username='******',
            password='******')
        self.wps.save()

        self.sds = SpatialDatasetService(
            name='test_sds',
            endpoint='http://localhost/geoserver/rest/',
            username='******',
            password='******')
        self.sds.save()

        self.ds = DatasetService(
            name='test_ds',
            endpoint='http://localhost/api/3/action/',
            apikey='foo',
        )
        self.ds.save()

        self.ps = PersistentStoreService(name='test_ps',
                                         host='localhost',
                                         port='5432',
                                         username='******',
                                         password='******')
        self.ps.save()

    def tear_down(self):
        self.wps.delete()
        self.ps.delete()
        self.ds.delete()
        self.sds.delete()

    def test_str(self):
        ret = str(self.test_app)
        self.assertEqual('Test App', ret)

    def test_add_settings(self):
        new_setting = TethysAppSetting(name='new_setting', required=False)

        self.test_app.add_settings([new_setting])

        app = TethysApp.objects.get(package='test_app')
        settings = app.settings_set.filter(name='new_setting')
        self.assertEqual(1, len(settings))

    def test_add_settings_add_same_setting_twice(self):
        new_setting = TethysAppSetting(name='new_setting', required=False)
        new_setting_same_name = TethysAppSetting(name='new_setting',
                                                 required=False)

        self.test_app.add_settings([new_setting, new_setting_same_name])

        app = TethysApp.objects.get(package='test_app')
        settings = app.settings_set.filter(name='new_setting')
        self.assertEqual(1, len(settings))

    def test_settings_prop(self):
        ret = self.test_app.settings
        self.assertEqual(13, len(ret))

        for r in ret:
            self.assertIsInstance(r, TethysAppSetting)

    def test_custom_settings_prop(self):
        custom_setting = self.test_app.settings_set.select_subclasses().get(
            name='default_name')
        custom_setting.value = 'foo'
        custom_setting.save()

        ret = self.test_app.custom_settings

        for r in ret:
            self.assertIsInstance(r, TethysAppSetting)
            if r.name == 'default_name':
                self.assertEqual('foo', r.value)

    def test_dataset_service_settings_prop(self):
        ds_setting = self.test_app.settings_set.select_subclasses().get(
            name='primary_ckan')
        ds_setting.dataset_service = self.ds
        ds_setting.save()

        ret = self.test_app.dataset_service_settings

        for r in ret:
            self.assertIsInstance(r, TethysAppSetting)
            if r.name == 'primary_ckan':
                self.assertEqual('test_ds', r.dataset_service.name)
                self.assertEqual('foo', r.dataset_service.apikey)
                self.assertEqual('http://localhost/api/3/action/',
                                 r.dataset_service.endpoint)

    def test_spatial_dataset_service_settings_prop(self):
        sds_setting = self.test_app.settings_set.select_subclasses().get(
            name='primary_geoserver')
        sds_setting.spatial_dataset_service = self.sds
        sds_setting.save()

        ret = self.test_app.spatial_dataset_service_settings

        for r in ret:
            self.assertIsInstance(r, TethysAppSetting)
            if r.name == 'primary_geoserver':
                self.assertEqual('test_sds', r.spatial_dataset_service.name)
                self.assertEqual('http://localhost/geoserver/rest/',
                                 r.spatial_dataset_service.endpoint)
                self.assertEqual('foo', r.spatial_dataset_service.username)
                self.assertEqual('password',
                                 r.spatial_dataset_service.password)

    def test_wps_services_settings_prop(self):
        wps_setting = self.test_app.settings_set.select_subclasses().get(
            name='primary_52n')
        wps_setting.web_processing_service = self.wps
        wps_setting.save()

        ret = self.test_app.wps_services_settings

        for r in ret:
            self.assertIsInstance(r, TethysAppSetting)
            if r.name == 'primary_52n':
                self.assertEqual('test_wps', r.web_processing_service.name)
                self.assertEqual('http://localhost/wps/WebProcessingService',
                                 r.web_processing_service.endpoint)
                self.assertEqual('foo', r.web_processing_service.username)
                self.assertEqual('password', r.web_processing_service.password)

    def test_persistent_store_connection_settings_prop(self):
        ps_setting = self.test_app.settings_set.select_subclasses().get(
            name='primary')
        ps_setting.persistent_store_service = self.ps
        ps_setting.save()

        ret = self.test_app.persistent_store_connection_settings

        for r in ret:
            self.assertIsInstance(r, TethysAppSetting)
            if r.name == 'primary':
                self.assertEqual('test_ps', r.persistent_store_service.name)
                self.assertEqual('localhost', r.persistent_store_service.host)
                self.assertEqual(5432, r.persistent_store_service.port)
                self.assertEqual('foo', r.persistent_store_service.username)
                self.assertEqual('password',
                                 r.persistent_store_service.password)

    def test_persistent_store_database_settings_prop(self):
        ps_setting = self.test_app.settings_set.select_subclasses().get(
            name='spatial_db')
        ps_setting.persistent_store_service = self.ps
        ps_setting.save()

        ret = self.test_app.persistent_store_database_settings

        for r in ret:
            self.assertIsInstance(r, TethysAppSetting)
            if r.name == 'spatial_db':
                self.assertEqual('test_ps', r.persistent_store_service.name)
                self.assertEqual('localhost', r.persistent_store_service.host)
                self.assertEqual(5432, r.persistent_store_service.port)
                self.assertEqual('foo', r.persistent_store_service.username)
                self.assertEqual('password',
                                 r.persistent_store_service.password)

    def test_configured_prop_required_and_set(self):
        # See: test_app.app for expected settings configuration
        # Set required settings
        custom_setting = self.test_app.settings_set.select_subclasses().get(
            name='default_name')
        custom_setting.value = 'foo'
        custom_setting.save()

        ds_setting = self.test_app.settings_set.select_subclasses().get(
            name='primary_ckan')
        ds_setting.dataset_service = self.ds
        ds_setting.save()

        sds_setting = self.test_app.settings_set.select_subclasses().get(
            name='primary_geoserver')
        sds_setting.spatial_dataset_service = self.sds
        sds_setting.save()

        wps_setting = self.test_app.settings_set.select_subclasses().get(
            name='primary_52n')
        wps_setting.web_processing_service = self.wps
        wps_setting.save()

        ps_setting = self.test_app.settings_set.select_subclasses().get(
            name='primary')
        ps_setting.persistent_store_service = self.ps
        ps_setting.save()

        ps_db_setting = self.test_app.settings_set.select_subclasses().get(
            name='spatial_db')
        ps_db_setting.persistent_store_service = self.ps
        ps_db_setting.save()

        ret = self.test_app.configured

        self.assertTrue(ret)

    def test_configured_prop_required_no_value(self):
        # See: test_app.app for expected settings configuration
        # Set required settings
        custom_setting = self.test_app.settings_set.select_subclasses().get(
            name='default_name')
        custom_setting.value = ''  # <-- NOT SET / NO VALUE
        custom_setting.save()

        ds_setting = self.test_app.settings_set.select_subclasses().get(
            name='primary_ckan')
        ds_setting.dataset_service = self.ds
        ds_setting.save()

        sds_setting = self.test_app.settings_set.select_subclasses().get(
            name='primary_geoserver')
        sds_setting.spatial_dataset_service = self.sds
        sds_setting.save()

        wps_setting = self.test_app.settings_set.select_subclasses().get(
            name='primary_52n')
        wps_setting.web_processing_service = self.wps
        wps_setting.save()

        ps_setting = self.test_app.settings_set.select_subclasses().get(
            name='primary')
        ps_setting.persistent_store_service = self.ps
        ps_setting.save()

        psd_setting = self.test_app.settings_set.select_subclasses().get(
            name='spatial_db')
        psd_setting.persistent_store_service = self.ps
        psd_setting.save()

        ret = self.test_app.configured
        self.assertFalse(ret)

    def test_configured_prop_not_assigned_exception(self):
        ret = self.test_app.configured

        self.assertFalse(ret)
示例#11
0
class TethysAppTests(TethysTestCase):

    def set_up(self):
        self.test_app = TethysApp.objects.get(package='test_app')
        self.wps = WebProcessingService(
            name='test_wps',
            endpoint='http://localhost/wps/WebProcessingService',
            username='******',
            password='******'

        )
        self.wps.save()

        self.sds = SpatialDatasetService(
            name='test_sds',
            endpoint='http://localhost/geoserver/rest/',
            username='******',
            password='******'
        )
        self.sds.save()

        self.ds = DatasetService(
            name='test_ds',
            endpoint='http://localhost/api/3/action/',
            apikey='foo',
        )
        self.ds.save()

        self.ps = PersistentStoreService(
            name='test_ps',
            host='localhost',
            port='5432',
            username='******',
            password='******'
        )
        self.ps.save()

    def tear_down(self):
        self.wps.delete()
        self.ps.delete()
        self.ds.delete()
        self.sds.delete()

    def test_str(self):
        ret = str(self.test_app)
        self.assertEqual('Test App', ret)

    def test_add_settings(self):
        new_setting = TethysAppSetting(
            name='new_setting',
            required=False
        )

        self.test_app.add_settings([new_setting])

        app = TethysApp.objects.get(package='test_app')
        settings = app.settings_set.filter(name='new_setting')
        self.assertEqual(1, len(settings))

    def test_add_settings_add_same_setting_twice(self):
        new_setting = TethysAppSetting(
            name='new_setting',
            required=False
        )
        new_setting_same_name = TethysAppSetting(
            name='new_setting',
            required=False
        )

        self.test_app.add_settings([new_setting, new_setting_same_name])

        app = TethysApp.objects.get(package='test_app')
        settings = app.settings_set.filter(name='new_setting')
        self.assertEqual(1, len(settings))

    def test_settings_prop(self):
        ret = self.test_app.settings
        self.assertEqual(12, len(ret))

        for r in ret:
            self.assertIsInstance(r, TethysAppSetting)

    def test_custom_settings_prop(self):
        custom_setting = self.test_app.settings_set.select_subclasses().get(name='default_name')
        custom_setting.value = 'foo'
        custom_setting.save()

        ret = self.test_app.custom_settings

        for r in ret:
            self.assertIsInstance(r, TethysAppSetting)
            if r.name == 'default_name':
                self.assertEqual('foo', r.value)

    def test_dataset_service_settings_prop(self):
        ds_setting = self.test_app.settings_set.select_subclasses().get(name='primary_ckan')
        ds_setting.dataset_service = self.ds
        ds_setting.save()

        ret = self.test_app.dataset_service_settings

        for r in ret:
            self.assertIsInstance(r, TethysAppSetting)
            if r.name == 'primary_ckan':
                self.assertEqual('test_ds', r.dataset_service.name)
                self.assertEqual('foo', r.dataset_service.apikey)
                self.assertEqual('http://localhost/api/3/action/', r.dataset_service.endpoint)

    def test_spatial_dataset_service_settings_prop(self):
        sds_setting = self.test_app.settings_set.select_subclasses().get(name='primary_geoserver')
        sds_setting.spatial_dataset_service = self.sds
        sds_setting.save()

        ret = self.test_app.spatial_dataset_service_settings

        for r in ret:
            self.assertIsInstance(r, TethysAppSetting)
            if r.name == 'primary_geoserver':
                self.assertEqual('test_sds', r.spatial_dataset_service.name)
                self.assertEqual('http://localhost/geoserver/rest/', r.spatial_dataset_service.endpoint)
                self.assertEqual('foo', r.spatial_dataset_service.username)
                self.assertEqual('password', r.spatial_dataset_service.password)

    def test_wps_services_settings_prop(self):
        wps_setting = self.test_app.settings_set.select_subclasses().get(name='primary_52n')
        wps_setting.web_processing_service = self.wps
        wps_setting.save()

        ret = self.test_app.wps_services_settings

        for r in ret:
            self.assertIsInstance(r, TethysAppSetting)
            if r.name == 'primary_52n':
                self.assertEqual('test_wps', r.web_processing_service.name)
                self.assertEqual('http://localhost/wps/WebProcessingService', r.web_processing_service.endpoint)
                self.assertEqual('foo', r.web_processing_service.username)
                self.assertEqual('password', r.web_processing_service.password)

    def test_persistent_store_connection_settings_prop(self):
        ps_setting = self.test_app.settings_set.select_subclasses().get(name='primary')
        ps_setting.persistent_store_service = self.ps
        ps_setting.save()

        ret = self.test_app.persistent_store_connection_settings

        for r in ret:
            self.assertIsInstance(r, TethysAppSetting)
            if r.name == 'primary':
                self.assertEqual('test_ps', r.persistent_store_service.name)
                self.assertEqual('localhost', r.persistent_store_service.host)
                self.assertEqual(5432, r.persistent_store_service.port)
                self.assertEqual('foo', r.persistent_store_service.username)
                self.assertEqual('password', r.persistent_store_service.password)

    def test_persistent_store_database_settings_prop(self):
        ps_setting = self.test_app.settings_set.select_subclasses().get(name='spatial_db')
        ps_setting.persistent_store_service = self.ps
        ps_setting.save()

        ret = self.test_app.persistent_store_database_settings

        for r in ret:
            self.assertIsInstance(r, TethysAppSetting)
            if r.name == 'spatial_db':
                self.assertEqual('test_ps', r.persistent_store_service.name)
                self.assertEqual('localhost', r.persistent_store_service.host)
                self.assertEqual(5432, r.persistent_store_service.port)
                self.assertEqual('foo', r.persistent_store_service.username)
                self.assertEqual('password', r.persistent_store_service.password)

    def test_configured_prop_required_and_set(self):
        # See: test_app.app for expected settings configuration
        # Set required settings
        custom_setting = self.test_app.settings_set.select_subclasses().get(name='default_name')
        custom_setting.value = 'foo'
        custom_setting.save()

        ds_setting = self.test_app.settings_set.select_subclasses().get(name='primary_ckan')
        ds_setting.dataset_service = self.ds
        ds_setting.save()

        sds_setting = self.test_app.settings_set.select_subclasses().get(name='primary_geoserver')
        sds_setting.spatial_dataset_service = self.sds
        sds_setting.save()

        wps_setting = self.test_app.settings_set.select_subclasses().get(name='primary_52n')
        wps_setting.web_processing_service = self.wps
        wps_setting.save()

        ps_setting = self.test_app.settings_set.select_subclasses().get(name='primary')
        ps_setting.persistent_store_service = self.ps
        ps_setting.save()

        ps_db_setting = self.test_app.settings_set.select_subclasses().get(name='spatial_db')
        ps_db_setting.persistent_store_service = self.ps
        ps_db_setting.save()

        ret = self.test_app.configured

        self.assertTrue(ret)

    def test_configured_prop_required_no_value(self):
        # See: test_app.app for expected settings configuration
        # Set required settings
        custom_setting = self.test_app.settings_set.select_subclasses().get(name='default_name')
        custom_setting.value = ''  # <-- NOT SET / NO VALUE
        custom_setting.save()

        ds_setting = self.test_app.settings_set.select_subclasses().get(name='primary_ckan')
        ds_setting.dataset_service = self.ds
        ds_setting.save()

        sds_setting = self.test_app.settings_set.select_subclasses().get(name='primary_geoserver')
        sds_setting.spatial_dataset_service = self.sds
        sds_setting.save()

        wps_setting = self.test_app.settings_set.select_subclasses().get(name='primary_52n')
        wps_setting.web_processing_service = self.wps
        wps_setting.save()

        ps_setting = self.test_app.settings_set.select_subclasses().get(name='primary')
        ps_setting.persistent_store_service = self.ps
        ps_setting.save()

        psd_setting = self.test_app.settings_set.select_subclasses().get(name='spatial_db')
        psd_setting.persistent_store_service = self.ps
        psd_setting.save()

        ret = self.test_app.configured
        self.assertFalse(ret)

    def test_configured_prop_not_assigned_exception(self):
        # See: test_app.app for expected settings configuration
        custom_setting = self.test_app.settings_set.select_subclasses().get(name='default_name')
        custom_setting.value = ''
        custom_setting.save()

        ds_setting = self.test_app.settings_set.select_subclasses().get(name='primary_ckan')
        ds_setting.dataset_service = None
        ds_setting.save()

        sds_setting = self.test_app.settings_set.select_subclasses().get(name='primary_geoserver')
        sds_setting.spatial_dataset_service = None
        sds_setting.save()

        wps_setting = self.test_app.settings_set.select_subclasses().get(name='primary_52n')
        wps_setting.web_processing_service = None
        wps_setting.save()

        ps_setting = self.test_app.settings_set.select_subclasses().get(name='primary')
        ps_setting.persistent_store_service = None
        ps_setting.save()

        psd_setting = self.test_app.settings_set.select_subclasses().get(name='spatial_db')
        psd_setting.persistent_store_service = None
        psd_setting.save()

        ret = self.test_app.configured

        self.assertFalse(ret)