import json from io import StringIO from django.contrib.auth import get_user_model from django.core.exceptions import ValidationError from django.core.files.uploadedfile import SimpleUploadedFile from django.core.management import call_command from django.test import Client, RequestFactory, TestCase from django.db import IntegrityError from django.urls import resolve from administration.models import VerificationSetting, VerificationReport from administration.utils import id_generator from app.views import UploadMateriView from authentication.models import User from .models import Category, Comment, Materi, Like, Rating from .views import (DaftarKatalog, DashboardKontributorView, DetailMateri, ProfilKontributorView, SuksesLoginAdminView, SuksesLoginKontributorView, SuntingProfilView, ProfilAdminView, CommentsView, SuntingProfilAdminView, RevisiMateriView) from app.forms import SuntingProfilForm class DaftarKatalogTest(TestCase): def test_daftar_katalog_url_exist(self): url = "/" response = Client().get(f"{url}") self.assertEqual(response.status_code, 200) def test_daftar_katalog_using_daftar_katalog_template(self): response = Client().get("/") self.assertTemplateUsed(response, "app/katalog_materi.html") def test_daftar_katalog_using_daftar_katalog_func(self): found = resolve("/") self.assertEqual(found.func.__name__, DaftarKatalog.as_view().__name__) def test_fields(self): materi = Materi() materi.title = "tes" materi.cover = "https://cache.umusic.com/_sites/billieeilish/v2/images/pic-red.jpg" materi.author = "input" materi.save() resp = Materi.objects.get(id=materi.id) self.assertEqual(resp, materi) class DetailMateriTest(TestCase): def setUp(self): self.client = Client() self.admin_credential = { "email": "admin@gov.id", "password": "passwordtest" } self.contributor_credential = { "email": "kontributor@gov.id", "password": "passwordtest" } self.anonymous_credential = { "email": "anonymous@gov.id", "password": "passwordtest" } self.admin = get_user_model().objects.create_user( **self.admin_credential, name="Admin", is_admin=True) self.contributor = get_user_model().objects.create_user( **self.contributor_credential, name="Kontributor", is_contributor=True) self.anonymous = get_user_model().objects.create_user( **self.anonymous_credential, name="Anonymous" ) self.cover = SimpleUploadedFile( "Cherprang_Areekul40_nJM9dGt.jpg", b"Test file") self.content = SimpleUploadedFile("Bahan_PA_RKK.pdf", b"Test file") Materi(title="Materi 1", author="Agas", uploader=self.contributor, publisher="Kelas SC", descriptions="Deskripsi Materi 1", status="APPROVE", cover=self.cover, content=self.content).save() self.materi1 = Materi.objects.first() self.url = "/materi/" + str(self.materi1.id) + "/" def test_detail_materi_url_exist(self): response = Client().get(self.url) self.assertEqual(response.status_code, 200) self.assertNotEqual(response.status_code, 404) def test_detail_materi_using_detail_materi_template(self): response = Client().get(self.url) self.assertTemplateUsed(response, 'app/detail_materi.html') def test_detail_materi_using_detail_materi_func(self): found = resolve(self.url) self.assertEqual(found.func.__name__, DetailMateri.as_view().__name__) def test_category_models_can_create_new_object(self): test = Category.objects.create( id="1", name="medis", description="kategori medis") countData = Category.objects.all().count() self.assertEqual(1, countData) self.assertNotEqual(0, countData) self.assertEqual(test.__str__(), "medis") self.assertNotEqual(test.__str__(), "saul") def test_comment_models_can_create_new_object(self): test = Comment.objects.create( username="saul", profile="121212", comment="232323") countData = Comment.objects.all().count() self.assertEqual(1, countData) self.assertNotEqual(0, countData) self.assertEqual(test.__str__(), "saul") self.assertNotEqual(test.__str__(), "userlain") def test_post_blank_comment(self): url = self.url self.client.login(**self.anonymous_credential) response = self.client.post(url, {"comment": ""}) self.assertIn("error_message", response.context) self.assertIn("Anda belum menuliskan komentar", response.context["error_message"]) def test_comment_rendered_to_template(self): url = self.url self.client.login(**self.contributor_credential) self.client.post(url, {"comment": "This is my new comment"}) response = Client().get(url) self.assertContains(response, "This is my new comment") def test_comment_by_admin(self): url = self.url self.client.login(**self.admin_credential) self.client.post(url, {"comment": "This is new comment by Admin"}) response = self.client.get(url) self.assertContains(response, "Admin") def test_comment_by_kontributor(self): url = self.url self.client.login(**self.contributor_credential) self.client.post( url, {"comment": "This is new comment by Contributor"}) response = self.client.get(url) self.assertContains(response, "Kontributor") def test_comment_by_anonymous(self): url = self.url self.client.get("/logout/") self.client.login(**self.anonymous_credential) self.client.post(url, {"comment": "This is new comment by Anonymous"}) response = self.client.get(url) self.assertContains(response, "Anonymous") def test_detail_materi_contains_form_comment(self): response = self.client.get(self.url) self.assertContains(response, "Beri komentar...") def test_delete_comments_by_admin(self): url = self.url self.client.post(url, {"comment": "This is new comment by Anonymous"}) deleteURL = "/delete/" + str(self.materi1.id) + "/" + str( Comment.objects.get(comment="This is new comment by Anonymous").id) self.client.get(deleteURL) self.assertEqual(Comment.objects.all().filter( comment="This is new comment by Anonymous").count(), 0) class ViewCommentsTest(TestCase): def setUp(self): self.client = Client() self.contributor_credential = { "email": "kontributor@gov.id", "password": "passwordtest" } self.matt_damon_credential = { "email": "mattdamon@gov.id", "password": "passwordtest" } self.contributor = get_user_model().objects.create_user( **self.contributor_credential, name="Kontributor", is_contributor=True) self.mattDamon = get_user_model().objects.create_user( **self.matt_damon_credential, name="Matt Damon", is_contributor=True) self.cover = SimpleUploadedFile( "Cherprang_Areekul40_nJM9dGt.jpg", b"Test file") self.content = SimpleUploadedFile("Bahan_PA_RKK.pdf", b"Test file") Materi(title="Materi 1", author="Agas", uploader=self.contributor, publisher="Kelas SC", descriptions="Deskripsi Materi 1", status="APPROVE", cover=self.cover, content=self.content).save() Materi(title="Materi 2", author="Matt", uploader=self.mattDamon, publisher="Kelas SC", descriptions="Deskripsi Materi 2", status="APPROVE", cover=self.cover, content=self.content).save() self.materi1 = Materi.objects.first() self.materi2 = Materi.objects.get(uploader=self.mattDamon) self.commentByKontributor = Comment.objects.create(username='saul', comment="this is contributor comment", materi=self.materi1, user=self.contributor) self.commentByMatt = Comment.objects.create(username='saul', comment="this is Matt Damon", materi=self.materi2, user=self.mattDamon) self.url = '/kontributor/' + str(self.contributor.id) + '/comments/' def test_comments_url_exist(self): self.client.login(**self.contributor_credential) response = self.client.get(self.url) self.assertEqual(response.status_code, 200) self.assertNotEqual(response.status_code, 404) def test_comments_using_comments_template(self): self.client.login(**self.contributor_credential) response = self.client.get(self.url) self.assertTemplateUsed(response, 'comments.html') def test_comments_using_comments_func(self): self.client.login(**self.contributor_credential) found = resolve(self.url) self.assertEqual(found.func.__name__, CommentsView.as_view().__name__) def test_comments_page_render_comments(self): self.client.login(**self.contributor_credential) response = self.client.get(self.url) self.assertContains(response, "this is contributor comment") self.assertNotContains(response, 'bukan comment') def test_comments_page_only_render_specific_user_comments(self): self.client.login(**self.contributor_credential) response = self.client.get(self.url) self.assertContains(response, "this is contributor comment") self.assertNotContains(response, "this is Matt Damon") def test_comments_page_only_for_specific_contributor(self): self.client.login(**self.matt_damon_credential) response = self.client.get(self.url) self.assertEqual(response.status_code, 403) self.assertNotEqual(response.status_code, 200) class TemplateLoaderTest(TestCase): def test_template_loader_url_exist(self): url = "/test-page.html" response = Client().get(url) self.assertEqual(response.status_code, 200) def test_template_loader_using_template_loader_template(self): url = "/test-page.html" response = Client().get(url) expected_template_name = "test-page.html" self.assertTemplateUsed(response, expected_template_name) def test_template_loader_using_template_loader_func(self): url = "/test-page.html" found = resolve(url) expected_view_name = "pages" self.assertEqual(found.func.__name__, expected_view_name) def test_template_loader_handle_non_existent_html(self): url = "/test.html" expected_template_name = "error-404.html" response = Client().get(url) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, expected_template_name) class UploadPageTest(TestCase): def setUp(self): self.client = Client() self.user = User.objects._create_user(email="kontributor@gov.id", password="kontributor", is_contributor=True) def test_upload_page_using_login_func(self): found = resolve("/unggah/") self.assertEqual(found.func.__name__, UploadMateriView.as_view().__name__) def test_uplaod_page_url_is_exist(self): # Positive test self.client.login(email="kontributor@gov.id", password="kontributor") response = self.client.get("/unggah/") self.assertEqual(response.status_code, 200) # Negative tests self.client.login(email="kontributor@gov.id", password="kontributor") response = Client().get("/fake/") self.assertEqual(response.status_code, 404) def test_upload_page_template(self): url = "/unggah/" self.client.login(email="kontributor@gov.id", password="kontributor") response = self.client.get(url) expected_template_name = "unggah.html" self.assertTemplateUsed(response, expected_template_name) def test_upload_page_title(self): self.client.login(email="kontributor@gov.id", password="kontributor") response = self.client.get("/unggah/") # Positive tests self.assertContains(response, "Unggah Materi") # Negative tests self.assertNotContains(response, "Anything") def test_upload_page_form_field(self): self.client.login(email="kontributor@gov.id", password="kontributor") response = self.client.get("/unggah/") # Positive tests self.assertContains(response, "title") # Negative tests self.assertNotContains(response, "anything") class DashboardKontributorViewTest(TestCase): def setUp(self): self.client = Client() self.kontributor = User.objects.create_contributor(email="kontributor@gov.id", password="kontributor") self.admin = User.objects.create_admin(email="admin@gov.id", password="admin") self.url = "/dashboard/" self.view = DashboardKontributorView self.template_name = "dashboard.html" def test_dashboard_kontributor_view(self): found = resolve(self.url) self.assertEqual(found.func.__name__, self.view.as_view().__name__) def test_dashboard_kontributor_template(self): # Login self.client.login(email="kontributor@gov.id", password="kontributor") # Test response = self.client.get(self.url) self.assertTemplateUsed(response, self.template_name) # Logout self.client.logout() def test_dashboard_kontributor_url(self): # Login self.client.login(email="kontributor@gov.id", password="kontributor") # Test response = self.client.get(self.url) self.assertEqual(response.status_code, 200) # Logout self.client.logout() def test_dashboard_kontributor_access(self): # Kontributor # Login self.client.login(email="kontributor@gov.id", password="kontributor") # Test response = self.client.get(self.url) self.assertEqual(response.status_code, 200) # Logout self.client.logout() # Admin # Login self.client.login(email="admin@gov.id", password="admin") # Test response = self.client.get(self.url) self.assertEqual(response.status_code, 403) # Logout self.client.logout() # Anonim # Test response = self.client.get(self.url) self.assertEqual(response.status_code, 403) class ProfilAdminTest(TestCase): def setUp(self): self.client = Client() self.kontributor = User.objects.create_contributor(email="kontributor@gov.id", password="kontributor") self.admin = User.objects.create_admin(email="admin@gov.id", password="admin") self.url = "/profil-admin/" self.view = ProfilAdminView self.template_name = "profil-admin.html" def test_profil_Admin_view(self): found = resolve(self.url) self.assertEqual(found.func.__name__, self.view.as_view().__name__) def test_profil_admin_template(self): # Login self.client.login(email="admin@gov.id", password="admin") # Test response = self.client.get(self.url) self.assertTemplateUsed(response, self.template_name) # Logout self.client.logout() def test_profil_admin_url(self): # Login response = self.client.get(self.url) self.assertNotEqual(response.status_code, 200) self.client.login(email="admin@gov.id", password="admin") # Test response = self.client.get(self.url) self.assertEqual(response.status_code, 200) # Logout self.client.logout() class ProfilKontributorTest(TestCase): def setUp(self): self.client = Client() self.kontributor = User.objects.create_contributor(email="kontributor@gov.id", password="kontributor") self.admin = User.objects.create_admin(email="admin@gov.id", password="admin") self.url = "/profil/" self.view = ProfilKontributorView self.template_name = "profil.html" def test_profil_kontributor_view(self): found = resolve(self.url) self.assertEqual(found.func.__name__, self.view.as_view().__name__) def test_profil_kontributor_template(self): # Login self.client.login(email="kontributor@gov.id", password="kontributor") # Test response = self.client.get(self.url) self.assertTemplateUsed(response, self.template_name) # Logout self.client.logout() def test_profil_kontributor_url(self): # Login self.client.login(email="kontributor@gov.id", password="kontributor") # Test response = self.client.get(self.url) self.assertEqual(response.status_code, 200) # Logout self.client.logout() def test_profil_kontributor_access(self): # Kontributor # Login self.client.login(email="kontributor@gov.id", password="kontributor") # Test response = self.client.get(self.url) self.assertEqual(response.status_code, 200) # Logout self.client.logout() # Admin # Login self.client.login(email="admin@gov.id", password="admin") # Test response = self.client.get(self.url) self.assertEqual(response.status_code, 403) # Logout self.client.logout() # Anonim # Test response = self.client.get(self.url) self.assertEqual(response.status_code, 403) class SuntingProfilTest(TestCase): def setUp(self): self.client = Client() self.kontributor = User.objects.create_contributor(email="kontributor@gov.id", password="kontributor") self.admin = User.objects.create_admin(email="admin@gov.id", password="admin") self.url = "/sunting/" self.view = SuntingProfilView self.template_name = "sunting.html" def test_sunting_profile_view(self): found = resolve(self.url) self.assertEqual(found.func.__name__, self.view.as_view().__name__) def test_sunting_profile_template(self): # Login self.client.login(email="kontributor@gov.id", password="kontributor") # Test response = self.client.get(self.url) self.assertTemplateUsed(response, self.template_name) # Logout self.client.logout() def test_sunting_profile_url(self): # Login self.client.login(email="kontributor@gov.id", password="kontributor") # Test response = self.client.get(self.url) self.assertEqual(response.status_code, 200) # Logout self.client.logout() def test_sunting_profile_access(self): # Kontributor # Login self.client.login(email="kontributor@gov.id", password="kontributor") # Test response = self.client.get(self.url) self.assertEqual(response.status_code, 200) # Logout self.client.logout() def test_sunting_profile_access_anonymous(self): # Test response = self.client.get(self.url) self.assertEqual(response.status_code, 403) def test_sunting_profile_autofocus(self): form_data = { "email": "kontributor@gov.id", "name": "kontributor", "instansi": "instansi", "nik": "nik", "alamat": "alamat", "nomor_telpon": "123456789", "twitter": "Twit", "instagram": "https://instagram.com/test_ig" } form = SuntingProfilForm(data=form_data) # Test self.assertEqual(form.fields["twitter"].widget.attrs.get("autofocus"), "") self.assertEqual(form.fields["instagram"].widget.attrs.get("autofocus"), None) class SuntingProfilAdminTest(TestCase): def setUp(self): self.client = Client() self.kontributor = User.objects.create_contributor(email="kontributor@gov.id", password="kontributor") self.admin = User.objects.create_admin(email="admin@gov.id", password="admin") self.url = "/sunting-admin/" self.view = SuntingProfilAdminView self.template_name = "sunting_admin.html" def test_sunting_profile_admin_view(self): found = resolve(self.url) self.assertEqual(found.func.__name__, self.view.as_view().__name__) def test_sunting_profile_admin_template(self): # Login self.client.login(email="admin@gov.id", password="admin") # Test response = self.client.get(self.url) self.assertTemplateUsed(response, self.template_name) # Logout self.client.logout() def test_sunting_profile_admin_url(self): # Login self.client.login(email="admin@gov.id", password="admin") # Test response = self.client.get(self.url) self.assertEqual(response.status_code, 200) # Logout self.client.logout() def test_sunting_profile_admin_access(self): # Kontributor # Login self.client.login(email="admin@gov.id", password="admin") # Test response = self.client.get(self.url) self.assertEqual(response.status_code, 200) # Logout self.client.logout() class SuksesLoginKontributorTest(TestCase): def setUp(self): self.client = Client() self.kontributor = User.objects.create_contributor(email="kontributor@gov.id", password="kontributor") self.admin = User.objects.create_admin(email="admin@gov.id", password="admin") self.url = "/sukses-kontributor/" self.view = SuksesLoginKontributorView self.template_name = "sukses_kontri.html" def test_sukses_login_kontributor_view(self): found = resolve(self.url) self.assertEqual(found.func.__name__, self.view.as_view().__name__) def test_sukses_login_kontributor_template(self): # Login self.client.login(email="kontributor@gov.id", password="kontributor") # Test response = self.client.get(self.url) self.assertTemplateUsed(response, self.template_name) # Logout self.client.logout() def test_sukses_login_kontributor_url(self): # Login self.client.login(email="kontributor@gov.id", password="kontributor") # Test response = self.client.get(self.url) self.assertEqual(response.status_code, 200) # Logout self.client.logout() def test_sukses_login_kontributor_access(self): # Kontributor # Login self.client.login(email="kontributor@gov.id", password="kontributor") # Test response = self.client.get(self.url) self.assertEqual(response.status_code, 200) # Logout self.client.logout() class SuksesLoginAdminTest(TestCase): def setUp(self): self.client = Client() self.kontributor = User.objects.create_contributor(email="kontributor@gov.id", password="kontributor") self.admin = User.objects.create_admin(email="admin@gov.id", password="admin") self.url = "/sukses-admin/" self.view = SuksesLoginAdminView self.template_name = "sukses_admin.html" def test_sukses_login_admin_view(self): found = resolve(self.url) self.assertEqual(found.func.__name__, self.view.as_view().__name__) def test_sukses_login_admin_template(self): # Login self.client.login(email="admin@gov.id", password="admin") # Test response = self.client.get(self.url) self.assertTemplateUsed(response, self.template_name) # Logout self.client.logout() def test_sukses_login_admin_url(self): # Login self.client.login(email="admin@gov.id", password="admin") # Test response = self.client.get(self.url) self.assertEqual(response.status_code, 200) # Logout self.client.logout() def test_sukses_login_admin_access(self): # Kontributor # Login self.client.login(email="admin@gov.id", password="admin") # Test response = self.client.get(self.url) self.assertEqual(response.status_code, 200) # Logout self.client.logout() class LikeMateriTest(TestCase): def setUp(self): self.contributor_credential = { "email": "kontributor@gov.id", "password": id_generator() } self.contributor = get_user_model().objects.create_user( **self.contributor_credential, name="Kontributor", is_contributor=True ) self.client = Client() self.url_like = '/materi/like/' content = b"Test file" self.cover = SimpleUploadedFile( "cover.jpg", content ) self.content = SimpleUploadedFile( "content.txt", content ) Materi(title="Materi 1", author="Agas", uploader=self.contributor, publisher="Kelas SC", descriptions="Deskripsi Materi 1", status="PENDING", cover=self.cover, content=self.content).save() self.materi1 = Materi.objects.first() self.url_materi = f'/materi/{self.materi1.id}/' def test_get_method(self): response = self.client.get(self.url_like) response = json.loads(response.content) self.assertEqual(response.get("success", None), False) def test_like_materi(self): # Verify that materi doesn't have any like to start with num_of_likes = Like.objects.filter(materi = self.materi1).count() self.assertEqual(num_of_likes, 0) # Like a materi response = self.client.get(self.url_materi) session_id = response.context["session_id"] materi_id = response.context["materi_data"].id payload = { 'materi_id': materi_id, 'session_id': session_id } ajax_response = Client().post(self.url_like, payload) num_of_likes = Like.objects.filter(materi = self.materi1).count() self.assertEqual(num_of_likes, 1) def test_unlike_materi(self): # Verify that materi doesn't have any like to start with num_of_likes = Like.objects.filter(materi = self.materi1).count() self.assertEqual(num_of_likes, 0) # Like a materi response = self.client.get(self.url_materi) session_id = response.context["session_id"] materi_id = response.context["materi_data"].id payload = { 'materi_id': materi_id, 'session_id': session_id } ajax_response = Client().post(self.url_like, payload) num_of_likes = Like.objects.filter(materi = self.materi1).count() self.assertEqual(num_of_likes, 1) # Unlike a materi response = self.client.get(self.url_materi) session_id = response.context["session_id"] materi_id = response.context["materi_data"].id payload = { 'materi_id': materi_id, 'session_id': session_id } ajax_response = Client().post(self.url_like, payload) num_of_likes = Like.objects.filter(materi = self.materi1).count() self.assertEqual(num_of_likes, 0) def test_2_client_like_materi(self): # Verify that materi doesn't have any like to start with num_of_likes = Like.objects.filter(materi = self.materi1).count() self.assertEqual(num_of_likes, 0) # Client 1 like a materi response = self.client.get(self.url_materi) session_id = response.context["session_id"] materi_id = response.context["materi_data"].id payload = { 'materi_id': materi_id, 'session_id': session_id } ajax_response = Client().post(self.url_like, payload) num_of_likes = Like.objects.filter(materi = self.materi1).count() self.assertEqual(num_of_likes, 1) # Client 2 like a materi response = Client().get(self.url_materi) session_id = response.context["session_id"] materi_id = response.context["materi_data"].id payload = { 'materi_id': materi_id, 'session_id': session_id } ajax_response = Client().post(self.url_like, payload) num_of_likes = Like.objects.filter(materi = self.materi1).count() self.assertEqual(num_of_likes, 2) def test_incomplete_like_parameter(self): # Verify that materi doesn't have any like to start with num_of_likes = Like.objects.filter(materi = self.materi1).count() self.assertEqual(num_of_likes, 0) # missing session id response = self.client.get(self.url_materi) materi_id = response.context["materi_data"].id payload = { 'materi_id': materi_id, } ajax_response = Client().post(self.url_like, payload) ajax_response = json.loads(ajax_response.content) num_of_likes = Like.objects.filter(materi = self.materi1).count() self.assertEqual(num_of_likes, 0) self.assertEqual(ajax_response.get("success", None), False) # missing materi id response = self.client.get(self.url_materi) session_id = response.context["session_id"] payload = { 'session_id': session_id } ajax_response = Client().post(self.url_like, payload) ajax_response = json.loads(ajax_response.content) num_of_likes = Like.objects.filter(materi = self.materi1).count() self.assertEqual(num_of_likes, 0) self.assertEqual(ajax_response.get("success", None), False) class ViewMateriStatissticsTest(TestCase): def setUp(self): self.contributor_credential = { "email": "kontributor@gov.id", "password": id_generator() } self.contributor = get_user_model().objects.create_user( **self.contributor_credential, name="Kontributor", is_contributor=True ) self.client = Client() content = b"Test file" self.cover = SimpleUploadedFile( "cover.jpg", content ) self.content = SimpleUploadedFile( "content.txt", content ) Materi(title="Materi 1", author="Agas", uploader=self.contributor, publisher="Kelas SC", descriptions="Deskripsi Materi 1", status="PENDING", cover=self.cover, content=self.content).save() self.materi1 = Materi.objects.first() self.url = f"/materi/{self.materi1.id}/view" # Test single view def test_count_one_materi_view(self): response = self.client.get(self.url) num_of_views = self.materi1.baca.all().count() self.assertEqual(num_of_views, 1) # Test more than one view def test_count_more_than_one_materi_view(self): response = self.client.get(self.url) num_of_views = self.materi1.baca.all().count() self.assertEqual(num_of_views, 1) response = Client().get(self.url) num_of_views = self.materi1.baca.all().count() self.assertEqual(num_of_views, 2) class DownloadMateriStatissticsTest(TestCase): def setUp(self): self.contributor_credential = { "email": "kontributor@gov.id", "password": id_generator() } self.contributor = get_user_model().objects.create_user( **self.contributor_credential, name="Kontributor", is_contributor=True ) self.client = Client() content = b"Test file" self.cover = SimpleUploadedFile( "cover.jpg", content ) self.content = SimpleUploadedFile( "content.txt", content ) Materi(title="Materi 1", author="Agas", uploader=self.contributor, publisher="Kelas SC", descriptions="Deskripsi Materi 1", status="PENDING", cover=self.cover, content=self.content).save() self.materi1 = Materi.objects.first() self.url = f"/materi/{self.materi1.id}/unduh" # Test single download def test_count_one_materi_download(self): response = self.client.get(self.url) num_of_downloads = self.materi1.unduh.all().count() self.assertEqual(num_of_downloads, 1) # Test more than one download def test_count_more_than_one_materi_download(self): response = self.client.get(self.url) num_of_downloads = self.materi1.unduh.all().count() self.assertEqual(num_of_downloads, 1) response = Client().get(self.url) num_of_downloads = self.materi1.unduh.all().count() self.assertEqual(num_of_downloads, 2) class RevisiMateriTest(TestCase): def setUp(self): self.client = Client() self.view = RevisiMateriView self.template_name = "revisi.html" self.contributor_credential = { "email": "kontributor@gov.id", "password": id_generator() } self.contributor = get_user_model().objects.create_user( **self.contributor_credential, name="Kontributor", is_contributor=True ) self.cover = SimpleUploadedFile( "cover.jpg", b"Test file" ) self.content = SimpleUploadedFile( "content.txt", b"Test file" ) Materi(title="Materi 1", author="Agas", uploader=self.contributor, publisher="Kelas SC", descriptions="Deskripsi Materi 1", status="REVISION", cover=self.cover, content=self.content).save() self.materi1 = Materi.objects.first() self.url = "/revisi/materi/" + str(self.materi1.id) + "/" def test_revisi_materi_view(self): found = resolve(self.url) self.assertEqual(found.func.__name__, self.view.as_view().__name__) def test_revisi_materi_template(self): # Login self.client.login(**self.contributor_credential) # Test response = self.client.get(self.url) self.assertTemplateUsed(response, self.template_name) # Logout self.client.logout() def test_revisi_materi_url(self): # Login self.client.login(**self.contributor_credential) # Test response = self.client.get(self.url) self.assertEqual(response.status_code, 200) # Logout self.client.logout() def test_revisi_materi_access(self): # Kontributor # Login self.client.login(**self.contributor_credential) # Test response = self.client.get(self.url) self.assertEqual(response.status_code, 200) # Logout self.client.logout() class GenerateDummyCommandTest(TestCase): def setUp(self): self.material_numbers = [5, 10, 25, 100] self.invalid_material_numbers = [-100, -10, -1, 0, 1, 2, 3, 4] self.stdout = StringIO() def test_command_output_with_given_num_of_materi(self): for num_of_materi in self.material_numbers: call_command("generatedummy", num_of_materi, stdout=self.stdout) self.assertIn( f"Successfully created {num_of_materi} materi\n", self.stdout.getvalue() ) def test_command_should_generate_materi_objects(self): for num_of_materi in self.material_numbers: call_command("generatedummy", num_of_materi, stdout=self.stdout) self.assertEqual(Materi.objects.count(), num_of_materi) Materi.objects.all().delete() def test_command_should_raise_exception_if_invalid_values_are_given(self): with self.assertRaises(IndexError): for num_of_materi in self.invalid_material_numbers: call_command("generatedummy", num_of_materi) class RemoveDummyCommandTest(TestCase): def test_calling_remove_dummy_command_should_remove_generated_dummy_objects(self): stdout = StringIO() call_command("generatedummy", 50) call_command("removedummy", stdout=stdout) self.assertEqual("Successfully remove all dummy object\n", stdout.getvalue()) self.assertEqual(User.objects.count(), 0) self.assertEqual(Category.objects.count(), 0) self.assertEqual(Materi.objects.count(), 0) self.assertEqual(VerificationSetting.objects.count(), 0) self.assertEqual(VerificationReport.objects.count(), 0) class RatingMateriTest(TestCase): def setUp(self): self.url = '/administration/' self.contributor_credential = { "email": "kontributor@gov.id", "password": id_generator() } self.user_one_credential = { "email": "user_one@user.id", "password": id_generator() } self.user_two_credential = { "email": "user_two@user.id", "password": id_generator() } self.contributor = get_user_model().objects.create_user( **self.contributor_credential, name="Kontributor", is_contributor=True ) self.user_one = get_user_model().objects.create_user(**self.user_one_credential, name="User One") self.user_two = get_user_model().objects.create_user(**self.user_two_credential, name="User Two") self.cover = SimpleUploadedFile( "cover.jpg", b"Test file" ) self.content = SimpleUploadedFile( "content.txt", b"Test file" ) Materi(title="Materi 1", author="Agas", uploader=self.contributor, publisher="Kelas SC", descriptions="Deskripsi Materi 1", status="PENDING", cover=self.cover, content=self.content).save() Materi(title="Materi Dua", author="Author", uploader=self.contributor, publisher="Publisher", descriptions="Deskripsi Materi Dua", status="APPROVE", cover=self.cover, content=self.content).save() self.materi1 = Materi.objects.all()[0] self.materi2 = Materi.objects.all()[1] def test_rating_model_can_be_created_with_proper_parameter(self): Rating(materi=self.materi1, user=self.user_one, score=5).save() rating = Rating.objects.first() self.assertEqual(rating.materi, self.materi1) self.assertEqual(rating.user, self.user_one) self.assertTrue(0 < rating.score < 6) self.assertEqual(rating.__str__(), "Material:Materi 1 | User:User One | Rating:5") def test_rating_model_should_not_be_created_with_rating_more_than_5(self): with self.assertRaises(ValidationError) as context: Rating(materi=self.materi1, user=self.user_one, score=6).save() self.assertTrue('Rating score must be integer between 1-5' in str(context.exception)) def test_rating_model_should_not_be_created_with_rating_less_than_1(self): with self.assertRaises(ValidationError) as context: Rating(materi=self.materi1, user=self.user_one, score=0).save() self.assertTrue('Rating score must be integer between 1-5' in str(context.exception)) def test_one_materi_should_be_able_to_be_related_to_multiple_rating(self): Rating(materi=self.materi1, user=self.user_one, score=1).save() Rating(materi=self.materi1, user=self.user_two, score=2).save() rating_one = Rating.objects.get(user=self.user_one) rating_two = Rating.objects.get(user=self.user_two) self.assertEqual(rating_one.materi, self.materi1) self.assertEqual(rating_two.materi, self.materi1) self.assertEqual(rating_one.user, self.user_one) self.assertEqual(rating_two.user, self.user_two) def test_one_user_should_be_able_to_be_related_to_two_rating(self): Rating(materi=self.materi1, user=self.user_one, score=3).save() Rating(materi=self.materi2, user=self.user_one, score=3).save() rating_one = Rating.objects.filter(materi=self.materi1).first() rating_two = Rating.objects.filter(materi=self.materi2).first() self.assertEqual(rating_one.materi, self.materi1) self.assertEqual(rating_two.materi, self.materi2) self.assertEqual(rating_one.user, self.user_one) self.assertEqual(rating_two.user, self.user_one) def test_two_rating_should_not_have_same_user_and_materi(self): with self.assertRaises(IntegrityError) as context: Rating(materi=self.materi1, user=self.user_one, score=1).save() Rating(materi=self.materi1, user=self.user_one, score=2).save() self.assertTrue('already exists' in str(context.exception)) def test_materi_in_rating_should_not_be_null(self): with self.assertRaises(IntegrityError): Rating(user=self.user_one, score=1).save() def test_user_in_rating_should_not_be_null(self): with self.assertRaises(IntegrityError): Rating(materi=self.materi1, score=1).save() def test_score_in_rating_should_not_be_null(self): with self.assertRaises(TypeError): Rating(materi=self.materi1, user=self.user_one).save()