From 4855d7701ed35eaaeb97052eb1a9f840d7e56d69 Mon Sep 17 00:00:00 2001
From: Zamil Majdy <z.majdy1996@gmail.com>
Date: Tue, 28 Mar 2017 17:50:20 +0700
Subject: [PATCH] Merge branch 'UserStory2' of
 https://gitlab.com/PPL2017csui/PPLA1 into UserStory2

---
 assets/css/custom.css                     |  20 +++-
 assets/js/Dashboard.jsx                   |   2 +-
 assets/js/components/Lowongan.jsx         |  21 ++--
 assets/js/components/ModalPendaftaran.jsx |  20 ++--
 assets/js/components/TopMenu.jsx          |   6 +-
 assets/js/components/VacancyList.jsx      |   1 +
 core/tests/__init__.py                    |   4 +-
 core/tests/test_accounts.py               |  76 +++++++++++++++
 core/tests/test_login.py                  |  53 ----------
 core/tests/test_vacancies.py              | 113 ++++++++++++++++++++++
 10 files changed, 236 insertions(+), 80 deletions(-)
 create mode 100644 core/tests/test_accounts.py
 delete mode 100644 core/tests/test_login.py
 create mode 100644 core/tests/test_vacancies.py

diff --git a/assets/css/custom.css b/assets/css/custom.css
index 79273fc0..7759976a 100755
--- a/assets/css/custom.css
+++ b/assets/css/custom.css
@@ -100,22 +100,32 @@ font-size: 30px;
 }
 
 .coverLetter{
-  margin-top:15px;
+  margin-top:30px;
+
 }
 
 .linkCV{
   float: right;
-  margin-top: 10px;
+  margin-top: 30px;
+  margin-bottom: 10px;
 }
 
 .registerForm{
-  width: 800px;
   margin: 0 auto;
   padding:50px;
   background-color: #3B8686;
 
 }
 
