1. from unittest import mock
    
  2. 
    
  3. from django.test import SimpleTestCase
    
  4. from django.test.runner import Shuffler
    
  5. 
    
  6. 
    
  7. class ShufflerTests(SimpleTestCase):
    
  8.     def test_hash_text(self):
    
  9.         actual = Shuffler._hash_text("abcd")
    
  10.         self.assertEqual(actual, "e2fc714c4727ee9395f324cd2e7f331f")
    
  11. 
    
  12.     def test_hash_text_hash_algorithm(self):
    
  13.         class MyShuffler(Shuffler):
    
  14.             hash_algorithm = "sha1"
    
  15. 
    
  16.         actual = MyShuffler._hash_text("abcd")
    
  17.         self.assertEqual(actual, "81fe8bfe87576c3ecb22426f8e57847382917acf")
    
  18. 
    
  19.     def test_init(self):
    
  20.         shuffler = Shuffler(100)
    
  21.         self.assertEqual(shuffler.seed, 100)
    
  22.         self.assertEqual(shuffler.seed_source, "given")
    
  23. 
    
  24.     def test_init_none_seed(self):
    
  25.         with mock.patch("random.randint", return_value=200):
    
  26.             shuffler = Shuffler(None)
    
  27.         self.assertEqual(shuffler.seed, 200)
    
  28.         self.assertEqual(shuffler.seed_source, "generated")
    
  29. 
    
  30.     def test_init_no_seed_argument(self):
    
  31.         with mock.patch("random.randint", return_value=300):
    
  32.             shuffler = Shuffler()
    
  33.         self.assertEqual(shuffler.seed, 300)
    
  34.         self.assertEqual(shuffler.seed_source, "generated")
    
  35. 
    
  36.     def test_seed_display(self):
    
  37.         shuffler = Shuffler(100)
    
  38.         shuffler.seed_source = "test"
    
  39.         self.assertEqual(shuffler.seed_display, "100 (test)")
    
  40. 
    
  41.     def test_hash_item_seed(self):
    
  42.         cases = [
    
  43.             (1234, "64ad3fb166ddb41a2ca24f1803b8b722"),
    
  44.             # Passing a string gives the same value.
    
  45.             ("1234", "64ad3fb166ddb41a2ca24f1803b8b722"),
    
  46.             (5678, "4dde450ad339b6ce45a0a2666e35b975"),
    
  47.         ]
    
  48.         for seed, expected in cases:
    
  49.             with self.subTest(seed=seed):
    
  50.                 shuffler = Shuffler(seed=seed)
    
  51.                 actual = shuffler._hash_item("abc", lambda x: x)
    
  52.                 self.assertEqual(actual, expected)
    
  53. 
    
  54.     def test_hash_item_key(self):
    
  55.         cases = [
    
  56.             (lambda x: x, "64ad3fb166ddb41a2ca24f1803b8b722"),
    
  57.             (lambda x: x.upper(), "ee22e8597bff91742affe4befbf4649a"),
    
  58.         ]
    
  59.         for key, expected in cases:
    
  60.             with self.subTest(key=key):
    
  61.                 shuffler = Shuffler(seed=1234)
    
  62.                 actual = shuffler._hash_item("abc", key)
    
  63.                 self.assertEqual(actual, expected)
    
  64. 
    
  65.     def test_shuffle_key(self):
    
  66.         cases = [
    
  67.             (lambda x: x, ["a", "d", "b", "c"]),
    
  68.             (lambda x: x.upper(), ["d", "c", "a", "b"]),
    
  69.         ]
    
  70.         for num, (key, expected) in enumerate(cases, start=1):
    
  71.             with self.subTest(num=num):
    
  72.                 shuffler = Shuffler(seed=1234)
    
  73.                 actual = shuffler.shuffle(["a", "b", "c", "d"], key)
    
  74.                 self.assertEqual(actual, expected)
    
  75. 
    
  76.     def test_shuffle_consistency(self):
    
  77.         seq = [str(n) for n in range(5)]
    
  78.         cases = [
    
  79.             (None, ["3", "0", "2", "4", "1"]),
    
  80.             (0, ["3", "2", "4", "1"]),
    
  81.             (1, ["3", "0", "2", "4"]),
    
  82.             (2, ["3", "0", "4", "1"]),
    
  83.             (3, ["0", "2", "4", "1"]),
    
  84.             (4, ["3", "0", "2", "1"]),
    
  85.         ]
    
  86.         shuffler = Shuffler(seed=1234)
    
  87.         for index, expected in cases:
    
  88.             with self.subTest(index=index):
    
  89.                 if index is None:
    
  90.                     new_seq = seq
    
  91.                 else:
    
  92.                     new_seq = seq.copy()
    
  93.                     del new_seq[index]
    
  94.                 actual = shuffler.shuffle(new_seq, lambda x: x)
    
  95.                 self.assertEqual(actual, expected)
    
  96. 
    
  97.     def test_shuffle_same_hash(self):
    
  98.         shuffler = Shuffler(seed=1234)
    
  99.         msg = "item 'A' has same hash 'a56ce89262959e151ee2266552f1819c' as item 'a'"
    
  100.         with self.assertRaisesMessage(RuntimeError, msg):
    
  101.             shuffler.shuffle(["a", "b", "A"], lambda x: x.upper())