Example #1
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()
Example #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)
Example #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
Example #4
0
    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)
Example #5
0
    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)
Example #6
0
    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)
Example #7
0
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
Example #8
0
 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)
Example #9
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)
Example #10
0
 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())
Example #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)
Example #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()
Example #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)
Example #14
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)
Example #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
Example #16
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)
Example #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
Example #18
0
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
Example #19
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)
Example #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)