コード例 #1
0
ファイル: tests.py プロジェクト: AeroNotix/django-timetracker
    def setUpClass(self):
        create_users(self)
        self.ot_entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today(),
            start_time=datetime.time(0, 0, 0),
            end_time=datetime.time(17, 0, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="WKDAY",
        )

	self.pending_entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today() + datetime.timedelta(days=123),
            start_time=datetime.time(9, 0, 0),
            end_time=datetime.time(17, 0, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="PENDI",
        )

        self.entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today() + datetime.timedelta(days=1),
            start_time=datetime.time(9, 0, 0),
            end_time=datetime.time(16, 45, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="WKDAY",
        )

        self.ot_entry.full_clean()
        self.ot_entry.save()
        self.entry.full_clean()
        self.entry.save()
コード例 #2
0
 def testDoubleClose(self):
     entry = TrackingEntry(
         user=self.linked_user,
         entry_date=datetime.datetime.today() + datetime.timedelta(days=3),
         start_time=datetime.time(9, 0, 0),
         end_time=datetime.time(20, 45, 0),
         breaks=datetime.time(0, 15, 0),
         daytype="WKDAY",
     )
     entry.full_clean()
     entry.save()
     entry.create_approval_request()
     pending = PendingApproval.objects.get(entry=entry)
     try:
         # we may be running with a default implementation which
         # doesn't sent e-mails.
         from timetracker.tracker.notifications import (
             send_overtime_notification, send_pending_overtime_notification,
             send_undertime_notification)
     except:
         return
     pending.tl_close(True)
     pending.close(True)
     self.assertEqual(len(mail.outbox), 1)
     pending.tl_close(True)
     pending.close(True)
     self.assertEqual(len(mail.outbox), 1)
コード例 #3
0
def download_all_holiday_data(request, who=None): # pragma: no cover
    '''Endpoint which creates a CSV file for all holiday data for a
    single employee.

    :param who: The ID of the person the report should be generated for
    if the user is not in the span of control for the administrator then
    no report will be generated.'''
    if not who:
        raise Http404

    auth_user = Tbluser.objects.get(id=request.session.get("user_id"))
    try:
        target_user = auth_user.get_subordinates().get(id=who)
    except Tbluser.DoesNotExist:
        raise Http404

    buf = StringIO()
    buf.write("\xef\xbb\xbf")
    csvfile = UnicodeWriter(buf)
    csvfile.writerow(TrackingEntry.headings())

    for entry in TrackingEntry.objects.filter(user_id=who):
        csvfile.writerow(entry.display_as_csv())

    response = HttpResponse(buf.getvalue(), mimetype="text/csv")
    response['Content-Disposition'] = \
        'attachment;filename=AllHolidayData_%s.csv' % target_user.id
    return response
コード例 #4
0
ファイル: tests.py プロジェクト: foonnnnn/django-timetracker
    def testHolidayBalanceDecrement(self):
        '''
        Test for the return decrement total works
        '''
        for day in (("1", "RETRN"), ("2", "RETRN"), ("3", "RETRN")):
            entry = TrackingEntry(
                entry_date="2012-01-%s" % day[0],
                user_id=self.linked_user.id,
                start_time="00:00:00",
                end_time="00:00:00",
                breaks="00:00:00",
                daytype=day[1],
            )
            entry.save()

        self.assertEquals(self.linked_user.get_holiday_balance(2012), 17)
コード例 #5
0
ファイル: tests.py プロジェクト: foonnnnn/django-timetracker
    def testHolidayBalanceAdd(self):
        '''
        Test for the holiday additional total works
        '''
        for day in (("1", "PUWRK"), ("2", "PUWRK"), ("3", "PUWRK")):
            entry = TrackingEntry(
                entry_date="2012-01-%s" % day[0],
                user_id=self.linked_user.id,
                start_time="00:00:00",
                end_time="00:00:00",
                breaks="00:00:00",
                daytype=day[1],
            )
            entry.save()

        self.assertEquals(self.linked_user.get_holiday_balance(2012), 26)
