1import unittest
2from unittest.mock import patch, mock_open
3
4from bangaranga import does_the_banga_rang, TheBangaDoesNotRangError
5
6
7class TestBangaRanga(unittest.TestCase):
8
9 def assert_banga_rang_result(self, file_content, expected_result):
10 with patch("builtins.open", mock_open(read_data=file_content)):
11 self.assertEqual(
12 expected_result,
13 does_the_banga_rang("dummy.txt")
14 )
15
16 def test_finds_bangaranga_as_single_word(self):
17 self.assert_banga_rang_result(
18 "bangaranga",
19 1
20 )
21
22 def test_finds_bangaranga_from_two_words(self):
23 self.assert_banga_rang_result(
24 "The banga is doing some ranga!",
25 2
26 )
27
28 def test_finds_bangaranga_from_three_words(self):
29 self.assert_banga_rang_result(
30 "bang a small ranga",
31 3
32 )
33
34 def test_returns_minimum_number_of_words(self):
35 self.assert_banga_rang_result(
36 "bang a banga ranga bangaranga",
37 1
38 )
39
40 def test_words_must_be_in_correct_order(self):
41 self.assert_banga_rang_result(
42 "ranga is before banga",
43 0
44 )
45
46 def test_returns_zero_when_words_do_not_form_exact_string(self):
47 self.assert_banga_rang_result(
48 "Does the banga rang?",
49 0
50 )
51
52 def test_is_case_insensitive(self):
53 self.assert_banga_rang_result(
54 "BANga RANga",
55 2
56 )
57
58 def test_uses_only_whole_words(self):
59 self.assert_banga_rang_result(
60 "xxbangaranga",
61 0
62 )
63
64 def test_returns_zero_for_empty_file(self):
65 self.assert_banga_rang_result(
66 "",
67 0
68 )
69
70 def test_raises_custom_error_when_os_error_occurs(self):
71 with patch("builtins.open", side_effect=OSError):
72 with self.assertRaises(TheBangaDoesNotRangError):
73 does_the_banga_rang("dummy.txt")
74
75 def test_raises_custom_error_when_io_error_occurs(self):
76 with patch("builtins.open", side_effect=IOError):
77 with self.assertRaises(TheBangaDoesNotRangError):
78 does_the_banga_rang("dummy.txt")
79
80
81if __name__ == "__main__":
82 unittest.main()
..........
----------------------------------------------------------------------
Ran 10 tests in 0.263s
OK
31.05.2026 18:21