dav_events: added tests for ChoiceSet
Run tests / Execute tox to run the test suite (push) Successful in 3m29s

This commit is contained in:
2026-06-10 14:25:03 +02:00
parent d8807a6bbc
commit f116d7b3bd
2 changed files with 193 additions and 0 deletions
+2
View File
@@ -10,6 +10,8 @@ class ChoiceSet(object):
self._codes = list()
self._labels = dict()
for code, label in choices:
if code in self._codes:
raise ValueError(u'Code not unique: {}'.format(code))
self._codes.append(code)
self._labels[code] = label
+191
View File
@@ -0,0 +1,191 @@
# -*- coding: utf-8 -*-
from django.test import SimpleTestCase
from django.utils.translation import gettext_lazy as _
from ..choices import ChoiceSet
class ChoiceSetTestCase(SimpleTestCase):
def setUp(self):
# We need at least three tuples with code and label.
# Codes (i.e. first field of the tuples) must not be in sorted order!
self.tuples = [
('4', 'A single digit number'),
('b', 'A lowercase bee'),
('B', 'A capital bee'),
('W', _('Wanderung')),
('bee', 'A B'),
('CO2', 'Carbon dioxide'),
('H2o', 'Water with mixed case'),
('h2O', 'Water with mixed case'),
('H-O-H', 'Water molecule'),
('O=C=O', 'Carbon dioxide'),
('.dot', 'Label with a dot'),
('_underscore', 'Label with underscore'),
('miXed.ALL_to-gether-98_76.543210', 'Label with mixed characters'),
('üÄö', 'Mixed case Umlaute'),
(' ', 'single blank space as code'),
('', 'Empty code'),
('empty', ''),
('A long code without umlaute for a short label', 'ÜäÖ'),
('True', 'Yes'),
('False', 'No'),
('None', 'Unknown'),
('NONE', 'Often used'),
('OTHER', 'Often used'),
]
self.choiceset = ChoiceSet(self.tuples)
self.code_not_in_choiceset = 'A'
def test_testdata(self):
codes = [c for c, l in self.tuples]
self.assertNotIn(self.code_not_in_choiceset, codes, "Improper test data")
sorted_codes = sorted(codes)
self.assertNotEqual(codes, sorted_codes, "Improper test data:"
" codes of test tuples must not be in sorted order")
def test_code_not_unique(self):
with self.assertRaises(ValueError) as cm:
_ = ChoiceSet([('A', 'First Label'), ('A', 'Second Label')])
self.assertEqual(str(cm.exception), 'Code not unique: A')
def test_len(self):
cs = ChoiceSet([])
self.assertEqual(len(cs), 0)
cs = ChoiceSet([('X', 'Single')])
self.assertEqual(len(cs), 1)
cs = self.choiceset
self.assertEqual(len(cs), len(self.tuples))
def test_getitem(self):
cs = ChoiceSet([])
with self.assertRaises(IndexError):
_ = cs[0]
cs = self.choiceset
code, label = cs[0]
self.assertEqual(code, self.tuples[0][0])
self.assertEqual(label, self.tuples[0][1])
code, label = cs[1]
self.assertEqual(code, self.tuples[1][0])
self.assertEqual(label, self.tuples[1][1])
code, label = cs[-1]
self.assertEqual(code, self.tuples[-1][0])
self.assertEqual(label, self.tuples[-1][1])
code, label = cs[-2]
self.assertEqual(code, self.tuples[-2][0])
self.assertEqual(label, self.tuples[-2][1])
with self.assertRaises(IndexError):
_ = cs[len(cs) + 1]
with self.assertRaises(IndexError):
_ = cs[-len(cs) - 1]
def test_iter_returns_tuples(self):
items = list(self.choiceset)
self.assertEqual(items, self.tuples)
def test_iter_empty_choiceset(self):
items = list(ChoiceSet([]))
self.assertEqual(items, [])
def test_iter_with_for_loop(self):
expected_codes = [c for c, l in self.tuples]
expected_labels = [l for c, l in self.tuples]
codes = []
labels = []
for code, label in self.choiceset:
codes.append(code)
labels.append(label)
self.assertEqual(codes, expected_codes)
self.assertEqual(labels, expected_labels)
def test_iter_multiple_times(self):
first_iteration = list(self.choiceset)
second_iteration = list(self.choiceset)
self.assertEqual(first_iteration, second_iteration)
def test_contains(self):
for c, l in self.tuples:
self.assertIn((c, l), self.choiceset)
self.assertIn((c, l[::-1]), self.choiceset)
self.assertNotIn((self.code_not_in_choiceset, self.tuples[0][1]), self.choiceset)
def test_contains_empty_choiceset(self):
cs = ChoiceSet([])
self.assertNotIn(self.tuples[0], cs)
def test_codes(self):
expected_codes = []
codes = ChoiceSet([]).codes
self.assertEqual(codes, expected_codes)
self.assertIsInstance(codes, list)
expected_codes = [c for c, l in self.tuples]
codes = self.choiceset.codes
self.assertEqual(codes, expected_codes)
self.assertIsInstance(codes, list)
def test_get_label_valid_code(self):
for c, l in self.tuples:
self.assertEqual(self.choiceset.get_label(c), l)
def test_get_label_invalid_code_raises_keyerror(self):
with self.assertRaises(KeyError):
self.choiceset.get_label(self.code_not_in_choiceset)
def test_get_label_case_sensitive(self):
cs = ChoiceSet([('UPPER', 'Label')])
with self.assertRaises(KeyError):
cs.get_label('upper')
def test_sort_numeric_codes(self):
cs = ChoiceSet([('3', 'Three'), ('1', 'One'), ('2', 'Two'), ('10', 'Ten')])
cs.sort()
self.assertEqual(cs.codes, ['1', '10', '2', '3'])
def test_sort_alphanumeric_codes(self):
cs = ChoiceSet([
('B1', 'Three'),
('A2', 'Two'),
('B2', 'Four'),
('A1', 'One'),
('a20', 'Five'),
('a3', 'Six'),
('b1', 'Seven'),
])
cs.sort()
self.assertEqual(cs.codes, ['A1', 'A2', 'B1', 'B2', 'a20', 'a3', 'b1'])
def test_sort_unsortable(self):
cs = ChoiceSet([])
cs.sort()
self.assertEqual(cs.codes, [])
cs = ChoiceSet([('X', 'Single')])
cs.sort()
self.assertEqual(cs.codes, ['X'])
def test_sort_already_sorted(self):
cs = ChoiceSet([('1', 'One'), ('2', 'Two'), ('3', 'Three')])
cs.sort()
self.assertEqual(cs.codes, ['1', '2', '3'])
def test_sort_preserves_labels(self):
cs = ChoiceSet([('B', 'Two'), ('A', 'One'), ('C', 'Three')])
cs.sort()
self.assertEqual(cs.get_label('A'), 'One')
self.assertEqual(cs.get_label('B'), 'Two')
self.assertEqual(cs.get_label('C'), 'Three')
def test_sort_test_data(self):
expected_codes = [c for c, l in self.tuples]
expected_codes.sort()
cs = ChoiceSet(self.tuples)
cs.sort()
self.assertEqual(cs.codes, expected_codes)