# coding: utf-8
#
# pylint: disable=no-self-use, missing-docstring, too-many-public-methods
"""
Test classes for Kata's validators.
"""
import copy
import json
from unittest import TestCase
from collections import defaultdict
from ckanext.kata.validators import validate_kata_date, \
validate_email, validate_phonenum, \
validate_discipline, validate_spatial, validate_algorithm, \
validate_mimetype, validate_general, validate_kata_date_relaxed, \
validate_title_duplicates, validate_title, check_direct_download_url
from ckan.lib.navl.dictization_functions import Invalid, flatten_dict, StopOnError
from ckanext.kata.converters import remove_disabled_languages, checkbox_to_boolean, convert_languages, from_extras_json, to_extras_json, \
flattened_to_extras, flattened_from_extras
from ckanext.kata import settings
from ckanext.kata.tests.test_fixtures.flattened import TEST_DATA_FLATTENED
[docs]class TestValidators(TestCase):
"""Tests for Kata validators."""
@classmethod
[docs] def setup_class(cls):
"""Set up tests."""
[docs] def test_validate_kata_date_valid(self):
errors = defaultdict(list)
validate_kata_date('date', {'date': '2012-12-31T13:12:11'}, errors, None)
assert len(errors) == 0
[docs] def test_validate_kata_date_invalid(self):
errors = defaultdict(list)
validate_kata_date('date', {'date': '20xx-xx-31T13:12:11'}, errors, None)
assert len(errors) > 0
[docs] def test_validate_kata_date_invalid_2(self):
errors = defaultdict(list)
validate_kata_date('date', {'date': '2013-02-29T13:12:11'}, errors, None)
assert len(errors) > 0
[docs] def test_validate_kata_date_relaxed_valid(self):
errors = defaultdict(list)
validate_kata_date_relaxed('date', {'date': '2012-12-31T13:12:11'}, errors, None)
assert len(errors) == 0
[docs] def test_validate_kata_date_relaxed_valid_2(self):
errors = defaultdict(list)
validate_kata_date_relaxed('date', {'date': '2012-12'}, errors, None)
assert len(errors) == 0
[docs] def test_validate_kata_date_relaxed_valid_3(self):
errors = defaultdict(list)
validate_kata_date_relaxed('date', {'date': '2012-12-31'}, errors, None)
assert len(errors) == 0
[docs] def test_validate_kata_date_relaxed_invalid(self):
errors = defaultdict(list)
validate_kata_date_relaxed('date', {'date': '2001-12-45'}, errors, None)
assert len(errors) > 0
[docs] def test_validate_kata_date_relaxed_invalid_2(self):
errors = defaultdict(list)
validate_kata_date_relaxed('date', {'date': '2013-02-99T13:12:11'}, errors, None)
assert len(errors) > 0
[docs] def test_validate_language_valid(self):
errors = defaultdict(list)
convert_languages(('language',), TEST_DATA_FLATTENED, errors, None)
assert len(errors) == 0
[docs] def test_remove_disabled_languages_valid(self):
errors = defaultdict(list)
remove_disabled_languages(('language',), TEST_DATA_FLATTENED, errors, None)
assert len(errors) == 0
[docs] def test_validate_language_valid_2(self):
errors = defaultdict(list)
dada = copy.deepcopy(TEST_DATA_FLATTENED)
dada[('language',)] = u''
dada[('langdis',)] = 'True'
convert_languages(('language',), dada, errors, None)
assert len(errors) == 0
remove_disabled_languages(('language',), dada, errors, None)
assert len(errors) == 0
[docs] def test_validate_language_valid_3(self):
errors = defaultdict(list)
dada = copy.deepcopy(TEST_DATA_FLATTENED)
dada[('language',)] = u'fin, swe, eng, isl'
dada[('langdis',)] = 'False'
convert_languages(('language',), dada, errors, None)
assert len(errors) == 0
remove_disabled_languages(('language',), dada, errors, None)
assert len(errors) == 0
assert dada[('language',)] == u'fin, swe, eng, isl'
[docs] def test_validate_language_delete(self):
errors = defaultdict(list)
dada = copy.deepcopy(TEST_DATA_FLATTENED)
dada[('language',)] = u'fin, swe, eng, ita'
dada[('langdis',)] = 'True'
convert_languages(('language',), dada, errors, None)
assert len(errors) == 0
remove_disabled_languages(('language',), dada, errors, None)
assert len(errors) == 0
assert dada[('language',)] == u''
[docs] def test_validate_language_invalid(self):
errors = defaultdict(list)
dada = copy.deepcopy(TEST_DATA_FLATTENED)
dada[('language',)] = u'aa, ab, ac, ad, ae, af'
dada[('langdis',)] = 'False'
convert_languages(('language',), dada, errors, None)
assert len(errors) == 1
[docs] def test_validate_language_invalid_2(self):
errors = defaultdict(list)
dada = copy.deepcopy(TEST_DATA_FLATTENED)
dada[('language',)] = u''
dada[('langdis',)] = 'False'
convert_languages(('language',), dada, errors, None)
remove_disabled_languages(('language',), dada, errors, None)
assert len(errors) == 1
[docs] def test_validate_language_invalid_3(self):
errors = defaultdict(list)
dada = copy.deepcopy(TEST_DATA_FLATTENED)
dada[('language',)] = u'finglish, sv, en'
dada[('langdis',)] = 'True'
convert_languages(('language',), dada, errors, None)
assert len(errors) == 1
# def test_project_valid(self):
# errors = defaultdict(list)
# dada = copy.deepcopy(self.test_data)
# # dada[('projdis',)] = 'False'
# dada[('funder',)] = u'funder'
# dada[('project_name',)] = u'project name'
# dada[('project_funding',)] = u'project_funding'
# dada[('project_homepage',)] = u'www.google.fi'
#
# check_project_dis(('project_name',),
# dada, errors, None)
# assert len(errors) == 0
# check_project_dis(('funder',),
# dada, errors, None)
# assert len(errors) == 0
# check_project_dis(('project_funding',),
# dada, errors, None)
# assert len(errors) == 0
# check_project_dis(('project_homepage',),
# dada, errors, None)
# assert len(errors) == 0
#
# def test_project_invalid(self):
# errors = defaultdict(list)
# dada = copy.deepcopy(self.test_data)
# # dada[('projdis',)] = 'False'
# dada[('funder',)] = u''
# dada[('project_name',)] = u'project name'
# dada[('project_funding',)] = u'project_funding'
# dada[('project_homepage',)] = u'www.google.fi'
#
# check_project_dis(('project_name',),
# dada, errors, None)
# assert len(errors) == 0
# check_project_dis(('funder',),
# dada, errors, None)
# assert len(errors) > 0
#
# def test_project_notgiven(self):
# errors = defaultdict(list)
# dada = copy.deepcopy(self.test_data)
# # dada[('projdis',)] = 'True'
# dada[('project_name',)] = u'project name'
# check_project(('project_name',),
# dada, errors, None)
# print errors
# assert len(errors) > 0
#
[docs] def test_validate_email_valid(self):
errors = defaultdict(list)
validate_email(('contact', 0, 'email'), TEST_DATA_FLATTENED, errors, None)
assert len(errors) == 0
[docs] def test_validate_email_valid_2(self):
errors = defaultdict(list)
dada = copy.deepcopy(TEST_DATA_FLATTENED)
dada[('contact', 0, 'email')] = u'a.b.c.d@e.com'
validate_email(('contact', 0, 'email'), dada, errors, None)
assert len(errors) == 0
[docs] def test_validate_email_invalid(self):
errors = defaultdict(list)
dada = copy.deepcopy(TEST_DATA_FLATTENED)
dada[('contact', 0, 'email')] = u'a.b.c.d'
validate_email(('contact', 0, 'email'), dada, errors, None)
assert len(errors) == 1
[docs] def test_validate_email_invalid_2(self):
errors = defaultdict(list)
dada = copy.deepcopy(TEST_DATA_FLATTENED)
dada[('contact', 0, 'email')] = u'a.b@com'
validate_email(('contact', 0, 'email'), dada, errors, None)
assert len(errors) == 1
[docs] def test_validate_phonenum_valid(self):
errors = defaultdict(list)
validate_phonenum(('contact', 0, 'phone'), TEST_DATA_FLATTENED, errors, None)
assert len(errors) == 0
[docs] def test_validate_phonenum_invalid(self):
errors = defaultdict(list)
dada = copy.deepcopy(TEST_DATA_FLATTENED)
dada[('contact', 0, 'phone')] = u'123_notgood_456'
validate_phonenum(('contact', 0, 'phone'), dada, errors, None)
assert len(errors) == 1
[docs] def test_general_validator_invalid(self):
errors = defaultdict(list)
dada = copy.deepcopy(TEST_DATA_FLATTENED)
dada[('agent', 2, 'URL')] = u'http://www.<asdf123456>'
validate_general(('agent', 2, 'URL'), dada, errors, None)
assert len(errors) == 1
[docs] def test_validate_discipline(self):
errors = defaultdict(list)
dada = copy.deepcopy(TEST_DATA_FLATTENED)
dada[('discipline',)] = u'Matematiikka'
validate_discipline(('discipline',), dada, errors, None)
assert len(errors) == 0
del dada[('discipline',)]
validate_discipline(('discipline',), dada, errors, None)
assert len(errors) == 0
dada[('discipline',)] = u'Matematiikka (Logiikka!)'
self.assertRaises(Invalid, validate_discipline, ('discipline',), dada, errors, None)
[docs] def test_validate_spatial(self):
errors = defaultdict(list)
dada = copy.deepcopy(TEST_DATA_FLATTENED)
dada[('geographic_coverage',)] = u'Uusimaa (laani)'
validate_spatial(('geographic_coverage',), dada, errors, None)
assert len(errors) == 0
del dada[('geographic_coverage',)]
validate_spatial(('geographic_coverage',), dada, errors, None)
assert len(errors) == 0
dada[('geographic_coverage',)] = u'Uusimaa ([]!)'
self.assertRaises(Invalid, validate_spatial, ('geographic_coverage',), dada, errors, None)
[docs] def test_checkbox_to_boolean(self):
errors = defaultdict(list)
dada = copy.deepcopy(TEST_DATA_FLATTENED)
dada[('langdis',)] = u'True'
checkbox_to_boolean(('langdis',), dada, errors, None)
assert dada[('langdis',)] == u'True'
dada[('langdis',)] = u'False'
checkbox_to_boolean(('langdis',), dada, errors, None)
assert dada[('langdis',)] == u'False'
dada[('langdis',)] = u'on'
checkbox_to_boolean(('langdis',), dada, errors, None)
assert dada[('langdis',)] == u'True'
dada[('langdis',)] = u''
checkbox_to_boolean(('langdis',), dada, errors, None)
assert dada[('langdis',)] == u'False'
[docs] def test_validate_duplicate_titles_valid(self):
errors = defaultdict(list)
dada = copy.deepcopy(TEST_DATA_FLATTENED)
dada[('langtitle', 1, 'lang')] = u'fi'
dada[('langtitle', 1, 'value')] = u'diedo'
try:
validate_title_duplicates(('langtitle', 0, 'value'), dada, errors, None)
except:
raise AssertionError('Duplicate titles check raised exception, it should not')
[docs] def test_validate_duplicate_titles_invalid(self):
errors = defaultdict(list)
dada = copy.deepcopy(TEST_DATA_FLATTENED)
dada[('langtitle', 1, 'lang')] = u'sv'
dada[('langtitle', 1, 'value')] = u'diedo'
self.assertRaises(Invalid, validate_title_duplicates, ('langtitle', 0, 'value'), dada, errors, None)
[docs] def test_validate_title_invalid(self):
errors = defaultdict(list)
dada = copy.deepcopy(TEST_DATA_FLATTENED)
dada[('langtitle', 0, 'lang')] = u''
dada[('langtitle', 0, 'value')] = u''
self.assertRaises(Invalid, validate_title, ('langtitle', 0, 'lang'), dada, errors, None)
[docs]class TestResourceValidators(TestCase):
'''
Test validators for resources
'''
@classmethod
[docs] def setup_class(cls):
'''
Using the resource's format for resource validator tests
'''
cls.test_data = {
'resources': [{
'url' : u'http://www.csc.fi',
'algorithm': u'MD5',
'hash': u'f60e586509d99944e2d62f31979a802f',
'mimetype': u'application/pdf',
'resource_type' : settings.RESOURCE_TYPE_DATASET,
}]
}
[docs] def test_validate_mimetype_valid(self):
errors = defaultdict(list)
data_dict = copy.deepcopy(self.test_data)
data_dict['resources'][0]['format'] = u'vnd.3gpp2.bcmcsinfo+xml/'
# flatten dict (or change test_data to flattened form?)
data = flatten_dict(data_dict)
try:
validate_mimetype(('resources', 0, 'mimetype',), data, errors, None)
except Invalid:
raise AssertionError('Mimetype raised exception, it should not')
[docs] def test_validate_mimetype_invalid(self):
errors = defaultdict(list)
data_dict = copy.deepcopy(self.test_data)
data_dict['resources'][0]['format'] = u'application/pdf><'
data = flatten_dict(data_dict)
self.assertRaises(Invalid, validate_mimetype, ('resources', 0, 'format',), data, errors, None)
[docs] def test_validate_algorithm_valid(self):
errors = defaultdict(list)
data_dict = copy.deepcopy(self.test_data)
data_dict['resources'][0]['algorithm'] = u'RadioGatĂșn-1216'
data = flatten_dict(data_dict)
try:
validate_algorithm(('resources', 0, 'algorithm',), data, errors, None)
except Invalid:
raise AssertionError('Algorithm raised exception, it should not')
[docs] def test_validate_algorithm_invalid(self):
errors = defaultdict(list)
data_dict = copy.deepcopy(self.test_data)
data_dict['resources'][0]['algorithm'] = u'RadioGatĂșn-1216!>'
data = flatten_dict(data_dict)
self.assertRaises(Invalid, validate_algorithm, ('resources', 0, 'algorithm',), data, errors, None)
[docs] def test_check_direct_download_url_invalid(self):
errors = defaultdict(list)
dada = copy.deepcopy(self.test_data)
dada['availability'] = u'direct_download'
dada['resources'][0]['url'] = u''
data = flatten_dict(dada)
self.assertRaises(Exception, check_direct_download_url, ('resources', 0, 'url'), data, errors, None)
[docs]class TestJSONConverters(TestCase):
'''
Test JSON converters
'''
PIDS = {
u'http://helda.helsinki.fi/oai/request': {
u'data': [u'some_data_pid', u'another_data_pid'],
u'metadata': [u'metadata_pid', u'another_metadata_pid', u'third_metadata_pid'],
u'version': [u'version_pid', u'another_version_pid'],
},
u'kata': {
u'version': [u'kata_version_pid'],
},
}
@classmethod
[docs] def setup_class(cls):
cls.test_data = {}
cls.serialized = json.dumps(cls.PIDS)
assert isinstance(cls.serialized, basestring)