diff --git a/app/templates/sunting.html b/app/templates/sunting.html
index 173e366e51418d55d17a77e72adb4a7f6924e5b5..62171b1654cd60c9c9a1b262ccba0289578b65c4 100644
--- a/app/templates/sunting.html
+++ b/app/templates/sunting.html
@@ -8,7 +8,15 @@
{% block content %}
-
Sunting Profil {% if user.is_admin %}Admin{% else %}Kontributor{% endif %}
+
+ {% if user.is_admin %}
+ Sunting Profil Admin
+ {% elif user.is_contributor %}
+ Sunting Profil Kontributor
+ {% else %}
+ Sunting Profil User
+ {% endif %}
+
diff --git a/authentication/tests.py b/authentication/tests.py
index ae7a2f85b99d7f095ed7b0ceaae84984113965fc..53548571ea64e4026f9600d1f73b80c2b20c0393 100644
--- a/authentication/tests.py
+++ b/authentication/tests.py
@@ -105,7 +105,7 @@ class LoginPageContributorTest(TestCase):
response = self.client.get(self.url)
# Positive tests
- self.assertContains(response, "Halo, kontributor")
+ self.assertContains(response, "Selamat Datang")
def test_login_kontributor_form_field(self):
response = self.client.get(self.url)
@@ -265,6 +265,106 @@ class LoginPageAdminTest(TestCase):
self.assertEqual(response.url, expected_redirect_url)
+class LoginPagePublicTest(TestCase):
+ def setUp(self):
+ self.client = Client()
+ self.public = User.objects.create_user(email="public@gov.id",
+ password="Publ1c")
+ self.url = "/login/"
+ self.view = Login
+ self.template_name = "login.html"
+ self.login_credential = {
+ "email": "public@gov.id", "pass": "Publ1c", "g-recaptcha-response" : "testcaptcha"}
+ self.error_message = {
+ "empty_email_or_password": "Email atau Password anda kosong.",
+ "wrong_email_or_password": "Email atau Password anda salah.",
+ }
+
+ def test_login_public_view(self):
+ found = resolve(self.url)
+ self.assertEqual(found.func.__name__, self.view.as_view().__name__)
+
+ def test_login_public_template(self):
+ # Test
+ response = self.client.get(self.url)
+ self.assertTemplateUsed(response, self.template_name)
+
+ def test_login_public_url(self):
+ # Test
+ response = self.client.get(self.url)
+ self.assertEqual(response.status_code, 200)
+
+ def test_login_public_title(self):
+ response = self.client.get(self.url)
+
+ # Positive tests
+ self.assertContains(response, "Selamat Datang")
+
+ def test_login_public_form_field(self):
+ response = self.client.get(self.url)
+
+ # Positive tests
+ self.assertContains(response, "Email")
+ self.assertContains(response, "Kata Sandi")
+
+ def test_public_login_missing_email_or_password(self):
+ response = self.client.post(self.url, {"email": "public@gov.id", "g-recaptcha-response" : "testcaptcha"})
+ self.assertIn("error_message", response.context_data)
+ self.assertIn(self.error_message["empty_email_or_password"],
+ response.context_data["error_message"])
+ response = self.client.post(self.url, {"pass": "public", "g-recaptcha-response" : "testcaptcha"})
+ self.assertIn("error_message", response.context_data)
+ self.assertIn(self.error_message["empty_email_or_password"],
+ response.context_data["error_message"])
+
+ def test_public_login_wrong_email_or_password(self):
+ # Wrong password
+ response = self.client.post(
+ self.url, {"email": "public@gov.id", "pass": "public1", "g-recaptcha-response" : "testcaptcha"})
+ self.assertIn("error_message", response.context_data)
+ self.assertIn(self.error_message["wrong_email_or_password"],
+ response.context_data["error_message"])
+ # Wrong email
+ response = self.client.post(
+ self.url, {"email": "public1@gov.id", "pass": "public", "g-recaptcha-response" : "testcaptcha"})
+ self.assertIn("error_message", response.context_data)
+ self.assertIn(self.error_message["wrong_email_or_password"],
+ response.context_data["error_message"])
+ # Wrong email and password
+ response = self.client.post(
+ self.url, {"email": "public1@gov.id", "pass": "public1", "g-recaptcha-response" : "testcaptcha"})
+ self.assertIn("error_message", response.context_data)
+ self.assertIn(self.error_message["wrong_email_or_password"],
+ response.context_data["error_message"])
+
+ def test_public_login(self):
+ # 302 meaning successful login and redirected
+ expected_redirect_url = "/"
+ response = self.client.post(
+ self.url, self.login_credential)
+ self.assertEqual(302, response.status_code)
+ self.assertEqual(response.url, expected_redirect_url)
+
+ def test_login_has_next_query_string(self):
+ next_querystring = "?next=/forum/discussion/create"
+ response = self.client.post(self.url + next_querystring, self.login_credential)
+ self.assertEqual(response.status_code, 302)
+ self.assertEqual(response.url, "/forum/discussion/create")
+
+ def test_public_visit_login_after_auth(self):
+ # 302 meaning successful login and redirected
+ expected_redirect_url = "/"
+ response = self.client.post(
+ self.url, self.login_credential)
+ self.assertEqual(302, response.status_code)
+ self.assertEqual(response.url, expected_redirect_url)
+ response = self.client.get(
+ self.url
+ )
+ self.assertEqual(302, response.status_code)
+ self.assertEqual(response.url, expected_redirect_url)
+
+
class TokenLoginTest(TestCase):
def setUp(self):
self.client = Client()
diff --git a/forum/tests.py b/forum/tests.py
index 2705e0b0303a3f33832b0247a6da98f27abd61ba..2f6f0ea4604266f93c3e227a22a360b89b105b00 100644
--- a/forum/tests.py
+++ b/forum/tests.py
@@ -1,3 +1,4 @@
+import time
from unittest import mock
from django.core.exceptions import ObjectDoesNotExist
@@ -72,6 +73,8 @@ class DiscussionModelTest(TestCase):
discussion.save()
discussion.title = 'Discussion after update'
+
+ time.sleep(0.1)
mock_time = timezone.now()
with mock.patch(TIME_ZONE_MODULE, mock.Mock(return_value=mock_time)):
@@ -145,6 +148,8 @@ class DiscussionCommentModelTest(TestCase):
discussion_comment.save()
discussion_comment.description = 'Discussion Comment after update'
+
+ time.sleep(0.1)
mock_time = timezone.now()
with mock.patch(TIME_ZONE_MODULE, mock.Mock(return_value=mock_time)):
diff --git a/register/services.py b/register/services.py
index 7f01dd0a499c851a4f323ab8f36bbfdf144473bd..5786c9a6bd1abbefbeb0ca27adf666404e2e734f 100644
--- a/register/services.py
+++ b/register/services.py
@@ -46,4 +46,25 @@ class RegistrationService:
form.add_error('password', e)
create_result["form"] = form
- return create_result
\ No newline at end of file
+ return create_result
+
+
+ @staticmethod
+ def create_new_public_user(data, form):
+ create_result = dict()
+ create_result["success"] = True
+ new_user = form.save(commit=False)
+
+ try:
+ password = form.cleaned_data['password']
+ validate_password(password, new_user)
+
+ new_user.password = make_password(data["password"])
+ new_user.save()
+ create_result["user"] = new_user
+ except ValidationError as e:
+ create_result["success"] = False
+ form.add_error('password', e)
+ create_result["form"] = form
+
+ return create_result
diff --git a/register/templates/index_umum.html b/register/templates/index_umum.html
new file mode 100644
index 0000000000000000000000000000000000000000..792c676faf603769a6723620270260af2b5931fa
--- /dev/null
+++ b/register/templates/index_umum.html
@@ -0,0 +1,137 @@
+{% load static %}
+
+
+
+
+
+
+
Registrasi Umum
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/register/tests.py b/register/tests.py
index c4d4a0b73e3af11f4db86f8d05864ca596787d2a..ef8205860cad0b4362a48bf9b5c1b7634595d772 100644
--- a/register/tests.py
+++ b/register/tests.py
@@ -598,4 +598,288 @@ class RegisterAdminTest(TestCase):
},
)
self.assertEqual(User.objects.all().count(), 0)
- self.assertIn(b"Password must have at least 8 characters", response.content)
\ No newline at end of file
+ self.assertIn(b"Password must have at least 8 characters", response.content)
+
+class RegisterPublicTest(TestCase):
+
+ def setUp(self):
+ self.client = Client()
+ self.password = "Passw0rd!"
+ self.reg_path = "/registrasi/umum/"
+
+ def test_register_url_is_exist(self):
+ # Positive tests
+ response = Client().get(self.reg_path)
+ self.assertEqual(response.status_code, 200)
+
+ # Negative tests
+ response = Client().get("/fake/")
+ self.assertEqual(response.status_code, 404)
+
+ def test_status_using_index_func(self):
+ # Positive tests
+ found = resolve(self.reg_path)
+ self.assertEqual(found.func.__name__, views.RegistrasiUmum.__name__)
+
+ # Negative tests
+ found = resolve("/admin/")
+ self.assertNotEqual(found.func, views.index)
+
+ def test_register_title(self):
+ response = Client().get(self.reg_path)
+
+ # Positive tests
+ self.assertContains(response, "Registrasi Umum")
+
+ # Negative tests
+ self.assertNotContains(response, "Fake Title")
+
+ def test_register_form_field(self):
+ response = Client().get(self.reg_path)
+
+ # Positive tests
+ self.assertContains(response, "Nama")
+ self.assertContains(response, "Instansi/Pekerjaan")
+ self.assertContains(response, "NIK")
+ self.assertContains(response, "Alamat")
+ self.assertContains(response, "Email")
+ self.assertContains(response, "Nomor Telepon")
+ self.assertContains(response, "Kata Sandi")
+ self.assertContains(response, "Ketik Ulang Kata Sandi")
+
+ # Negative tests
+ self.assertNotContains(response, "Jenis Kelamin")
+
+ def test_create_user(self):
+ self.client.post(
+ self.reg_path,
+ {
+ "name": "bob",
+ "instansi": "university",
+ "nik": "3201234567890001",
+ "alamat": "bekasi",
+ "email": "bob@company.com",
+ "nomor_telpon": "087878726602",
+ "password": self.password,
+ "password2": self.password,
+ },
+ )
+ self.assertEqual(User.objects.all().count(), 1)
+
+ def test_create_user_wrong_password_combination(self):
+ response = self.client.post(
+ self.reg_path,
+ {
+ "name": "bob",
+ "instansi": "university",
+ "nik": "3201234567890001",
+ "alamat": "bekasi",
+ "email": "bob@company.com",
+ "nomor_telpon": "087878726602",
+ "password": self.password,
+ "password2": "different passwd",
+ },
+ )
+ self.assertEqual(User.objects.all().count(), 0)
+ self.assertIn(b"Password tidak sama", response.content)
+
+ def test_create_user_with_existing_email(self):
+ response = self.client.post(
+ self.reg_path,
+ {
+ "name": "bob",
+ "instansi": "university",
+ "nik": "3201234567890001",
+ "alamat": "bekasi",
+ "email": "bob@company.com",
+ "nomor_telpon": "087878726602",
+ "password": self.password,
+ "password2": self.password,
+ },
+ )
+ self.assertEqual(User.objects.all().count(), 1)
+ response = self.client.post(
+ self.reg_path,
+ {
+ "name": "bob",
+ "instansi": "university",
+ "nik": "3201234567890001",
+ "alamat": "bekasi",
+ "email": "bob@company.com",
+ "nomor_telpon": "087878726602",
+ "password": self.password,
+ "password2": self.password,
+ },
+ )
+ self.assertEqual(User.objects.all().count(), 1)
+ self.assertIn(
+ b"Email sudah digunakan untuk mendaftar akun.", response.content)
+
+ def test_create_user_with_existing_nik(self):
+ response = self.client.post(
+ self.reg_path,
+ {
+ "name": "bob",
+ "instansi": "university",
+ "nik": "3201234567890001",
+ "alamat": "bekasi",
+ "email": "bob@company.com",
+ "nomor_telpon": "087878726601",
+ "password": self.password,
+ "password2": self.password,
+ },
+ )
+ self.assertEqual(User.objects.all().count(), 1)
+
+ response = self.client.post(
+ self.reg_path,
+ {
+ "name": "budi",
+ "instansi": "university",
+ "nik": "3201234567890001",
+ "alamat": "bekasi",
+ "email": "budi@company.com",
+ "nomor_telpon": "087878726602",
+ "password": self.password,
+ "password2": self.password,
+ },
+ )
+ self.assertEqual(User.objects.all().count(), 1)
+ self.assertIn(
+ b"NIK sudah digunakan untuk mendaftar akun", response.content)
+
+ def test_create_user_with_existing_nomor_telpon(self):
+ response = self.client.post(
+ self.reg_path,
+ {
+ "name": "bob",
+ "instansi": "university",
+ "nik": "3201234567890001",
+ "alamat": "bekasi",
+ "email": "bob@company.com",
+ "nomor_telpon": "087878726602",
+ "password": self.password,
+ "password2": self.password,
+ },
+ )
+ self.assertEqual(User.objects.all().count(), 1)
+
+ response = self.client.post(
+ self.reg_path,
+ {
+ "name": "budi",
+ "instansi": "university",
+ "nik": "3201234567890002",
+ "alamat": "bekasi",
+ "email": "budi@company.com",
+ "nomor_telpon": "087878726602",
+ "password": self.password,
+ "password2": self.password,
+ },
+ )
+ self.assertEqual(User.objects.all().count(), 1)
+ self.assertIn(
+ b"Nomor telepon sudah digunakan untuk mendaftar akun", response.content)
+
+ def test_create_user_input_wrong_phone_number_format(self):
+ response = self.client.post(
+ self.reg_path,
+ {
+ "name": "bob",
+ "instansi": "university",
+ "nik": "3201234567890001",
+ "alamat": "bekasi",
+ "email": "bob@company.com",
+ "nomor_telpon": "abcdefghijkl",
+ "password": self.password,
+ "password2": self.password,
+ },
+ )
+ self.assertEqual(User.objects.all().count(), 0)
+ self.assertIn(b"Hanya masukkan angka", response.content)
+
+ def test_create_user_weak_password_no_lowercase(self):
+ response = self.client.post(
+ self.reg_path,
+ {
+ "name": "bob",
+ "instansi": "university",
+ "nik": "3201234567890001",
+ "alamat": "bekasi",
+ "email": "bob@company.com",
+ "nomor_telpon": "087878726602",
+ "password": "PASSW0RD!",
+ "password2": "PASSW0RD!",
+ },
+ )
+ self.assertEqual(User.objects.all().count(), 0)
+ self.assertIn(b"Password must contain at least 1 lowercase letter", response.content)
+
+ def test_create_user_weak_password_no_uppercase(self):
+ response = self.client.post(
+ self.reg_path,
+ {
+ "name": "bob",
+ "instansi": "university",
+ "nik": "3201234567890001",
+ "alamat": "bekasi",
+ "email": "bob@company.com",
+ "nomor_telpon": "087878726602",
+ "password": "passw0rd!",
+ "password2": "passw0rd!",
+ },
+ )
+ self.assertEqual(User.objects.all().count(), 0)
+ self.assertIn(b"Password must contain at least 1 uppercase letter", response.content)
+
+ def test_create_user_weak_password_no_special_char(self):
+ response = self.client.post(
+ self.reg_path,
+ {
+ "name": "bob",
+ "instansi": "university",
+ "nik": "3201234567890001",
+ "alamat": "bekasi",
+ "email": "bob@company.com",
+ "nomor_telpon": "087878726602",
+ "password": "Passw0rd",
+ "password2": "Passw0rd",
+ },
+ )
+ self.assertEqual(User.objects.all().count(), 0)
+ self.assertIn(b"Password must contain at least 1 special letter", response.content)
+
+ def test_create_user_weak_password_no_number(self):
+ response = self.client.post(
+ self.reg_path,
+ {
+ "name": "bob",
+ "instansi": "university",
+ "nik": "3201234567890001",
+ "alamat": "bekasi",
+ "email": "bob@company.com",
+ "nomor_telpon": "087878726602",
+ "password": "Password!",
+ "password2": "Password!",
+ },
+ )
+ self.assertEqual(User.objects.all().count(), 0)
+ self.assertIn(b"Password must contain at least 1 number", response.content)
+
+ def test_create_user_weak_password_less_than_8_chars(self):
+ response = self.client.post(
+ self.reg_path,
+ {
+ "name": "bob",
+ "instansi": "university",
+ "nik": "3201234567890001",
+ "alamat": "bekasi",
+ "email": "bob@company.com",
+ "nomor_telpon": "087878726602",
+ "password": "P4ss!",
+ "password2": "P4ss!",
+ },
+ )
+ self.assertEqual(User.objects.all().count(), 0)
+ self.assertIn(b"Password must have at least 8 characters", response.content)
+
diff --git a/register/urls.py b/register/urls.py
index bcb8ff4261cb7a51b0226d2c59615df484f6c0f6..0acd03ba88ac4292c91e311da81766e4f8faf4e3 100644
--- a/register/urls.py
+++ b/register/urls.py
@@ -6,5 +6,6 @@ app_name = "register"
urlpatterns = [
path("", views.index.as_view()),
+ path("umum/", views.RegistrasiUmum.as_view()),
path("admin/", views.RegistrasiAdmin.as_view())
]
diff --git a/register/views.py b/register/views.py
index e9b3ca41a76600fbc0d5f714997f161cd11741ee..97c4e766c7c983141fc4ac3750fa88a43efeb28b 100644
--- a/register/views.py
+++ b/register/views.py
@@ -66,3 +66,34 @@ class RegistrasiAdmin(TemplateView):
context = self.get_context_data(**kwargs)
context["form"] = UserForm
return self.render_to_response(context=context)
+
+
+class RegistrasiUmum(TemplateView):
+ template_name = "index_umum.html"
+
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ return context
+
+ def post(self, request, *args, **kwargs):
+ data = request.POST.copy()
+ form = UserForm(request.POST)
+ if form.is_valid():
+ create_user_service = RegistrationService.create_new_public_user(data, form)
+ if not create_user_service["success"]:
+ context = self.get_context_data(**kwargs)
+ context["form"] = create_user_service["form"]
+ return self.render_to_response(context)
+
+ login(request, create_user_service["user"])
+ return HttpResponseRedirect("/")
+ else:
+ context = self.get_context_data(**kwargs)
+ context["form"] = form
+ return self.render_to_response(context)
+
+
+ def get(self, request, *args, **kwargs):
+ context = self.get_context_data(**kwargs)
+ context["form"] = UserForm
+ return self.render_to_response(context=context)