Fakultas Ilmu Komputer UI

test_vacancies.py 50.6 KB
Newer Older
1
from datetime import datetime, timedelta
2
from django.utils import timezone
3
import json
4
import requests_mock
5
from django.core.exceptions import ValidationError
6
7
8
from django.contrib.auth.models import User
from rest_framework import status
from rest_framework.test import APITestCase
9

10
from core.models.accounts import Company, Student, Supervisor
11
from core.models.vacancies import Vacancy, Application, VacancyMilestone
12
from core.views.vacancies import date_validator
13
14
from core.tests.mocks import mock_csui_oauth_verify, mock_csui_ldap_student, mock_csui_siak_student

15

16
class ApplicationTests(APITestCase):
17
18
19
20
21
22
    def get_student_id(self, mock_obj):
        mock_csui_oauth_verify(mock_obj)
        mock_csui_ldap_student(mock_obj)
        mock_csui_siak_student(mock_obj)
        login_url = '/api/login/'
        response = self.client.post(login_url, {'username': 'dummy.mahasiswa', 'password': 'lalala', 'login-type': 'sso-ui'},
Zamil Majdy's avatar
Zamil Majdy committed
23
                                    format='json')
24
        return response.data.get('student').get('id')
25

26
27
28
    @requests_mock.Mocker()
    def test_application_list(self, m):
        student_id = self.get_student_id(m)
Joshua Casey's avatar
Joshua Casey committed
29
        url = '/api/students/' + str(student_id) + '/applied-vacancies/'
30
31
32
33
        response = self.client.get(url)

        self.assertEqual(response.status_code, status.HTTP_200_OK)

34
35
    @requests_mock.Mocker()
    def test_application_search(self, m):
36
        student_id = self.get_student_id(m)
37
38
39
40
41
        url = '/api/students/' + str(student_id) + '/applied-vacancies/?search=engineer'
        response = self.client.get(url)

        self.assertEqual(response.status_code, status.HTTP_200_OK)

42
43
    @requests_mock.Mocker()
    def test_application_create_and_delete(self, m):
44
        student_id = self.get_student_id(m)
45
        new_user = User.objects.create_user('dummy.company', 'dummy.company@company.com', 'lalala123')
Zamil Majdy's avatar
Zamil Majdy committed
46
47
        new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None,
                                             address=None)
48
        new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(1541319300.0),
49
                                             description="lalala", max_accepted_applicants=3, working_period="3 Bulan", requirements= "requirements", close_time=(timezone.now() + timedelta(days=1)))
50

Joshua Casey's avatar
Joshua Casey committed
51
        url = '/api/students/' + str(student_id) + '/applied-vacancies/'
Zamil Majdy's avatar
Zamil Majdy committed
52
53
        response = self.client.post(url, {'vacancy_id': new_vacancy.pk, 'cover_letter': 'this is a cover letter.'},
                                    format='json')
54
55
        self.assertEqual(response.status_code, status.HTTP_200_OK)

Joshua Casey's avatar
Joshua Casey committed
56
        url = '/api/students/' + str(student_id) + '/applied-vacancies/' + str(new_vacancy.pk) + '/'
57
58
59
        response = self.client.delete(url)
        self.assertEqual(response.status_code, status.HTTP_200_OK)

60
61
62
63
64
65
66
67
68
69
70
71
    def test_count_application_a_person_is_already_register(self):
        new_user = User.objects.create_user('dummy.company', 'dummy.company@company.com', 'lalala123')
        new_user2 = User.objects.create_user('dummy.student', 'dummy.student@student.com', 'lalala123')

        self.client.force_authenticate(new_user)
        self.client.force_authenticate(new_user2)

        new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None,
                                             address=None)
        new_student = Student.objects.create(user=new_user2, npm=1234123412)

        new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(0),
72
                                             description="lalala", close_time=datetime.today(), max_accepted_applicants=3, working_period="3 Bulan")
73

74
        Application.objects.create(student=new_student, vacancy=new_vacancy, cover_letter="lorem ipsum")
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91

        url = '/api/applications/' + str(new_vacancy.pk) + '/count/'

        response = self.client.get(url, format='json')

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.json()['count'], 1)

    def test_count_application_nobody_register(self):
        new_user = User.objects.create_user('dummy.company', 'dummy.company@company.com', 'lalala123')
        new_user2 = User.objects.create_user('dummy.student', 'dummy.student@student.com', 'lalala123')

        self.client.force_authenticate(new_user)
        self.client.force_authenticate(new_user2)

        new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None,
                                             address=None)
92
        Student.objects.create(user=new_user2, npm=1234123412)
93
        new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(0),
94
                                             description="lalala", close_time=datetime.today(), max_accepted_applicants=3, working_period="3 Bulan")
95
96
97
98
99
100
101
102

        url = '/api/applications/' + str(new_vacancy.pk) + '/count/'

        response = self.client.get(url, format='json')

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.json()['count'], 0)

103
104
    @requests_mock.Mocker()
    def test_cannot_create_application_if_vacancy_is_closed(self, m):
105
        student_id = self.get_student_id(m)
106
107
108
109
        new_user = User.objects.create_user('dummy.company', 'dummy.company@company.com', 'lalala123')
        new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None,
                                             address=None)
        new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(0),
110
                                             description="lalala", close_time=(timezone.now() - timedelta(days=1)), max_accepted_applicants=3, working_period="3 Bulan")
111
112
113
114
        url = '/api/students/' + str(student_id) + '/applied-vacancies/'
        response = self.client.post(url, {'vacancy_id': new_vacancy.pk, 'cover_letter': 'this is a cover letter.'},
                                    format='json')
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
115

