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)
Exemple #5
0
 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': '******'})
Exemple #10
0
    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]'
        )
Exemple #18
0
 def test_find_task_id_empty(self):
     self.assertEquals(None, TogglEntry.findTaskId(''))
     self.assertEquals(None, TogglEntry.findTaskId(None))
Exemple #19
0
 def test_find_task_id_not_contains(self):
     self.assertEquals(None,
                       TogglEntry.findTaskId('Lorem ipsum dolor imet'))
Exemple #20
0
 def test_find_task_id_multiple(self):
     self.assertEquals(
         24361,
         TogglEntry.findTaskId(
             '#24361 Task description, with others things #333'))