diff --git a/authentication/templates/login.html b/authentication/templates/login.html
index 165806054bc0a0223c3b68ffc4effdfe6dea25d8..0dfae589ed5969411d1930b21e24b16e1fc0267b 100644
--- a/authentication/templates/login.html
+++ b/authentication/templates/login.html
@@ -38,7 +38,8 @@
         <div class="container-login100">
 
             <div class="wrap-login100">
-                <form class="login100-form validate-form">
+                <form class="login100-form validate-form" method="POST">
+                    {% csrf_token %}
 
                     <div class="login100-form-title p-b-43">
                         Halo, kontributor
@@ -70,7 +71,7 @@
 
 
                     <div class="container-login100-form-btn">
-                        <button class="login100-form-btn">
+                        <button class="login100-form-btn" type="submit">
                             Login
                         </button>
                     </div>
diff --git a/authentication/templates/login_admin.html b/authentication/templates/login_admin.html
index 02b0f3b96a587f5cfbcbd9e108c7d87e4f005b5f..b5bce529229dab01f053404646575ace9b3cebc6 100644
--- a/authentication/templates/login_admin.html
+++ b/authentication/templates/login_admin.html
@@ -52,33 +52,35 @@
                     </div>
 
                     <div class="work_info">
-
-                        <div class="login100-form-title p-b-43">
-                            Halo, Admin
-                        </div>
-
-                        <div class="wrap-input100 validate-input" data-validate="Valid email is required: ex@abc.xyz">
-                            <input class="input100" type="text" name="email">
-                            <span class="focus-input100"></span>
-                            <span class="label-input100">Email</span>
-                        </div>
-                        
-                        
-                        <div class="wrap-input100 validate-input" data-validate="Password is required">
-                            <input class="input100" type="password" name="pass">
-                            <span class="focus-input100"></span>
-                            <span class="label-input100">Kata Sandi</span>
-                        </div>
-
-                        <br>
-                        </br>
-
-                        <div class="container-login100-form-btn">
-                            <button class="login100-form-btn">
-                                Login
-                            </button>
-                        </div>
-
+                        <form class="login100-form validate-form" method="POST">
+                            {% csrf_token %}
+
+                            <div class="login100-form-title p-b-43">
+                                Halo, Admin
+                            </div>
+
+                            <div class="wrap-input100 validate-input" data-validate="Valid email is required: ex@abc.xyz">
+                                <input class="input100" type="text" name="email">
+                                <span class="focus-input100"></span>
+                                <span class="label-input100">Email</span>
+                            </div>
+                            
+                            
+                            <div class="wrap-input100 validate-input" data-validate="Password is required">
+                                <input class="input100" type="password" name="pass">
+                                <span class="focus-input100"></span>
+                                <span class="label-input100">Kata Sandi</span>
+                            </div>
+
+                            <br>
+                            </br>
+
+                            <div class="container-login100-form-btn">
+                                <button class="login100-form-btn" type="submit">
+                                    Login
+                                </button>
+                            </div>
+                        </form>
                     </div>
                 </div>
             </div>
diff --git a/authentication/tests.py b/authentication/tests.py
index 90c8717d97ea474b097df5895aae4d1495c33d20..484663e49ed4cc03ad186eac46a1ab91b6501cfd 100644
--- a/authentication/tests.py
+++ b/authentication/tests.py
@@ -2,17 +2,16 @@ from django.test import TestCase, Client, RequestFactory
 from django.urls import resolve
 from authentication.views import Login
 from authentication.models import User
-from .views import login_admin
 
-class LoginPageTest(TestCase):
+class LoginPageContributorTest(TestCase):
     def setUp(self):
-        User.objects._create_user(email="alice@acme.com", password="acmecorp")
+        User.objects._create_user(email="alice@acme.com", password="acmecorp", is_contributor=True)
 
-    def test_login_using_login_func(self):
+    def test_login_contributor_using_login_func(self):
         found = resolve('/login/')
         self.assertEqual(found.func.__name__, Login.as_view().__name__)
 
-    def test_login_url_is_exist(self):
+    def test_login_contributor_url_is_exist(self):
         # Positive tests
         response = Client().get('/login/')
         self.assertEqual(response.status_code, 200)
@@ -21,6 +20,12 @@ class LoginPageTest(TestCase):
         response = Client().get('/fake/')
         self.assertEqual(response.status_code, 404)
     
+    def test_login_contributor_template(self):
+        url = "/login/"
+        response = Client().get(url)
+        expected_template_name = "login.html"
+        self.assertTemplateUsed(response, expected_template_name)
+
     def test_register_title(self):
         response = Client().get('/login/')
 
@@ -129,42 +134,72 @@ class UserModelTest(TestCase):
         self.assertTrue(superuser.is_superuser)
 
 
-class Login_AdminPageTest(TestCase):
-    def test_register_url_is_exist(self):
-        # Positive tests
-        response = Client().get('/login_admin/')
-        self.assertEqual(response.status_code, 200)
-
-        # Negative tests
-        response = Client().get('/fake/')
-        self.assertEqual(response.status_code, 404)
+class LoginPageAdminTest(TestCase):
+    def setUp(self):
+        User.objects._create_user(email="alice@acme.com", password="acmecorp", is_admin=True)
 
-    def test_status_using_index_func(self):
-        # Positive tests
+    def test_login_admin_using_login_func(self):
         found = resolve('/login_admin/')