116
class BookmarkApplicationTests(APITestCase):
117
    @requests_mock.Mocker()
118
119
120
121
122
123
    def setUp(self, m):
        mock_csui_oauth_verify(m)
        mock_csui_ldap_student(m)
        mock_csui_siak_student(m)
        login_url = '/api/login/'
        response = self.client.post(login_url, {'username': 'dummy.mahasiswa', 'password': 'lalala', 'login-type': 'sso-ui'},
Zamil Majdy's avatar
Zamil Majdy committed
124
                                    format='json')
125
        self.student_id = response.data.get('student').get('id')
126

127
128
    def test_application_list(self):
        url = '/api/students/' + str(self.student_id) + '/bookmarked-vacancies/'
129
130
131
132
        response = self.client.get(url)

        self.assertEqual(response.status_code, status.HTTP_200_OK)

133
134
    def test_search_bookmarked_application(self):
        url = '/api/students/' + str(self.student_id) + '/bookmarked-vacancies/?search=engineer'
135
136
137
138
        response = self.client.get(url)

        self.assertEqual(response.status_code, status.HTTP_200_OK)

139
    def test_application_create_and_delete(self):
140
        new_user = User.objects.create_user('dummy.company2', 'dummy.compan2y@company.com', 'lalala123')
Zamil Majdy's avatar
Zamil Majdy committed
141
142
        new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None,
                                             address=None)
Hadlina Rahmadinni's avatar
Hadlina Rahmadinni committed
143
        new_vacancy = Vacancy.objects.create(company=new_company, verified=True, requirements= "requirements", open_time=datetime.fromtimestamp(1541319300.0),
144
                                             description="lalala", close_time=timezone.now(), max_accepted_applicants=3, working_period="3 Bulan")
145

146
        url = '/api/students/' + str(self.student_id) + '/bookmarked-vacancies/'
Zamil Majdy's avatar
Zamil Majdy committed
147
        response = self.client.post(url, {'vacancy_id': new_vacancy.pk}, format='json')
148
149
        self.assertEqual(response.status_code, status.HTTP_200_OK)

150
        url = '/api/students/' + str(self.student_id) + '/bookmarked-vacancies/' + str(new_vacancy.pk) + '/'
151
152
        response = self.client.delete(url)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
153

154

155
class VacancyTest(APITestCase):
156
157
158
159
160
161
162
    def login(self, mock_obj):
        mock_csui_oauth_verify(mock_obj)
        mock_csui_ldap_student(mock_obj)
        mock_csui_siak_student(mock_obj)
        login_url = '/api/login/'
        self.client.post(login_url, {'username': 'dummy.mahasiswa', 'password': 'lalala', 'login-type': 'sso-ui'}, format='json')

163
164
165
166
167
168
169
170
    def test_verified_vacancy_list(self):
        superuser = User.objects.create_superuser('dummy.company', 'dummy.company@company.com', 'lalala123')
        self.client.force_authenticate(user=superuser)

        url = '/api/vacancies/'
        response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)

171
172
173
174
    @requests_mock.Mocker()
    def test_search_vacancy(self, m):
        superuser = User.objects.create_user('dummy.company', 'dummy.company@company.com', 'lalala123')
        company = Company.objects.create(user=superuser, description="This is a test company")
175
176
        Vacancy.objects.create(company=company, open_time=datetime.now(), close_time=datetime.now(), name="Software Engineer", max_accepted_applicants=3, working_period="3 Bulan")
        Vacancy.objects.create(company=company, open_time=datetime.now(), close_time=datetime.now(), name="Data Engineer", max_accepted_applicants=3, working_period="3 Bulan")
177

178
        self.login(m)
179
180
181
182
183
        url = '/api/vacancies/?search=software'
        response = self.client.get(url, format='json')
        self.assertEqual(1, Company.objects.all().count())
        self.assertEqual(2, Vacancy.objects.all().count())
        self.assertEqual(response.status_code, status.HTTP_200_OK)
root's avatar
root committed
184

185
186
187
188
189
190
191
    def test_unverified_vacancy_list(self):
        superuser = User.objects.create_superuser('dummy.company', 'dummy.company@company.com', 'lalala123')
        self.client.force_authenticate(user=superuser)

        url = '/api/vacancies/?verified=false'
        response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
192

193
194
195
    def test_filter_vacancy_list_by_company_ids(self):
        superuser = User.objects.create_superuser('dummy.company', 'dummy.company@company.com', 'lalala123')
        self.client.force_authenticate(user=superuser)
196

197
198
199
200
201
202
203
204
205
206
        new_user = User.objects.create_user('dummy.company3', 'dummy.company3@company.com', 'lalala123')
        new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None,
                                             address=None)

        new_user2 = User.objects.create_user('dummy.companyzxc', 'dummy.companyzxc@company.com', 'lalala123')
        new_company2 = Company.objects.create(user=new_user2, description="lalalaasdsad", status=Company.VERIFIED,
                                              logo=None,
                                              address=None)
        open_time = datetime(2019, 10, 20)
        close_time = datetime(2019, 12, 20)
207
        Vacancy.objects.create(company=new_company, verified=True, open_time=open_time,
208
                                            description='', close_time=close_time, name='vacancy1', max_accepted_applicants=3, working_period="3 Bulan")
209
        Vacancy.objects.create(company=new_company2, verified=True, open_time=open_time,
210
                                            description='', close_time=close_time, name='vacancy2', max_accepted_applicants=3, working_period="3 Bulan")
211
212
        url = '/api/vacancies/?company={}&company={}'.format(new_company.id, new_company2.id)
        response = self.client.get(url, format='json')
213
        Vacancy.objects.filter(company__id__in=[new_company.id, new_company2.id])
