Exemplo n.º 1
0
 def test_get_serializer_class__staff_user_allow_to_modify_all_fields(self):
     assessment = AssessmentFactory(status=STATUS.new,
                                    start_date=Day().date,
                                    end_date=Day().date)
     self.client.force_authenticate(self.staff_user)
     user, decision_by = UserFactory(), UserFactory()
     data = {
         'user': {
             'id': user.id
         },
         'decision_by': {
             'id': decision_by.id
         },
         'status': STATUS.completed,
         'start_date': Day(ago=15).date,
         'end_date': Day(ago=10).date,
         'plan': self.fake.text(),
         'comments': self.fake.text(),
         'notes': self.fake.text(),
     }
     response = self.client.patch(self.get_detail_url(assessment.id),
                                  data=data)
     assessment.refresh_from_db()
     assert assessment.user.id == data['user']['id']
     assert assessment.decision_by.id == data['decision_by']['id']
     assert response.data['user']['id'] == data['user']['id']
     assert response.data['decision_by']['id'] == data['decision_by']['id']
     data.pop('user'), data.pop('decision_by')
     for field in data.keys():
         assert response.data[field] == (format(data[field]) if isinstance(
             data[field], date) else data[field])
         assert getattr(assessment, field) == data[field]
Exemplo n.º 2
0
 def test__read_only_fields(self):
     absence = AbsenceFactory(status=STATUS.new,
                              reason=REASON.illness,
                              start_date=Day().date,
                              end_date=Day().date)
     user, decision_by = UserFactory(), UserFactory()
     data = {
         'user': {
             'id': user.id
         },
         'decision_by': {
             'id': decision_by.id
         },
         'status': STATUS.verifying,
         'reason': REASON.other,
         'start_date': Day(ago=5).date,
         'end_date': Day(ago=4).date,
         'notes': 'Test notes',
     }
     serializer = AbsenceSerializer(absence, data=data)
     assert serializer.is_valid()
     absence = serializer.save()
     assert absence.user.id == data['user']['id']
     assert absence.decision_by.id != data['decision_by']['id']
     data.pop('user'), data.pop('decision_by'), data.pop('notes')
     for field in data.keys():
         assert getattr(absence, field) == data[field]
Exemplo n.º 3
0
 def test_get_serializer_class_non_staff_user_allow_to_modify_non_read_only_fields(
         self):
     assessment = AssessmentFactory(user=self.simple_user,
                                    start_date=Day().date,
                                    end_date=Day().date)
     self.client.force_authenticate(self.simple_user)
     user, decision_by = UserFactory(), UserFactory()
     data = {
         'user': {
             'id': user.id
         },
         'decision_by': {
             'id': decision_by.id
         },
         'status': STATUS.completed,
         'start_date': Day(ago=15).date,
         'end_date': Day(ago=10).date,
         'plan': self.fake.text(),
         'comments': self.fake.text(),
         'notes': self.fake.text(),
     }
     response = self.client.patch(self.get_detail_url(assessment.id),
                                  data=data)
     assert response.status_code == HTTP_403_FORBIDDEN
     assessment.refresh_from_db()
     assert assessment.user.id != data['user']['id']
     assert assessment.decision_by.id != data['decision_by']['id']
     data.pop('user'), data.pop('decision_by')
     for field in data.keys():
         assert getattr(assessment, field) != data[field]
Exemplo n.º 4
0
 def setUp(self):
     self.staff_user = StaffUserFactory()
     self.simple_user = UserFactory()
     self.skill = Skill.objects.create(name='python')
     self.staff_user2 = StaffUserFactory()
     self.simple_user2 = UserFactory()
     UserSkillModel.objects.create(user=self.staff_user2, skill=self.skill)
     UserSkillModel.objects.create(user=self.simple_user2, skill=self.skill)