-        self.assertEqual(found.func, login_admin)
+        self.assertEqual(found.func.__name__, Login.as_view().__name__)
 
-        # Negative tests
-        found = resolve('/admin/')
-        self.assertNotEqual(found.func, login_admin)
+    def test_login_admin_template(self):
+        url = "/login_admin/"
+        response = Client().get(url)
+        expected_template_name = "login_admin.html"
+        self.assertTemplateUsed(response, expected_template_name)
+        
+    def test_login_admin_url_is_exist(self):
+        # Positive tests
+        response = Client().get('/login_admin/')
+        self.assertEqual(response.status_code, 200)
     
     def test_register_title(self):
         response = Client().get('/login_admin/')
 
         # Positive tests
-        self.assertContains(response, 'Login Admin')
+        self.assertContains(response, 'Halo, Admin')
 
-        # Negative tests
-        self.assertNotContains(response, 'Fake Title')
-
-    def test_register_form_field(self):
+    def test_login_admin_form_field(self):
         response = Client().get('/login_admin/')
 
         # Positive tests
         self.assertContains(response, 'Email')
-        self.assertContains(response, 'Password')
+        self.assertContains(response, 'Kata Sandi')
 
-        # Negative tests
-        self.assertNotContains(response, 'Jenis Kelamin')
+    def test_user_login_missing_email_or_password(self):
+        response = Client().post('/login_admin/', {'email': 'alice@acme.com'})
+        self.assertIn('error_message', response.context_data)
+        self.assertIn("Email atau Password anda kosong.",
+                      response.context_data['error_message'])
+        response = Client().post('/login_admin/', {'pass': 'acmecorp'})
+        self.assertIn('error_message', response.context_data)
+        self.assertIn("Email atau Password anda kosong.",
+                      response.context_data['error_message'])
+
+    def test_user_login_wrong_email_or_password(self):
+        # Wrong password
+        response = Client().post(
+            '/login_admin/', {'email': 'alice@acme.com', 'pass': 'acmeindustry'})
+        self.assertIn('error_message', response.context_data)
+        self.assertIn("Email atau Password anda salah.",
+                      response.context_data['error_message'])
+        # Wrong email
+        response = Client().post(
+            '/login_admin/', {'email': 'alice@acme.co.id', 'pass': 'acmecorp'})
+        self.assertIn('error_message', response.context_data)
+        self.assertIn("Email atau Password anda salah.",
+                      response.context_data['error_message'])
+        # Wrong email and password
+        response = Client().post(
+            '/login_admin/', {'email': 'alice@acme.co.id', 'pass': 'acmeindustry'})
+        self.assertIn('error_message', response.context_data)
+        self.assertIn("Email atau Password anda salah.",
+                      response.context_data['error_message'])
+
+    def test_user_login(self):
+        # 302 meaning successful login and redirected
+        response = Client().post(
+            '/login_admin/', {'email': 'alice@acme.com', 'pass': 'acmecorp'})
+        self.assertEqual(302, response.status_code)
 
         
\ No newline at end of file
diff --git a/authentication/urls.py b/authentication/urls.py
index 49a16496c930193f30eab4451e4b9142b71cc970..6510358ff91953d94950fb2196a7658d4a09e493 100644
--- a/authentication/urls.py
+++ b/authentication/urls.py
@@ -1,9 +1,9 @@
 from django.urls import path
-from authentication.views import Login, login_admin
+from authentication.views import Login
 from django.contrib.auth.views import LogoutView
 
 urlpatterns = [
-    path('login/', Login.as_view()),
-    path('login_admin/', login_admin, name='login_admin'),
+    path('login/', Login.as_view(), name='login_admin'),
+    path('login_admin/', Login.as_view(), name='login_admin'),
     path('logout/', LogoutView.as_view()),
 ]
\ No newline at end of file
diff --git a/authentication/views.py b/authentication/views.py
index ae28b170bb98308a3feeedf9db26a745fb70c02b..a0189ebab1b8c683d775f772ba57d7af0409b6df 100644
--- a/authentication/views.py
+++ b/authentication/views.py
@@ -6,7 +6,13 @@ from django.contrib.auth.views import LogoutView
 
 
 class Login(TemplateView):
-    template_name = 'login.html'
+
+    def get_template_names(self):
+        if self.request.path == '/login_admin/':
+            template_name = 'login_admin.html'
+        else:
+            template_name = 'login.html'
+        return template_name
 
     def get_context_data(self, *args, **kwargs):
         context = super().get_context_data(**kwargs)
@@ -33,7 +39,3 @@ class Login(TemplateView):
                 context = self.get_context_data(*args, **kwargs)
                 context["error_message"] = "Email atau Password anda salah."
                 return self.render_to_response(context=context)
-
-# Create your views here.
-def login_admin(request):
-    return render(request, 'login_admin.html')
diff --git a/static/css/main.css b/static/css/main.css
index 5b6cb549af4f995c451a98dad560dbb1bbe9bea7..9c391d674c7dba1b166775d637c900089d83b0d7 100644
--- a/static/css/main.css
+++ b/static/css/main.css
@@ -260,7 +260,7 @@ iframe {
   min-height: 100vh;
   display: block;
   background-color: #f7f7f7;
-  padding: 100px 55px 55px 55px;
+  padding: 173px 55px 55px 55px;
 }
 
 .login100-form-title {