コード例 #1
0
ファイル: test_user.py プロジェクト: LadyJaz/timed-backend
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'
コード例 #2
0
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
コード例 #3
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
コード例 #4
0
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)
コード例 #5
0
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
コード例 #6
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
コード例 #7
0
    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
コード例 #8
0
    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
コード例 #9
0
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
コード例 #10
0
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)
    )
コード例 #11
0
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
コード例 #12
0
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"
コード例 #13
0
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"
コード例 #14
0
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
コード例 #15
0
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
コード例 #16
0
ファイル: test_user.py プロジェクト: hairmare/timed-backend
    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'
コード例 #17
0
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
コード例 #18
0
    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))
コード例 #19
0
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
コード例 #20
0
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
コード例 #21
0
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
コード例 #22
0
    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'
コード例 #23
0
ファイル: test_user.py プロジェクト: hairmare/timed-backend
    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
コード例 #24
0
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'
コード例 #25
0
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
コード例 #26
0
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"
コード例 #27
0
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
コード例 #28
0
    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)
        )
コード例 #29
0
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
コード例 #30
0
    def setUp(self):
        """Set the environment for the tests up."""
        super().setUp()

        self.absence_types = AbsenceTypeFactory.create_batch(5)