214
215
216
        self.assertEqual(dict(response.data)['count'], Vacancy.objects.count())
        self.assertEqual(response.status_code, status.HTTP_200_OK)

217
218
219
220
    def test_fail_on_unverified_user_vacancy_list(self):
        url = '/api/vacancies/'
        response = self.client.post(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
221

222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
    def test_opened_only_vacancy_list(self):
        superuser = User.objects.create_superuser('dummy.company', 'dummy.company@company.com', 'lalala123')
        self.client.force_authenticate(user=superuser)

        url = '/api/vacancies/?opened_only=true'
        response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)

    def test_opened_and_unopened_vacancy_list(self):
        superuser = User.objects.create_superuser('dummy.company', 'dummy.company@company.com', 'lalala123')
        self.client.force_authenticate(user=superuser)

        url = '/api/vacancies/?opened_only=false'
        response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
237

238
239
    @requests_mock.Mocker()
    def test_closed_vacancy_not_included(self, m):
240
        self.login(m)
241
242
243
        new_user = User.objects.create_user('dummy.company2', 'dummy.compan2y@company.com', 'lalala123')
        new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None,
                                             address=None)
244
        Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(1541319300.0),
245
                                             description="expired vacancy", close_time=datetime.fromtimestamp(1541319301.0), max_accepted_applicants=3, working_period="3 Bulan")
246
247
248
249
250

        url = '/api/vacancies/?opened_only=true'
        response = self.client.get(url, format='json')
        self.assertEqual("expired vacancy" in response, False)

root's avatar
root committed
251
252
253
254
    def test_vacancy_is_closed(self):
        superuser = User.objects.create_superuser('dummy.company', 'dummy.company@company.com', 'lalala123')
        new_company = Company.objects.create(user=superuser, description="lalalaz", status=Company.VERIFIED, logo=None,
                                             address=None)
255

root's avatar
root committed
256
        new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(0),
257
                                             description="lalala", close_time=timezone.now() - timedelta(minutes = 10),working_period="3 Bulan")
root's avatar
root committed
258
259
260
261
262
263
264
265
266
267
        self.client.force_authenticate(user=superuser)

        response = new_vacancy.apply_before

        self.assertEqual(response, "Pendaftaran ditutup")

    def test_vacancy_is_closed(self):
        superuser = User.objects.create_superuser('dummy.company', 'dummy.company@company.com', 'lalala123')
        new_company = Company.objects.create(user=superuser, description="lalalaz", status=Company.VERIFIED, logo=None,
                                             address=None)
268

root's avatar
root committed
269
        new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(0),
270
271
                                             description="lalala", close_time=timezone.now() + timedelta(minutes = 10),
                                             max_accepted_applicants=3, working_period="3 Bulan")
root's avatar
root committed
272
273
274
275
276
277
        self.client.force_authenticate(user=superuser)

        response = new_vacancy.apply_before

        self.assertNotEqual(response, "Pendaftaran ditutup")

278
279
280
281
282
283
284
285
286
287
288
289
290
291
    def test_vacancy_valid_date(self):
        self.assertEqual(True, date_validator(str(datetime.today() + timedelta(days=1)), str(datetime.today() + timedelta(days=2)))['is_valid'])

    def test_vacancy_invalid_date(self):
        self.assertEqual(
            status.HTTP_400_BAD_REQUEST,
            date_validator(str(datetime.today() - timedelta(days=1)), str(datetime.today()))['status'])

        self.assertEqual(status.HTTP_400_BAD_REQUEST,
                         date_validator(str(datetime.today()), str(datetime.today() - timedelta(days=1)))['status'])

        self.assertRaisesMessage(status.HTTP_400_BAD_REQUEST,
                                 date_validator(str(datetime.today()), str(datetime.today()))['status'])

root's avatar
root committed
292

293
class CompanyListsTests(APITestCase):
294
    def test_company_vacancy_list(self):
295
        new_user = User.objects.create_user('dummy.company3', 'dummy.company3@company.com', 'lalala123')
Zamil Majdy's avatar
Zamil Majdy committed
296
297
        new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None,
                                             address=None)
298

299
300
301
302
        self.client.force_authenticate(new_user)

        url = '/api/companies/' + str(new_company.pk) + '/vacancies/'
        response = self.client.get(url, format='json')
303
304
        self.assertEqual(response.status_code, status.HTTP_200_OK)

305
306
    def test_company_vacancy_list_unauthorized(self):
        new_user = User.objects.create_user('dummy.company3', 'dummy.company3@company.com', 'lalala123')
Zamil Majdy's avatar
Zamil Majdy committed
307
308
        new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None,
                                             address=None)
309
310

        new_user2 = User.objects.create_user('dummy.companyzxc', 'dummy.companyzxc@company.com', 'lalala123')
311
        Company.objects.create(user=new_user2, description="lalalaasdsad", status=Company.VERIFIED,
Zamil Majdy's avatar
Zamil Majdy committed
312
313
                                              logo=None,
                                              address=None)
314
315
316
317
318
319
320
321

        self.client.force_authenticate(new_user2)

        url = '/api/companies/' + str(new_company.pk) + '/vacancies/'
        response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)

    def test_company_application_list(self):
322
        new_user = User.objects.create_user('dummy.company4', 'dummy.company4@company.com', 'lalala123')
323
        new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None,
324
325
                                             address=None)

326
327
328
329
330
331
        self.client.force_authenticate(new_user)

        url = '/api/companies/' + str(new_company.pk) + '/applications/'
        response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)

332
333
334
335
336
337
338
339
340
341
342
    def test_company_application_list_with_status(self):
        new_user = User.objects.create_user('dummy.company4', 'dummy.company4@company.com', 'lalala123')
        new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None,
                                             address=None)

        self.client.force_authenticate(new_user)

        url = '/api/companies/' + str(new_company.pk) + '/applications/?status=0'
        response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)

