Completed
Push — qml ( c6aebc...cb107e )
by Olivier
01:01
created

TestFile.test_get_all_projects_incl_completed()   A

Complexity

Conditions 1

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
dl 0
loc 9
rs 9.6666
c 1
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A TestFile.test_load_nonexisting_file() 0 3 1
A TestFile.test_load_empty_filename() 0 2 1
1
import unittest
2
from tempfile import mkstemp
3
from os import remove
4
from datetime import date, datetime, timedelta
5
from sys import version
6
7
from qtodotxt.lib.file import File
8
from qtodotxt.lib.tasklib import Task
9
from qtodotxt.lib.filters import DueTodayFilter, DueTomorrowFilter, DueThisWeekFilter, DueThisMonthFilter, DueOverdueFilter
10
11
12
PYTHON_VERSION = version[:3]
13
14
15
if PYTHON_VERSION < '3.3':
16
    FileNotFoundError = BaseException
17
18
19
class TestFile(unittest.TestCase):
20
    def setUp(self):
21
        self.file = File()
22
        self.tmpfile = mkstemp(text=True)[1]
23
24
    def tearDown(self):
25
        try:
26
            remove(self.tmpfile)
27
        except FileNotFoundError:
28
            pass
29
        except OSError as ex:    # maintain compatibility with Python 3.2
30
            if ex.errno != 2:
31
                raise
32
        except:
33
            raise
34
35
    def saveAndReload(self):
36
        self.file.save(self.tmpfile)
37
        self.file = File()
38
        self.file.load(self.tmpfile)
39
40
    def test_single_task(self):
41
        text = 'due:1999-10-10 do something +project1 @context1'
42
        self.file.tasks.append(Task(text))
43
        self.saveAndReload()
44
        self.assertEqual(self.file.tasks[0].text, text)
45
        self.assertEqual(self.file.tasks[0].contexts, ['context1'])
46
        self.assertEqual(self.file.tasks[0].projects, ['project1'])
47
        self.assertFalse(self.file.tasks[0].is_complete)
48
        self.assertFalse(self.file.tasks[0].priority)
49
        self.assertEqual(self.file.tasks[0].due, datetime(1999, 10, 10))
50
51
    def test_two_tasks(self):
52
        task1 = 'do something +project1 @context1'
53
        task2 = '(A) do something else +project1 @context2'
54
        self.file.tasks.extend([
55
            Task(task1),
56
            Task(task2)
57
        ])
58
        self.saveAndReload()
59
        self.assertEqual(self.file.tasks[0].text, task2)
60
        self.assertEqual(self.file.tasks[1].text, task1)
61
62
    def test_five_tasks(self):
63
        task1 = Task('do something +project1 @context1')
64
        task2 = Task('(A) do something else +project1 @context2')
65
        task3 = Task('do something else +project1 @context2')
66
        task4 = Task('something else +project1 @context2')
67
        task5 = Task('abc +project1 @context2')
68
        self.file.tasks.extend([task1, task2, task3, task4, task5])
69
        self.saveAndReload()
70
        self.assertEqual(self.file.tasks[0].text, task2.text)
71
        self.assertEqual(self.file.tasks[1].text, task5.text)
72
        self.assertEqual(self.file.tasks[2].text, task1.text)
73
        self.assertEqual(self.file.tasks[3].text, task3.text)
74
        self.assertEqual(self.file.tasks[4].text, task4.text)
75
76
    def test_get_all_contexts(self):
77
        self.file.tasks.extend([
78
            Task('x task with @context1'),
79
            Task('task with @context2'),
80
            Task('task with @context1 and @context2'),
81
            Task('task with @context1 and @context2 and @context3')
82
        ])
83
        self.saveAndReload()
84
        self.assertEqual(self.file.getAllContexts(), {'context1': [2, 1], 'context2': [3, 0], 'context3': [1, 0]})
85
86
    def test_get_all_incl_completed_contexts(self):
87
        self.file.tasks.extend([
88
            Task('x task with @context1'),
89
            Task('task with @context2'),
90
            Task('task with @context1 and @context2'),
91
            Task('x task with @context1 and @context2 and @context3')
92
        ])
93
        self.saveAndReload()
94
        self.assertEqual(self.file.getAllContexts(), {'context1': [1, 2], 'context2': [2, 1], 'context3': [0, 1]})
95
96
    def test_get_all_projects(self):
97
        self.file.tasks.extend([
98
            Task('x task with +project1'),
99
            Task('task with +project2'),
100
            Task('task with +project1 and +project2'),
101
            Task('task with +project1 and +project2 and +project3')
102
        ])
103
        self.saveAndReload()
104
        self.assertEqual(self.file.getAllProjects(), {'project1': [2, 1], 'project2': [3, 0], 'project3': [1, 0]})
105
106
    def test_get_all_due_ranges(self):
107
        today = date.today().strftime('%Y-%m-%d')
108
        yesterday = (date.today() - timedelta(days=1)).strftime('%Y-%m-%d')
109
110
        self.file.tasks.extend([
111
            Task('x due:' + today + ' completed task of today'),
112
            Task('due:' + today + ' first task of today'),
113
            Task('due:' + today + ' second task of today'),
114
            Task('due:' + yesterday + ' task of yesterday'),
115
        ])
116
        self.saveAndReload()
117
        due = self.file.getAllDueRanges()
118
        self.assertEqual(due[DueTodayFilter()], [2, 1])
119
        self.assertEqual(due[DueOverdueFilter()], [1, 0])
120
        self.assertEqual(due[DueThisWeekFilter()], [2, 1])
121
122
    def test_load_empty_filename(self):
123
        self.assertRaises(OSError, self.file.load, '')
124
125
    def test_load_nonexisting_file(self):
126
        remove(self.tmpfile)
127
        self.assertRaises(OSError, self.file.load, self.tmpfile)
128