from unittest import mock from django.test import SimpleTestCase from django.test.runner import Shuffler class ShufflerTests(SimpleTestCase): def test_hash_text(self): actual = Shuffler._hash_text("abcd") self.assertEqual(actual, "e2fc714c4727ee9395f324cd2e7f331f") def test_hash_text_hash_algorithm(self): class MyShuffler(Shuffler): hash_algorithm = "sha1" actual = MyShuffler._hash_text("abcd") self.assertEqual(actual, "81fe8bfe87576c3ecb22426f8e57847382917acf") def test_init(self): shuffler = Shuffler(100) self.assertEqual(shuffler.seed, 100) self.assertEqual(shuffler.seed_source, "given") def test_init_none_seed(self): with mock.patch("random.randint", return_value=200): shuffler = Shuffler(None) self.assertEqual(shuffler.seed, 200) self.assertEqual(shuffler.seed_source, "generated") def test_init_no_seed_argument(self): with mock.patch("random.randint", return_value=300): shuffler = Shuffler() self.assertEqual(shuffler.seed, 300) self.assertEqual(shuffler.seed_source, "generated") def test_seed_display(self): shuffler = Shuffler(100) shuffler.seed_source = "test" self.assertEqual(shuffler.seed_display, "100 (test)") def test_hash_item_seed(self): cases = [ (1234, "64ad3fb166ddb41a2ca24f1803b8b722"), # Passing a string gives the same value. ("1234", "64ad3fb166ddb41a2ca24f1803b8b722"), (5678, "4dde450ad339b6ce45a0a2666e35b975"), ] for seed, expected in cases: with self.subTest(seed=seed): shuffler = Shuffler(seed=seed) actual = shuffler._hash_item("abc", lambda x: x) self.assertEqual(actual, expected) def test_hash_item_key(self): cases = [ (lambda x: x, "64ad3fb166ddb41a2ca24f1803b8b722"), (lambda x: x.upper(), "ee22e8597bff91742affe4befbf4649a"), ] for key, expected in cases: with self.subTest(key=key): shuffler = Shuffler(seed=1234) actual = shuffler._hash_item("abc", key) self.assertEqual(actual, expected) def test_shuffle_key(self): cases = [ (lambda x: x, ["a", "d", "b", "c"]), (lambda x: x.upper(), ["d", "c", "a", "b"]), ] for num, (key, expected) in enumerate(cases, start=1): with self.subTest(num=num): shuffler = Shuffler(seed=1234) actual = shuffler.shuffle(["a", "b", "c", "d"], key) self.assertEqual(actual, expected) def test_shuffle_consistency(self): seq = [str(n) for n in range(5)] cases = [ (None, ["3", "0", "2", "4", "1"]), (0, ["3", "2", "4", "1"]), (1, ["3", "0", "2", "4"]), (2, ["3", "0", "4", "1"]), (3, ["0", "2", "4", "1"]), (4, ["3", "0", "2", "1"]), ] shuffler = Shuffler(seed=1234) for index, expected in cases: with self.subTest(index=index): if index is None: new_seq = seq else: new_seq = seq.copy() del new_seq[index] actual = shuffler.shuffle(new_seq, lambda x: x) self.assertEqual(actual, expected) def test_shuffle_same_hash(self): shuffler = Shuffler(seed=1234) msg = "item 'A' has same hash 'a56ce89262959e151ee2266552f1819c' as item 'a'" with self.assertRaisesMessage(RuntimeError, msg): shuffler.shuffle(["a", "b", "A"], lambda x: x.upper())