343
344
345
346
347
348
    def test_company_application_list_unauthorized(self):
        new_user = User.objects.create_user('dummy.company3', 'dummy.company3@company.com', 'lalala123')
        new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None,
                                             address=None)

        new_user2 = User.objects.create_user('dummy.companyzxc', 'dummy.companyzxc@company.com', 'lalala123')
349
        Company.objects.create(user=new_user2, description="lalalaasdsad", status=Company.VERIFIED,
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
                                              logo=None,
                                              address=None)

        self.client.force_authenticate(new_user2)

        url = '/api/companies/' + str(new_company.pk) + '/applications/'
        response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)

    def test_company_application_list_by_vacancy(self):
        new_user = User.objects.create_user('dummy.company3', 'dummy.company3@company.com', 'lalala123')
        new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None,
                                             address=None)

        new_user2 = User.objects.create_user('dummy.company4', 'dummy.company4@company.com', 'lalala123')
        new_student = Student.objects.create(user=new_user2, npm=1234123412)

367
        new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(1541319300.0),
368
                                             description="lalala", requirements= "requirements", close_time=timezone.now(), max_accepted_applicants=3, working_period="3 Bulan")
369
        Application.objects.create(student=new_student, vacancy=new_vacancy, cover_letter="asdasdasd")
370
371
372
373
374

        self.client.force_authenticate(new_user)

        url = '/api/companies/' + str(new_company.pk) + '/applications/' + str(new_vacancy.pk) + '/by_vacancy/'
        response = self.client.get(url, format='json')
375
        self.assertEqual(response.status_code, status.HTTP_200_OK)
376
377
378
379
380
381
382
383
384

    def test_company_application_list_by_vacancy_unauthorized_1(self):
        new_user = User.objects.create_user('dummy.company3', 'dummy.company3@company.com', 'lalala123')
        new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None,
                                             address=None)

        new_user2 = User.objects.create_user('dummy.student', 'dummy.company3@company.com', 'lalala123')
        new_student = Student.objects.create(user=new_user2, npm=1234123412)

385
        new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(1541319300.0),
386
                                             description="lalala", requirements= "requirements", close_time=timezone.now(), max_accepted_applicants=3, working_period="3 Bulan")
387
        Application.objects.create(student=new_student, vacancy=new_vacancy, cover_letter="asdasdasd")
388
389

        new_user3 = User.objects.create_user('dummy.company4', 'dummy.company4@company.com', 'lalala123')
390
        Company.objects.create(user=new_user3, description="lalala", status=Company.VERIFIED, logo=None,
Zamil Majdy's avatar
Zamil Majdy committed
391
                                              address=None)
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406

        self.client.force_authenticate(new_user3)

        url = '/api/companies/' + str(new_company.pk) + '/applications/' + str(new_vacancy.pk) + '/by_vacancy/'
        response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)

    def test_company_application_list_by_vacancy_unauthorized_2(self):
        new_user = User.objects.create_user('dummy.company3', 'dummy.company3@company.com', 'lalala123')
        new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None,
                                             address=None)

        new_user2 = User.objects.create_user('dummy.student', 'dummy.company3@company.com', 'lalala123')
        new_student = Student.objects.create(user=new_user2, npm=1234123412)

407
        new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(1541319300.0),
408
                                             description="lalala", requirements= "requirements", close_time=timezone.now(), max_accepted_applicants=3, working_period="3 Bulan")
409
        Application.objects.create(student=new_student, vacancy=new_vacancy, cover_letter="asdasdasd")
410
411
412
413
414
415
416
417
418

        new_user3 = User.objects.create_user('dummy.company4', 'dummy.company4@company.com', 'lalala123')
        new_company3 = Company.objects.create(user=new_user3, description="lalala", status=Company.VERIFIED, logo=None,
                                              address=None)

        self.client.force_authenticate(new_user3)

        url = '/api/companies/' + str(new_company3.pk) + '/applications/' + str(new_vacancy.pk) + '/by_vacancy/'
        response = self.client.get(url, format='json')
419
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
420
421
422
423
424
425
426
427
428

    def test_company_application_list_by_vacancy_with_status(self):
        new_user = User.objects.create_user('dummy.company3', 'dummy.company3@company.com', 'lalala123')
        new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None,
                                             address=None)

        new_user2 = User.objects.create_user('dummy.company4', 'dummy.company4@company.com', 'lalala123')
        new_student = Student.objects.create(user=new_user2, npm=1234123412)

429
        new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(1541319300.0),
430
                                             description="lalala", requirements= "requirements", close_time=timezone.now(), max_accepted_applicants=3, working_period="3 Bulan")
431
        Application.objects.create(student=new_student, vacancy=new_vacancy, cover_letter="asdasdasd")
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446

        self.client.force_authenticate(new_user)

        url = '/api/companies/' + str(new_company.pk) + '/applications/' + str(new_vacancy.pk) + '/by_vacancy/?status=2'
        response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)

    def test_company_application_list_by_vacancy_with_bad_status_string(self):
        new_user = User.objects.create_user('dummy.company3', 'dummy.company3@company.com', 'lalala123')
        new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None,
                                             address=None)

        new_user2 = User.objects.create_user('dummy.company4', 'dummy.company4@company.com', 'lalala123')
        new_student = Student.objects.create(user=new_user2, npm=1234123412)

447
        new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(1541319300.0),
448
                                             description="lalala", requirements= "requirements", close_time=timezone.now(), max_accepted_applicants=3, working_period="3 Bulan")
