import copy
import datetime
#import json
try:
    import unittest2 as unittest
except ImportError:
    import unittest
import os

import jsonschema

from leap.base.config import JSONLeapConfig
from leap.base import pluggableconfig
from leap.testing.basetest import BaseLeapTest

SAMPLE_CONFIG_DICT = {
    'prop_one': 1,
    'prop_uri': "http://example.org",
    'prop_date': '2012-12-12',
}

EXPECTED_CONFIG = {
    'prop_one': 1,
    'prop_uri': "http://example.org",
    'prop_date': datetime.datetime(2012, 12, 12)
}

sample_spec = {
    'description': 'sample schema definition',
    'type': 'object',
    'properties': {
        'prop_one': {
            'type': int,
            'default': 1,
            'required': True
        },
        'prop_uri': {
            'type': str,
            'default': 'http://example.org',
            'required': True,
            'format': 'uri'
        },
        'prop_date': {
            'type': str,
            'default': '2012-12-12',
            'format': 'date'
        }
    }
}


class SampleConfig(JSONLeapConfig):
    spec = sample_spec

    @property
    def slug(self):
        return os.path.expanduser('~/sampleconfig.json')


class TestJSONLeapConfigValidation(BaseLeapTest):
    def setUp(self):
        self.sampleconfig = SampleConfig()
        self.sampleconfig.save()
        self.sampleconfig.load()
        self.config = self.sampleconfig.config

    def tearDown(self):
        if hasattr(self, 'testfile') and os.path.isfile(self.testfile):
            os.remove(self.testfile)

    # tests

    def test_good_validation(self):
        self.sampleconfig.validate(SAMPLE_CONFIG_DICT)

    def test_broken_int(self):
        _config = copy.deepcopy(SAMPLE_CONFIG_DICT)
        _config['prop_one'] = '1'
        with self.assertRaises(jsonschema.ValidationError):
            self.sampleconfig.validate(_config)

    def test_format_property(self):
        # JsonSchema Validator does not check the format property.
        # We should have to extend the Configuration class
        blah = copy.deepcopy(SAMPLE_CONFIG_DICT)
        blah['prop_uri'] = 'xxx'
        with self.assertRaises(pluggableconfig.TypeCastException):
            self.sampleconfig.validate(blah)


if __name__ == "__main__":
    unittest.main()