import pytz
from django.conf import settings
from django.core.exceptions import ValidationError
from django.test import TestCase

from sundial.forms import TimezoneChoiceField, TimezoneField
from sundial.zones import ALL_CHOICES

from .forms import TimezoneChoiceFieldModelForm, TimezoneFieldModelForm

default_timezone = pytz.timezone(settings.TIME_ZONE)


class TimezoneFieldTests(TestCase):
    def test_coercing(self):
        field = TimezoneField()
        self.assertEqual(
            field.clean(settings.TIME_ZONE),
            pytz.timezone(settings.TIME_ZONE)
        )

    def test_empty_values(self):
        field = TimezoneField(required=False)
        self.assertEqual(field.clean(''), '')
        self.assertEqual(field.clean(None), '')

    def test_invalid_value(self):
        field = TimezoneField()
        self.assertRaises(ValidationError, field.clean, 'invalid')

    def test_modelform(self):
        form = TimezoneFieldModelForm({'timezone': settings.TIME_ZONE})
        self.assertTrue(form.is_valid())


class TimezoneChoiceFieldTests(TestCase):
    def test_coercing(self):
        field = TimezoneChoiceField(choices=ALL_CHOICES)
        self.assertEqual(
            field.clean(settings.TIME_ZONE),
            pytz.timezone(settings.TIME_ZONE)
        )

    def test_empty_values(self):
        field = TimezoneChoiceField(choices=ALL_CHOICES, required=False)
        self.assertEqual(field.clean(''), '')
        self.assertEqual(field.clean(None), '')

    def test_invalid_value(self):
        field = TimezoneChoiceField(choices=ALL_CHOICES)
        self.assertRaises(ValidationError, field.clean, 'invalid')

    def test_modelform(self):
        form = TimezoneChoiceFieldModelForm({'choices_timezone': settings.TIME_ZONE})
        self.assertTrue(form.is_valid())