449
        Application.objects.create(student=new_student, vacancy=new_vacancy, cover_letter="asdasdasd")
450
451
452

        self.client.force_authenticate(new_user)

Zamil Majdy's avatar
Zamil Majdy committed
453
454
        url = '/api/companies/' + str(new_company.pk) + '/applications/' + str(
            new_vacancy.pk) + '/by_vacancy/?status=lalala'
455
456
457
458
459
460
461
462
463
464
465
        response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

    def test_company_application_list_by_vacancy_with_bad_status_negative(self):
        new_user = User.objects.create_user('dummy.company3', 'dummy.company3@company.com', 'lalala123')
        new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None,
                                             address=None)

        new_user2 = User.objects.create_user('dummy.company4', 'dummy.company4@company.com', 'lalala123')
        new_student = Student.objects.create(user=new_user2, npm=1234123412)

466
        new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(1541319300.0),
467
                                             description="lalala", requirements= "requirements", close_time=timezone.now(), max_accepted_applicants=3, working_period="3 Bulan")
468
        Application.objects.create(student=new_student, vacancy=new_vacancy, cover_letter="asdasdasd")
469
470
471

        self.client.force_authenticate(new_user)

Zamil Majdy's avatar
Zamil Majdy committed
472
473
        url = '/api/companies/' + str(new_company.pk) + '/applications/' + str(
            new_vacancy.pk) + '/by_vacancy/?status=-1'
474
475
476
477
478
479
480
481
482
483
484
        response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

    def test_company_application_list_by_vacancy_with_bad_status_large(self):
        new_user = User.objects.create_user('dummy.company3', 'dummy.company3@company.com', 'lalala123')
        new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None,
                                             address=None)

        new_user2 = User.objects.create_user('dummy.company4', 'dummy.company4@company.com', 'lalala123')
        new_student = Student.objects.create(user=new_user2, npm=1234123412)

485
        new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(1541319300.0),
486
                                             description="lalala", requirements= "requirements", close_time=timezone.now(), max_accepted_applicants=3, working_period="3 Bulan")
487
        Application.objects.create(student=new_student, vacancy=new_vacancy, cover_letter="asdasdasd")
488
489
490
491
492
493

        self.client.force_authenticate(new_user)

        url = '/api/companies/' + str(new_company.pk) + '/applications/' + str(new_vacancy.pk) + '/by_vacancy/?status=5'
        response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
494

495
496
    def test_company_application_list_with_major(self):
        new_user = User.objects.create_user('dummy.company4', 'dummy.company4@company.com', 'lalala123')
497
498
        new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None,
                                             address=None)
499

500
        self.client.force_authenticate(new_user)
501

502
503
504
        url = '/api/companies/' + str(new_company.pk) + '/applications/?major=0'
        response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
505

506

Zamil Majdy's avatar
Zamil Majdy committed
507
class SupervisorStudentApplicationTests(APITestCase):
508
509
    def test_list_student_application(self):
        new_user = User.objects.create_user('dummy.supervisor', 'dummy.supervisor@asd.asd', 'lalala123')
510
        Supervisor.objects.create(user=new_user, nip=1212121212)
511
512
        self.client.force_authenticate(user=new_user)

Zamil Majdy's avatar
Zamil Majdy committed
513
        url = '/api/applications/'
514
515
516
517
518
519
520
        response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)

    def test_list_student_application_unauthorized(self):
        new_user = User.objects.create_user('dummy.supervisor', 'dummy.supervisor@asd.asd', 'lalala123')
        self.client.force_authenticate(user=new_user)

Zamil Majdy's avatar
Zamil Majdy committed
521
        url = '/api/applications/'
522
523
        response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
M. Reza Qorib's avatar
M. Reza Qorib committed
524

525

Zamil Majdy's avatar
Zamil Majdy committed
526
class SupervisorApprovalTests(APITestCase):
527
528
    def test_supervisor_approve_vacancy(self):
        new_user = User.objects.create_user('dummy.supervisor', 'dummy.supervisor@asd.asd', 'lalala123')
529
        Supervisor.objects.create(user=new_user, nip=1212121212)
530
531
        self.client.force_authenticate(user=new_user)

532
533
        new_user2 = User.objects.create_user('dummy.company2', 'dummy.compan2y@company.com', 'lalala123')
        new_company2 = Company.objects.create(user=new_user2, description="lalala", status=Company.VERIFIED, logo=None,
Zamil Majdy's avatar
Zamil Majdy committed
534
                                              address=None)
535
        new_vacancy2 = Vacancy.objects.create(company=new_company2, verified=False, open_time=datetime.fromtimestamp(1541319300.0),
536
                                              description="lalala", requirements= "requirements", close_time=timezone.now(), max_accepted_applicants=3)
537
538

        url = '/api/vacancies/' + str(new_vacancy2.pk) + '/verify/'
Zamil Majdy's avatar
Zamil Majdy committed
539
        response = self.client.patch(url, {'verified': True}, format='json')
540
541
542
543
544
545
546
547
548
549
550
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        retrieve_vacancy = Vacancy.objects.get(pk=new_vacancy2.pk)
        self.assertEqual(retrieve_vacancy.verified, True)

    def test_unauthorized_approve_vacancy(self):
        new_user = User.objects.create_user('dummy.companyz', 'dummy.companyz@company.com', 'lalala123')
        new_company = Company.objects.create(user=new_user, description="lalalaz", status=Company.VERIFIED, logo=None,
                                             address=None)
        self.client.force_authenticate(user=new_user)

551
        new_vacancy = Vacancy.objects.create(company=new_company, verified=False, open_time=datetime.fromtimestamp(1541319300.0),
552
                                             description="lalala", requirements= "requirements", close_time=timezone.now(), max_accepted_applicants=3)