+item{
+  color:black;
+}
+
+textarea{
+  width: 800px !important;
+  height: 160px !important;
+}
+
 .register{
   background-color:#3B8686;
 
@@ -142,4 +152,8 @@ input.active:invalid {
 
 card .formRegis{
   margin-top: 100px;
+}
+
+itemLowongan{
+  color: black;
 }
\ No newline at end of file
diff --git a/assets/js/Dashboard.jsx b/assets/js/Dashboard.jsx
index f297f54d..513a5b8c 100755
--- a/assets/js/Dashboard.jsx
+++ b/assets/js/Dashboard.jsx
@@ -11,7 +11,7 @@ export default class Dashboard extends React.Component {
 
   render = () => (
     <div>
-      <TopMenu color="blue" />
+      <TopMenu  />
       {this.props.children}
     </div>
   )
diff --git a/assets/js/components/Lowongan.jsx b/assets/js/components/Lowongan.jsx
index 2998b80a..37a10d4d 100644
--- a/assets/js/components/Lowongan.jsx
+++ b/assets/js/components/Lowongan.jsx
@@ -16,20 +16,21 @@ export default class Lowongan extends React.Component {
         <Item >
           {image}
           <Item.Content verticalAlign="middle">
-            <Item.Header>{this.props.header}</Item.Header>
+            <Item.Header>
+
+                {this.props.header}
+
+            </Item.Header>
             <Item.Description>{this.props.content}</Item.Description>
-            <Item.Extra>
+            <Item.Content>
 
-                <h3>{ this.props.data.data1 }</h3>
-                <h4>PT. Koding Kuat </h4>
-                <h5> JL.Kali deres utara no.1 </h5>
-                <h5> Jakarta Barat, DKI Jakarta</h5>
+                    <h3>{ this.props.data.data1 }</h3>
+                    <h4>PT. Koding Kuat </h4>
+                    <h5> JL.Kali deres utara no.1 Jakarta Barat, DKI Jakarta</h5>
 
-                <ModalPendaftaran id={1} data={ { header: 'Deskripsi Lowongan', description: 'Lorem ipsum dolor sit amet, consectetur' +
-                ' adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim ' +
-                'veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.' } } buttonTitle="Daftar"  />
+                <ModalPendaftaran id={1} data={ { header: 'Deskripsi Lowongan', description: 'Lorem ipsum dolor sit amet'} } buttonTitle="Daftar"  />
 
-            </Item.Extra>
+            </Item.Content>
           </Item.Content>
         </Item>
 
diff --git a/assets/js/components/ModalPendaftaran.jsx b/assets/js/components/ModalPendaftaran.jsx
index 549dd0e8..ea22f3ac 100644
--- a/assets/js/components/ModalPendaftaran.jsx
+++ b/assets/js/components/ModalPendaftaran.jsx
@@ -46,26 +46,28 @@ export default class ModalPendaftaran extends React.Component {
     >
 
       <Modal.Header>{this.props.data.header}</Modal.Header>
-      <Modal.Content image>
-        <div className="image">
-          <Icon name="right arrow" />
-        </div>
+
+      <Modal.Content>
+
         <Modal.Description>
           <Modal.Header> <h3> Deskripsi Lowongan </h3></Modal.Header>
           {this.props.data.description}
 
-          <div className="linkCV">
+        </Modal.Description>
+
+          <div className="coverLetter">
+
+            <div className="linkCV">
             <a> your latest CV </a>
           </div>
 
-          <div className="coverLetter">
             <h5> Write your Cover Letter </h5>
-            <Form>
-              <TextArea placeholder="Tell us more" onChange={this.handleChange} />
+            <Form >
+              <TextArea placeholder="Tell us more" size='big' />
             </Form>
+
           </div>
 
-        </Modal.Description>
       </Modal.Content>
       <Modal.Actions>
         <ModalAlert
diff --git a/assets/js/components/TopMenu.jsx b/assets/js/components/TopMenu.jsx
index 0bf949c9..a08c56ea 100644
--- a/assets/js/components/TopMenu.jsx
+++ b/assets/js/components/TopMenu.jsx
@@ -21,11 +21,11 @@ export default class TopMenu extends React.Component {
 
   render() {
     return (
-      <Menu pointing secondary>
+      <Menu color="blue" pointing secondary>
         <Image as="a" size="small" src="/assets/img/logo.png" href="/" />
         <Menu.Menu position="right">
-          <Menu.Item as={Link} to="/lowongan" name="home" />
-          <Menu.Item as={Link} to="/profile" name="profil" />
+          <Menu.Item as={Link} to="/lowongan" name="home" onClick={this.handleItemClick} />
+          <Menu.Item as={Link} to="/profile" name="profil" onClick={this.handleItemClick} />
           {Server.isLoggedIn() ?
             <Menu.Item as={Link} onClick={this.logout} name="logout" /> :
             <Menu.Item as={Link} to="/login" name="login" />
diff --git a/assets/js/components/VacancyList.jsx b/assets/js/components/VacancyList.jsx
index 044af11e..4beaf37d 100644
--- a/assets/js/components/VacancyList.jsx
+++ b/assets/js/components/VacancyList.jsx
@@ -27,6 +27,7 @@ export default class VacancyList extends React.Component {
     );
   }
 
+
   render = () => {
     return (
       <Item.Group relaxed>
diff --git a/core/tests/__init__.py b/core/tests/__init__.py
index 98a24c10..7f0ec277 100755
--- a/core/tests/__init__.py
+++ b/core/tests/__init__.py
@@ -1,2 +1,4 @@
 # __init__.py
-from core.tests.test_login import LoginTests
+from core.tests.test_accounts import LoginTests
+from core.tests.test_vacancies import ApplicationTests, BookmarkApplicationTests
+
diff --git a/core/tests/test_accounts.py b/core/tests/test_accounts.py
new file mode 100644
index 00000000..afd8eb12
--- /dev/null
+++ b/core/tests/test_accounts.py
@@ -0,0 +1,76 @@
+import requests_mock
+from rest_framework import status
+from rest_framework.test import APITestCase
+from django.contrib.auth.models import User
+from core.models.accounts import Company
+
+class LoginTests(APITestCase):
+
+    @requests_mock.Mocker()
+    def test_succesful_student_login_relogin(self, m):
+        """
+        Ensure we can login
+        """
+
+        m.post('https://api.cs.ui.ac.id/authentication/ldap/v2/', json={
+                "username": "dummy.mahasiswa",
+                "nama": "Dummy Mahasiswa",
+                "state": 1,
+                "kode_org": "01.00.12.01:mahasiswa",
+                "kodeidentitas": "1234567890",
+                "nama_role": "mahasiswa"
+        }, status_code=200)
+
+        url = '/api/login/'
+
+        response = self.client.post(url, { 'username' : 'dummy.mahasiswa', 'password' : 'lalala', 'login-type' : 'sso-ui'}, format='json')
+        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+
+        response = self.client.post(url, {'username': 'dummy.mahasiswa', 'password': 'lalala', 'login-type': 'sso-ui'}, format='json')
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+
+    @requests_mock.Mocker()
+    def test_successful_supervisor_login_relogin(self, m):
+        m.post('https://api.cs.ui.ac.id/authentication/ldap/v2/', json={
+            "username": "dummy.dosen",
+            "nama": "Dummy Dosen",
+            "state": 1,
+            "kode_org": "01.00.12.01:dosen",
+            "kodeidentitas": "1234567891",
+            "nama_role": "dosen"
+        }, status_code=200)
+
+        url = '/api/login/'
+        response = self.client.post(url, {'username': 'dummy.dosen', 'password': 'lalala', 'login-type': 'sso-ui'}, format='json')
+        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+
+        response = self.client.post(url, {'username': 'dummy.dosen', 'password': 'lalala', 'login-type': 'sso-ui'}, format='json')
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+
+    @requests_mock.Mocker()
+    def test_failed_sso_login(self, m):
+        m.post('https://api.cs.ui.ac.id/authentication/ldap/v2/', json={
+            "state": 0
+        }, status_code=200)
+
+        url = '/api/login/'
+        response = self.client.post(url, {'username': 'dummy.salah', 'password': 'lalala', 'login-type': 'sso-ui'}, format='json')
+        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
+
+    def test_failed_company_login(self):
+        url = '/api/login/'
+        response = self.client.post(url, {'username': 'dummy.company.failed', 'password': 'lalala', 'login-type': 'company'}, format='json')
+        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
+
+    def test_success_company_login(self):
+        new_user = User.objects.create_user('dummy.login.company', 'dummy.login.company@company.com', 'lalala123')
+        new_company = Company.objects.create(user=new_user, description="lalalala", verified=True, logo=None, alamat=None)
+
+        url = '/api/login/'
+        response = self.client.post(url, {'username': 'dummy.login.company', 'password': 'lalala123', 'login-type': 'company'}, format='json')
+        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
+
+    def test_bad_request(self):
+        url = '/api/login/'
+        response = self.client.post(url, {'uesrname': 'lalala'}, format='json')
+        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
\ No newline at end of file
diff --git a/core/tests/test_login.py b/core/tests/test_login.py
deleted file mode 100644
index 4ea35329..00000000
--- a/core/tests/test_login.py
+++ /dev/null
@@ -1,53 +0,0 @@
-import requests_mock
-from rest_framework import status
-from rest_framework.test import APITestCase
-
-class LoginTests(APITestCase):
-
-    @requests_mock.Mocker()
-    def test_login(self, m):
-        """
-        Ensure we can login
-        """
-
-        m.post('https://api.cs.ui.ac.id/authentication/ldap/v2/', [{'json': {
-                "username": "dummy.mahasiswa",
-                "nama": "Dummy Mahasiswa",
-                "state": 1,
-                "kode_org": "01.00.12.01:mahasiswa",
-                "kodeidentitas": "1234567890",
-                "nama_role": "mahasiswa"
-            }, 'status_code': 200}, {'json': {
-                "username": "dummy.mahasiswa",
-                "nama": "Dummy Mahasiswa",
-                "state": 1,
-                "kode_org": "01.00.12.01:mahasiswa",
-                "kodeidentitas": "1234567890",
-                "nama_role": "mahasiswa"
-            }, 'status_code': 200}, {'json': {
-                "username": "dummy.dosen",
-                "nama": "Dummy Dosen",
-                "state": 1,
-                "kode_org": "01.00.12.01:dosen",
-                "kodeidentitas": "1234567820",
-                "nama_role": "dosen"
-            }, 'status_code': 200}, {'json': {
-                "state": 0
-            }, 'status_code': 200}])
-
-        url = '/api/login/'
-        response = self.client.post(url, { 'username' : 'dummy.mahasiswa', 'password' : 'lalala', 'login-type' : 'sso-ui'}, format='json')
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
-
-        response = self.client.post(url, {'username': 'dummy.mahasiswa', 'password': 'lalala', 'login-type': 'sso-ui'},
-                                    format='json')
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
-
-        response = self.client.post(url, {'username': 'dummy.dosen', 'password': 'lalala', 'login-type': 'sso-ui'}, format='json')
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
-
-        response = self.client.post(url, {'username': 'dummy.salah', 'password': 'lalala', 'login-type': 'sso-ui'}, format='json')
-        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
-
-        response = self.client.post(url, {'username': 'dummy.perusahaan.salah', 'password': 'lalala', 'login-type': 'perusahaan'}, format='json')
-        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
diff --git a/core/tests/test_vacancies.py b/core/tests/test_vacancies.py
new file mode 100644
index 00000000..a8f718e1
--- /dev/null
+++ b/core/tests/test_vacancies.py
@@ -0,0 +1,113 @@
+from datetime import datetime
+import requests_mock
+from rest_framework import status
+from rest_framework.test import APITestCase
+from django.contrib.auth.models import User
+from core.models.accounts import Company
+from core.models.vacancies import Vacancy
+
+class ApplicationTests(APITestCase):
+
+    @requests_mock.Mocker()
+    def test_application_list(self, m):
+        m.post('https://api.cs.ui.ac.id/authentication/ldap/v2/', json={
+            "username": "dummy.mahasiswa",
+            "nama": "Dummy Mahasiswa",
+            "state": 1,
+            "kode_org": "01.00.12.01:mahasiswa",
+            "kodeidentitas": "1234567890",
+            "nama_role": "mahasiswa"
+        }, status_code=200)
+
+        url = '/api/login/'
+
+        response = self.client.post(url, {'username': 'dummy.mahasiswa', 'password': 'lalala', 'login-type': 'sso-ui'}, format='json')
+        student_id = response.data.get('student').get('id')
+
+        url = '/api/students/' + str(student_id) + '/applications/'
+        response = self.client.get(url)
+
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+
+
+    @requests_mock.Mocker()
+    def test_application_create_and_delete(self, m):
+        m.post('https://api.cs.ui.ac.id/authentication/ldap/v2/', json={
+            "username": "dummy.mahasiswa",
+            "nama": "Dummy Mahasiswa",
+            "state": 1,
+            "kode_org": "01.00.12.01:mahasiswa",
+            "kodeidentitas": "1234567890",
+            "nama_role": "mahasiswa"
+        }, status_code=200)
+
+        url = '/api/login/'
+
+        response = self.client.post(url, {'username': 'dummy.mahasiswa', 'password': 'lalala', 'login-type': 'sso-ui'},
+                                    format='json')
+        student_id = response.data.get('student').get('id')
+
+        new_user = User.objects.create_user('dummy.company', 'dummy.company@company.com', 'lalala123')
+        new_company = Company.objects.create(user=new_user, description="lalala",verified=True,logo=None,alamat=None)
+        new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(0), description="lalala", close_time=datetime.today())
+
+        url = '/api/students/' + str(student_id) + '/applications/'
+        response = self.client.post(url, {'vacancy_id' : new_vacancy.pk}, format='json')
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+
+        url = '/api/students/' + str(student_id) + '/applications/' + str(new_vacancy.pk) + '/'
+        response = self.client.delete(url)
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+
+class BookmarkApplicationTests(APITestCase):
+
+    @requests_mock.Mocker()
+    def test_application_list(self, m):
+        m.post('https://api.cs.ui.ac.id/authentication/ldap/v2/', json={
+            "username": "dummy.mahasiswa",
+            "nama": "Dummy Mahasiswa",
+            "state": 1,
+            "kode_org": "01.00.12.01:mahasiswa",
+            "kodeidentitas": "1234567890",
+            "nama_role": "mahasiswa"
+        }, status_code=200)
+
+        url = '/api/login/'
+
+        response = self.client.post(url, {'username': 'dummy.mahasiswa', 'password': 'lalala', 'login-type': 'sso-ui'}, format='json')
+        student_id = response.data.get('student').get('id')
+
+        url = '/api/students/' + str(student_id) + '/bookmarked-vacancies/'
+        response = self.client.get(url)
+
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+
+
+    @requests_mock.Mocker()
+    def test_application_create_and_delete(self, m):
+        m.post('https://api.cs.ui.ac.id/authentication/ldap/v2/', json={
+            "username": "dummy.mahasiswa",
+            "nama": "Dummy Mahasiswa",
+            "state": 1,
+            "kode_org": "01.00.12.01:mahasiswa",
+            "kodeidentitas": "1234567890",
+            "nama_role": "mahasiswa"
+        }, status_code=200)
+
+        url = '/api/login/'
+
+        response = self.client.post(url, {'username': 'dummy.mahasiswa', 'password': 'lalala', 'login-type': 'sso-ui'},
+                                    format='json')
+        student_id = response.data.get('student').get('id')
+
+        new_user = User.objects.create_user('dummy.company', 'dummy.company@company.com', 'lalala123')
+        new_company = Company.objects.create(user=new_user, description="lalala",verified=True,logo=None,alamat=None)
+        new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(0), description="lalala", close_time=datetime.today())
+
+        url = '/api/students/' + str(student_id) + '/bookmarked-vacancies/'
+        response = self.client.post(url, {'vacancy_id' : new_vacancy.pk}, format='json')
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+
+        url = '/api/students/' + str(student_id) + '/bookmarked-vacancies/' + str(new_vacancy.pk) + '/'
+        response = self.client.delete(url)
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
-- 
GitLab