Exemplo n.º 5
0
 def setUp(self):
     self.staff_user = StaffUserFactory()
     self.simple_user = UserFactory()
     from ssm.skills.models import Skill
     self.skill1 = Skill.objects.create(name='python')
     self.skill2 = Skill.objects.create(name='golang')
     Skill.objects.create(name='postgresql')
     Skill.objects.create(name='mysql')
     Skill.objects.create(name='mongodb')
     Skill.objects.create(name='aws')
     Skill.objects.create(name='gcloud')
Exemplo n.º 6
0
class UserTestCase(TestCase):
    def setUp(self):
        self.user = UserFactory(email='*****@*****.**',
                                full_name='Ethan Elliott')

    def test_str(self):
        assert str(
            self.user) == f'{self.user.get_full_name()} (user {self.user.id})'

    def test_create(self):
        user = User.objects.create(email='*****@*****.**',
                                   full_name='Aryan Barber')
        assert user.id
        assert user.is_active
        assert not user.is_staff
        assert not user.is_superuser
        assert user.email == '*****@*****.**'
        assert user.full_name == 'Aryan Barber'

    def test_is_birthday__true(self):
        self.user.date_of_birth = today()
        assert self.user.is_birthday()

    def test_is_birthday__false__already_notified(self):
        self.user.date_of_birth = today()
        self.user.birthday_notification = today()
        assert not self.user.is_birthday()

    def test_is_birthday__false_5_days_ago(self):
        self.user.date_of_birth = Day(ago=5).date
        assert not self.user.is_birthday()

    def test_is_birthday__false_5_days_ahead(self):
        self.user.date_of_birth = Day(ago=-5).date
        assert not self.user.is_birthday()

    def test_notify__birthday(self):
        self.user.notify(BIRTHDAY)
        assert len(mail.outbox) == 1
        assert mail.outbox[0].subject == settings.BIRTHDAY_SUBJECT
        assert mail.outbox[0].body == settings.BIRTHDAY_MESSAGE

    def test_notify__assessment(self):
        self.user.notify(ASSESSMENT)
        assert len(mail.outbox) == 1
        assert mail.outbox[0].subject == settings.ASSESSMENT_SUBJECT
        assert mail.outbox[0].body == settings.ASSESSMENT_MESSAGE

    def test_notify__unknown_notification(self):
        with pytest.raises(Exception):
            self.user.notify('unknown')
Exemplo n.º 7
0
 def test_get_serializer_class__staff_user_allow_to_modify_all_fields(self):
     user = UserFactory()
     self.client.force_authenticate(self.staff_user)
     data = {
         'email': '*****@*****.**',
         'is_staff': True,
         'has_card': True,
         'has_key': True
     }
     response = self.client.patch(self.get_detail_url(user.id), data=data)
     user.refresh_from_db()
     for field in data.keys():
         assert response.data[field] == data[field]
         assert getattr(user, field) == data[field]
Exemplo n.º 8
0
    def test_permission_classes__staff_allow_to_use_any_rest_method(self):
        self.client.force_authenticate(self.staff_user)

        # POST
        assert User.objects.count() == 2
        data = {
            'email': self.fake.email(),
            'password': self.fake.password(),
            'skills': []
        }
        response = self.client.post(self.get_list_url(), data=data)
        assert response.status_code == HTTP_201_CREATED
        assert User.objects.count() == 3
        user = User.objects.get(email=data['email'])
        self.assert_fields(user, data, self.staff_user)

        # GET(id)
        response = self.client.get(self.get_detail_url(response.data['id']))
        assert response.status_code == HTTP_200_OK
        assert response.data['email'] == data['email']
        serializer = StaffUserWithSkillsSerializer(user)
        assert response.data == serializer.data

        # PATCH
        data = {'skype': self.fake.user_name()}
        response = self.client.patch(self.get_detail_url(response.data['id']),
                                     data=data)
        user.refresh_from_db()
        assert response.status_code == HTTP_200_OK
        assert response.data['skype'] == data['skype']
        assert user.skype == data['skype']

        # PUT
        data = {**response.data, **{'skype': self.fake.user_name()}}
        response = self.client.put(self.get_detail_url(response.data['id']),
                                   data=data)
        user.refresh_from_db()
        assert response.status_code == HTTP_200_OK
        assert response.data['skype'] == data['skype']
        assert user.skype == data['skype']

        # DELETE
        assert User.objects.count() == 3
        response = self.client.delete(self.get_detail_url(response.data['id']))
        assert response.status_code == HTTP_204_NO_CONTENT
        assert User.objects.count() == 2

        # GET(all)
        [
            UserFactory(email=email)
            for email in [self.fake.email, self.fake.email()]
        ]
        users = User.objects.all()
        response = self.client.get(self.get_list_url())
        assert response.status_code == HTTP_200_OK
        assert len(response.data['results']) == 4
        serializer = StaffUserWithSkillsSerializer(users, many=True)
        assert response.data['results'] == serializer.data
        assert set(entity['id'] for entity in response.data['results']) == set(
            entity.id for entity in users)