553
554
555
556
557

        url = '/api/vacancies/' + str(new_vacancy.pk) + '/verify/'
        response = self.client.patch(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
        self.assertEqual(new_vacancy.verified, False)
558

559
560
561
562
563
564
565
566
567
568
569
570
571
class ValidationPositionNameinCreateLowonganKP(APITestCase):
    def setUp(self):
        user = User.objects.create_user('dummy', 'dummy@dummy.com', 'dummy')
        self.client.force_authenticate(user=user)
        self.company = Company.objects.create(
            user=user,
            description="dummy",
            status=Company.VERIFIED,
            logo=None,
            address=None
        )
        self.url = '/api/vacancies/'
        self.payload = {
572
            "name": "dummy",
573
574
            "company" : self.company.id,
            "open_time" : datetime.fromtimestamp(0),
575
576
            "close_time" : datetime.today(),
            "description" : "dummy",
577
578
            "working_period": "Summer 2019",
            "max_accepted_applicants": 10,
579
580
581
582
583
        }
        self.message = "Name must alphabets only"

    def test_name_contains_only_alphabets(self):
        self.payload["name"] = "Engineer"
Farah Alhaniy Efendi's avatar
Farah Alhaniy Efendi committed
584
        self.payload["requirements" ] = "lalala"
585
586
587
588
589
590
591
592
593

        response = self.client.post(
            self.url,
            self.payload,
            format="json"
        )

        response_status_code = response.status_code

594
        self.assertEqual(response_status_code, 200)
595
596

    def test_name_contains_only_alphabets_and_spaces(self):
597
        self.payload["name"] = "Software Engineer"
Farah Alhaniy Efendi's avatar
Farah Alhaniy Efendi committed
598
        self.payload["requirements" ] = "lala la"
599
600
601
602
603
604
605
606
607

        response = self.client.post(
            self.url,
            self.payload,
            format="json"
        )

        response_status_code = response.status_code

608
        self.assertEqual(response_status_code, 200)
609

610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
    def test_name_contains_alphabets_and_numerics(self):
        self.payload["name"] = "Software18 Engineer"

        response = self.client.post(
            self.url,
            self.payload,
            format="json"
        )

        response_status_code = response.status_code
        self.assertEqual(response_status_code, 400)

    def test_name_contains_only_numerics(self):
        self.payload["name"] = "123654789"

        response = self.client.post(
            self.url,
            self.payload,
            format="json"
        )

        response_status_code = response.status_code
        self.assertEqual(response_status_code, 400)

    def test_name_contains_characters_besides_alphabets(self):
        self.payload["name"] = "!@#$%^&*()"

        response = self.client.post(
            self.url,
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
            self.payload,
            format="json"
        )

        response_status_code = response.status_code
        self.assertEqual(response_status_code, 400)

    def test_salary_contains_number_only(self):
        self.payload["salary"] = 2312312

        response = self.client.post(
            self.url,
            self.payload,
            format="json"
        )

        response_status_code = response.status_code
        self.assertEqual(response_status_code, 200)

    def test_salary_contains_number_and_alphabet(self):
        self.payload["salary"] = "sdsaa"

        response = self.client.post(
            self.url,
            self.payload,
            format="json"
        )

        response_status_code = response.status_code
        self.assertEqual(response_status_code, 400)

    def test_amount_contains_number_only(self):
        self.payload["amount"] = 231231221312

        response = self.client.post(
            self.url,
            self.payload,
            format="json"
        )

        response_status_code = response.status_code
        self.assertEqual(response_status_code, 200)

Fajrin Kingwijati's avatar
Fajrin Kingwijati committed
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
    def test_max_accepted_applicants_contains_only_number(self):
        self.payload[""] = "11"

        response = self.client.post(
            self.url,
            self.payload,
            format="json"
        )

        response_status_code = response.status_code
        self.assertEqual(response_status_code, 200)

    def test_max_accepted_applicants_contains_only_alphabet(self):
        self.payload[""] = "abcd"

        response = self.client.post(
            self.url,
            self.payload,
            format="json"
        )

        response_status_code = response.status_code
        self.assertEqual(response_status_code, 400)
    
    def test_max_accepted_applicants_contains_number_and_alphabet(self):
        self.payload[""] = "a1r1"

        response = self.client.post(
            self.url,
            self.payload,
            format="json"
        )

        response_status_code = response.status_code
        self.assertEqual(response_status_code, 400)

718
719
720
721
722
    def test_amount_contains_number_and_alphabet(self):
        self.payload["salary"] = "sadas231"

        response = self.client.post(
            self.url,
723
724
725
726
727
728
729
            self.payload,
            format="json"
        )

        response_status_code = response.status_code
        self.assertEqual(response_status_code, 400)

730

731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
class VacancyMilestoneTests(APITestCase):
    def setUp(self):
        super(VacancyMilestoneTests, self).setUp()
        self.user = User.objects.create_user('dummy.student', 'dummy.student@home.com', 'lalala123')
        self.company_user =  User.objects.create_user('dummy.company2', 'dummy.compan2y@company.com', 'lalala123')
        self.company = Company.objects.create(user=self.company_user, description="lalala", status=Company.VERIFIED, logo=None,
                                              address=None)
        self.vacancy = Vacancy.objects.create(company=self.company, verified=True, open_time=datetime.fromtimestamp(0),
                                              description="lalala", close_time=datetime.today())

    def create_milestone_object(self):
        return VacancyMilestone.objects.create(vacancy=self.vacancy, name="initiate", detail="install things",
                                               expected_start=datetime.fromtimestamp(0),
                                               expected_finish=datetime.fromtimestamp(86400))

    def test_vacancy_milestone_model(self):
        milestone1 = VacancyMilestone(vacancy=self.vacancy, name="initiate", detail="install things",
                                      expected_start=datetime.fromtimestamp(0),
                                      expected_finish=datetime.fromtimestamp(86400))
        milestone1.full_clean()

        milestone2 = VacancyMilestone(vacancy=self.vacancy, name="a"*101, detail="install things",
                                      expected_start=datetime.fromtimestamp(0),
                                      expected_finish=datetime.fromtimestamp(86400))
        with self.assertRaises(ValidationError, msg="Name with more than 100 character should raise ValidationError"):
            milestone2.full_clean()

        milestone3 = VacancyMilestone(vacancy=self.vacancy, name="initiate", detail="install things",
                                      expected_start=datetime.fromtimestamp(86400),
                                      expected_finish=datetime.fromtimestamp(0))
        with self.assertRaises(ValidationError, msg="Expected finish earlier than tart should raise ValidationError"):
            milestone3.full_clean()

    def test_vacancy_milestones_list(self):
        milestone1 = self.create_milestone_object()
        self.client.force_authenticate(user=self.user)

        url = '/api/vacancies/' + str(self.vacancy.pk) + '/milestones/'
        response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data["results"]), 1)
        self.assertEqual(response.data["results"][0]["name"], milestone1.name)
        self.assertEqual(response.data["results"][0]["detail"], milestone1.detail)

    def test_create_new_milestone_on_a_vacancy_success(self):
        self.client.force_authenticate(user=self.company_user)
        url = '/api/vacancies/' + str(self.vacancy.pk) + '/milestones/'
        data = {"name": "initiate", "detail": "install things", "expected_start": "2019-01-20",
                "expected_finish": "2019-01-21"}
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(self.vacancy.milestones.count(), 1)
        new_milestone = self.vacancy.milestones.first()
        self.assertEqual(new_milestone.name, data["name"])
        self.assertEqual(new_milestone.detail, data["detail"])

    def test_create_new_milestone_on_a_vacancy_invalid_data(self):
        self.client.force_authenticate(user=self.company_user)
        url = '/api/vacancies/' + str(self.vacancy.pk) + '/milestones/'
        data = {"name": "initiate", "detail": "install things", "expected_start": "2019-01-20",
                "expected_finish": "2019-01-01"}
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(self.vacancy.milestones.count(), 0)

    def test_create_new_milestone_on_a_vacancy_unauthorized_user(self):
        self.client.force_authenticate(user=self.user)
        url = '/api/vacancies/' + str(self.vacancy.pk) + '/milestones/'
        data = {"name": "initiate", "detail": "install things", "expected_start": "2019-01-20",
                "expected_finish": "2019-01-21"}
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
        self.assertEqual(self.vacancy.milestones.count(), 0)

    def test_modify_milestone_on_a_vacancy_success(self):
        milestone = self.create_milestone_object()
        self.client.force_authenticate(user=self.company_user)
        url = '/api/vacancies/' + str(self.vacancy.pk) + '/milestones/' + str(milestone.pk) + '/'
        data = {"name": "initiate env", "detail": "install all things", "expected_start": "2019-01-20",
                "expected_finish": "2019-01-21"}
        response = self.client.put(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(self.vacancy.milestones.count(), 1)
        new_milestone = self.vacancy.milestones.first()
        self.assertEqual(new_milestone.name, data["name"])
        self.assertEqual(new_milestone.detail, data["detail"])

    def test_modify_milestone_on_a_vacancy_not_found(self):
        milestone = self.create_milestone_object()
        self.client.force_authenticate(user=self.company_user)
        url = '/api/vacancies/1000/milestones/' + str(milestone.pk) + '/'
        data = {"name": "initiate env", "detail": "install all things", "expected_start": "2019-01-20",
                "expected_finish": "2019-01-21"}
        response = self.client.put(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
        url2 = '/api/vacancies/' + str(self.vacancy.pk) + '/milestones/1000/'
        response2 = self.client.put(url2, data, format='json')
        self.assertEqual(response2.status_code, status.HTTP_404_NOT_FOUND)
        self.assertEqual(self.vacancy.milestones.count(), 1)
        new_milestone = self.vacancy.milestones.first()
        self.assertEqual(new_milestone.name, milestone.name)
        self.assertEqual(new_milestone.detail, milestone.detail)

    def test_modify_milestone_on_a_vacancy_invalid_data(self):
        milestone = self.create_milestone_object()
        self.client.force_authenticate(user=self.company_user)
        url = '/api/vacancies/' + str(self.vacancy.pk) + '/milestones/' + str(milestone.pk) + '/'
        data = {"name": "a" * 101, "detail": "install all things", "expected_start": "2019-01-21",
                "expected_finish": "2019-01-19"}
        response = self.client.put(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(self.vacancy.milestones.count(), 1)
        new_milestone = self.vacancy.milestones.first()
        self.assertEqual(new_milestone.name, milestone.name)
        self.assertEqual(new_milestone.detail, milestone.detail)

    def test_modify_milestone_on_a_vacancy_unauthorized_user(self):
        milestone = self.create_milestone_object()
        self.client.force_authenticate(user=self.user)
        url = '/api/vacancies/' + str(self.vacancy.pk) + '/milestones/' + str(milestone.pk) + '/'
        data = {"name": "initiate env", "detail": "install all things", "expected_start": "2019-01-20",
                "expected_finish": "2019-01-21"}
        response = self.client.put(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
        self.assertEqual(self.vacancy.milestones.count(), 1)
        new_milestone = self.vacancy.milestones.first()
        self.assertEqual(new_milestone.name, milestone.name)
        self.assertEqual(new_milestone.detail, milestone.detail)

    def test_delete_milestone_on_a_vacancy_success(self):
        milestone = self.create_milestone_object()
        self.client.force_authenticate(user=self.company_user)
        url = '/api/vacancies/' + str(self.vacancy.pk) + '/milestones/' + str(milestone.pk) + '/'
        response = self.client.delete(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(self.vacancy.milestones.count(), 0)

    def test_delete_milestone_on_a_vacancy_not_found(self):
        milestone = self.create_milestone_object()
        self.client.force_authenticate(user=self.company_user)
        url = '/api/vacancies/1000/milestones/' + str(milestone.pk) + '/'
        response = self.client.delete(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
        url2 = '/api/vacancies/' + str(self.vacancy.pk) + '/milestones/1000/'
        response2 = self.client.delete(url2, format='json')
        self.assertEqual(response2.status_code, status.HTTP_404_NOT_FOUND)
        self.assertEqual(self.vacancy.milestones.count(), 1)

    def test_delete_milestone_on_a_vacancy_unauthorized_user(self):
        milestone = self.create_milestone_object()
        self.client.force_authenticate(user=self.user)
        url = '/api/vacancies/' + str(self.vacancy.pk) + '/milestones/' + str(milestone.pk) + '/'
        response = self.client.delete(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
        self.assertEqual(self.vacancy.milestones.count(), 1)

887

888
class AcceptOneOfferTests(APITestCase):
889
890
891
892
    def generateObject(self):
        new_user = User.objects.create_user('dummy.company', 'dummy.company@company.com', 'lalala123')
        new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None,
                                             address=None)
893

894
895
        new_user2 = User.objects.create_user('dummy.company2', 'dummy.company2@company.com', 'lalala123')
        new_company2 = Company.objects.create(user=new_user2, description="lalala", status=Company.VERIFIED, logo=None,
896
                                              address=None)
897
898

        new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(0),
899
                                             description="lalala", requirements= "requirements", close_time=datetime.today(), max_accepted_applicants=3)
900

901
        new_vacancy2 = Vacancy.objects.create(company=new_company2, verified=True, open_time=datetime.fromtimestamp(0),
902
                                             description="lalala", requirements= "requirements", close_time=datetime.today(), max_accepted_applicants=3)
903
904
905
906
907
908
909

        new_user3 = User.objects.create_user('dummy.student', 'dummy.student@company.com', 'lalala123')
        new_student = Student.objects.create(user=new_user3, npm=1234123412)

        return new_user3, new_vacancy, new_vacancy2, new_student

    def test_number_of_content_response_object_given_id_auth(self):
910

911
        new_user3, new_vacancy, new_vacancy2, new_student = self.generateObject()
912

913
914
915
916
917
918
919
920
921
922
923
924
        self.client.force_authenticate(new_user3)

        Application.objects.create(student=new_student, vacancy=new_vacancy, cover_letter="asdasdasd")
        Application.objects.create(student=new_student, vacancy=new_vacancy2, cover_letter="asdasdasd")

        url = '/api/acceptoffer/' + str(new_student.pk) + '/vacancy/' + str(new_vacancy.pk) + '/'

        response = self.client.patch(url, format='json')
        body = json.loads(response.content)

        status_response = []
        for app in body:
925
            status_response.append(app['status'])
926
927
928
929
930
931
932
933

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertTrue(len(body) >= 2)
        self.assertFalse(len(body) == 0)
        self.assertTrue('new' in status_response)
        self.assertTrue('aborted' in status_response)

    def test_student_not_exist_given_auth(self):
934
        new_user3, new_vacancy, new_vacancy2, new_student = self.generateObject()
935
936
937
938
939
940
941
942
943
944
945
946

        self.client.force_authenticate(new_user3)

        user4 = User.objects.create_user('student_user_4', 'student_user_4@company.com', 'lalala123')
        other_student = Student.objects.create(user=user4, npm=1098765432)

        Application.objects.create(student=other_student, vacancy=new_vacancy, cover_letter="asdasdasd")
        Application.objects.create(student=other_student, vacancy=new_vacancy2, cover_letter="asdasdasd")

        url = '/api/acceptoffer/' + str(new_student.pk) + '/vacancy/' + str(new_vacancy.pk) + '/'

        response = self.client.patch(url, format='json')
947
        body = json.loads(response.content)
948
949
950
951
952
953
954
955
956
957
958
959
960

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertTrue(len(body) == 0)

    def test_type_error_if_input_null(self):
        new_user3, new_vacancy, new_vacancy2, new_student = self.generateObject()

        self.client.force_authenticate(new_user3)

        Application.objects.create(student=new_student, vacancy=new_vacancy, cover_letter="asdasdasd")
        Application.objects.create(student=new_student, vacancy=new_vacancy2, cover_letter="asdasdasd")

        with self.assertRaises(TypeError):
961
            '/api/acceptoffer/' + None + '/vacancy/' + str(new_vacancy.pk) + '/'
962

963
        with self.assertRaises(TypeError):
964
            '/api/acceptoffer/' + str(new_student.pk) + '/vacancy/' + None + '/'
965

966
967
    def test_if_requester_is_not_authenticated(self):
        new_user3, new_vacancy, new_vacancy2, new_student = self.generateObject()
968

969
970
971
972
973
974
        Application.objects.create(student=new_student, vacancy=new_vacancy, cover_letter="asdasdasd")
        Application.objects.create(student=new_student, vacancy=new_vacancy2, cover_letter="asdasdasd")

        url = '/api/acceptoffer/' + str(new_student.pk) + '/vacancy/' + str(new_vacancy.pk) + '/'

        response = self.client.patch(url, format='json')
975

976
977

        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)