def test_groupTogglByIssueId(self): entries = [ TogglEntry(None, 3600, None, 1, '#15'), TogglEntry(None, 3600, None, 2, '#16'), TogglEntry(None, 3600, None, 3, '#16'), TogglEntry(None, 3600, None, 4, '#16'), TogglEntry(None, 3600, None, 5, '#17'), ] groups = Synchronizer.groupTogglByIssueId(entries) self.assertIsNotNone(groups) self.assertEqual(3, len(groups)) self.assertTrue(15 in groups) self.assertTrue(16 in groups) self.assertTrue(17 in groups) self.assertEquals(1, len(groups[15])) self.assertEquals(3, len(groups[16])) self.assertEquals(1, len(groups[17])) self.assertEquals(1, groups[15][0].id) self.assertEquals(2, groups[16][0].id) self.assertEquals(3, groups[16][1].id) self.assertEquals(4, groups[16][2].id) self.assertEquals(5, groups[17][0].id)
def test_ignore_negative_duration(self): """ Mattermost should ignore entries with negative durations (pending entries). From toggl docs: duration: time entry duration in seconds. If the time entry is currently running, the duration attribute contains a negative value, denoting the start of the time entry in seconds since epoch (Jan 1 1970). The correct duration can be calculated as current_time + duration, where current_time is the current time in seconds since epoch. (integer, required) """ runner = MagicMock() mattermost = MattermostNotifier('http://dummy', runner) l = [ TogglEntry(None, 3600, self.today, 777, 'test #333'), TogglEntry(None, -300, self.today, 778, 'test #334') ] mattermost.appendEntries(l) mattermost.send() text = '''Found entries in toggl: **2** (filtered: **1**) You worked almost less than 4 hours today (exactly 1.00 h), not every day is a perfect day, right? :smirk:. Huh, not many entries. It means, you did only a couple of tasks, but did it right .. right? :open_mouth: It seems that more than 75% of your today work had redmine id! So .. you rock :rocket:! ''' runner.send.assert_called_with('http://dummy', {'text': text, 'username': '******'})
def test_ignore_negative_duration(self): """ Synchronizer should ignore entries with negative durations (pending entries). From toggl docs: duration: time entry duration in seconds. If the time entry is currently running, the duration attribute contains a negative value, denoting the start of the time entry in seconds since epoch (Jan 1 1970). The correct duration can be calculated as current_time + duration, where current_time is the current time in seconds since epoch. (integer, required) """ redmine = Mock() toggl = Mock() toggl.get.return_value = [ TogglEntry(None, 3600, '2016-01-01T01:01:01', 777, 'test #333'), TogglEntry(None, -3600, '2016-01-01T01:01:01', 778, 'test #334') ] redmine.get.return_value = [] s = Synchronizer(Mock(), redmine, toggl, None) s.start(1) toggl.get.assert_called_once_with(1) redmine.get.assert_called_once_with(333) redmine.put.assert_called_once_with(issueId=333, spentOn='2016-01-01', hours=1.0, comment='test #333 [toggl#777]')
def test_filterToday(self): actual = MattermostNotifier.filterToday([ TogglEntry(None, 4 * 3600, self.today, 777, '#666 Hardwork'), TogglEntry(None, 4 * 3600, None, 778, '#666 Hardwork') ]) self.assertEquals(1, len(actual)) self.assertEquals(actual[0].id, 777)
def test_find_task_id_contains(self): self.assertEquals( 21558, TogglEntry.findTaskId('Long task description #21558')) self.assertEquals(21497, TogglEntry.findTaskId('Short #21497')) self.assertEquals(24361, TogglEntry.findTaskId('#24361')) self.assertEquals( 24361, TogglEntry.findTaskId( '#24361 Task description, with others things'))
def test_filterWithRedmineId(self): entries = [ TogglEntry(None, 1, self.today, 1, '#666 Hardwork'), TogglEntry(None, 1, self.today, 2, 'Hardwork'), TogglEntry(None, 1, self.today, 3, '#666 Hardwork'), ] filtered = MattermostNotifier.filterWithRedmineId(entries) self.assertEquals(2, len(filtered)) self.assertEquals(1, filtered[0].id) self.assertEquals(3, filtered[1].id)
def test_sync_single_toggl_already_inserted_in_redmine(self): class RedmineSpec: def get(self): pass class TogllSpec: def get(self, days): pass redmine = MagicMock(spec_set=RedmineSpec) toggl = MagicMock(spec_set=TogllSpec) toggl.get.return_value = [ TogglEntry(None, 3600, '2016-01-01T01:01:01', 17, '#987 hard work') ] redmine.get.return_value = [ RedmineTimeEntry( 222, '2016-05-01T04:02:22', 'john doe', 1, '2016-01-01', 987, '#987 hard work [toggl#17]' ) ] s = Synchronizer(MagicMock(), redmine, toggl, None) s.start(1)
def test_sync_single_toggl_no_redmine(self): class RedmineSpec: def get(self): pass def put(self, id, spentOn, hours, comment): pass class TogllSpec: def get(self, days): pass config = MagicMock() redmine = MagicMock(spec_set=RedmineSpec) toggl = MagicMock(spec_set=TogllSpec) toggl.get.return_value = [ TogglEntry(None, 3600, '2016-01-01T01:01:01', 17, '#987 hard work') ] redmine.get.return_value = [] s = Synchronizer(config, redmine, toggl, None) s.start(1) toggl.get.assert_called_once_with(1) redmine.put.assert_called_once_with( issueId=987, spentOn='2016-01-01', hours=1.0, comment='#987 hard work [toggl#17]' )
def test_append_entries_two_one_with_redmine(self): runner = MagicMock() mattermost = MattermostNotifier('http://dummy', runner) mattermost.appendEntries([ TogglEntry(None, 60, self.today, 776, ''), TogglEntry(None, 60, self.today, 777, '#666 Hardwork') ]) mattermost.send() text = '''Found entries in toggl: **2** (filtered: **1**) You worked almost less than 4 hours today (exactly 2 m), not every day is a perfect day, right? :smirk:. Huh, not many entries. It means, you did only a couple of tasks, but did it right .. right? :open_mouth: It's gooood. A lot of today work had redmine id! Congrats :sunglasses:. ''' runner.send.assert_called_with('http://dummy', {'text': text, 'username': '******'})
def test_parse(self): entry = TogglEntry.createFromEntry({ 'id': 2121, 'duration': 255, 'start': '2016-01-01T09:09:09+02:00', 'description': 'entry description' }) self.assertEquals(2121, entry.id)
def test_append_entries_3_entries_1_redmine(self): runner = MagicMock() mattermost = MattermostNotifier('http://dummy', runner) l = [ TogglEntry(None, 60, self.today, 777, '#666 Hardwork'), TogglEntry(None, 60, self.today, 777, 'Hardwork'), TogglEntry(None, 60, self.today, 777, 'Hardwork') ] mattermost.appendEntries(l) mattermost.send() text = '''Found entries in toggl: **3** (filtered: **1**) You worked almost less than 4 hours today (exactly 3 m), not every day is a perfect day, right? :smirk:. Huh, not many entries. It means, you did only a couple of tasks, but did it right .. right? :open_mouth: Almost 50% of your today work had redmine id :blush:. ''' runner.send.assert_called_with('http://dummy', {'text': text, 'username': '******'})
def test_append_entries_one(self): runner = MagicMock() mattermost = MattermostNotifier('http://dummy', runner) mattermost.appendEntries([TogglEntry(None, 60, self.today, 777, '')]) mattermost.send() text = '''Found entries in toggl: **1** (filtered: **0**) You worked almost less than 4 hours today (exactly 1 m), not every day is a perfect day, right? :smirk:. Huh, not many entries. It means, you did only a couple of tasks, but did it right .. right? :open_mouth: Ugh. Less than 25% of your work had redmine id. Not so good :cry:. ''' runner.send.assert_called_with('http://dummy', {'text': text, 'username': '******'})
def test_append_entries_two_one_with_redmine_4_hours(self): runner = MagicMock() mattermost = MattermostNotifier('http://dummy', runner) mattermost.appendEntries([ TogglEntry(None, 4 * 3123, self.today, 777, '#666 Hardwork') ]) mattermost.send() text = '''Found entries in toggl: **1** (filtered: **1**) You worked almost less than 4 hours today (exactly 3.47 h), not every day is a perfect day, right? :smirk:. Huh, not many entries. It means, you did only a couple of tasks, but did it right .. right? :open_mouth: It seems that more than 75% of your today work had redmine id! So .. you rock :rocket:! ''' runner.send.assert_called_with('http://dummy', {'text': text, 'username': '******'})
def test_start_one_day_single(self): redmine = Mock() toggl = Mock() toggl.get.return_value = [ TogglEntry(None, 3600, '2016-01-01T01:01:01', 777, 'test #333') ] redmine.get.return_value = [ RedmineTimeEntry( 777, '2016-01-01T01:02:03', 'john doe', 1.25, '2016-03-02', 333, 'test #333 [toggl#777]' )] s = Synchronizer(Mock(), redmine, toggl, None) s.start(1) toggl.get.assert_called_once_with(1)
def test_append_entries_10_entries(self): runner = MagicMock() mattermost = MattermostNotifier('http://dummy', runner) e = TogglEntry(None, 4 * 3600, self.today, 777, '#666 Hardwork') l = [] for i in range(1, 10): l.append(e) mattermost.appendEntries(l) mattermost.send() text = '''Found entries in toggl: **9** (filtered: **9**) Wow you did overtime today :rocket:! Doing overtime from time to time can be good, but life after work is also important. Remember this next time taking 36.00 h in work :sunglasses:! Average day. Not too few, not too many entries :sunglasses:. It seems that more than 75% of your today work had redmine id! So .. you rock :rocket:! ''' runner.send.assert_called_with('http://dummy', {'text': text, 'username': '******'})
def test_append_entries_50_entries(self): runner = MagicMock() mattermost = MattermostNotifier('http://dummy', runner) e = TogglEntry(None, 60, self.today, 777, '#666 Hardwork') l = [] for i in range(50): l.append(e) mattermost.appendEntries(l) mattermost.send() text = '''Found entries in toggl: **50** (filtered: **50**) You worked almost less than 4 hours today (exactly 50 m), not every day is a perfect day, right? :smirk:. You did 50 entries like a boss :smirk: :boom:! It seems that more than 75% of your today work had redmine id! So .. you rock :rocket:! ''' runner.send.assert_called_with('http://dummy', {'text': text, 'username': '******'})
def test_sync_single_toggl_modified_entry(self): class RedmineSpec: def get(self): pass def update(self): pass class TogllSpec: def get(self, days): pass redmine = MagicMock(spec_set=RedmineSpec) toggl = MagicMock(spec_set=TogllSpec) toggl.get.return_value = [ TogglEntry(None, 2*3600, '2016-01-01T01:01:01', 17, '#987 hard work') ] redmine.get.return_value = [ RedmineTimeEntry( 222, '2016-05-01T04:02:22', 'john doe', 1, '2016-01-01', 987, '#987 hard work [toggl#17]' ) ] s = Synchronizer(MagicMock(), redmine, toggl, None) s.start(1) redmine.update.assert_called_once_with( id=222, issueId=987, spentOn='2016-01-01', hours=2.0, comment='#987 hard work [toggl#17]' )
def test_find_task_id_empty(self): self.assertEquals(None, TogglEntry.findTaskId('')) self.assertEquals(None, TogglEntry.findTaskId(None))
def test_find_task_id_not_contains(self): self.assertEquals(None, TogglEntry.findTaskId('Lorem ipsum dolor imet'))
def test_find_task_id_multiple(self): self.assertEquals( 24361, TogglEntry.findTaskId( '#24361 Task description, with others things #333'))