Exemplo n.º 9
0
    def test_permission_classes__non_staff_allow_to_use_subset_of_rest_api_methods(
            self):
        self.client.force_authenticate(self.simple_user)

        # POST
        assert User.objects.count() == 2
        data = {
            'email': self.fake.email(),
            'password': self.fake.password(),
            'skills': []
        }
        response = self.client.post(self.get_list_url(), data=data)
        assert response.status_code == HTTP_403_FORBIDDEN
        assert User.objects.count() == 2

        # GET(id)
        response = self.client.get(self.get_detail_url(self.simple_user.id))
        assert response.status_code == HTTP_200_OK
        serializer = UserWithSkillsSerializer(self.simple_user)
        assert response.data == serializer.data

        # PATCH
        data = {'skype': self.fake.user_name()}
        response = self.client.patch(self.get_detail_url(self.simple_user.id),
                                     data=data)
        self.simple_user.refresh_from_db()
        assert response.status_code == HTTP_200_OK
        assert response.data['skype'] == data['skype']
        assert self.simple_user.skype == data['skype']

        # PUT
        data = {**response.data, **{'skype': self.fake.user_name()}}
        response = self.client.put(self.get_detail_url(self.simple_user.id),
                                   data=data)
        self.simple_user.refresh_from_db()
        assert response.status_code == HTTP_403_FORBIDDEN
        assert self.simple_user.skype != data['skype']

        # DELETE
        response = self.client.delete(self.get_detail_url(self.simple_user.id))
        assert response.status_code == HTTP_403_FORBIDDEN
        assert User.objects.count() == 2

        # GET(all)
        [
            UserFactory(email=email)
            for email in [self.fake.email(),
                          self.fake.email()]
        ]
        users = User.objects.filter(email=self.simple_user.email)
        response = self.client.get(self.get_list_url())
        assert response.status_code == HTTP_200_OK
        assert len(response.data['results']) == 1
        serializer = UserWithSkillsSerializer(users, many=True)
        assert response.data['results'] == serializer.data
        assert set(entity['id'] for entity in response.data['results']) == set(
            entity.id for entity in users)
Exemplo n.º 10
0
 def setUp(self):
     self.staff_user = StaffUserFactory()
     self.simple_user = UserFactory()
     MembersModel.objects.create(user=self.staff_user,
                                 project=self.project1,
                                 joined_date=today())
     MembersModel.objects.create(user=self.simple_user,
                                 project=self.project1,
                                 joined_date=today())
     MembersModel.objects.create(user=self.simple_user,
                                 project=self.project2,
                                 joined_date=today())
