import ast
from django.test.utils import override_settings
from owslib.etree import etree
from geonode.base.populate_test_data import create_single_doc, create_single_dataset, create_single_map
from django.contrib.auth.models import AnonymousUser
from django.test.client import RequestFactory
from geonode.catalogue.views import csw_global_dispatch
from django.test import TestCase
from django.conf import settings
[docs]
pycsw_settings = settings.PYCSW.copy()
[docs]
pycsw_settings_all = settings.PYCSW.copy()
pycsw_settings["FILTER"] = {"resource_type__in": ["dataset", "map"]}
pycsw_settings_all["FILTER"] = {"resource_type__in": ["dataset", "map", "document"]}
[docs]
class TestGeoNodeRepository(TestCase):
# to simplify the tests we pass throught csw_global_dispatch
# since call the GeoNodeRepository.query
[docs]
def setUp(self):
self.layer = create_single_dataset("dataset_name")
self.map = create_single_map("map_name")
self.doc = create_single_doc("doc_name")
self.request = self.__request_factory()
[docs]
def test_if_pycsw_filter_is_not_set_should_return_only_the_dataset_by_default(self):
response = csw_global_dispatch(self.request)
root = etree.fromstring(response.content)
child = [x.attrib for x in root if "numberOfRecordsMatched" in x.attrib]
returned_results = ast.literal_eval(child[0].get("numberOfRecordsMatched", "0")) if child else 0
self.assertEqual(1, returned_results)
@override_settings(PYCSW=pycsw_settings)
[docs]
def test_if_pycsw_filter_is_set_should_return_only_datasets_and_map(self):
response = csw_global_dispatch(self.request)
root = etree.fromstring(response.content)
child = [x.attrib for x in root if "numberOfRecordsMatched" in x.attrib]
returned_results = ast.literal_eval(child[0].get("numberOfRecordsMatched", "0")) if child else 0
self.assertEqual(2, returned_results)
@override_settings(PYCSW=pycsw_settings_all)
[docs]
def test_if_pycsw_filter_is_set_should_return_all_datasets_map_doc(self):
response = csw_global_dispatch(self.request)
root = etree.fromstring(response.content)
child = [x.attrib for x in root if "numberOfRecordsMatched" in x.attrib]
returned_results = ast.literal_eval(child[0].get("numberOfRecordsMatched", "0")) if child else 0
self.assertEqual(3, returned_results)
@staticmethod
[docs]
def __request_factory():
factory = RequestFactory()
url = "http://localhost:8000/catalogue/csw?request=GetRecords"
url += "&service=CSW&version=2.0.2&outputschema=http%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd"
url += "&elementsetname=brief&typenames=csw:Record&resultType=results"
request = factory.get(url)
request.user = AnonymousUser()
return request