コード例 #6
0
ファイル: tests.py プロジェクト: foonnnnn/django-timetracker
    def testHolidayBalanceMix(self):
        '''
        Test to make sure that the holiday balance calculates correctly
        '''
        for day in (("1", "HOLIS"), ("2", "PUWRK"), ("3", "RETRN")):
            entry = TrackingEntry(
                entry_date="2012-01-%s" % day[0],
                user_id=self.linked_user.id,
                start_time="00:00:00",
                end_time="00:00:00",
                breaks="00:00:00",
                daytype=day[1],
            )
            entry.save()

        self.assertEquals(self.linked_user.get_holiday_balance(2012), 20)
コード例 #7
0
ファイル: views.py プロジェクト: foonnnnn/django-timetracker
def download_all_holiday_data(request, who=None):
    '''Endpoint which creates a CSV file for all holiday data for a
    single employee.

    :param who: The ID of the person the report should be generated for
    if the user is not in the span of control for the administrator then
    no report will be generated.'''
    if not who:
        raise Http404

    auth_user = Tbluser.objects.get(id=request.session.get("user_id"))
    try:
        target_user = auth_user.get_subordinates().get(id=who)
    except Tbluser.DoesNotExist:
        raise Http404

    buf = StringIO()
    buf.write("\xef\xbb\xbf")
    csvfile = UnicodeWriter(buf)
    csvfile.writerow(TrackingEntry.headings())

    for entry in TrackingEntry.objects.filter(user_id=who):
        csvfile.writerow(entry.display_as_csv())

    response = HttpResponse(buf.getvalue(), mimetype="text/csv")
    response['Content-Disposition'] = \
        'attachment;filename=AllHolidayData_%s.csv' % target_user.id
    return response
コード例 #8
0
ファイル: tests.py プロジェクト: foonnnnn/django-timetracker
 def testTimeDifferenceZero(self):
     '''Tests an entry against several rules to make sure our
     check for whether an entry is or is not overtime is correctly
     working.'''
     for date, end in [
         ["2012-01-11", "16:45"],
         ]:
         entry = TrackingEntry(
             entry_date=date,
             user_id=self.linked_user.id,
             start_time="09:00",
             end_time=end,
             breaks="00:15",
             daytype="WKDAY"
             )
         entry.full_clean()
         self.assertTrue(entry.time_difference() == 0)
コード例 #9
0
ファイル: tests.py プロジェクト: AeroNotix/django-timetracker
 def testDoubleClose(self):
     entry = TrackingEntry(
         user=self.linked_user,
         entry_date=datetime.datetime.today() + datetime.timedelta(days=3),
         start_time=datetime.time(9, 0, 0),
         end_time=datetime.time(20, 45, 0),
         breaks=datetime.time(0, 15, 0),
         daytype="WKDAY",
     )
     entry.full_clean()
     entry.save()
     entry.create_approval_request()
     pending = PendingApproval.objects.get(
         entry=entry
     )
     try:
         # we may be running with a default implementation which
         # doesn't sent e-mails.
         from timetracker.tracker.notifications import (
             send_overtime_notification, send_pending_overtime_notification,
             send_undertime_notification
         )
     except:
         return
     pending.tl_close(True)
     pending.close(True)
     self.assertEqual(len(mail.outbox), 1)
     pending.tl_close(True)
     pending.close(True)
     self.assertEqual(len(mail.outbox), 1)
コード例 #10
0
ファイル: tests.py プロジェクト: foonnnnn/django-timetracker
 def testIsOvertime(self):
     '''Tests an entry against several rules to make sure our
     check for whether an entry is or is not overtime is correctly
     working.'''
     for date, end in [
         ["2012-01-06", "18:01"],
         ["2012-01-07", "19:00"],
         ]:
         entry = TrackingEntry(
             entry_date=date,
             user_id=self.linked_user.id,
             start_time="09:00",
             end_time=end,
             breaks="00:15",
             daytype="WKDAY"
             )
         entry.full_clean()
         self.assertTrue(entry.is_overtime())