Exemplo n.º 11
0
 def test__read_only_fields(self):
     assessment = AssessmentFactory(status=STATUS.new, start_date=Day().date, end_date=Day().date)
     user, decision_by = UserFactory(), UserFactory()
     data = {
         'user': {'id': user.id},
         'decision_by': {'id': decision_by.id},
         'status': STATUS.in_progress,
         'start_date': Day(ago=5).date,
         'end_date': Day(ago=5).date,
         'plan': 'Test plan',
         'comments': 'Test comments',
         'notes': 'Test notes',
     }
     serializer = AssessmentSerializer(assessment, data=data)
     assert serializer.is_valid()
     assessment = serializer.save()
     assert assessment.user.id != data['user']['id']
     assert assessment.decision_by.id != data['user']['id']
     data.pop('user'), data.pop('decision_by')
     for field in data.keys():
         assert getattr(assessment, field) != data[field]
Exemplo n.º 12
0
 def test_get_serializer_class_non_staff_user_allow_to_modify_non_read_only_fields(self):
     data = {
         'user': self.simple_user,
         'status': STATUS.new,
         'reason': REASON.illness,
         'start_date': Day().date,
         'end_date': Day().date,
     }
     absence = AbsenceFactory(**data)
     self.client.force_authenticate(self.simple_user)
     user, decision_by = UserFactory(), UserFactory()
     data = {
         'user': {'id': user.id},
         'decision_by': {'id': decision_by.id},
         'status': STATUS.verifying,
         'reason': REASON.other,
         'start_date': Day(ago=5).date,
         'end_date': Day(ago=4).date,
         'notes': self.fake.text(),
     }
     response = self.client.patch(self.get_detail_url(absence.id), data=data)
     assert response.status_code == HTTP_403_FORBIDDEN
     absence.refresh_from_db()
     assert absence.user.id != data['user']['id']
     assert absence.decision_by.id != data['decision_by']['id']
     data.pop('user'), data.pop('decision_by')
     for field in data.keys():
         assert getattr(absence, field) != data[field]
     data = {
         'status': STATUS.verifying,
         'reason': REASON.other,
         'start_date': Day(ago=5).date,
         'end_date': Day(ago=4).date,
     }
     response = self.client.patch(self.get_detail_url(absence.id), data=data)
     assert response.status_code == HTTP_200_OK
     absence.refresh_from_db()
     for field in data.keys():
         assert getattr(absence, field) == data[field]
Exemplo n.º 13
0
 def test_get_serializer_class__staff_user_allow_to_modify_all_fields(self):
     absence = AbsenceFactory(status=STATUS.new, reason=REASON.illness, start_date=Day().date, end_date=Day().date)
     self.client.force_authenticate(self.staff_user)
     user, decision_by = UserFactory(), UserFactory()
     data = {
         'user': {'id': user.id},
         'decision_by': {'id': decision_by.id},
         'status': STATUS.verifying,
         'reason': REASON.other,
         'start_date': Day(ago=5).date,
         'end_date': Day(ago=4).date,
         'notes': self.fake.text(),
     }
     response = self.client.patch(self.get_detail_url(absence.id), data=data)
     absence.refresh_from_db()
     assert absence.user.id == data['user']['id']
     assert absence.decision_by.id == data['decision_by']['id']
     assert response.data['user']['id'] == data['user']['id']
     assert response.data['decision_by']['id'] == data['decision_by']['id']
     data.pop('user'), data.pop('decision_by')
     for field in data.keys():
         assert response.data[field] == (format(data[field]) if isinstance(data[field], date) else data[field])
         assert getattr(absence, field) == data[field]
