|
1 | 1 | import unittest |
2 | 2 | from unittest.mock import patch, MagicMock |
3 | | -from pathlib import Path |
| 3 | +import tkinter as tk |
4 | 4 | import json |
5 | | -from todo_app.app import TodoApp, Task, TaskStatus, ThemeColors |
| 5 | +from pathlib import Path |
| 6 | +import sys |
| 7 | +sys.path.append('../') |
| 8 | +from todo_app.todo_app import TodoApp |
6 | 9 |
|
7 | 10 | class TestTodoApp(unittest.TestCase): |
8 | 11 |
|
9 | | - @patch('todo_app.app.Path.read_text') |
| 12 | + def setUp(self): |
| 13 | + self.root = tk.Tk() |
| 14 | + self.app = TodoApp(self.root) |
| 15 | + |
| 16 | + def tearDown(self): |
| 17 | + self.root.destroy() |
| 18 | + |
| 19 | + @patch('todo_app.todo_app.Path.read_text') |
10 | 20 | def test_load_tasks(self, mock_read_text): |
11 | | - mock_read_text.return_value = json.dumps([ |
12 | | - {"name": "Task 1", "status": "PENDING", "urgent": False}, |
13 | | - {"name": "Task 2", "status": "DONE", "urgent": True} |
14 | | - ]) |
15 | | - tasks = TodoApp._load_tasks() |
16 | | - self.assertEqual(len(tasks), 2) |
17 | | - self.assertIsInstance(tasks[0], Task) |
18 | | - self.assertEqual(tasks[0].name, "Task 1") |
19 | | - self.assertEqual(tasks[0].status, TaskStatus.PENDING) |
20 | | - self.assertFalse(tasks[0].urgent) |
21 | | - self.assertEqual(tasks[1].name, "Task 2") |
22 | | - self.assertEqual(tasks[1].status, TaskStatus.DONE) |
23 | | - self.assertTrue(tasks[1].urgent) |
| 21 | + mock_tasks = [ |
| 22 | + {"name": "Task 1", "done": False, "cancelled": False, "urgent": False, "separator": False}, |
| 23 | + {"name": "Task 2", "done": True, "cancelled": False, "urgent": True, "separator": False}, |
| 24 | + {"name": "───────", "separator": True, "title": False} |
| 25 | + ] |
| 26 | + mock_read_text.return_value = json.dumps(mock_tasks) |
| 27 | + |
| 28 | + tasks = self.app.load_tasks() |
| 29 | + self.assertEqual(len(tasks), 3) |
| 30 | + self.assertEqual(tasks[0]['name'], "Task 1") |
| 31 | + self.assertFalse(tasks[0]['done']) |
| 32 | + self.assertTrue(tasks[1]['done']) |
| 33 | + self.assertTrue(tasks[1]['urgent']) |
| 34 | + self.assertTrue(tasks[2]['separator']) |
24 | 35 |
|
25 | | - @patch('todo_app.app.Path.write_text') |
| 36 | + @patch('todo_app.todo_app.Path.write_text') |
26 | 37 | def test_save_tasks(self, mock_write_text): |
27 | | - tasks = [ |
28 | | - Task("Task 1", TaskStatus.PENDING, False), |
29 | | - Task("Task 2", TaskStatus.DONE, True) |
| 38 | + self.app.tasks = [ |
| 39 | + {"name": "Task 1", "done": False, "cancelled": False, "urgent": False, "separator": False}, |
| 40 | + {"name": "Task 2", "done": True, "cancelled": False, "urgent": True, "separator": False}, |
| 41 | + {"name": "───────", "separator": True, "title": False} |
30 | 42 | ] |
31 | | - TodoApp._save_tasks(tasks) |
| 43 | + self.app.save_tasks() |
32 | 44 | mock_write_text.assert_called_once() |
33 | 45 | saved_data = json.loads(mock_write_text.call_args[0][0]) |
34 | | - self.assertEqual(len(saved_data), 2) |
| 46 | + self.assertEqual(len(saved_data), 3) |
35 | 47 | self.assertEqual(saved_data[0]['name'], "Task 1") |
36 | | - self.assertEqual(saved_data[0]['status'], "PENDING") |
37 | | - self.assertFalse(saved_data[0]['urgent']) |
38 | | - self.assertEqual(saved_data[1]['name'], "Task 2") |
39 | | - self.assertEqual(saved_data[1]['status'], "DONE") |
| 48 | + self.assertFalse(saved_data[0]['done']) |
40 | 49 | self.assertTrue(saved_data[1]['urgent']) |
| 50 | + self.assertTrue(saved_data[2]['separator']) |
41 | 51 |
|
42 | 52 | def test_toggle_dark_mode(self): |
43 | | - app = TodoApp(MagicMock()) |
44 | | - initial_mode = app.is_dark_mode |
45 | | - app._toggle_dark_mode() |
46 | | - self.assertNotEqual(initial_mode, app.is_dark_mode) |
47 | | - |
48 | | - def test_get_theme_colors(self): |
49 | | - app = TodoApp(MagicMock()) |
50 | | - light_colors = app._get_theme_colors() |
51 | | - self.assertEqual(light_colors, ThemeColors.LIGHT.value) |
52 | | - app.is_dark_mode = True |
53 | | - dark_colors = app._get_theme_colors() |
54 | | - self.assertEqual(dark_colors, ThemeColors.DARK.value) |
| 53 | + initial_mode = self.app.is_dark_mode |
| 54 | + self.app.toggle_dark_mode() |
| 55 | + self.assertNotEqual(initial_mode, self.app.is_dark_mode) |
55 | 56 |
|
56 | 57 | def test_add_task(self): |
57 | | - app = TodoApp(MagicMock()) |
58 | | - app.entry = MagicMock() |
59 | | - app.entry.get.return_value = "New Task" |
60 | | - app._add_task() |
61 | | - self.assertEqual(len(app.tasks), 1) |
62 | | - self.assertEqual(app.tasks[0].name, "New Task") |
63 | | - self.assertEqual(app.tasks[0].status, TaskStatus.PENDING) |
64 | | - self.assertFalse(app.tasks[0].urgent) |
| 58 | + self.app.entry = MagicMock() |
| 59 | + self.app.entry.get.return_value = "New Task" |
| 60 | + self.app.add_task() |
| 61 | + self.assertEqual(len(self.app.tasks), 1) |
| 62 | + self.assertEqual(self.app.tasks[0]['name'], "New Task") |
| 63 | + self.assertFalse(self.app.tasks[0]['done']) |
65 | 64 |
|
66 | | - def test_remove_selected_tasks(self): |
67 | | - app = TodoApp(MagicMock()) |
68 | | - app.tasks = [Task("Task 1"), Task("Task 2"), Task("Task 3")] |
69 | | - app.listbox = MagicMock() |
70 | | - app.listbox.curselection.return_value = [1] |
71 | | - app._remove_selected_tasks() |
72 | | - self.assertEqual(len(app.tasks), 2) |
73 | | - self.assertEqual(app.tasks[0].name, "Task 1") |
74 | | - self.assertEqual(app.tasks[1].name, "Task 3") |
| 65 | + @patch('todo_app.todo_app.TodoApp.populate_listbox') |
| 66 | + @patch('todo_app.todo_app.TodoApp.save_tasks') |
| 67 | + def test_remove_selected_tasks(self, mock_save, mock_populate): |
| 68 | + self.app.tasks = [ |
| 69 | + {"name": "Task 1", "done": False, "cancelled": False, "urgent": False, "separator": False}, |
| 70 | + {"name": "Task 2", "done": False, "cancelled": False, "urgent": False, "separator": False} |
| 71 | + ] |
| 72 | + self.app.listbox = MagicMock() |
| 73 | + self.app.listbox.curselection.return_value = [0] |
| 74 | + self.app.remove_selected_tasks() |
| 75 | + self.assertEqual(len(self.app.tasks), 1) |
| 76 | + self.assertEqual(self.app.tasks[0]['name'], "Task 2") |
75 | 77 |
|
76 | | - def test_mark_selected_tasks_done(self): |
77 | | - app = TodoApp(MagicMock()) |
78 | | - app.tasks = [Task("Task 1"), Task("Task 2")] |
79 | | - app.listbox = MagicMock() |
80 | | - app.listbox.curselection.return_value = [0] |
81 | | - app._mark_selected_tasks_done() |
82 | | - self.assertEqual(app.tasks[0].status, TaskStatus.DONE) |
83 | | - self.assertEqual(app.tasks[1].status, TaskStatus.PENDING) |
| 78 | + @patch('todo_app.todo_app.TodoApp.populate_listbox') |
| 79 | + @patch('todo_app.todo_app.TodoApp.save_tasks') |
| 80 | + def test_mark_selected_tasks_done(self, mock_save, mock_populate): |
| 81 | + self.app.tasks = [ |
| 82 | + {"name": "Task 1", "done": False, "cancelled": False, "urgent": False, "separator": False}, |
| 83 | + {"name": "Task 2", "done": False, "cancelled": False, "urgent": False, "separator": False} |
| 84 | + ] |
| 85 | + self.app.listbox = MagicMock() |
| 86 | + self.app.listbox.curselection.return_value = [0] |
| 87 | + self.app.mark_selected_tasks_done() |
| 88 | + self.assertTrue(self.app.tasks[0]['done']) |
| 89 | + self.assertFalse(self.app.tasks[1]['done']) |
84 | 90 |
|
85 | 91 | if __name__ == "__main__": |
86 | 92 | unittest.main() |
0 commit comments