from datetime import date
from django.forms import DateField, Form, SelectDateWidget
from django.test import override_settings
from django.utils import translation
from django.utils.dates import MONTHS_AP
from .base import WidgetTest
class SelectDateWidgetTest(WidgetTest):
    maxDiff = None
    widget = SelectDateWidget(
        years=('2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016'),
    )
    def test_render_empty(self):
        self.check_html(self.widget, 'mydate', '', html=(
            """
            
            
            
            """
        ))
    def test_render_none(self):
        """
        Rendering the None or '' values should yield the same output.
        """
        self.assertHTMLEqual(
            self.widget.render('mydate', None),
            self.widget.render('mydate', ''),
        )
    def test_render_string(self):
        self.check_html(self.widget, 'mydate', '2010-04-15', html=(
            """
            
            
            
            """
        ))
    def test_render_datetime(self):
        self.assertHTMLEqual(
            self.widget.render('mydate', date(2010, 4, 15)),
            self.widget.render('mydate', '2010-04-15'),
        )
    def test_render_invalid_date(self):
        """
        Invalid dates should still render the failed date.
        """
        self.check_html(self.widget, 'mydate', '2010-02-31', html=(
            """
            
            
            
            """
        ))
    def test_custom_months(self):
        widget = SelectDateWidget(months=MONTHS_AP, years=('2013',))
        self.check_html(widget, 'mydate', '', html=(
            """
            
            
            
            """
        ))
    def test_selectdate_required(self):
        class GetNotRequiredDate(Form):
            mydate = DateField(widget=SelectDateWidget, required=False)
        class GetRequiredDate(Form):
            mydate = DateField(widget=SelectDateWidget, required=True)
        self.assertFalse(GetNotRequiredDate().fields['mydate'].widget.is_required)
        self.assertTrue(GetRequiredDate().fields['mydate'].widget.is_required)
    def test_selectdate_empty_label(self):
        w = SelectDateWidget(years=('2014',), empty_label='empty_label')
        # Rendering the default state with empty_label setted as string.
        self.assertInHTML('', w.render('mydate', ''), count=3)
        w = SelectDateWidget(years=('2014',), empty_label=('empty_year', 'empty_month', 'empty_day'))
        # Rendering the default state with empty_label tuple.
        self.assertHTMLEqual(
            w.render('mydate', ''),
            """
            
            
            
            """,
        )
        with self.assertRaisesMessage(ValueError, 'empty_label list/tuple must have 3 elements.'):
            SelectDateWidget(years=('2014',), empty_label=('not enough', 'values'))
    @override_settings(USE_L10N=True)
    @translation.override('nl')
    def test_l10n(self):
        w = SelectDateWidget(
            years=('2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016')
        )
        self.assertEqual(
            w.value_from_datadict({'date_year': '2010', 'date_month': '8', 'date_day': '13'}, {}, 'date'),
            '13-08-2010',
        )
        self.assertHTMLEqual(
            w.render('date', '13-08-2010'),
            """
            
            
            
            """,
        )
        # Even with an invalid date, the widget should reflect the entered value (#17401).
        self.assertEqual(w.render('mydate', '2010-02-30').count('selected="selected"'), 3)
        # Years before 1900 should work.
        w = SelectDateWidget(years=('1899',))
        self.assertEqual(
            w.value_from_datadict({'date_year': '1899', 'date_month': '8', 'date_day': '13'}, {}, 'date'),
            '13-08-1899',
        )