Exemplo n.º 14
0
    def test_permission_classes__non_staff_allows_to_access_and_modify_only_his_data(
            self):
        self.client.force_authenticate(self.simple_user)

        # POST
        assert User.objects.count() == 2
        data = {
            'email': self.fake.email(),
            'password': self.fake.password(),
            'skills': []
        }
        response = self.client.post(self.get_list_url(), data=data)
        assert response.status_code == HTTP_403_FORBIDDEN
        assert User.objects.count() == 2

        # GET(id)
        response = self.client.get(self.get_detail_url(self.staff_user.id))
        assert response.status_code == HTTP_404_NOT_FOUND

        # PATCH
        data = {'skype': self.fake.user_name()}
        response = self.client.patch(self.get_detail_url(self.staff_user.id),
                                     data=data)
        assert response.status_code == HTTP_404_NOT_FOUND

        # DELETE
        response = self.client.delete(self.get_detail_url(self.staff_user.id))
        assert response.status_code == HTTP_403_FORBIDDEN

        # GET(all)
        [
            UserFactory(email=email)
            for email in [self.fake.email(),
                          self.fake.email()]
        ]
        users = User.objects.filter(email=self.simple_user.email)
        response = self.client.get(self.get_list_url())
        assert response.status_code == HTTP_200_OK
        assert len(response.data['results']) == 1
        assert User.objects.count() == 4
        serializer = UserWithSkillsSerializer(users, many=True)
        assert response.data['results'] == serializer.data
Exemplo n.º 15
0
 def setUp(self):
     self.staff_user = StaffUserFactory()
     self.simple_user = UserFactory()
Exemplo n.º 16
0
 def setUp(self):
     self.staff_user = StaffUserFactory()
     self.simple_user = UserFactory()
     UserSkillModel.objects.create(user=self.staff_user, skill=self.skill1)
     UserSkillModel.objects.create(user=self.simple_user, skill=self.skill1)
Exemplo n.º 17
0
 def setUpTestData(cls):
     cls.staff_user = StaffUserFactory()
     cls.simple_user = UserFactory()
     super().setUpTestData()
