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 {