コード例 #11
0
 def testIsHolidayRequest(self):
     entry = TrackingEntry(
         user=self.linked_user,
         entry_date=datetime.datetime.today() + datetime.timedelta(days=5),
         start_time=datetime.time(9, 0, 0),
         end_time=datetime.time(20, 45, 0),
         breaks=datetime.time(0, 15, 0),
         daytype="PENDI",
     )
     entry.full_clean()
     entry.save()
     entry.create_approval_request()
     pending = PendingApproval.objects.get(entry=entry)
     self.assertEqual(pending.is_holiday_request(), True)
コード例 #12
0
    def setUpClass(self):
        create_users(self)
        self.ot_entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today(),
            start_time=datetime.time(0, 0, 0),
            end_time=datetime.time(17, 0, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="WKDAY",
        )

        self.pending_entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today() +
            datetime.timedelta(days=123),
            start_time=datetime.time(9, 0, 0),
            end_time=datetime.time(17, 0, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="PENDI",
        )

        self.entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today() + datetime.timedelta(days=1),
            start_time=datetime.time(9, 0, 0),
            end_time=datetime.time(16, 45, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="WKDAY",
        )

        self.ot_entry.full_clean()
        self.ot_entry.save()
        self.entry.full_clean()
        self.entry.save()
コード例 #13
0
 def testTLDeny(self):
     entry = TrackingEntry(
         user=self.linked_user,
         entry_date=datetime.datetime.today() + datetime.timedelta(days=6),
         start_time=datetime.time(9, 0, 0),
         end_time=datetime.time(20, 45, 0),
         breaks=datetime.time(0, 15, 0),
         daytype="WKDAY",
     )
     entry.full_clean()
     entry.save()
     entry.create_approval_request()
     pending = PendingApproval.objects.get(entry=entry)
     pending.tl_close(False)
     self.assertEqual(len(mail.outbox), 1)
コード例 #14
0
ファイル: tests.py プロジェクト: AeroNotix/django-timetracker
 def testIsHolidayRequest(self):
     entry = TrackingEntry(
         user=self.linked_user,
         entry_date=datetime.datetime.today() + datetime.timedelta(days=5),
         start_time=datetime.time(9, 0, 0),
         end_time=datetime.time(20, 45, 0),
         breaks=datetime.time(0, 15, 0),
         daytype="PENDI",
     )
     entry.full_clean()
     entry.save()
     entry.create_approval_request()
     pending = PendingApproval.objects.get(
         entry=entry
     )
     self.assertEqual(pending.is_holiday_request(), True)
コード例 #15
0
def all_team(request, year=None, month=None, team=None): # pragma: no cover
    if not year or not month or not team:
        raise Http404

    buf = StringIO()
    buf.write("\xef\xbb\xbf")
    csvfile = UnicodeWriter(buf)
    csvfile.writerow(TrackingEntry.headings())
    for user in Tbluser.objects.filter(market=team):
        for entry in TrackingEntry.objects.filter(
            entry_date__year=year,
            entry_date__month=month,
            user_id=user.id):
            csvfile.writerow(entry.display_as_csv())
    response = HttpResponse(buf.getvalue(), mimetype="text/csv")
    response['Content-Disposition'] = \
        'attachment;filename=AllHolidayData_%s_%s_%s.csv' % (year, month, team)
    return response
コード例 #16
0
ファイル: tests.py プロジェクト: AeroNotix/django-timetracker
 def testTLDeny(self):
     entry = TrackingEntry(
         user=self.linked_user,
         entry_date=datetime.datetime.today() + datetime.timedelta(days=6),
         start_time=datetime.time(9, 0, 0),
         end_time=datetime.time(20, 45, 0),
         breaks=datetime.time(0, 15, 0),
         daytype="WKDAY",
     )
     entry.full_clean()
     entry.save()
     entry.create_approval_request()
     pending = PendingApproval.objects.get(
         entry=entry
     )
     pending.tl_close(False)
     self.assertEqual(len(mail.outbox), 1)
