def test_user_transfer(superadmin_client): user = UserFactory.create() EmploymentFactory.create(user=user, start_date=date(2017, 12, 28), percentage=100) AbsenceTypeFactory.create(fill_worktime=True) AbsenceTypeFactory.create(fill_worktime=False) absence_type = AbsenceTypeFactory.create(fill_worktime=False) AbsenceFactory.create(user=user, type=absence_type, date=date(2017, 12, 29)) url = reverse('user-transfer', args=[user.id]) response = superadmin_client.post(url) assert response.status_code == status.HTTP_204_NO_CONTENT # running transfer twice should lead to same result response = superadmin_client.post(url) assert response.status_code == status.HTTP_204_NO_CONTENT assert user.overtime_credits.count() == 1 overtime_credit = user.overtime_credits.first() assert overtime_credit.transfer assert overtime_credit.date == date(2018, 1, 1) assert overtime_credit.duration == timedelta(hours=-8, minutes=-30) assert overtime_credit.comment == 'Transfer 2017' assert user.absence_credits.count() == 1 absence_credit = user.absence_credits.first() assert absence_credit.transfer assert absence_credit.date == date(2018, 1, 1) assert absence_credit.days == -1 assert absence_credit.comment == 'Transfer 2017'
def test_absence_balance_list_none_supervisee(auth_client): url = reverse("absence-balance-list") AbsenceTypeFactory.create() unrelated_user = UserFactory.create() result = auth_client.get( url, data={"user": unrelated_user.id, "date": "2017-01-03"} ) assert result.status_code == status.HTTP_200_OK assert len(result.json()["data"]) == 0
def test_absence_type_list(auth_client): AbsenceTypeFactory.create_batch(2) url = reverse('absence-type-list') response = auth_client.get(url) assert response.status_code == status.HTTP_200_OK json = response.json() assert len(json['data']) == 2
def test_absence_type_list_filter_fill_worktime(auth_client): absence_type = AbsenceTypeFactory.create(fill_worktime=True) AbsenceTypeFactory.create() url = reverse('absence-type-list') response = auth_client.get(url, data={'fill_worktime': 1}) assert response.status_code == status.HTTP_200_OK json = response.json() assert len(json['data']) == 1 assert json['data'][0]['id'] == str(absence_type.id)
def test_absence_balance_list_none_supervisee(auth_client): url = reverse('absence-balance-list') AbsenceTypeFactory.create() unrelated_user = UserFactory.create() result = auth_client.get(url, data={ 'user': unrelated_user.id, 'date': '2017-01-03' }) assert result.status_code == status.HTTP_200_OK assert len(result.json()['data']) == 0
def test_absence_type_delete(auth_client): absence_type = AbsenceTypeFactory.create() url = reverse('absence-type-detail', args=[absence_type.id]) response = auth_client.delete(url) assert response.status_code == status.HTTP_405_METHOD_NOT_ALLOWED
def test_absence_weekend(self): """Should not be able to create an absence on a weekend.""" type = AbsenceTypeFactory.create() data = { 'data': { 'type': 'absences', 'id': None, 'attributes': { 'date': datetime.date(2017, 5, 14).strftime('%Y-%m-%d') }, 'relationships': { 'type': { 'data': { 'type': 'absence-types', 'id': type.id } } } } } url = reverse('absence-list') res = self.client.post(url, data) assert res.status_code == HTTP_400_BAD_REQUEST
def test_absence_public_holiday(self): """Should not be able to create an absence on a public holiday.""" date = datetime.date(2017, 5, 16) type = AbsenceTypeFactory.create() PublicHolidayFactory.create(location=Employment.objects.for_user( self.user, date).location, date=date) data = { 'data': { 'type': 'absences', 'id': None, 'attributes': { 'date': date.strftime('%Y-%m-%d') }, 'relationships': { 'type': { 'data': { 'type': 'absence-types', 'id': type.id } } } } } url = reverse('absence-list') res = self.client.post(url, data) assert res.status_code == HTTP_400_BAD_REQUEST
def test_absence_credit_create_superuser(superadmin_client): absence_type = AbsenceTypeFactory.create() url = reverse('absence-credit-list') data = { 'data': { 'type': 'absence-credits', 'id': None, 'attributes': { 'date': '2017-01-01', 'duration': '01:00:00', }, 'relationships': { 'user': { 'data': { 'type': 'users', 'id': superadmin_client.user.id } }, 'absence_type': { 'data': { 'type': 'absence-types', 'id': absence_type.id } } } } } result = superadmin_client.post(url, data) assert result.status_code == status.HTTP_201_CREATED
def test_absence_create(auth_client): user = auth_client.user date = datetime.date(2017, 5, 4) EmploymentFactory.create( user=user, start_date=date, worktime_per_day=datetime.timedelta(hours=8) ) type = AbsenceTypeFactory.create() data = { "data": { "type": "absences", "id": None, "attributes": {"date": date.strftime("%Y-%m-%d")}, "relationships": { "type": {"data": {"type": "absence-types", "id": type.id}} }, } } url = reverse("absence-list") response = auth_client.post(url, data) assert response.status_code == status.HTTP_201_CREATED json = response.json() assert json["data"]["relationships"]["user"]["data"]["id"] == ( str(auth_client.user.id) )
def test_absence_public_holiday(auth_client): """Should not be able to create an absence on a public holiday.""" date = datetime.date(2017, 5, 16) user = auth_client.user type = AbsenceTypeFactory.create() employment = EmploymentFactory.create( user=user, start_date=date, worktime_per_day=datetime.timedelta(hours=8) ) PublicHolidayFactory.create(location=employment.location, date=date) data = { "data": { "type": "absences", "id": None, "attributes": {"date": date.strftime("%Y-%m-%d")}, "relationships": { "type": {"data": {"type": "absence-types", "id": type.id}} }, } } url = reverse("absence-list") response = auth_client.post(url, data) assert response.status_code == status.HTTP_400_BAD_REQUEST
def test_absence_fill_worktime_reported_time_to_long(auth_client): """ Verify absence fill worktime is zero when reported time is too long. Too long is defined when reported time is longer than worktime per day. """ date = datetime.date(2017, 5, 10) user = auth_client.user EmploymentFactory.create( user=user, start_date=date, worktime_per_day=datetime.timedelta(hours=8) ) type = AbsenceTypeFactory.create(fill_worktime=True) ReportFactory.create( user=user, date=date, duration=datetime.timedelta(hours=8, minutes=30) ) data = { "data": { "type": "absences", "id": None, "attributes": {"date": date.strftime("%Y-%m-%d")}, "relationships": { "type": {"data": {"type": "absence-types", "id": type.id}} }, } } url = reverse("absence-list") response = auth_client.post(url, data) assert response.status_code == status.HTTP_201_CREATED json = response.json() assert json["data"]["attributes"]["duration"] == "00:00:00"
def test_absence_fill_worktime(auth_client): """Should create an absence which fills the worktime.""" date = datetime.date(2017, 5, 10) user = auth_client.user EmploymentFactory.create( user=user, start_date=date, worktime_per_day=datetime.timedelta(hours=8) ) type = AbsenceTypeFactory.create(fill_worktime=True) ReportFactory.create(user=user, date=date, duration=datetime.timedelta(hours=5)) data = { "data": { "type": "absences", "id": None, "attributes": {"date": date.strftime("%Y-%m-%d")}, "relationships": { "type": {"data": {"type": "absence-types", "id": type.id}} }, } } url = reverse("absence-list") response = auth_client.post(url, data) assert response.status_code == status.HTTP_201_CREATED json = response.json() assert json["data"]["attributes"]["duration"] == "03:00:00"
def test_absence_type_detail(auth_client): absence_type = AbsenceTypeFactory.create() url = reverse('absence-type-detail', args=[absence_type.id]) response = auth_client.get(url) assert response.status_code == status.HTTP_200_OK
def test_absence_balance_detail_none_supervisee(auth_client): url = reverse('absence-balance-list') absence_type = AbsenceTypeFactory.create() unrelated_user = UserFactory.create() url = reverse( 'absence-balance-detail', args=['{0}_{1}_2017-03-01'.format(unrelated_user.id, absence_type.id)]) result = auth_client.get(url) assert result.status_code == status.HTTP_404_NOT_FOUND
def test_user_absence_types_fill_worktime(self): absence_type = AbsenceTypeFactory.create(fill_worktime=True) employment = self.user.employments.get(end_date__isnull=True) employment.worktime_per_day = timedelta(hours=5) employment.start_date = date.today() - timedelta(days=1) employment.save() ReportFactory.create( user=self.user, date=date.today(), duration=timedelta(hours=4) ) AbsenceFactory.create(date=date.today(), user=self.user, type=absence_type) AbsenceFactory.create(date=date.today() - timedelta(days=1), user=self.user, type=absence_type) url = reverse('user-detail', args=[ self.user.id ]) res = self.client.get(url, {'include': 'user_absence_types'}) assert res.status_code == HTTP_200_OK result = self.result(res) rel = result['data']['relationships'] inc = result['included'] assert len(rel['user-absence-types']['data']) == 1 assert len(inc) == 1 assert ( inc[0]['id'] == '{0}-{1}'.format(self.user.id, absence_type.id) ) assert inc[0]['attributes']['credit'] is None assert inc[0]['attributes']['balance'] is None assert inc[0]['attributes']['used-days'] is None assert inc[0]['attributes']['used-duration'] == '06:00:00'
def test_absence_balance_detail(auth_client): user = auth_client.user absence_type = AbsenceTypeFactory.create() url = reverse('absence-balance-detail', args=['{0}_{1}_2017-03-01'.format(user.id, absence_type.id)]) result = auth_client.get(url) assert result.status_code == status.HTTP_200_OK json = result.json() entry = json['data'] assert entry['attributes']['credit'] == 0 assert entry['attributes']['balance'] == 0 assert entry['attributes']['used-days'] == 0 assert entry['attributes']['used-duration'] is None
def test_absence_update_on_create_report(self): """Should update the absence after creating a new report.""" task = TaskFactory.create() type = AbsenceTypeFactory.create(fill_worktime=True) day = date(2017, 5, 3) employment = EmploymentFactory.create(user=self.user, start_date=day) absence = AbsenceFactory.create(user=self.user, date=day, type=type) Report.objects.create(user=self.user, date=day, task=task, duration=timedelta(hours=1)) assert (Absence.objects.get( pk=absence.pk).duration == employment.worktime_per_day - timedelta(hours=1))
def test_absence_balance_detail(auth_client): user = auth_client.user absence_type = AbsenceTypeFactory.create() url = reverse( "absence-balance-detail", args=["{0}_{1}_2017-03-01".format(user.id, absence_type.id)], ) result = auth_client.get(url) assert result.status_code == status.HTTP_200_OK json = result.json() entry = json["data"] assert entry["attributes"]["credit"] == 0 assert entry["attributes"]["balance"] == 0 assert entry["attributes"]["used-days"] == 0 assert entry["attributes"]["used-duration"] is None
def test_absence_balance_full_day(auth_client, django_assert_num_queries): day = date(2017, 2, 28) user = auth_client.user EmploymentFactory.create(user=user, start_date=day) absence_type = AbsenceTypeFactory.create() AbsenceCreditFactory.create(date=day, user=user, days=5, absence_type=absence_type) # credit on different user, may not show up AbsenceCreditFactory.create(date=date.today(), absence_type=absence_type) AbsenceFactory.create(date=day, user=user, type=absence_type) AbsenceFactory.create(date=day - timedelta(days=1), user=user, type=absence_type) url = reverse('absence-balance-list') with django_assert_num_queries(7): result = auth_client.get(url, data={ 'date': '2017-03-01', 'user': user.id, 'include': 'absence_credits,absence_type' }) assert result.status_code == status.HTTP_200_OK json = result.json() assert len(json['data']) == 1 entry = json['data'][0] assert (entry['id'] == '{0}_{1}_2017-03-01'.format(user.id, absence_type.id)) assert entry['attributes']['credit'] == 5 assert entry['attributes']['used-days'] == 2 assert entry['attributes']['used-duration'] is None assert entry['attributes']['balance'] == 3 assert len(json['included']) == 2
def test_absence_create_unemployed(auth_client): """Test creation of absence fails on unemployed day.""" type = AbsenceTypeFactory.create() data = { "data": { "type": "absences", "id": None, "attributes": {"date": "2017-05-16"}, "relationships": { "type": {"data": {"type": "absence-types", "id": type.id}} }, } } url = reverse("absence-list") response = auth_client.post(url, data) assert response.status_code == status.HTTP_400_BAD_REQUEST
def test_absence_fill_worktime(self): """Should create an absence which fills the worktime.""" date = datetime.date(2017, 5, 10) type = AbsenceTypeFactory.create(fill_worktime=True) employment = Employment.objects.for_user(self.user, date) employment.worktime_per_day = datetime.timedelta(hours=8) employment.save() ReportFactory.create( user=self.user, date=date, duration=datetime.timedelta(hours=5) ) data = { 'data': { 'type': 'absences', 'id': None, 'attributes': { 'date': date.strftime('%Y-%m-%d') }, 'relationships': { 'type': { 'data': { 'type': 'absence-types', 'id': type.id } } } } } url = reverse('absence-list') res = self.client.post(url, data) assert res.status_code == HTTP_201_CREATED result = self.result(res) assert result['data']['attributes']['duration'] == '03:00:00'
def test_user_absence_types(self): absence_type = AbsenceTypeFactory.create() credit = AbsenceCreditFactory.create(date=date.today(), user=self.user, days=5, absence_type=absence_type) AbsenceFactory.create(date=date.today(), user=self.user, type=absence_type) AbsenceFactory.create(date=date.today() - timedelta(days=1), user=self.user, type=absence_type) url = reverse('user-detail', args=[ self.user.id ]) res = self.client.get(url, {'include': 'user_absence_types'}) assert res.status_code == HTTP_200_OK result = self.result(res) rel = result['data']['relationships'] inc = result['included'] assert len(rel['user-absence-types']['data']) == 1 assert len(inc) == 1 assert ( inc[0]['id'] == '{0}-{1}'.format(self.user.id, credit.absence_type.id) ) assert inc[0]['attributes']['credit'] == 5 assert inc[0]['attributes']['balance'] == 3 assert inc[0]['attributes']['used-days'] == 2 assert inc[0]['attributes']['used-duration'] is None
def test_absence_balance_fill_worktime(auth_client, django_assert_num_queries): day = date(2017, 2, 28) user = UserFactory.create() user.supervisors.add(auth_client.user) EmploymentFactory.create(user=user, start_date=day, worktime_per_day=timedelta(hours=5)) absence_type = AbsenceTypeFactory.create(fill_worktime=True) ReportFactory.create(user=user, date=day + timedelta(days=1), duration=timedelta(hours=4)) AbsenceFactory.create(date=day + timedelta(days=1), user=user, type=absence_type) AbsenceFactory.create(date=day, user=user, type=absence_type) url = reverse('absence-balance-list') with django_assert_num_queries(12): result = auth_client.get(url, data={ 'date': '2017-03-01', 'user': user.id, 'include': 'absence_credits,absence_type' }) assert result.status_code == status.HTTP_200_OK json = result.json() assert len(json['data']) == 1 entry = json['data'][0] assert (entry['id'] == '{0}_{1}_2017-03-01'.format(user.id, absence_type.id)) assert entry['attributes']['credit'] is None assert entry['attributes']['balance'] is None assert entry['attributes']['used-days'] is None assert entry['attributes']['used-duration'] == '06:00:00'
def test_absence_credit_create_superuser(superadmin_client): absence_type = AbsenceTypeFactory.create() url = reverse("absence-credit-list") data = { "data": { "type": "absence-credits", "id": None, "attributes": {"date": "2017-01-01", "duration": "01:00:00"}, "relationships": { "user": {"data": {"type": "users", "id": superadmin_client.user.id}}, "absence_type": { "data": {"type": "absence-types", "id": absence_type.id} }, }, } } result = superadmin_client.post(url, data) assert result.status_code == status.HTTP_201_CREATED
def test_absence_balance_fill_worktime(auth_client, django_assert_num_queries): day = date(2017, 2, 28) user = UserFactory.create() user.supervisors.add(auth_client.user) EmploymentFactory.create( user=user, start_date=day, worktime_per_day=timedelta(hours=5) ) absence_type = AbsenceTypeFactory.create(fill_worktime=True) ReportFactory.create( user=user, date=day + timedelta(days=1), duration=timedelta(hours=4) ) AbsenceFactory.create(date=day + timedelta(days=1), user=user, type=absence_type) AbsenceFactory.create(date=day, user=user, type=absence_type) url = reverse("absence-balance-list") with django_assert_num_queries(11): result = auth_client.get( url, data={ "date": "2017-03-01", "user": user.id, "include": "absence_credits,absence_type", }, ) assert result.status_code == status.HTTP_200_OK json = result.json() assert len(json["data"]) == 1 entry = json["data"][0] assert entry["id"] == "{0}_{1}_2017-03-01".format(user.id, absence_type.id) assert entry["attributes"]["credit"] is None assert entry["attributes"]["balance"] is None assert entry["attributes"]["used-days"] is None assert entry["attributes"]["used-duration"] == "06:00:00"
def test_absence_balance_full_day(auth_client, django_assert_num_queries): day = date(2017, 2, 28) user = auth_client.user EmploymentFactory.create(user=user, start_date=day) absence_type = AbsenceTypeFactory.create() AbsenceCreditFactory.create(date=day, user=user, days=5, absence_type=absence_type) # credit on different user, may not show up AbsenceCreditFactory.create(date=date.today(), absence_type=absence_type) AbsenceFactory.create(date=day, user=user, type=absence_type) AbsenceFactory.create(date=day - timedelta(days=1), user=user, type=absence_type) url = reverse("absence-balance-list") with django_assert_num_queries(6): result = auth_client.get( url, data={ "date": "2017-03-01", "user": user.id, "include": "absence_credits,absence_type", }, ) assert result.status_code == status.HTTP_200_OK json = result.json() assert len(json["data"]) == 1 entry = json["data"][0] assert entry["id"] == "{0}_{1}_2017-03-01".format(user.id, absence_type.id) assert entry["attributes"]["credit"] == 5 assert entry["attributes"]["used-days"] == 2 assert entry["attributes"]["used-duration"] is None assert entry["attributes"]["balance"] == 3 assert len(json["included"]) == 2
def test_absence_create(self): """Should create a new absence.""" type = AbsenceTypeFactory.create() data = { 'data': { 'type': 'absences', 'id': None, 'attributes': { 'date': datetime.date(2017, 5, 4).strftime('%Y-%m-%d') }, 'relationships': { 'type': { 'data': { 'type': 'absence-types', 'id': type.id } } } } } url = reverse('absence-list') noauth_res = self.noauth_client.post(url, data) res = self.client.post(url, data) assert noauth_res.status_code == HTTP_401_UNAUTHORIZED assert res.status_code == HTTP_201_CREATED result = self.result(res) assert not result['data']['id'] is None assert ( int(result['data']['relationships']['user']['data']['id']) == int(self.user.id) )
def test_absence_update_superadmin_type(superadmin_client): """Test that superadmin may not change type of absence.""" user = UserFactory.create() date = datetime.date(2017, 5, 3) type = AbsenceTypeFactory.create() absence = AbsenceFactory.create(user=user, date=datetime.date(2016, 5, 3)) EmploymentFactory.create( user=user, start_date=date, worktime_per_day=datetime.timedelta(hours=8) ) data = { "data": { "type": "absences", "id": absence.id, "relationships": { "type": {"data": {"type": "absence-types", "id": type.id}} }, } } url = reverse("absence-detail", args=[absence.id]) response = superadmin_client.patch(url, data) assert response.status_code == status.HTTP_400_BAD_REQUEST
def setUp(self): """Set the environment for the tests up.""" super().setUp() self.absence_types = AbsenceTypeFactory.create_batch(5)