Exemplo n.º 18
0
class UserViewSetTestCase(BaseTestCase):
    list_url = 'user-list'
    detail_url = 'user-detail'

    def setUp(self):
        self.staff_user = StaffUserFactory()
        self.simple_user = UserFactory()
        from ssm.skills.models import Skill
        self.skill1 = Skill.objects.create(name='python')
        self.skill2 = Skill.objects.create(name='golang')
        Skill.objects.create(name='postgresql')
        Skill.objects.create(name='mysql')
        Skill.objects.create(name='mongodb')
        Skill.objects.create(name='aws')
        Skill.objects.create(name='gcloud')

    def test_permission_classes__only_is_authenticated_user_allows_access(
            self):
        response = self.client.get(self.get_list_url())
        assert response.status_code == HTTP_401_UNAUTHORIZED
        self.client.force_authenticate(self.staff_user)
        response = self.client.get(self.get_list_url())
        assert response.status_code == HTTP_200_OK
        assert len(response.data['results']) == 2

    def test_permission_classes__staff_allow_to_use_any_rest_method(self):
        self.client.force_authenticate(self.staff_user)

        # POST
        assert User.objects.count() == 2
        data = {
            'email': self.fake.email(),
            'password': self.fake.password(),
            'skills': []
        }
        response = self.client.post(self.get_list_url(), data=data)
        assert response.status_code == HTTP_201_CREATED
        assert User.objects.count() == 3
        user = User.objects.get(email=data['email'])
        self.assert_fields(user, data, self.staff_user)

        # GET(id)
        response = self.client.get(self.get_detail_url(response.data['id']))
        assert response.status_code == HTTP_200_OK
        assert response.data['email'] == data['email']
        serializer = StaffUserWithSkillsSerializer(user)
        assert response.data == serializer.data

        # PATCH
        data = {'skype': self.fake.user_name()}
        response = self.client.patch(self.get_detail_url(response.data['id']),
                                     data=data)
        user.refresh_from_db()
        assert response.status_code == HTTP_200_OK
        assert response.data['skype'] == data['skype']
        assert user.skype == data['skype']

        # PUT
        data = {**response.data, **{'skype': self.fake.user_name()}}
        response = self.client.put(self.get_detail_url(response.data['id']),
                                   data=data)
        user.refresh_from_db()
        assert response.status_code == HTTP_200_OK
        assert response.data['skype'] == data['skype']
        assert user.skype == data['skype']

        # DELETE
        assert User.objects.count() == 3
        response = self.client.delete(self.get_detail_url(response.data['id']))
        assert response.status_code == HTTP_204_NO_CONTENT
        assert User.objects.count() == 2

        # GET(all)
        [
            UserFactory(email=email)
            for email in [self.fake.email, self.fake.email()]
        ]
        users = User.objects.all()
        response = self.client.get(self.get_list_url())
        assert response.status_code == HTTP_200_OK
        assert len(response.data['results']) == 4
        serializer = StaffUserWithSkillsSerializer(users, many=True)
        assert response.data['results'] == serializer.data
        assert set(entity['id'] for entity in response.data['results']) == set(
            entity.id for entity in users)

    def test_permission_classes__non_staff_allow_to_use_subset_of_rest_api_methods(
            self):
        self.client.force_authenticate(self.simple_user)

        # POST
        assert User.objects.count() == 2
        data = {
            'email': self.fake.email(),
            'password': self.fake.password(),
            'skills': []
        }
        response = self.client.post(self.get_list_url(), data=data)
        assert response.status_code == HTTP_403_FORBIDDEN
        assert User.objects.count() == 2

        # GET(id)
        response = self.client.get(self.get_detail_url(self.simple_user.id))
        assert response.status_code == HTTP_200_OK
        serializer = UserWithSkillsSerializer(self.simple_user)
        assert response.data == serializer.data

        # PATCH
        data = {'skype': self.fake.user_name()}
        response = self.client.patch(self.get_detail_url(self.simple_user.id),
                                     data=data)
        self.simple_user.refresh_from_db()
        assert response.status_code == HTTP_200_OK
        assert response.data['skype'] == data['skype']
        assert self.simple_user.skype == data['skype']

        # PUT
        data = {**response.data, **{'skype': self.fake.user_name()}}
        response = self.client.put(self.get_detail_url(self.simple_user.id),
                                   data=data)
        self.simple_user.refresh_from_db()
        assert response.status_code == HTTP_403_FORBIDDEN
        assert self.simple_user.skype != data['skype']

        # DELETE
        response = self.client.delete(self.get_detail_url(self.simple_user.id))
        assert response.status_code == HTTP_403_FORBIDDEN
        assert User.objects.count() == 2

        # GET(all)
        [
            UserFactory(email=email)
            for email in [self.fake.email(),
                          self.fake.email()]
        ]
        users = User.objects.filter(email=self.simple_user.email)
        response = self.client.get(self.get_list_url())
        assert response.status_code == HTTP_200_OK
        assert len(response.data['results']) == 1
        serializer = UserWithSkillsSerializer(users, many=True)
        assert response.data['results'] == serializer.data
        assert set(entity['id'] for entity in response.data['results']) == set(
            entity.id for entity in users)

    def test_permission_classes__staff_allows_to_access_and_modify_any_other_users_data(
            self):
        self.client.force_authenticate(self.staff_user)

        # POST
        assert User.objects.count() == 2
        data = {
            'email': self.fake.email(),
            'password': self.fake.password(),
            'skills': []
        }
        response = self.client.post(self.get_list_url(), data=data)
        assert response.status_code == HTTP_201_CREATED
        assert response.data['email'] == data['email']
        user = User.objects.get(email=data['email'])
        self.assert_fields(user, data, self.simple_user)

        # GET(id)
        response = self.client.get(self.get_detail_url(response.data['id']))
        assert response.status_code == HTTP_200_OK
        serializer = StaffUserWithSkillsSerializer(user)
        assert response.data == serializer.data

        # PATCH
        data = {'skype': self.fake.user_name()}
        response = self.client.patch(self.get_detail_url(response.data['id']),
                                     data=data)
        user.refresh_from_db()
        assert response.status_code == HTTP_200_OK
        assert response.data['skype'] == data['skype']
        assert user.skype == data['skype']

        # PUT
        data = {**response.data, **{'skype': self.fake.user_name()}}
        response = self.client.put(self.get_detail_url(response.data['id']),
                                   data=data)
        user.refresh_from_db()
        assert response.status_code == HTTP_200_OK
        assert response.data['skype'] == data['skype']
        assert user.skype == data['skype']

        # DELETE
        assert User.objects.count() == 3
        response = self.client.delete(self.get_detail_url(response.data['id']))
        assert response.status_code == HTTP_204_NO_CONTENT
        assert User.objects.count() == 2

        # GET(all)
        [
            UserFactory(email=email)
            for email in [self.fake.email(),
                          self.fake.email()]
        ]
        users = User.objects.all()
        response = self.client.get(self.get_list_url())
        assert response.status_code == HTTP_200_OK
        assert len(response.data['results']) == 4
        serializer = StaffUserWithSkillsSerializer(users, many=True)
        assert response.data['results'] == serializer.data
        assert set(entity['id'] for entity in response.data['results']) == set(
            entity.id for entity in users)

    def test_permission_classes__non_staff_allows_to_access_and_modify_only_his_data(
            self):
        self.client.force_authenticate(self.simple_user)

        # POST
        assert User.objects.count() == 2
        data = {
            'email': self.fake.email(),
            'password': self.fake.password(),
            'skills': []
        }
        response = self.client.post(self.get_list_url(), data=data)
        assert response.status_code == HTTP_403_FORBIDDEN
        assert User.objects.count() == 2

        # GET(id)
        response = self.client.get(self.get_detail_url(self.staff_user.id))
        assert response.status_code == HTTP_404_NOT_FOUND

        # PATCH
        data = {'skype': self.fake.user_name()}
        response = self.client.patch(self.get_detail_url(self.staff_user.id),
                                     data=data)
        assert response.status_code == HTTP_404_NOT_FOUND

        # DELETE
        response = self.client.delete(self.get_detail_url(self.staff_user.id))
        assert response.status_code == HTTP_403_FORBIDDEN

        # GET(all)
        [
            UserFactory(email=email)
            for email in [self.fake.email(),
                          self.fake.email()]
        ]
        users = User.objects.filter(email=self.simple_user.email)
        response = self.client.get(self.get_list_url())
        assert response.status_code == HTTP_200_OK
        assert len(response.data['results']) == 1
        assert User.objects.count() == 4
        serializer = UserWithSkillsSerializer(users, many=True)
        assert response.data['results'] == serializer.data

    def test_get_serializer_class__staff_user_serializer(self):
        self.client.force_authenticate(self.staff_user)
        response = self.client.get(self.get_detail_url(self.staff_user.id))
        serializer = StaffUserWithSkillsSerializer(self.staff_user)
        assert response.status_code == HTTP_200_OK
        assert response.data == serializer.data

    def test_get_serializer_class__user_serializer(self):
        self.client.force_authenticate(self.simple_user)
        response = self.client.get(self.get_detail_url(self.simple_user.id))
        serializer = UserWithSkillsSerializer(self.simple_user)
        assert response.status_code == HTTP_200_OK
        assert response.data == serializer.data

    def test_get_serializer_class__staff_user_allow_to_modify_all_fields(self):
        user = UserFactory()
        self.client.force_authenticate(self.staff_user)
        data = {
            'email': '*****@*****.**',
            'is_staff': True,
            'has_card': True,
            'has_key': True
        }
        response = self.client.patch(self.get_detail_url(user.id), data=data)
        user.refresh_from_db()
        for field in data.keys():
            assert response.data[field] == data[field]
            assert getattr(user, field) == data[field]

    def test_get_serializer_class__non_staff_user_allow_to_modify_non_read_only_fields(
            self):
        self.client.force_authenticate(self.simple_user)
        data = {
            'email': '*****@*****.**',
            'is_staff': True,
            'has_card': True,
            'has_key': True
        }
        response = self.client.patch(self.get_detail_url(self.simple_user.id),
                                     data=data)
        assert response.status_code == HTTP_200_OK
        self.simple_user.refresh_from_db()
        for field in data.keys():
            assert getattr(self.simple_user, field) != data[field]
        data = {
            'full_name': self.fake.name(),
            'date_of_birth': self.fake.date_of_birth(),
            'education': self.fake.hostname(),
            'phone_number': self.fake.phone_number(),
            'phone_number2': self.fake.phone_number(),
            'skype': self.fake.user_name(),
        }
        response = self.client.patch(self.get_detail_url(self.simple_user.id),
                                     data=data)
        assert response.status_code == HTTP_200_OK
        self.simple_user.refresh_from_db()
        for field in data.keys():
            assert getattr(self.simple_user, field) == data[field]

    def test_get_serializer_class__staff_request__without_skills(self):
        self.client.force_authenticate(self.staff_user)
        response = self.client.get(self.get_list_url(), {'skills': False})
        assert response.status_code == HTTP_200_OK
        assert len(response.data['results']) == 2
        assert all('skills' not in value for value in response.data['results'])
        response = self.client.get(self.get_list_url(), {'skills': 'false'})
        assert response.status_code == HTTP_200_OK
        assert len(response.data['results']) == 2
        assert all('skills' not in value for value in response.data['results'])
        response = self.client.get(self.get_list_url(), {'skills': 0})
        assert response.status_code == HTTP_200_OK
        assert len(response.data['results']) == 2
        assert all('skills' not in value for value in response.data['results'])

    def test_get_serializer_class__staff_request__with_skills(self):
        from ssm.skills.models import UserSkillModel
        UserSkillModel.objects.create(user=self.staff_user, skill=self.skill1)
        UserSkillModel.objects.create(user=self.simple_user, skill=self.skill2)
        self.client.force_authenticate(self.staff_user)
        response = self.client.get(self.get_list_url())
        assert len(response.data['results']) == 2
        assert all('skills' in value for value in response.data['results'])
        assert any(
            len(value['skills']) == 1 for value in response.data['results'])
        response = self.client.get(self.get_list_url(), {'skills': True})
        assert len(response.data['results']) == 2
        assert all('skills' in value for value in response.data['results'])
        assert any(
            len(value['skills']) == 1 for value in response.data['results'])

    def test_get_serializer_class__non_staff_request__without_skills(self):
        self.client.force_authenticate(self.simple_user)
        response = self.client.get(self.get_list_url(), {'skills': False})
        assert response.status_code == HTTP_200_OK
        assert len(response.data['results']) == 1
        assert all('skills' not in value for value in response.data['results'])
        response = self.client.get(self.get_list_url(), {'skills': 'false'})
        assert response.status_code == HTTP_200_OK
        assert len(response.data['results']) == 1
        assert all('skills' not in value for value in response.data['results'])
        response = self.client.get(self.get_list_url(), {'skills': 0})
        assert response.status_code == HTTP_200_OK
        assert len(response.data['results']) == 1
        assert all('skills' not in value for value in response.data['results'])

    def test_get_serializer_class__non_staff_request__with_skills(self):
        from ssm.skills.models import UserSkillModel
        UserSkillModel.objects.create(user=self.simple_user, skill=self.skill1)
        UserSkillModel.objects.create(user=self.simple_user, skill=self.skill2)
        self.client.force_authenticate(self.simple_user)
        response = self.client.get(self.get_list_url())
        assert len(response.data['results']) == 1
        assert all('skills' in value for value in response.data['results'])
        assert all(
            len(value['skills']) == 2 for value in response.data['results'])
        response = self.client.get(self.get_list_url(), {'skills': True})
        assert len(response.data['results']) == 1
        assert all('skills' in value for value in response.data['results'])
        assert all(
            len(value['skills']) == 2 for value in response.data['results'])
Exemplo n.º 19
0
 def setUp(self):
     self.user = UserFactory(email='*****@*****.**',
                             full_name='Ethan Elliott')