コード例 #17
0
def yearmonthhol(request, year=None, month=None): # pragma: no cover
    '''Endpoint which creates a CSV file for all holiday data within
    a specific month.

    :param year: The year for the report.
    :param month: The month for the report.

    :note: Both year and mont are required.'''
    auth_user = Tbluser.objects.get(id=request.session.get("user_id"))
    buf = StringIO()
    buf.write("\xef\xbb\xbf")
    csvfile = UnicodeWriter(buf)
    csvfile.writerow(TrackingEntry.headings())
    for user in auth_user.get_subordinates():
        for entry in TrackingEntry.objects.filter(
            entry_date__year=year,
            entry_date__month=month,
            user_id=user.id):
            csvfile.writerow(entry.display_as_csv())
    response = HttpResponse(buf.getvalue(), mimetype="text/csv")
    response['Content-Disposition'] = \
        'attachment;filename=HolidayData_%s_%s.csv' % (year, month)
    return response
コード例 #18
0
ファイル: views.py プロジェクト: foonnnnn/django-timetracker
def yearmonthhol(request, year=None, month=None):
    '''Endpoint which creates a CSV file for all holiday data within
    a specific month.

    :param year: The year for the report.
    :param month: The month for the report.

    :note: Both year and mont are required.'''
    auth_user = Tbluser.objects.get(id=request.session.get("user_id"))
    buf = StringIO()
    buf.write("\xef\xbb\xbf")
    csvfile = UnicodeWriter(buf)
    csvfile.writerow(TrackingEntry.headings())
    for user in auth_user.get_subordinates():
        for entry in TrackingEntry.objects.filter(
            entry_date__year=year,
            entry_date__month=month,
            user_id=user.id):
            csvfile.writerow(entry.display_as_csv())
    response = HttpResponse(buf.getvalue(), mimetype="text/csv")
    response['Content-Disposition'] = \
        'attachment;filename=HolidayData_%s_%s.csv' % (year, month)
    return response
