def test_set_model_changes_choices(self):
        class ModelA(models.Model):
            FIELD_CHOICES = [('foo', 'Foo'), ('bar', 'Bar')]

        class ModelB(models.Model):
            FIELD_CHOICES = [('baz', 'Baz'), ('qux', 'Qux')]

        f = LazyChoiceField(model=ModelA, choices_name='FIELD_CHOICES')
        self.assertEqual([('', '---------'), ('foo', 'Foo'), ('bar', 'Bar')], f.choices)

        f.model = ModelB
        self.assertEqual([('', '---------'), ('baz', 'Baz'), ('qux', 'Qux')], f.choices)
    def test_not_required(self):
        class Model(models.Model):
            FIELD_CHOICES = [('foo', 'Foo'), ('bar', 'Bar')]

        f = LazyChoiceField(model=Model, choices_name='FIELD_CHOICES', required=False)

        self.assertEqual('', f.clean(''))
        self.assertEqual('', f.clean(None))
        self.assertEqual('foo', f.clean('foo'))
        self.assertRaisesMessage(
            ValidationError, "'Select a valid choice. abcd is not one of the available choices.'",
            f.clean, 'abcd',
        )
    def test_change_model_after_init(self):
        class ModelA(models.Model):
            FIELD_CHOICES = [('foo', 'Foo'), ('bar', 'Bar')]

        class ModelB(models.Model):
            FIELD_CHOICES = [('baz', 'Baz'), ('qux', 'Qux')]

        f = LazyChoiceField(model=ModelA, choices_name='FIELD_CHOICES')
        f.model = ModelB

        self.assertEqual('baz', f.clean('baz'))
        self.assertRaisesMessage(
            ValidationError, 'Select a valid choice. foo is not one of the available choices.',
            f.clean, 'foo',
        )
    def test_with_optgroup(self):
        class Model(models.Model):
            FIELD_CHOICES = [
                (1, [('foo', 'Foo'), ('bar', 'Bar')]),
                (2, [('baz', 'Baz'), ('qux', 'Qux')]),
                ('other', 'Other'),
            ]

        f = LazyChoiceField(model=Model, choices_name='FIELD_CHOICES')
        self.assertEqual('foo', f.clean('foo'))
        self.assertEqual('baz', f.clean('baz'))
        self.assertEqual('other', f.clean('other'))
        self.assertRaisesMessage(
            ValidationError, "'Select a valid choice. invalid is not one of the available choices.'",
            f.clean, 'invalid',
        )