def test_get_query_empty(self): """ Tests whether a query with no associated project searches the entire set of activities, regardless of project. """ activity1 = factories.Activity(name='foo') activity2 = factories.Activity(name='bar') activity3 = factories.Activity(name='baz') activity4 = factories.Activity(name='qux') activity_group1 = factories.ActivityGroup() activity_group1.activities.add(activity1) activity_group1.activities.add(activity2) activity_group2 = factories.ActivityGroup() activity_group2.activities.add(activity3) activity_group2.activities.add(activity4) request = RequestFactory().get('/selectable/entries-activitylookup', {'project': ''}) data = self.lookup.get_query(request, '') self.assertIn(activity1, data) self.assertIn(activity2, data) self.assertIn(activity3, data) self.assertIn(activity4, data) data = self.lookup.get_query(request, 'a') self.assertNotIn(activity1, data) self.assertIn(activity2, data) self.assertIn(activity3, data) self.assertNotIn(activity4, data)
def setUp(self): super(PayrollTest, self).setUp() self.user = factories.User() self.user2 = factories.User() self.superuser = factories.Superuser() self.devl_activity = factories.Activity(billable=True) self.activity = factories.Activity() self.sick = factories.Project(name='sick') self.vacation = factories.Project(name='vacation') settings.TIMEPIECE_PAID_LEAVE_PROJECTS = { 'sick': self.sick.pk, 'vacation': self.vacation.pk } self.next = utils.add_timezone(datetime.datetime(2011, 6, 1)) self.overtime_before = utils.add_timezone( datetime.datetime(2011, 4, 29)) self.first = utils.add_timezone(datetime.datetime(2011, 5, 1)) self.first_week = utils.add_timezone(datetime.datetime(2011, 5, 2)) self.middle = utils.add_timezone(datetime.datetime(2011, 5, 18)) self.last_billable = utils.add_timezone(datetime.datetime(2011, 5, 28)) self.last = utils.add_timezone(datetime.datetime(2011, 5, 31)) self.dates = [ self.overtime_before, self.first, self.first_week, self.middle, self.last, self.last_billable, self.next ] self.url = reverse('report_payroll_summary') self.args = { 'year': self.first.year, 'month': self.first.month, }
def setUp(self): super(InvoiceCreateTestCase, self).setUp() self.user = factories.Superuser() self.login_user(self.user) start = utils.add_timezone(datetime.datetime(2011, 1, 1, 8)) end = utils.add_timezone(datetime.datetime(2011, 1, 1, 12)) self.project_billable = factories.BillableProject() self.project_billable2 = factories.BillableProject() self.project_non_billable = factories.NonbillableProject() self.entry1 = factories.Entry( user=self.user, project=self.project_billable, activity=factories.Activity(billable=True), start_time=start, end_time=end, status=Entry.APPROVED) self.entry2 = factories.Entry( user=self.user, project=self.project_billable, activity=factories.Activity(billable=True), start_time=start - relativedelta(days=5), end_time=end - relativedelta(days=5), status=Entry.APPROVED) self.entry3 = factories.Entry( user=self.user, project=self.project_billable2, activity=factories.Activity(billable=False), start_time=start - relativedelta(days=10), end_time=end - relativedelta(days=10), status=Entry.APPROVED) self.entry4 = factories.Entry( user=self.user, project=self.project_non_billable, start_time=start + relativedelta(hours=11), end_time=end + relativedelta(hours=15), status=Entry.APPROVED)
def test_get_query(self): """ Tests whether we get the right results with a non-empty query. """ activity1 = factories.Activity(name='foo') activity2 = factories.Activity(name='bar') activity3 = factories.Activity(name='baz') activity4 = factories.Activity(name='qux') activity_group = factories.ActivityGroup() activity_group.activities.add(activity1) activity_group.activities.add(activity2) activity_group.activities.add(activity3) activity_group.activities.add(activity4) project = factories.Project(activity_group=activity_group) request = RequestFactory().get('/selectable/entries-activitylookup', {'project': project.pk}) data = self.lookup.get_query(request, 'a') self.assertNotIn(activity1, data) self.assertIn(activity2, data) self.assertIn(activity3, data) self.assertNotIn(activity4, data)
def setUp(self): super(ReportsTestBase, self).setUp() self.user = factories.User() self.user2 = factories.User() self.superuser = factories.Superuser() self.devl_activity = factories.Activity(billable=True) self.activity = factories.Activity() self.sick = factories.Project() self.vacation = factories.Project() settings.TIMEPIECE_PAID_LEAVE_PROJECTS = { 'sick': self.sick.pk, 'vacation': self.vacation.pk, } self.leave = [self.sick.pk, self.vacation.pk] self.p1 = factories.BillableProject(name='1') self.p2 = factories.NonbillableProject(name='2') self.p4 = factories.BillableProject(name='4') self.p3 = factories.NonbillableProject(name='1') self.p5 = factories.BillableProject(name='3') self.default_projects = [self.p1, self.p2, self.p3, self.p4, self.p5] self.default_dates = [ utils.add_timezone(datetime.datetime(2011, 1, 3)), utils.add_timezone(datetime.datetime(2011, 1, 4)), utils.add_timezone(datetime.datetime(2011, 1, 10)), utils.add_timezone(datetime.datetime(2011, 1, 16)), utils.add_timezone(datetime.datetime(2011, 1, 17)), utils.add_timezone(datetime.datetime(2011, 1, 18)), ]
def setUp(self): super(TestProjectTimesheetView, self).setUp() self.user = factories.User() self.user2 = factories.User() self.superuser = factories.Superuser() self.p1 = factories.BillableProject(name='1') self.p2 = factories.NonbillableProject(name='2') self.p4 = factories.BillableProject(name='4') self.p3 = factories.NonbillableProject(name='1') self.url_args = (self.p1.pk, ) self.devl_activity = factories.Activity(billable=True) self.activity = factories.Activity()
def setUp(self): self.user = factories.User() permissions = Permission.objects.filter( content_type=ContentType.objects.get_for_model(Entry), codename__in=('can_clock_in', 'can_clock_out', 'can_pause', 'change_entry')) self.user.user_permissions = permissions self.user.save() self.superuser = factories.Superuser() self.tracked_status = factories.StatusAttribute( label='Current', billable=True, enable_timetracking=True) self.untracked_status = factories.StatusAttribute( label='Closed', billable=False, enable_timetracking=False) self.tracked_type = factories.TypeAttribute(label='Tracked', billable=True, enable_timetracking=True) self.untracked_type = factories.TypeAttribute( label='Untracked', billable=False, enable_timetracking=False) self.work_activities = factories.ActivityGroup(name='Work') self.leave_activities = factories.ActivityGroup(name='Leave') self.all_activities = factories.ActivityGroup(name='All') self.leave_activity = factories.Activity(code='leave', name='Leave', billable=False) self.leave_activity.activity_group.add(self.leave_activities, self.all_activities) self.work_activity = factories.Activity(code='work', name='Work', billable=True) self.work_activity.activity_group.add(self.work_activities, self.all_activities) data = { 'type': self.tracked_type, 'status': self.tracked_status, 'activity_group': self.work_activities, } self.tracked_project = factories.BillableProject(name='Tracked', **data) data = { 'type': self.untracked_type, 'status': self.untracked_status, 'activity_group': self.all_activities, } self.untracked_project = factories.BillableProject(name='Untracked', **data)
def test_invoice_confirm_rounding(self): """Verify that the per activity totals are rounded correctly.""" ACTIVITY_NAME = 'activity_n' # Make a few extra entries to test per activity totals start = utils.add_timezone(datetime.datetime(2011, 1, 1, 8, 0, 0)) end = utils.add_timezone(datetime.datetime(2011, 1, 1, 8, 3, 1)) # 3m1s = 0.05166667h # 0.05166667 rounds to 0.05, at two decimal places # 0.05 * 5 = 0.25 # 0.05166667 * 5 = 0.25833335 # 0.25833335 rounds to 0.26, at two decimal places # If rounding happens before summation, then the total will be 0.25 # If rounding happens after summation, then the total will be 0.26 activity = factories.Activity(billable=True, name=ACTIVITY_NAME) for num in range(0, 5): factories.Entry( user=self.user, project=self.project_billable, start_time=start - relativedelta(days=num), end_time=end - relativedelta(days=num), status=Entry.APPROVED, activity=activity) self.make_hourgroups() to_date = datetime.datetime(2011, 1, 31) kwargs = { 'project': self.project_billable.id, 'to_date': to_date.strftime(DATE_FORM_FORMAT), } url = self.get_create_url(**kwargs) response = self.client.get(url) self.assertEqual(response.status_code, 200) for name, hours_activities in response.context['billable_totals']: total, activities = hours_activities if name == ACTIVITY_NAME: self.assertEqual(total, 0.25) self.assertNotAlmostEqual(float(total), 0.26, places=2)
def setUp(self): super(ListOutstandingInvoicesViewTestCase, self).setUp() self.user = factories.Superuser() self.login_user(self.user) start = utils.add_timezone(datetime.datetime(2011, 1, 1, 8)) end = utils.add_timezone(datetime.datetime(2011, 1, 1, 12)) self.project_billable = factories.BillableProject() self.project_billable2 = factories.BillableProject() self.project_non_billable = factories.NonbillableProject() self.entry1 = factories.Entry( user=self.user, project=self.project_billable, activity=factories.Activity(billable=True), start_time=start, end_time=end, status=Entry.APPROVED) self.entry2 = factories.Entry( user=self.user, project=self.project_billable, activity=factories.Activity(billable=True), start_time=start - relativedelta(days=5), end_time=end - relativedelta(days=5), status=Entry.APPROVED) self.entry3 = factories.Entry( user=self.user, project=self.project_billable2, activity=factories.Activity(billable=False), start_time=start - relativedelta(days=10), end_time=end - relativedelta(days=10), status=Entry.APPROVED) self.entry4 = factories.Entry(user=self.user, project=self.project_non_billable, start_time=start + relativedelta(hours=11), end_time=end + relativedelta(hours=15), status=Entry.APPROVED) # Default get kwargs. self.to_date = utils.add_timezone( datetime.datetime(2011, 1, 31, 0, 0, 0)) self.get_kwargs = { 'to_date': self.to_date.strftime(DATE_FORM_FORMAT), 'statuses': list(Attribute.statuses.values_list('pk', flat=True)), }
def setUp(self): super(InvoiceViewPreviousTestCase, self).setUp() self.user = factories.Superuser() self.login_user(self.user) self.devl_activity = factories.Activity( code='devl', name='development', billable=True) self.activity = factories.Activity( code='WRK', name='Work') # Make some projects and entries for invoice creation self.project = factories.BillableProject() self.project2 = factories.BillableProject() last_start = self.log_many([self.project, self.project2]) # Add some non-billable entries self.log_many([self.project, self.project2], start=last_start, billable=False) self.create_invoice(self.project, {'static': EntryGroup.INVOICED}) self.create_invoice(self.project2, {'status': EntryGroup.NOT_INVOICED})
def test_clock_in_form_activity_without_project_activity_group(self): """Ensure that the ActivityLookup provides all Activities if Project does not have an activity group. """ factory = RequestFactory() lookup = ActivityLookup() factories.Activity() request = factory.get("/entry/clock_in/", {'project': self.project.pk}) response = lookup.results(request) data = json.loads(response.content.decode("utf-8"))['data'] self.assertEqual(2, len(data))
def setUp(self): self.today = datetime.date(2012, 11, 7) self.this_week = utils.get_week_start(self.today) self.next_week = self.this_week + relativedelta(days=7) self.user = factories.User() self.project = factories.Project() self.activity = factories.Activity() self.location = factories.Location() self.status = Entry.UNVERIFIED
def test_clock_in_form_activity_lookup(self): """Create an ActivityGroup that includes the Activity, and associate it with the project. Add a second Activity that is not included. Ensure that the ActivityLookup disallows the second Activity. """ factory = RequestFactory() lookup = ActivityLookup() factories.Activity() activity_group = factories.ActivityGroup() activity_group.activities.add(self.activity) project2 = factories.Project(activity_group=activity_group) factories.ProjectRelationship(project=project2, user=self.user) request = factory.get("/entry/clock_in/", {'project': project2.pk}) response = lookup.results(request) data = json.loads(response.content.decode("utf-8"))['data'] self.assertEqual(1, len(data)) self.assertEqual(self.activity.pk, data[0]['id'])
def setUp(self): self.today = datetime.date(2012, 11, 7) self.this_week = utils.get_week_start(self.today) self.next_week = self.this_week + relativedelta(days=7) get_params = {'week_start': self.this_week.strftime('%Y-%m-%d')} self.url = reverse('dashboard') + '?' + urlencode(get_params) self.user = factories.User() self.permission = Permission.objects.get(codename='can_clock_in') self.user.user_permissions.add(self.permission) self.login_user(self.user) self.project = factories.Project() self.activity = factories.Activity() self.location = factories.Location() self.status = Entry.UNVERIFIED
def test_invoice_confirm_totals(self): """Verify that the per activity totals are valid.""" # Make a few extra entries to test per activity totals start = utils.add_timezone(datetime.datetime(2011, 1, 1, 8)) end = utils.add_timezone(datetime.datetime(2011, 1, 1, 12)) # start = utils.add_timezone(datetime.datetime.now()) # end = start + relativedelta(hours=4) activity = factories.Activity(billable=True, name='activity1') for num in xrange(0, 4): new_entry = factories.Entry(user=self.user, project=self.project_billable, start_time=start - relativedelta(days=num), end_time=end - relativedelta(days=num), status=Entry.APPROVED, activity=activity) self.make_hourgroups() to_date = datetime.datetime(2011, 1, 31) kwargs = { 'project': self.project_billable.id, 'to_date': to_date.strftime(DATE_FORM_FORMAT), } url = self.get_create_url(**kwargs) response = self.client.get(url) self.assertEqual(response.status_code, 200) for name, hours_activities in response.context['billable_totals']: total, activities = hours_activities if name == 'activity1': self.assertEqual(total, 16) self.assertEqual(total, activities[0][1]) self.assertEqual(name, activities[0][0]) elif name == 'Total': self.assertEqual(total, 24) self.assertEqual(activities, []) else: # Each other activity is 4 hrs each self.assertEqual(total, 4) self.assertEqual(total, activities[0][1]) self.assertEqual(name, activities[0][0])