コード例 #19
0
ファイル: tests.py プロジェクト: AeroNotix/django-timetracker
class ApprovalTest(TestCase):

    @classmethod
    def setUpClass(self):
        create_users(self)
        self.ot_entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today(),
            start_time=datetime.time(0, 0, 0),
            end_time=datetime.time(17, 0, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="WKDAY",
        )

	self.pending_entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today() + datetime.timedelta(days=123),
            start_time=datetime.time(9, 0, 0),
            end_time=datetime.time(17, 0, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="PENDI",
        )

        self.entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today() + datetime.timedelta(days=1),
            start_time=datetime.time(9, 0, 0),
            end_time=datetime.time(16, 45, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="WKDAY",
        )

        self.ot_entry.full_clean()
        self.ot_entry.save()
        self.entry.full_clean()
        self.entry.save()

    @classmethod
    def tearDownClass(self):
        delete_users(self)

    def testPendingApprovalDenied(self):
        self.doapprovaltest(False, "Request for Overtime: Denied.", 0)

    def testPendingApprovalApproved(self):
        try:
            # we may be running with a default implementation which
            # doesn't sent e-mails.
            from timetracker.tracker.notifications import (
                send_overtime_notification, send_pending_overtime_notification,
                send_undertime_notification
            )
        except: # pragma: no cover
            return
        self.doapprovaltest(True, "Your recent timetracker actions.", 1)

    @override_settings(UNDER_TIME_ENABLED={M: True for M in MARKET_CHOICES})
    def doapprovaltest(self, status, message, attachments):
        approval = PendingApproval(
            entry=self.ot_entry,
            approver=self.linked_manager
        )
        approval.save()
        approval.close(status)
        self.assertEqual(len(mail.outbox), 1)
        self.assertEqual(mail.outbox[0].subject, message)
        self.assertEqual(len(mail.outbox[0].attachments), attachments)
        
    def test_approvalonpendingtest(self):
        self.pending_entry.save()
        approval = PendingApproval(
            entry=self.pending_entry,
            approver=self.linked_manager
        )
        approval.save()
        approval.close(True)
        self.assertEqual(approval.entry.daytype, "HOLIS")

    def testNoApprovalRequired(self): # pragma: no cover
        if not settings.SENDING_APPROVAL.get(self.linked_manager.market):
            return
        approval = PendingApproval(
            entry=self.entry,
            approver=self.linked_manager
        )
        approval.inform_manager()
        self.assertEqual(len(mail.outbox), 0)

    def testApprovalRequired(self): # pragma: no cover
        if not settings.SENDING_APPROVAL.get(self.linked_manager.market):
            return
        approval = PendingApproval(
            entry=self.ot_entry,
            approver=self.linked_manager
        )
        approval.inform_manager()
        self.assertEqual(len(mail.outbox), 1)

    def testSoftClose(self):
        entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today() + datetime.timedelta(days=2),
            start_time=datetime.time(9, 0, 0),
            end_time=datetime.time(20, 45, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="WKDAY",
        )
        entry.full_clean()
        entry.save()
        entry.create_approval_request()
        pending = PendingApproval.objects.get(
            entry=entry
        )
        pending.tl_close(True)
        self.assertEqual(pending.tl_approved, True)

    def testDoubleClose(self):
        entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today() + datetime.timedelta(days=3),
            start_time=datetime.time(9, 0, 0),
            end_time=datetime.time(20, 45, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="WKDAY",
        )
        entry.full_clean()
        entry.save()
        entry.create_approval_request()
        pending = PendingApproval.objects.get(
            entry=entry
        )
        try:
            # we may be running with a default implementation which
            # doesn't sent e-mails.
            from timetracker.tracker.notifications import (
                send_overtime_notification, send_pending_overtime_notification,
                send_undertime_notification
            )
        except:
            return
        pending.tl_close(True)
        pending.close(True)
        self.assertEqual(len(mail.outbox), 1)
        pending.tl_close(True)
        pending.close(True)
        self.assertEqual(len(mail.outbox), 1)

    def testDeniedClosedMail(self):
        entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today() + datetime.timedelta(days=4),
            start_time=datetime.time(9, 0, 0),
            end_time=datetime.time(20, 45, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="WKDAY",
        )
        entry.full_clean()
        entry.save()
        entry.create_approval_request()
        pending = PendingApproval.objects.get(
            entry=entry
        )
        pending.tl_close(False)
        self.assertEqual(len(mail.outbox), 1)

    def testIsHolidayRequest(self):
        entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today() + datetime.timedelta(days=5),
            start_time=datetime.time(9, 0, 0),
            end_time=datetime.time(20, 45, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="PENDI",
        )
        entry.full_clean()
        entry.save()
        entry.create_approval_request()
        pending = PendingApproval.objects.get(
            entry=entry
        )
        self.assertEqual(pending.is_holiday_request(), True)

    def testTLDeny(self):
        entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today() + datetime.timedelta(days=6),
            start_time=datetime.time(9, 0, 0),
            end_time=datetime.time(20, 45, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="WKDAY",
        )
        entry.full_clean()
        entry.save()
        entry.create_approval_request()
        pending = PendingApproval.objects.get(
            entry=entry
        )
        pending.tl_close(False)
        self.assertEqual(len(mail.outbox), 1)
