1. from django.core.exceptions import ValidationError
    
  2. from django.forms import MultipleChoiceField
    
  3. from django.test import SimpleTestCase
    
  4. 
    
  5. 
    
  6. class MultipleChoiceFieldTest(SimpleTestCase):
    
  7.     def test_multiplechoicefield_1(self):
    
  8.         f = MultipleChoiceField(choices=[("1", "One"), ("2", "Two")])
    
  9.         with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
    
  10.             f.clean("")
    
  11.         with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
    
  12.             f.clean(None)
    
  13.         self.assertEqual(["1"], f.clean([1]))
    
  14.         self.assertEqual(["1"], f.clean(["1"]))
    
  15.         self.assertEqual(["1", "2"], f.clean(["1", "2"]))
    
  16.         self.assertEqual(["1", "2"], f.clean([1, "2"]))
    
  17.         self.assertEqual(["1", "2"], f.clean((1, "2")))
    
  18.         with self.assertRaisesMessage(ValidationError, "'Enter a list of values.'"):
    
  19.             f.clean("hello")
    
  20.         with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
    
  21.             f.clean([])
    
  22.         with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
    
  23.             f.clean(())
    
  24.         msg = "'Select a valid choice. 3 is not one of the available choices.'"
    
  25.         with self.assertRaisesMessage(ValidationError, msg):
    
  26.             f.clean(["3"])
    
  27. 
    
  28.     def test_multiplechoicefield_2(self):
    
  29.         f = MultipleChoiceField(choices=[("1", "One"), ("2", "Two")], required=False)
    
  30.         self.assertEqual([], f.clean(""))
    
  31.         self.assertEqual([], f.clean(None))
    
  32.         self.assertEqual(["1"], f.clean([1]))
    
  33.         self.assertEqual(["1"], f.clean(["1"]))
    
  34.         self.assertEqual(["1", "2"], f.clean(["1", "2"]))
    
  35.         self.assertEqual(["1", "2"], f.clean([1, "2"]))
    
  36.         self.assertEqual(["1", "2"], f.clean((1, "2")))
    
  37.         with self.assertRaisesMessage(ValidationError, "'Enter a list of values.'"):
    
  38.             f.clean("hello")
    
  39.         self.assertEqual([], f.clean([]))
    
  40.         self.assertEqual([], f.clean(()))
    
  41.         msg = "'Select a valid choice. 3 is not one of the available choices.'"
    
  42.         with self.assertRaisesMessage(ValidationError, msg):
    
  43.             f.clean(["3"])
    
  44. 
    
  45.     def test_multiplechoicefield_3(self):
    
  46.         f = MultipleChoiceField(
    
  47.             choices=[
    
  48.                 ("Numbers", (("1", "One"), ("2", "Two"))),
    
  49.                 ("Letters", (("3", "A"), ("4", "B"))),
    
  50.                 ("5", "Other"),
    
  51.             ]
    
  52.         )
    
  53.         self.assertEqual(["1"], f.clean([1]))
    
  54.         self.assertEqual(["1"], f.clean(["1"]))
    
  55.         self.assertEqual(["1", "5"], f.clean([1, 5]))
    
  56.         self.assertEqual(["1", "5"], f.clean([1, "5"]))
    
  57.         self.assertEqual(["1", "5"], f.clean(["1", 5]))
    
  58.         self.assertEqual(["1", "5"], f.clean(["1", "5"]))
    
  59.         msg = "'Select a valid choice. 6 is not one of the available choices.'"
    
  60.         with self.assertRaisesMessage(ValidationError, msg):
    
  61.             f.clean(["6"])
    
  62.         msg = "'Select a valid choice. 6 is not one of the available choices.'"
    
  63.         with self.assertRaisesMessage(ValidationError, msg):
    
  64.             f.clean(["1", "6"])
    
  65. 
    
  66.     def test_multiplechoicefield_changed(self):
    
  67.         f = MultipleChoiceField(choices=[("1", "One"), ("2", "Two"), ("3", "Three")])
    
  68.         self.assertFalse(f.has_changed(None, None))
    
  69.         self.assertFalse(f.has_changed([], None))
    
  70.         self.assertTrue(f.has_changed(None, ["1"]))
    
  71.         self.assertFalse(f.has_changed([1, 2], ["1", "2"]))
    
  72.         self.assertFalse(f.has_changed([2, 1], ["1", "2"]))
    
  73.         self.assertTrue(f.has_changed([1, 2], ["1"]))
    
  74.         self.assertTrue(f.has_changed([1, 2], ["1", "3"]))
    
  75. 
    
  76.     def test_disabled_has_changed(self):
    
  77.         f = MultipleChoiceField(choices=[("1", "One"), ("2", "Two")], disabled=True)
    
  78.         self.assertIs(f.has_changed("x", "y"), False)