from ckanext.odsh.validation import *
import ckan.plugins.toolkit as toolkit
import ckan.model as modelMock
import sys
import json
import pytest
from mock import MagicMock, Mock, patch


def mockInvalid(*args, **kwargs):
    return Exception(*args, **kwargs)


def mock_(s):
    return s


m = MagicMock()


class MissingMock:
    pass


m.Missing = MissingMock

sys.modules['ckan'] = MagicMock()
sys.modules['ckan.plugins'] = MagicMock()
sys.modules['ckan.plugins.toolkit'] = MagicMock()
sys.modules['ckan.model'] = MagicMock()
sys.modules['ckan.lib'] = MagicMock()
sys.modules['ckan.lib.navl'] = MagicMock()
sys.modules['ckan.lib.navl.dictization_functions'] = m
sys.modules['pylons'] = MagicMock()


toolkit.Invalid = mockInvalid
toolkit._ = mock_


def test_get_validators():
    assert get_validators()


@patch('urllib.request.urlopen')
@patch('pylons.config.get', side_effect='foo')
@patch('csv.reader', side_effect=[[['uri', 'text', json.dumps({"geometry": 0})]]])
def test_known_spatial_uri(url_mock, get_mock, csv_mock):
    # arrange
    data = {('extras', 0, 'key'): 'spatial_uri',
            ('extras', 0, 'value'): 'uri'}
    # act
    known_spatial_uri('spatial_uri', data, {}, None)
    # assert
    assert data[('extras', 1, 'key')] == 'spatial_text'
    assert data[('extras', 1, 'value')] == 'text'
    assert data[('extras', 2, 'key')] == 'spatial'
    assert data[('extras', 2, 'value')] == '0'


@pytest.mark.parametrize('exception_type', [Exception])
@patch('urllib.request.urlopen')
@patch('pylons.config.get', side_effect='foo')
@patch('csv.reader', side_effect=[[['uri', 'text', json.dumps({"geometry": 0})]]])
def test_known_spatial_uri_without_uri(url_mock, get_mock, csv_mock, exception_type):
    # arrange
    data = {('extras', 0, 'key'): 'spatial_uri',
            ('extras', 0, 'value'): ''}
    
    # act and assert
    with pytest.raises(exception_type):
        known_spatial_uri('spatial_uri', data, {}, None)


@pytest.mark.parametrize('exception_type', [Exception])
def test_known_spatial_uri_without_uri_with_spatial(exception_type):
    # arrange
    data = {('extras', 0, 'key'): 'spatial',
            ('extras', 0, 'value'): 'value',
            ('extras', 1, 'key'): 'spatial_uri',
            ('extras', 1, 'value'): ''}
    
    # act and assert
    with pytest.raises(exception_type):
        known_spatial_uri('spatial_uri', data, {}, None)


def test_validate_licenseAttributionByText():
    # arrange
    def get_licenses():
        return {}
    modelMock.Package.get_license_register = get_licenses
    data = {'license_id': '0',
            ('extras', 0, 'key'): 'licenseAttributionByText',
            ('extras', 0, 'value'): ''}
    validate_licenseAttributionByText('key', data, {}, None)


def test_tag_name_validator_invalid():
    with pytest.raises(Exception):
        tag_name_validator('', None)


def test_tag_name_validator_valid():
    tag_name_validator('Regionalplan für den Planungsraum_I: (5.8 – Windenergie_an_Land)', None)


def _create_test_string(length):
    base_string = "Lorem ipsum dolor sit amet."
    num_repetitions = (length // len(base_string)) + 1
    test_string = base_string * num_repetitions
    test_string = test_string[:length]
    return test_string