コード例 #20
0
class ApprovalTest(TestCase):
    @classmethod
    def setUpClass(self):
        create_users(self)
        self.ot_entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today(),
            start_time=datetime.time(0, 0, 0),
            end_time=datetime.time(17, 0, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="WKDAY",
        )

        self.pending_entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today() +
            datetime.timedelta(days=123),
            start_time=datetime.time(9, 0, 0),
            end_time=datetime.time(17, 0, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="PENDI",
        )

        self.entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today() + datetime.timedelta(days=1),
            start_time=datetime.time(9, 0, 0),
            end_time=datetime.time(16, 45, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="WKDAY",
        )

        self.ot_entry.full_clean()
        self.ot_entry.save()
        self.entry.full_clean()
        self.entry.save()

    @classmethod
    def tearDownClass(self):
        delete_users(self)

    def testPendingApprovalDenied(self):
        self.doapprovaltest(False, "Request for Overtime: Denied.", 0)

    def testPendingApprovalApproved(self):
        try:
            # we may be running with a default implementation which
            # doesn't sent e-mails.
            from timetracker.tracker.notifications import (
                send_overtime_notification, send_pending_overtime_notification,
                send_undertime_notification)
        except:  # pragma: no cover
            return
        self.doapprovaltest(True, "Your recent timetracker actions.", 1)

    @override_settings(UNDER_TIME_ENABLED={M: True for M in MARKET_CHOICES})
    def doapprovaltest(self, status, message, attachments):
        approval = PendingApproval(entry=self.ot_entry,
                                   approver=self.linked_manager)
        approval.save()
        approval.close(status)
        self.assertEqual(len(mail.outbox), 1)
        self.assertEqual(mail.outbox[0].subject, message)
        self.assertEqual(len(mail.outbox[0].attachments), attachments)

    def test_approvalonpendingtest(self):
        self.pending_entry.save()
        approval = PendingApproval(entry=self.pending_entry,
                                   approver=self.linked_manager)
        approval.save()
        approval.close(True)
        self.assertEqual(approval.entry.daytype, "HOLIS")

    def testNoApprovalRequired(self):  # pragma: no cover
        if not settings.SENDING_APPROVAL.get(self.linked_manager.market):
            return
        approval = PendingApproval(entry=self.entry,
                                   approver=self.linked_manager)
        approval.inform_manager()
        self.assertEqual(len(mail.outbox), 0)

    def testApprovalRequired(self):  # pragma: no cover
        if not settings.SENDING_APPROVAL.get(self.linked_manager.market):
            return
        approval = PendingApproval(entry=self.ot_entry,
                                   approver=self.linked_manager)
        approval.inform_manager()
        self.assertEqual(len(mail.outbox), 1)

    def testSoftClose(self):
        entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today() + datetime.timedelta(days=2),
            start_time=datetime.time(9, 0, 0),
            end_time=datetime.time(20, 45, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="WKDAY",
        )
        entry.full_clean()
        entry.save()
        entry.create_approval_request()
        pending = PendingApproval.objects.get(entry=entry)
        pending.tl_close(True)
        self.assertEqual(pending.tl_approved, True)

    def testDoubleClose(self):
        entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today() + datetime.timedelta(days=3),
            start_time=datetime.time(9, 0, 0),
            end_time=datetime.time(20, 45, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="WKDAY",
        )
        entry.full_clean()
        entry.save()
        entry.create_approval_request()
        pending = PendingApproval.objects.get(entry=entry)
        try:
            # we may be running with a default implementation which
            # doesn't sent e-mails.
            from timetracker.tracker.notifications import (
                send_overtime_notification, send_pending_overtime_notification,
                send_undertime_notification)
        except:
            return
        pending.tl_close(True)
        pending.close(True)
        self.assertEqual(len(mail.outbox), 1)
        pending.tl_close(True)
        pending.close(True)
        self.assertEqual(len(mail.outbox), 1)

    def testDeniedClosedMail(self):
        entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today() + datetime.timedelta(days=4),
            start_time=datetime.time(9, 0, 0),
            end_time=datetime.time(20, 45, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="WKDAY",
        )
        entry.full_clean()
        entry.save()
        entry.create_approval_request()
        pending = PendingApproval.objects.get(entry=entry)
        pending.tl_close(False)
        self.assertEqual(len(mail.outbox), 1)

    def testIsHolidayRequest(self):
        entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today() + datetime.timedelta(days=5),
            start_time=datetime.time(9, 0, 0),
            end_time=datetime.time(20, 45, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="PENDI",
        )
        entry.full_clean()
        entry.save()
        entry.create_approval_request()
        pending = PendingApproval.objects.get(entry=entry)
        self.assertEqual(pending.is_holiday_request(), True)

    def testTLDeny(self):
        entry = TrackingEntry(
            user=self.linked_user,
            entry_date=datetime.datetime.today() + datetime.timedelta(days=6),
            start_time=datetime.time(9, 0, 0),
            end_time=datetime.time(20, 45, 0),
            breaks=datetime.time(0, 15, 0),
            daytype="WKDAY",
        )
        entry.full_clean()
        entry.save()
        entry.create_approval_request()
        pending = PendingApproval.objects.get(entry=entry)
        pending.tl_close(False)
        self.assertEqual(len(mail.outbox), 1)