From a37a189a133eaa86088e31df4f7447cac0feb5c8 Mon Sep 17 00:00:00 2001 From: Christopher Samuel Date: Tue, 4 May 2021 17:46:03 +0700 Subject: [PATCH 01/17] [RED] Create baseline tests for FotoKegiatan and KomentarKegiatan models --- informasi_fasilitas/test_base.py | 21 ++++++++++++++++++++- informasi_fasilitas/test_models.py | 14 +++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/informasi_fasilitas/test_base.py b/informasi_fasilitas/test_base.py index f768810..35c04f5 100644 --- a/informasi_fasilitas/test_base.py +++ b/informasi_fasilitas/test_base.py @@ -15,7 +15,9 @@ from .models import ( KURSI_RODA, Likes, Dislikes, - Kegiatan + Kegiatan, + FotoKegiatan, + KomentarKegiatan ) from pplbackend.utils import get_client_login_with_user @@ -54,6 +56,17 @@ class InformasiFasilitasTest(TestCase): 'deskripsi' : 'sebuah deskripsi' } + mock_komentar_kegiatan_test = { + 'email_user' : 'self.mock_user@test.com', + 'kegiatan' : 'mock_id_kegiatan', + 'komentar': 'sangat membantu' + } + + mock_foto_kegiatan = { + 'kegiatan' : 'mock_id_kegiatan', + 'list_foto' : [], + } + def create_user_test(self, user_dict=mock_user_test): return User.objects.create_user(**user_dict) @@ -242,6 +255,12 @@ class InformasiFasilitasTest(TestCase): def create_kegiatan_test(self, kegiatan_dict=mock_kegiatan_test): return Kegiatan.objects.create_kegiatan(**kegiatan_dict) + + def create_foto_kegiatan_test(self, foto_kegiatan_dict=mock_foto_kegiatan_test): + return FotoKegiatan.objects.create_kegiatan(**foto_kegiatan_dict) + + def create_komentar_kegiatan_test(self, komentar_kegiatan_dict=mock_komentar_kegiatan_test): + return KomentarKegiatan.objects.create_kegiatan(**komentar_kegiatan_dict) class InformasiFasilitasViewTest(InformasiFasilitasTest): diff --git a/informasi_fasilitas/test_models.py b/informasi_fasilitas/test_models.py index 7ea2d1c..42d6c60 100644 --- a/informasi_fasilitas/test_models.py +++ b/informasi_fasilitas/test_models.py @@ -1,7 +1,7 @@ from django.db.utils import IntegrityError from .test_base import InformasiFasilitasTest -from .models import Lokasi, Fasilitas, Komentar, Likes, Dislikes, Kegiatan +from .models import Lokasi, Fasilitas, Komentar, Likes, Dislikes, Kegiatan, FotoKegiatan, KomentarKegiatan class InformasiFasilitasModelTest(InformasiFasilitasTest): @@ -83,3 +83,15 @@ class InformasiFasilitasModelTest(InformasiFasilitasTest): self.create_kegiatan_test() count = Kegiatan.objects.all().count() self.assertNotEqual(count, 0) + + def test_models_create_new_foto_kegiatan(self): + self.create_kegiatan_test() + self.create_foto_kegiatan_test() + count = FotoKegiatan.objects.all().count() + self.assertNotEqual(count, 0) + + def test_models_create_new_foto_kegiatan(self): + self.create_kegiatan_test() + self.create_komentar_kegiatan_test() + count = KomentarKegiatan.objects.all().count() + self.assertNotEqual(count, 0) -- GitLab From 0847c5e2539c9226cf66228b0f200f1a79c0d935 Mon Sep 17 00:00:00 2001 From: Christopher Samuel Date: Wed, 5 May 2021 13:43:32 +0700 Subject: [PATCH 02/17] [RED] Update tests + create base models for FotoKegiatan and Komentar Kegiatan, waiting for Kegiatan model --- informasi_fasilitas/models.py | 14 +++++++++++- informasi_fasilitas/test_base.py | 35 +++++++++++++++++++++--------- informasi_fasilitas/test_models.py | 2 -- 3 files changed, 38 insertions(+), 13 deletions(-) diff --git a/informasi_fasilitas/models.py b/informasi_fasilitas/models.py index 1e90a63..33f5940 100644 --- a/informasi_fasilitas/models.py +++ b/informasi_fasilitas/models.py @@ -90,4 +90,16 @@ class Dislikes(models.Model): objects = models.Manager() user = models.ForeignKey(User, on_delete=models.CASCADE) fasilitas = models.ForeignKey(Fasilitas, on_delete=models.CASCADE) - created = models.DateTimeField(auto_now_add=True) \ No newline at end of file + created = models.DateTimeField(auto_now_add=True) + +class KomentarKegiatan(models.Model): + objects = models.Manager() + user = models.ForeignKey(User, on_delete=models.CASCADE) + kegiatan = models.ForeignKey(Kegiatan, on_delete=models.CASCADE) + deskripsi = models.TextField() + created = models.DateTimeField(auto_now_add=True) + +class FotoKegiatan(models.Model): + objects = models.Manager() + kegiatan = models.ForeignKey(Kegiatan, on_delete=models.CASCADE) + foto = models.ImageField() diff --git a/informasi_fasilitas/test_base.py b/informasi_fasilitas/test_base.py index 35c04f5..e528399 100644 --- a/informasi_fasilitas/test_base.py +++ b/informasi_fasilitas/test_base.py @@ -57,14 +57,11 @@ class InformasiFasilitasTest(TestCase): } mock_komentar_kegiatan_test = { - 'email_user' : 'self.mock_user@test.com', - 'kegiatan' : 'mock_id_kegiatan', - 'komentar': 'sangat membantu' + 'deskripsi': 'sangat membantu' } mock_foto_kegiatan = { - 'kegiatan' : 'mock_id_kegiatan', - 'list_foto' : [], + 'foto' : '/media/lokasi/Screen_Shot_2020-12-29_at_01.48.32.png', } def create_user_test(self, user_dict=mock_user_test): @@ -254,13 +251,31 @@ class InformasiFasilitasTest(TestCase): ) def create_kegiatan_test(self, kegiatan_dict=mock_kegiatan_test): - return Kegiatan.objects.create_kegiatan(**kegiatan_dict) + return Kegiatan.objects.create(**kegiatan_dict) - def create_foto_kegiatan_test(self, foto_kegiatan_dict=mock_foto_kegiatan_test): - return FotoKegiatan.objects.create_kegiatan(**foto_kegiatan_dict) + def create_foto_kegiatan_test( + self, + kegiatan, + foto_kegiatan_dict=mock_foto_kegiatan_test + ): + return FotoKegiatan.objects.create(**foto_kegiatan_dict, kegiatan=kegiatan) - def create_komentar_kegiatan_test(self, komentar_kegiatan_dict=mock_komentar_kegiatan_test): - return KomentarKegiatan.objects.create_kegiatan(**komentar_kegiatan_dict) + def create_komentar_kegiatan_test( + self, + kegiatan, + komentar_kegiatan_dict=mock_komentar_kegiatan_test, + user_dict=mock_user_test + ): + user = self.get_or_create_user_test( + user=user, + user_dict=user_dict, + ) + + return KomentarKegiatan.objects.create( + **komentar_kegiatan_dict, + kegiatan=kegiatan, + user=user + ) class InformasiFasilitasViewTest(InformasiFasilitasTest): diff --git a/informasi_fasilitas/test_models.py b/informasi_fasilitas/test_models.py index 42d6c60..0cf3ec3 100644 --- a/informasi_fasilitas/test_models.py +++ b/informasi_fasilitas/test_models.py @@ -85,13 +85,11 @@ class InformasiFasilitasModelTest(InformasiFasilitasTest): self.assertNotEqual(count, 0) def test_models_create_new_foto_kegiatan(self): - self.create_kegiatan_test() self.create_foto_kegiatan_test() count = FotoKegiatan.objects.all().count() self.assertNotEqual(count, 0) def test_models_create_new_foto_kegiatan(self): - self.create_kegiatan_test() self.create_komentar_kegiatan_test() count = KomentarKegiatan.objects.all().count() self.assertNotEqual(count, 0) -- GitLab From 26db90e3c5f6c6a054f65993ec1f2bcbff81ae42 Mon Sep 17 00:00:00 2001 From: Christopher Samuel Date: Thu, 6 May 2021 16:20:25 +0700 Subject: [PATCH 03/17] [CHORES] Update tests for Kegiatan and related models --- informasi_fasilitas/test_base.py | 33 +++++++++++++++++++++++------- informasi_fasilitas/test_models.py | 2 +- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/informasi_fasilitas/test_base.py b/informasi_fasilitas/test_base.py index e528399..d1b634b 100644 --- a/informasi_fasilitas/test_base.py +++ b/informasi_fasilitas/test_base.py @@ -50,9 +50,10 @@ class InformasiFasilitasTest(TestCase): # Waktu mungkin perlu disesuaikan lagi test dan implementasinya mock_kegiatan_test = { - 'nama' : 'mock kegiatan', + 'nama_kegiatan' : 'mock kegiatan', 'penyelenggara' : 'mock penyelenggara', - 'waktu' : datetime.now(), + 'time_start' : datetime.now(), + 'time_end' : datetime.now(), 'deskripsi' : 'sebuah deskripsi' } @@ -60,7 +61,7 @@ class InformasiFasilitasTest(TestCase): 'deskripsi': 'sangat membantu' } - mock_foto_kegiatan = { + mock_foto_kegiatan_test = { 'foto' : '/media/lokasi/Screen_Shot_2020-12-29_at_01.48.32.png', } @@ -250,19 +251,35 @@ class InformasiFasilitasTest(TestCase): fasilitas=fasilitas, ) - def create_kegiatan_test(self, kegiatan_dict=mock_kegiatan_test): - return Kegiatan.objects.create(**kegiatan_dict) + def create_kegiatan_test( + self, + user=None, + user_dict=mock_user_test, + lokasi=None, + lokasi_dict=mock_lokasi_test, + kegiatan_dict=mock_kegiatan_test + ): + user = self.get_or_create_user_test( + user=user, + user_dict=user_dict, + ) + + lokasi = self.get_or_create_lokasi_test( + lokasi=lokasi, + lokasi_dict=lokasi_dict, + ) + return Kegiatan.objects.create(**kegiatan_dict, user=user) def create_foto_kegiatan_test( self, - kegiatan, foto_kegiatan_dict=mock_foto_kegiatan_test ): + kegiatan = self.create_kegiatan_test() return FotoKegiatan.objects.create(**foto_kegiatan_dict, kegiatan=kegiatan) def create_komentar_kegiatan_test( self, - kegiatan, + user=None, komentar_kegiatan_dict=mock_komentar_kegiatan_test, user_dict=mock_user_test ): @@ -271,6 +288,8 @@ class InformasiFasilitasTest(TestCase): user_dict=user_dict, ) + kegiatan = self.create_kegiatan_test() + return KomentarKegiatan.objects.create( **komentar_kegiatan_dict, kegiatan=kegiatan, diff --git a/informasi_fasilitas/test_models.py b/informasi_fasilitas/test_models.py index 0cf3ec3..fae0d4c 100644 --- a/informasi_fasilitas/test_models.py +++ b/informasi_fasilitas/test_models.py @@ -89,7 +89,7 @@ class InformasiFasilitasModelTest(InformasiFasilitasTest): count = FotoKegiatan.objects.all().count() self.assertNotEqual(count, 0) - def test_models_create_new_foto_kegiatan(self): + def test_models_create_new_komentar_kegiatan(self): self.create_komentar_kegiatan_test() count = KomentarKegiatan.objects.all().count() self.assertNotEqual(count, 0) -- GitLab From 1d6cb5d94ca7563047a6c8c8d098c324bcfd3631 Mon Sep 17 00:00:00 2001 From: Christopher Samuel Date: Thu, 6 May 2021 17:10:42 +0700 Subject: [PATCH 04/17] [CHORES] Add migrations for Kegiatan and related models --- ..._fotokegiatan_kegiatan_komentarkegiatan.py | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 informasi_fasilitas/migrations/0013_fotokegiatan_kegiatan_komentarkegiatan.py diff --git a/informasi_fasilitas/migrations/0013_fotokegiatan_kegiatan_komentarkegiatan.py b/informasi_fasilitas/migrations/0013_fotokegiatan_kegiatan_komentarkegiatan.py new file mode 100644 index 0000000..b6e7a89 --- /dev/null +++ b/informasi_fasilitas/migrations/0013_fotokegiatan_kegiatan_komentarkegiatan.py @@ -0,0 +1,48 @@ +# Generated by Django 3.1.7 on 2021-05-06 10:09 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('informasi_fasilitas', '0012_auto_20210329_1332'), + ] + + operations = [ + migrations.CreateModel( + name='Kegiatan', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nama_kegiatan', models.CharField(max_length=50)), + ('penyelenggara', models.CharField(max_length=50)), + ('deskripsi', models.TextField()), + ('time_start', models.DateTimeField(default=django.utils.timezone.now)), + ('time_end', models.DateTimeField(blank=True, null=True)), + ('lokasi', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='informasi_fasilitas.lokasi')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='KomentarKegiatan', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('deskripsi', models.TextField()), + ('created', models.DateTimeField(auto_now_add=True)), + ('kegiatan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='informasi_fasilitas.kegiatan')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='FotoKegiatan', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('foto', models.ImageField(upload_to='')), + ('kegiatan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='informasi_fasilitas.kegiatan')), + ], + ), + ] -- GitLab From be0120e399a4d368811d425810f1e6fe7bf07b30 Mon Sep 17 00:00:00 2001 From: Christopher Samuel Date: Thu, 6 May 2021 17:16:40 +0700 Subject: [PATCH 05/17] [CHORES] Fixed test for Kegiatan --- informasi_fasilitas/test_base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/informasi_fasilitas/test_base.py b/informasi_fasilitas/test_base.py index d1b634b..4180515 100644 --- a/informasi_fasilitas/test_base.py +++ b/informasi_fasilitas/test_base.py @@ -268,7 +268,7 @@ class InformasiFasilitasTest(TestCase): lokasi=lokasi, lokasi_dict=lokasi_dict, ) - return Kegiatan.objects.create(**kegiatan_dict, user=user) + return Kegiatan.objects.create(**kegiatan_dict, user=user, lokasi=lokasi) def create_foto_kegiatan_test( self, -- GitLab From a7f601c6961ae0785989123f9e82ad3158be8700 Mon Sep 17 00:00:00 2001 From: Christopher Samuel Date: Sat, 8 May 2021 14:14:01 +0700 Subject: [PATCH 06/17] [RED] Add tests for Kegiatan and related models --- informasi_fasilitas/test_views_kegiatan.py | 118 +++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 informasi_fasilitas/test_views_kegiatan.py diff --git a/informasi_fasilitas/test_views_kegiatan.py b/informasi_fasilitas/test_views_kegiatan.py new file mode 100644 index 0000000..3fc98e5 --- /dev/null +++ b/informasi_fasilitas/test_views_kegiatan.py @@ -0,0 +1,118 @@ +import json +from http import HTTPStatus +from django.test import Client +from django.urls import reverse + +from .test_base import InformasiFasilitasViewTest +from .models import Lokasi, Kegiatan, FotoKegiatan, KomentarKegiatan +from pplbackend.utils import response_decode + +class KegiatanRelatedViewTest(InformasiFasilitasViewTest): + + def setUp(self): + super().setUp() + + self.kegiatan = self.create_kegiatan_test(self.user, self.lokasi) + self.kwargs_place_id = {'place_id': self.lokasi.place_id} + self.kwargs_add_or_update_kegiatan = { + 'place_id': self.lokasi.place_id, + 'id': self.kegiatan.id, + } + self.kwargs_kegiatan_id = {'kegiatan_id' : self.kegiatan.place_id} + + self.get_list_kegiatan_url = \ + reverse('list-kegiatan', kwargs=self.kwargs_place_id) + self.get_detail_kegiatan_url = \ + reverse('detail-kegiatan', kwargs=self.kwargs_add_or_update_kegiatan) + self.add_kegiatan_url = \ + reverse('add-kegiatan', kwargs=self.kwargs_place_id) + self.update_kegiatan_url = reverse('update-kegiatan', + kwargs=self.kwargs_add_or_update_kegiatan) + + self.add_komentar_kegiatan_url = \ + reverse('add-komentar-kegiatan', kwargs=self.kwargs_kegiatan_id) + self.list_komentar_kegiatan_url = \ + reverse('list-komentar-kegiatan', kwargs=self.kwargs_kegiatan_id) + + self.add_foto_kegiatan_url = \ + reverse('add-foto-kegiatan', kwargs=self.kwargs_kegiatan_id) + self.list_foto_kegiatan_url = \ + reverse('list-foto-kegiatan', kwargs=self.kwargs_kegiatan_id) + + def test_can_add_kegiatan(self): + Kegiatan.objects.all().delete() + response = \ + self.client.post(self.add_kegiatan_url, self.mock_kegiatan_test) + self.assertEqual(response.status_code, HTTPStatus.CREATED) + count = Kegiatan.objects.all().count() + self.assertEqual(count, 1) + + def test_can_get_list_kegiatan(self): + response = Client().get(self.get_list_kegiatan_url) + self.assertEqual(response.status_code, HTTPStatus.OK) + content = json.loads(response.content.decode('utf-8')) + expected_json = { + str(self.kegiatan.id): { + 'id': self.kegiatan.id, + 'place_id': self.kegiatan.lokasi.place_id, + 'user': self.kegiatan.user.last_name, + 'nama_kegiatan' : self.kegiatan.nama_kegiatan, + 'penyelenggara': self.kegiatan.penyelenggara, + 'deskripsi': self.kegiatan.deskripsi, + 'time_start': self.kegiatan.time_start, + 'time_end': self.kegiatan.time_end, + }, + } + self.assertEqual(content, expected_json) + + def test_can_put_update_kegiatan(self): + send_data = { + 'deskripsi': 'deskripsi kegiatan baru untuk test', + 'nama_kegiatan': 'nama kegiatan baru untuk test', + } + response = self.client.put(self.update_kegiatan_url, data=send_data, + content_type=self.put_content_type) + self.assertEqual(response.status_code, HTTPStatus.ACCEPTED) + + def test_can_add_komentar_kegiatan(self): + KomentarKegiatan.objects.all().delete() + response = \ + self.client.post(self.add_komentar_kegiatan_url, self.mock_komentar_kegiatan_test) + self.assertEqual(response.status_code, HTTPStatus.CREATED) + + count = KomentarKegiatan.objects.filter(kegiatan=self.kegiatan).count() + self.assertEqual(count, 1) + + def test_can_get_list_komentar_kegiatan(self): + komentar = self.create_komentar_kegiatan_test(user=self.user) + response = self.client.get(self.list_komentar_kegiatan_url) + self.assertEqual(response.status_code, HTTPStatus.OK) + + response_json = response_decode(response) + expected_json = { + str(komentar.id): { + 'id': komentar.id, + 'user': komentar.user.last_name, + 'kegiatan': komentar.kegiatan.id, + 'deskripsi': komentar.deskripsi, + } + } + self.assertEqual(response_json, expected_json) + + def test_can_add_foto_kegiatan(self): + FotoKegiatan.objects.all().delete() + response = \ + self.client.post(self.add_foto_kegiatan_url, self.mock_foto_kegiatan_test) + self.assertEqual(response.status_code, HTTPStatus.CREATED) + + count = FotoKegiatan.objects.filter(kegiatan=self.kegiatan).count() + self.assertEqual(count, 1) + + def test_can_get_list_foto_kegiatan(self): + foto = self.create_foto_kegiatan_test() + response = self.client.get(self.list_foto_kegiatan_url) + self.assertEqual(response.status_code, HTTPStatus.OK) + + response_json = response_decode(response) + self.assertEqual(response_json['id'], foto.id) + self.assertIsNotNone(response_json['foto']) -- GitLab From 01ed82ca23b40382bacd54e62eae7ae9dbcc7b2a Mon Sep 17 00:00:00 2001 From: Christopher Samuel Date: Sun, 9 May 2021 11:32:16 +0700 Subject: [PATCH 07/17] [CHORES] Added serializer for KomentarKegiatan and moved KomentarKegiatan tests to new test file --- informasi_fasilitas/serializers.py | 13 ++- informasi_fasilitas/test_views_kegiatan.py | 32 +------ .../test_views_komentar_kegiatan.py | 93 +++++++++++++++++++ 3 files changed, 106 insertions(+), 32 deletions(-) create mode 100644 informasi_fasilitas/test_views_komentar_kegiatan.py diff --git a/informasi_fasilitas/serializers.py b/informasi_fasilitas/serializers.py index 178dd12..683404b 100644 --- a/informasi_fasilitas/serializers.py +++ b/informasi_fasilitas/serializers.py @@ -1,6 +1,6 @@ from rest_framework import serializers -from .models import Lokasi, Kegiatan +from .models import Lokasi, Kegiatan, KomentarKegiatan class LokasiSerializer(serializers.ModelSerializer): @@ -46,3 +46,14 @@ class KegiatanFullSerializer(serializers.ModelSerializer): 'deskripsi': {'required': True}, 'time_start': {'required': True} } + +class KomentarKegiatanSerializer(serializers.ModelSerializer): + kegiatan = serializers.CharField(source='kegiatan.id', read_only=True) + creator = serializers.CharField(source='user.last_name', read_only=True) + class Meta: + model = KomentarKegiatan + fields = {'id', 'creator', 'kegiatan', 'deskripsi', 'created'} + extra_kwargs = { + 'deskripsi': {'required': True}, + 'created': {'required' : True} + } diff --git a/informasi_fasilitas/test_views_kegiatan.py b/informasi_fasilitas/test_views_kegiatan.py index 3fc98e5..2a7deec 100644 --- a/informasi_fasilitas/test_views_kegiatan.py +++ b/informasi_fasilitas/test_views_kegiatan.py @@ -28,11 +28,6 @@ class KegiatanRelatedViewTest(InformasiFasilitasViewTest): reverse('add-kegiatan', kwargs=self.kwargs_place_id) self.update_kegiatan_url = reverse('update-kegiatan', kwargs=self.kwargs_add_or_update_kegiatan) - - self.add_komentar_kegiatan_url = \ - reverse('add-komentar-kegiatan', kwargs=self.kwargs_kegiatan_id) - self.list_komentar_kegiatan_url = \ - reverse('list-komentar-kegiatan', kwargs=self.kwargs_kegiatan_id) self.add_foto_kegiatan_url = \ reverse('add-foto-kegiatan', kwargs=self.kwargs_kegiatan_id) @@ -55,7 +50,7 @@ class KegiatanRelatedViewTest(InformasiFasilitasViewTest): str(self.kegiatan.id): { 'id': self.kegiatan.id, 'place_id': self.kegiatan.lokasi.place_id, - 'user': self.kegiatan.user.last_name, + 'creator': self.kegiatan.user.last_name, 'nama_kegiatan' : self.kegiatan.nama_kegiatan, 'penyelenggara': self.kegiatan.penyelenggara, 'deskripsi': self.kegiatan.deskripsi, @@ -74,31 +69,6 @@ class KegiatanRelatedViewTest(InformasiFasilitasViewTest): content_type=self.put_content_type) self.assertEqual(response.status_code, HTTPStatus.ACCEPTED) - def test_can_add_komentar_kegiatan(self): - KomentarKegiatan.objects.all().delete() - response = \ - self.client.post(self.add_komentar_kegiatan_url, self.mock_komentar_kegiatan_test) - self.assertEqual(response.status_code, HTTPStatus.CREATED) - - count = KomentarKegiatan.objects.filter(kegiatan=self.kegiatan).count() - self.assertEqual(count, 1) - - def test_can_get_list_komentar_kegiatan(self): - komentar = self.create_komentar_kegiatan_test(user=self.user) - response = self.client.get(self.list_komentar_kegiatan_url) - self.assertEqual(response.status_code, HTTPStatus.OK) - - response_json = response_decode(response) - expected_json = { - str(komentar.id): { - 'id': komentar.id, - 'user': komentar.user.last_name, - 'kegiatan': komentar.kegiatan.id, - 'deskripsi': komentar.deskripsi, - } - } - self.assertEqual(response_json, expected_json) - def test_can_add_foto_kegiatan(self): FotoKegiatan.objects.all().delete() response = \ diff --git a/informasi_fasilitas/test_views_komentar_kegiatan.py b/informasi_fasilitas/test_views_komentar_kegiatan.py new file mode 100644 index 0000000..df0b5c1 --- /dev/null +++ b/informasi_fasilitas/test_views_komentar_kegiatan.py @@ -0,0 +1,93 @@ +import json +from http import HTTPStatus +from django.test import Client +from django.urls import reverse + +from .test_base import InformasiFasilitasViewTest +from .models import Lokasi, Kegiatan, KomentarKegiatan +from pplbackend.utils import response_decode + +class KomentarKegiatanRelatedViewTest(InformasiFasilitasViewTest): + + def setUp(self): + super().setUp() + self.kegiatan = self.create_kegiatan_test(self.user, self.lokasi) + self.kwargs_place_id = {'place_id': self.lokasi.place_id} + self.kwargs_get_or_delete_komentar_kegiatan = { + 'kegiatan_id': self.kegiatan.id, + 'komentar_id': self.kegiatan.id, + } + self.kwargs_kegiatan_id = {'kegiatan_id' : self.kegiatan.place_id} + + self.add_komentar_kegiatan_url = \ + reverse('add-komentar-kegiatan', kwargs=self.kwargs_kegiatan_id) + self.list_komentar_kegiatan_url = \ + reverse('list-komentar-kegiatan', kwargs=self.kwargs_kegiatan_id) + + def test_can_add_komentar_kegiatan(self): + KomentarKegiatan.objects.all().delete() + response = \ + self.client.post(self.add_komentar_kegiatan_url, self.mock_komentar_kegiatan_test) + self.assertEqual(response.status_code, HTTPStatus.CREATED) + + count = KomentarKegiatan.objects.filter(kegiatan=self.kegiatan).count() + self.assertEqual(count, 1) + + def test_can_get_list_komentar_kegiatan(self): + komentar = self.create_komentar_kegiatan_test(user=self.user) + response = self.client.get(self.list_komentar_kegiatan_url) + self.assertEqual(response.status_code, HTTPStatus.OK) + + response_json = response_decode(response) + expected_id = komentar.id + expected_creator: komentar.user.last_name + expected_kegiatan: komentar.kegiatan.id + expected_deskripsi: komentar.deskripsi + + self.assertEqual(response_json['id']['id'], expected_id) + self.assertEqual(response_json['id']['creator'], expected_creator) + self.assertEqual(response_json['id']['kegiatan'], expected_kegiatan) + self.assertEqual(response_json['id']['deskripsi'], expected_deskripsi) + self.assertEqual(True, ('created' in response_json['id'].keys())) + + def test_can_get_komentar_kegiatan(self): + komentar = self.create_komentar_kegiatan_test(user=self.user) + kwargs_get_komentar_kegiatan = { + 'kegiatan_id': self.kegiatan.id, + 'komentar_id': komentar.id, + } + get_komentar_kegiatan_url = \ + reverse('get-komentar-kegiatan', kwargs=kwargs_get_komentar_kegiatan) + response = self.client.get(get_komentar_kegiatan_url) + self.assertEqual(response.status_code, HTTPStatus.OK) + + response_json = response_decode(response) + expected_id = komentar.id + expected_creator: komentar.user.last_name + expected_kegiatan: komentar.kegiatan.id + expected_deskripsi: komentar.deskripsi + + self.assertEqual(response_json['id']['id'], expected_id) + self.assertEqual(response_json['id']['creator'], expected_creator) + self.assertEqual(response_json['id']['kegiatan'], expected_kegiatan) + self.assertEqual(response_json['id']['deskripsi'], expected_deskripsi) + self.assertEqual(True, ('created' in response_json['id'].keys())) + + def test_can_delete_komentar_kegiatan(self): + KomentarKegiatan.objects.all().delete() + komentar = self.create_komentar_kegiatan_test(user=self.user) + + kwargs_delete_komentar_kegiatan = { + 'kegiatan_id': self.kegiatan.id, + 'komentar_id': komentar.id, + } + + delete_komentar_kegiatan_url = \ + reverse('delete-komentar-kegiatan', kwargs=kwargs_delete_komentar_kegiatan) + + response = self.client.delete(delete_komentar_kegiatan_url) + self.assertEqual(response.status_code, HTTPStatus.OK) + + count = KomentarKegiatan.objects.filter(kegiatan=self.kegiatan).count() + self.assertEqual(count, 0) + -- GitLab From 6935153ed7bcb1945c1840846b5ee6dccfe447ac Mon Sep 17 00:00:00 2001 From: Christopher Samuel Date: Sun, 9 May 2021 11:35:55 +0700 Subject: [PATCH 08/17] [CHORES] Added API views for KomentarKegiatan --- .../views_komentar_kegiatan.py | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 informasi_fasilitas/views_komentar_kegiatan.py diff --git a/informasi_fasilitas/views_komentar_kegiatan.py b/informasi_fasilitas/views_komentar_kegiatan.py new file mode 100644 index 0000000..61663d6 --- /dev/null +++ b/informasi_fasilitas/views_komentar_kegiatan.py @@ -0,0 +1,73 @@ +from http import HTTPStatus +from django.http import JsonResponse +from django.views.decorators.csrf import csrf_exempt +from django.contrib.auth.models import User +from django.core.exceptions import ObjectDoesNotExist +from django.db.models import F + +from rest_framework.decorators import api_view, permission_classes, authentication_classes +from rest_framework.authentication import TokenAuthentication +from rest_framework.permissions import IsAuthenticated +from rest_framework.response import Response +from rest_framework.parsers import FileUploadParser +from rest_framework.views import APIView +from rest_framework.generics import ListCreateAPIView +from rest_framework import viewsets + +from .serializers import KomentarKegiatanSerializer +from .models import Lokasi, Kegiatan, KomentarKegiatan +from .permissions import UserPermission + +@api_view(['GET']) +@authentication_classes([]) +@permission_classes([]) +def list_komentar_kegiatan(request, kegiatan_id): + try: + queryset = KomentarKegiatan.objects.filter(kegiatan__id=kegiatan_id) + serializer = KomentarKegiatanSerializer(queryset, many=True) + data_response = serializer.data + new_dict = {item['id']: dict(item) for item in data_response} + return JsonResponse(new_dict, status=HTTPStatus.OK) + except Exception as error: + return JsonResponse({'response': str(error)}, status=HTTPStatus.NOT_FOUND) + +@api_view(['GET']) +@authentication_classes([]) +@permission_classes([]) +def get_komentar_kegiatan(request, kegiatan_id, komentar_id): + try: + queryset = KomentarKegiatan.objects.get(kegiatan__id=kegiatan_id, id=komentar_id) + serializer = KomentarKegiatanSerializer(queryset, many=False) + return JsonResponse(serializer.data, status=HTTPStatus.OK) + except ObjectDoesNotExist: + return JsonResponse({'response': 'Komentar tidak ditemukan'}, status=HTTPStatus.NOT_FOUND) + +@api_view(['POST']) +@authentication_classes([TokenAuthentication]) +@permission_classes([IsAuthenticated]) +def add_komentar_kegiatan(request, kegiatan_id): + try: + kegiatan = Kegiatan.objects.get(id=kegiatan_id) + deskripsi = request.POST['deskripsi'] + komentar = KomentarKegiatan.objects \ + .create( + kegiatan=kegiatan, + user=request.user, + deskripsi=deskripsi + ) + return JsonResponse({'response': 'komentar kegiatan added', 'id': komentar.id}, + status=HTTPStatus.CREATED) + except Exception as error: + return JsonResponse({'response': str(error)}, status=HTTPStatus.NOT_FOUND) + +@api_view(['DELETE']) +@authentication_classes([TokenAuthentication]) +@permission_classes([IsAuthenticated]) +def delete_komentar_kegiatan(request, kegiatan_id, komentar_id): + try: + komentar = KomentarKegiatan.objects.get(kegiatan__id=kegiatan_id, id=komentar_id) + komentar.delete() + return JsonResponse({'response': 'komentar kegiatan deleted', 'id': komentar_id}, + status=HTTPStatus.OK) + except Exception as error: + return JsonResponse({'response': str(error)}, status=HTTPStatus.NOT_FOUND) -- GitLab From 6d16498cd33018d30ea3e43109d3e4357e3ba0db Mon Sep 17 00:00:00 2001 From: Christopher Samuel Date: Mon, 10 May 2021 13:48:55 +0700 Subject: [PATCH 09/17] [CHORES] Added urls for KomentarKegiatan views and updated views + tests for KomentarKegiatan --- .../test_views_komentar_kegiatan.py | 7 ++++++- informasi_fasilitas/urls.py | 14 +++++++++++++- informasi_fasilitas/views_komentar_kegiatan.py | 16 ++++++++-------- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/informasi_fasilitas/test_views_komentar_kegiatan.py b/informasi_fasilitas/test_views_komentar_kegiatan.py index df0b5c1..bc6de61 100644 --- a/informasi_fasilitas/test_views_komentar_kegiatan.py +++ b/informasi_fasilitas/test_views_komentar_kegiatan.py @@ -17,7 +17,10 @@ class KomentarKegiatanRelatedViewTest(InformasiFasilitasViewTest): 'kegiatan_id': self.kegiatan.id, 'komentar_id': self.kegiatan.id, } - self.kwargs_kegiatan_id = {'kegiatan_id' : self.kegiatan.place_id} + self.kwargs_kegiatan_id = { + 'place_id': self.lokasi.place_id, + 'kegiatan_id' : self.kegiatan.place_id, + } self.add_komentar_kegiatan_url = \ reverse('add-komentar-kegiatan', kwargs=self.kwargs_kegiatan_id) @@ -53,6 +56,7 @@ class KomentarKegiatanRelatedViewTest(InformasiFasilitasViewTest): def test_can_get_komentar_kegiatan(self): komentar = self.create_komentar_kegiatan_test(user=self.user) kwargs_get_komentar_kegiatan = { + 'place_id': self.lokasi.place_id, 'kegiatan_id': self.kegiatan.id, 'komentar_id': komentar.id, } @@ -78,6 +82,7 @@ class KomentarKegiatanRelatedViewTest(InformasiFasilitasViewTest): komentar = self.create_komentar_kegiatan_test(user=self.user) kwargs_delete_komentar_kegiatan = { + 'place_id': self.lokasi.place_id, 'kegiatan_id': self.kegiatan.id, 'komentar_id': komentar.id, } diff --git a/informasi_fasilitas/urls.py b/informasi_fasilitas/urls.py index eacb246..1b7db35 100644 --- a/informasi_fasilitas/urls.py +++ b/informasi_fasilitas/urls.py @@ -1,5 +1,5 @@ from django.urls import path -from . import views +from . import views, views_komentar_kegiatan list_lokasi_views = views.LokasiListCreateView.as_view({'get':'list'}) add_lokasi_views = views.LokasiListCreateView.as_view({'post':'create'}) @@ -29,4 +29,16 @@ urlpatterns = [ path('lokasi/like-fasilitas////', views.update_like_fasilitas, name='update-like-fasilitas'), + + path('lokasi/get-komentar-kegiatan///', + views_komentar_kegiatan.get_komentar_kegiatan, name='get-komentar-kegiatan'), + + path('lokasi/list-komentar-kegiatan//', + views_komentar_kegiatan.list_komentar_kegiatan, name='list-komentar-kegiatan'), + + path('lokasi/add-komentar-kegiatan//', + views_komentar_kegiatan.add_komentar_kegiatan, name='add-komentar-kegiatan'), + + path('lokasi/delete-komentar-kegiatan///', + views_komentar_kegiatan.delete_komentar_kegiatan, name='delete-komentar-kegiatan'), ] diff --git a/informasi_fasilitas/views_komentar_kegiatan.py b/informasi_fasilitas/views_komentar_kegiatan.py index 61663d6..c8e2f5d 100644 --- a/informasi_fasilitas/views_komentar_kegiatan.py +++ b/informasi_fasilitas/views_komentar_kegiatan.py @@ -21,9 +21,9 @@ from .permissions import UserPermission @api_view(['GET']) @authentication_classes([]) @permission_classes([]) -def list_komentar_kegiatan(request, kegiatan_id): +def list_komentar_kegiatan(request, place_id, kegiatan_id): try: - queryset = KomentarKegiatan.objects.filter(kegiatan__id=kegiatan_id) + queryset = KomentarKegiatan.objects.filter(kegiatan__lokasi__place_id=place_id, kegiatan__id=kegiatan_id) serializer = KomentarKegiatanSerializer(queryset, many=True) data_response = serializer.data new_dict = {item['id']: dict(item) for item in data_response} @@ -34,9 +34,9 @@ def list_komentar_kegiatan(request, kegiatan_id): @api_view(['GET']) @authentication_classes([]) @permission_classes([]) -def get_komentar_kegiatan(request, kegiatan_id, komentar_id): +def get_komentar_kegiatan(request, place_id, kegiatan_id, komentar_id): try: - queryset = KomentarKegiatan.objects.get(kegiatan__id=kegiatan_id, id=komentar_id) + queryset = KomentarKegiatan.objects.filter(kegiatan__lokasi__place_id=place_id, kegiatan__id=kegiatan_id) serializer = KomentarKegiatanSerializer(queryset, many=False) return JsonResponse(serializer.data, status=HTTPStatus.OK) except ObjectDoesNotExist: @@ -45,9 +45,9 @@ def get_komentar_kegiatan(request, kegiatan_id, komentar_id): @api_view(['POST']) @authentication_classes([TokenAuthentication]) @permission_classes([IsAuthenticated]) -def add_komentar_kegiatan(request, kegiatan_id): +def add_komentar_kegiatan(request, place_id, kegiatan_id): try: - kegiatan = Kegiatan.objects.get(id=kegiatan_id) + kegiatan = Kegiatan.objects.get(lokasi__place_id=place_id, id=kegiatan_id) deskripsi = request.POST['deskripsi'] komentar = KomentarKegiatan.objects \ .create( @@ -63,9 +63,9 @@ def add_komentar_kegiatan(request, kegiatan_id): @api_view(['DELETE']) @authentication_classes([TokenAuthentication]) @permission_classes([IsAuthenticated]) -def delete_komentar_kegiatan(request, kegiatan_id, komentar_id): +def delete_komentar_kegiatan(request, place_id, kegiatan_id, komentar_id): try: - komentar = KomentarKegiatan.objects.get(kegiatan__id=kegiatan_id, id=komentar_id) + komentar = KomentarKegiatan.objects.get(kegiatan__lokasi__place_id=place_id, kegiatan__id=kegiatan_id, id=komentar_id) komentar.delete() return JsonResponse({'response': 'komentar kegiatan deleted', 'id': komentar_id}, status=HTTPStatus.OK) -- GitLab From 8a03fb3c3d6e47b905072297ff5f272fa6b041d0 Mon Sep 17 00:00:00 2001 From: Christopher Samuel Date: Mon, 10 May 2021 23:04:25 +0700 Subject: [PATCH 10/17] [CHORES] Fixed typo in KomentarKegiatan test setup --- informasi_fasilitas/test_views_komentar_kegiatan.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/informasi_fasilitas/test_views_komentar_kegiatan.py b/informasi_fasilitas/test_views_komentar_kegiatan.py index bc6de61..437000e 100644 --- a/informasi_fasilitas/test_views_komentar_kegiatan.py +++ b/informasi_fasilitas/test_views_komentar_kegiatan.py @@ -19,7 +19,7 @@ class KomentarKegiatanRelatedViewTest(InformasiFasilitasViewTest): } self.kwargs_kegiatan_id = { 'place_id': self.lokasi.place_id, - 'kegiatan_id' : self.kegiatan.place_id, + 'kegiatan_id' : self.kegiatan.id, } self.add_komentar_kegiatan_url = \ -- GitLab From 1f813f23f28dba83f16d8edc4c30f3ad06376004 Mon Sep 17 00:00:00 2001 From: Christopher Samuel Date: Tue, 11 May 2021 01:01:57 +0700 Subject: [PATCH 11/17] [GREEN] Fixed implementation + tests for KomentarKegiatan, temporary commented unused tests --- informasi_fasilitas/serializers.py | 4 +- informasi_fasilitas/test_base.py | 6 ++- informasi_fasilitas/test_views_kegiatan.py | 36 ++++++++--------- .../test_views_komentar_kegiatan.py | 40 +++++++++---------- .../views_komentar_kegiatan.py | 5 ++- 5 files changed, 47 insertions(+), 44 deletions(-) diff --git a/informasi_fasilitas/serializers.py b/informasi_fasilitas/serializers.py index 683404b..f3f3f7c 100644 --- a/informasi_fasilitas/serializers.py +++ b/informasi_fasilitas/serializers.py @@ -48,11 +48,11 @@ class KegiatanFullSerializer(serializers.ModelSerializer): } class KomentarKegiatanSerializer(serializers.ModelSerializer): - kegiatan = serializers.CharField(source='kegiatan.id', read_only=True) + kegiatan = serializers.IntegerField(source='kegiatan.id', read_only=True) creator = serializers.CharField(source='user.last_name', read_only=True) class Meta: model = KomentarKegiatan - fields = {'id', 'creator', 'kegiatan', 'deskripsi', 'created'} + fields = ('id', 'creator', 'kegiatan', 'deskripsi', 'created') extra_kwargs = { 'deskripsi': {'required': True}, 'created': {'required' : True} diff --git a/informasi_fasilitas/test_base.py b/informasi_fasilitas/test_base.py index 6ef56a4..d67f4aa 100644 --- a/informasi_fasilitas/test_base.py +++ b/informasi_fasilitas/test_base.py @@ -281,14 +281,16 @@ class InformasiFasilitasTest(TestCase): self, user=None, komentar_kegiatan_dict=mock_komentar_kegiatan_test, - user_dict=mock_user_test + user_dict=mock_user_test, + kegiatan=None ): user = self.get_or_create_user_test( user=user, user_dict=user_dict, ) - kegiatan = self.create_kegiatan_test() + if kegiatan is None: + kegiatan = self.create_kegiatan_test() return KomentarKegiatan.objects.create( **komentar_kegiatan_dict, diff --git a/informasi_fasilitas/test_views_kegiatan.py b/informasi_fasilitas/test_views_kegiatan.py index 2d122c8..d513c1a 100644 --- a/informasi_fasilitas/test_views_kegiatan.py +++ b/informasi_fasilitas/test_views_kegiatan.py @@ -29,10 +29,10 @@ class KegiatanRelatedViewTest(InformasiFasilitasViewTest): self.update_kegiatan_url = reverse('update-kegiatan', kwargs=self.kwargs_add_or_update_kegiatan) - self.add_foto_kegiatan_url = \ - reverse('add-foto-kegiatan', kwargs=self.kwargs_kegiatan_id) - self.list_foto_kegiatan_url = \ - reverse('list-foto-kegiatan', kwargs=self.kwargs_kegiatan_id) + # self.add_foto_kegiatan_url = \ + # reverse('add-foto-kegiatan', kwargs=self.kwargs_kegiatan_id) + # self.list_foto_kegiatan_url = \ + # reverse('list-foto-kegiatan', kwargs=self.kwargs_kegiatan_id) def test_can_add_kegiatan(self): Kegiatan.objects.all().delete() @@ -114,20 +114,20 @@ class KegiatanRelatedViewTest(InformasiFasilitasViewTest): response = self.client.put(self.update_kegiatan_url, data=send_data) self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND) - def test_can_add_foto_kegiatan(self): - FotoKegiatan.objects.all().delete() - response = \ - self.client.post(self.add_foto_kegiatan_url, self.mock_foto_kegiatan_test) - self.assertEqual(response.status_code, HTTPStatus.CREATED) + # def test_can_add_foto_kegiatan(self): + # FotoKegiatan.objects.all().delete() + # response = \ + # self.client.post(self.add_foto_kegiatan_url, self.mock_foto_kegiatan_test) + # self.assertEqual(response.status_code, HTTPStatus.CREATED) - count = FotoKegiatan.objects.filter(kegiatan=self.kegiatan).count() - self.assertEqual(count, 1) + # count = FotoKegiatan.objects.filter(kegiatan=self.kegiatan).count() + # self.assertEqual(count, 1) - def test_can_get_list_foto_kegiatan(self): - foto = self.create_foto_kegiatan_test() - response = self.client.get(self.list_foto_kegiatan_url) - self.assertEqual(response.status_code, HTTPStatus.OK) + # def test_can_get_list_foto_kegiatan(self): + # foto = self.create_foto_kegiatan_test() + # response = self.client.get(self.list_foto_kegiatan_url) + # self.assertEqual(response.status_code, HTTPStatus.OK) - response_json = response_decode(response) - self.assertEqual(response_json['id'], foto.id) - self.assertIsNotNone(response_json['foto']) + # response_json = response_decode(response) + # self.assertEqual(response_json['id'], foto.id) + # self.assertIsNotNone(response_json['foto']) diff --git a/informasi_fasilitas/test_views_komentar_kegiatan.py b/informasi_fasilitas/test_views_komentar_kegiatan.py index 437000e..cd8ca12 100644 --- a/informasi_fasilitas/test_views_komentar_kegiatan.py +++ b/informasi_fasilitas/test_views_komentar_kegiatan.py @@ -37,24 +37,24 @@ class KomentarKegiatanRelatedViewTest(InformasiFasilitasViewTest): self.assertEqual(count, 1) def test_can_get_list_komentar_kegiatan(self): - komentar = self.create_komentar_kegiatan_test(user=self.user) + komentar = self.create_komentar_kegiatan_test(user=self.user, kegiatan=self.kegiatan) response = self.client.get(self.list_komentar_kegiatan_url) self.assertEqual(response.status_code, HTTPStatus.OK) response_json = response_decode(response) expected_id = komentar.id - expected_creator: komentar.user.last_name - expected_kegiatan: komentar.kegiatan.id - expected_deskripsi: komentar.deskripsi + expected_creator = komentar.user.last_name + expected_kegiatan = komentar.kegiatan.id + expected_deskripsi = komentar.deskripsi + + self.assertEqual(response_json[str(komentar.id)]['id'], expected_id) + self.assertEqual(response_json[str(komentar.id)]['creator'], expected_creator) + self.assertEqual(response_json[str(komentar.id)]['kegiatan'], expected_kegiatan) + self.assertEqual(response_json[str(komentar.id)]['deskripsi'], expected_deskripsi) + self.assertEqual(True, ('created' in response_json[str(komentar.id)].keys())) - self.assertEqual(response_json['id']['id'], expected_id) - self.assertEqual(response_json['id']['creator'], expected_creator) - self.assertEqual(response_json['id']['kegiatan'], expected_kegiatan) - self.assertEqual(response_json['id']['deskripsi'], expected_deskripsi) - self.assertEqual(True, ('created' in response_json['id'].keys())) - def test_can_get_komentar_kegiatan(self): - komentar = self.create_komentar_kegiatan_test(user=self.user) + komentar = self.create_komentar_kegiatan_test(user=self.user, kegiatan=self.kegiatan) kwargs_get_komentar_kegiatan = { 'place_id': self.lokasi.place_id, 'kegiatan_id': self.kegiatan.id, @@ -67,19 +67,19 @@ class KomentarKegiatanRelatedViewTest(InformasiFasilitasViewTest): response_json = response_decode(response) expected_id = komentar.id - expected_creator: komentar.user.last_name - expected_kegiatan: komentar.kegiatan.id - expected_deskripsi: komentar.deskripsi + expected_creator = komentar.user.last_name + expected_kegiatan = komentar.kegiatan.id + expected_deskripsi = komentar.deskripsi - self.assertEqual(response_json['id']['id'], expected_id) - self.assertEqual(response_json['id']['creator'], expected_creator) - self.assertEqual(response_json['id']['kegiatan'], expected_kegiatan) - self.assertEqual(response_json['id']['deskripsi'], expected_deskripsi) - self.assertEqual(True, ('created' in response_json['id'].keys())) + self.assertEqual(response_json['id'], expected_id) + self.assertEqual(response_json['creator'], expected_creator) + self.assertEqual(response_json['kegiatan'], expected_kegiatan) + self.assertEqual(response_json['deskripsi'], expected_deskripsi) + self.assertEqual(True, ('created' in response_json.keys())) def test_can_delete_komentar_kegiatan(self): KomentarKegiatan.objects.all().delete() - komentar = self.create_komentar_kegiatan_test(user=self.user) + komentar = self.create_komentar_kegiatan_test(user=self.user, kegiatan=self.kegiatan) kwargs_delete_komentar_kegiatan = { 'place_id': self.lokasi.place_id, diff --git a/informasi_fasilitas/views_komentar_kegiatan.py b/informasi_fasilitas/views_komentar_kegiatan.py index c8e2f5d..eea2872 100644 --- a/informasi_fasilitas/views_komentar_kegiatan.py +++ b/informasi_fasilitas/views_komentar_kegiatan.py @@ -36,8 +36,9 @@ def list_komentar_kegiatan(request, place_id, kegiatan_id): @permission_classes([]) def get_komentar_kegiatan(request, place_id, kegiatan_id, komentar_id): try: - queryset = KomentarKegiatan.objects.filter(kegiatan__lokasi__place_id=place_id, kegiatan__id=kegiatan_id) - serializer = KomentarKegiatanSerializer(queryset, many=False) + komentar = KomentarKegiatan.objects.get(kegiatan__lokasi__place_id=place_id, + kegiatan__id=kegiatan_id, id=komentar_id) + serializer = KomentarKegiatanSerializer(komentar, many=False) return JsonResponse(serializer.data, status=HTTPStatus.OK) except ObjectDoesNotExist: return JsonResponse({'response': 'Komentar tidak ditemukan'}, status=HTTPStatus.NOT_FOUND) -- GitLab From 6baecaf1fedfdf1475f0bfcf79af92596ec29f3f Mon Sep 17 00:00:00 2001 From: Christopher Samuel Date: Sun, 16 May 2021 13:44:46 +0700 Subject: [PATCH 12/17] [CHORES] Add negative tests for KomentarKegiatan --- informasi_fasilitas/test_views_kegiatan.py | 5 +++-- .../test_views_komentar_kegiatan.py | 21 +++++++++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/informasi_fasilitas/test_views_kegiatan.py b/informasi_fasilitas/test_views_kegiatan.py index 84dd906..0b6eb1f 100644 --- a/informasi_fasilitas/test_views_kegiatan.py +++ b/informasi_fasilitas/test_views_kegiatan.py @@ -51,7 +51,8 @@ class KegiatanRelatedViewTest(InformasiFasilitasViewTest): self.add_kegiatan_url = \ reverse('add-kegiatan', kwargs=self.kwargs_place_id) self.update_kegiatan_url = reverse('update-kegiatan', - kwargs=self.kwargs_add_or_update_kegiatan), + kwargs=self.kwargs_add_or_update_kegiatan) + self.list_foto_kegiatan_url = \ reverse('list-foto-kegiatan', kwargs=self.kwargs_get_foto_kegiatan) @@ -198,6 +199,7 @@ class KegiatanRelatedViewTest(InformasiFasilitasViewTest): response = self.client.put(url, data=send_data) self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND) + def test_can_get_list_foto_kegiatan(self): response = Client().get(self.list_foto_kegiatan_url) data = response.json() @@ -207,4 +209,3 @@ class KegiatanRelatedViewTest(InformasiFasilitasViewTest): self.assertIn("test"+str(counter), item["foto"]) self.assertEqual(item["kegiatan"], self.kegiatan.id) counter += 1 - diff --git a/informasi_fasilitas/test_views_komentar_kegiatan.py b/informasi_fasilitas/test_views_komentar_kegiatan.py index cd8ca12..c712e22 100644 --- a/informasi_fasilitas/test_views_komentar_kegiatan.py +++ b/informasi_fasilitas/test_views_komentar_kegiatan.py @@ -13,10 +13,6 @@ class KomentarKegiatanRelatedViewTest(InformasiFasilitasViewTest): super().setUp() self.kegiatan = self.create_kegiatan_test(self.user, self.lokasi) self.kwargs_place_id = {'place_id': self.lokasi.place_id} - self.kwargs_get_or_delete_komentar_kegiatan = { - 'kegiatan_id': self.kegiatan.id, - 'komentar_id': self.kegiatan.id, - } self.kwargs_kegiatan_id = { 'place_id': self.lokasi.place_id, 'kegiatan_id' : self.kegiatan.id, @@ -36,6 +32,15 @@ class KomentarKegiatanRelatedViewTest(InformasiFasilitasViewTest): count = KomentarKegiatan.objects.filter(kegiatan=self.kegiatan).count() self.assertEqual(count, 1) + def test_fail_add_komentar_kegiatan(self): + KomentarKegiatan.objects.all().delete() + response = \ + self.client.post(self.add_komentar_kegiatan_url, None) + self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND) + + count = KomentarKegiatan.objects.filter(kegiatan=self.kegiatan).count() + self.assertEqual(count, 0) + def test_can_get_list_komentar_kegiatan(self): komentar = self.create_komentar_kegiatan_test(user=self.user, kegiatan=self.kegiatan) response = self.client.get(self.list_komentar_kegiatan_url) @@ -77,6 +82,10 @@ class KomentarKegiatanRelatedViewTest(InformasiFasilitasViewTest): self.assertEqual(response_json['deskripsi'], expected_deskripsi) self.assertEqual(True, ('created' in response_json.keys())) + def test_fail_get_komentar_kegiatan(self): + response = self.client.get('/informasi-fasilitas/lokasi/get-komentar-kegiatan/harusnyaTidakAda/101/1011') + self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND) + def test_can_delete_komentar_kegiatan(self): KomentarKegiatan.objects.all().delete() komentar = self.create_komentar_kegiatan_test(user=self.user, kegiatan=self.kegiatan) @@ -95,4 +104,8 @@ class KomentarKegiatanRelatedViewTest(InformasiFasilitasViewTest): count = KomentarKegiatan.objects.filter(kegiatan=self.kegiatan).count() self.assertEqual(count, 0) + + def test_fail_delete_komentar_kegiatan(self): + response = self.client.delete('/informasi-fasilitas/lokasi/delete-komentar-kegiatan/harusnyaTidakAda/10/10101') + self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND) -- GitLab From 18cc3af5614733f263c8bbd5b14901452863d37d Mon Sep 17 00:00:00 2001 From: Christopher Samuel Date: Mon, 24 May 2021 19:33:18 +0700 Subject: [PATCH 13/17] [RED] Add tests for agenda kegiatan functions --- informasi_fasilitas/test_base.py | 21 +++++++++- informasi_fasilitas/test_views_kegiatan.py | 46 ++++++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/informasi_fasilitas/test_base.py b/informasi_fasilitas/test_base.py index e481d3d..1108940 100644 --- a/informasi_fasilitas/test_base.py +++ b/informasi_fasilitas/test_base.py @@ -48,7 +48,6 @@ class InformasiFasilitasTest(TestCase): 'deskripsi': 'sangat membantu', } - # Waktu mungkin perlu disesuaikan lagi test dan implementasinya mock_kegiatan_test = { 'nama_kegiatan': 'mock kegiatan', 'penyelenggara': 'mock penyelenggara', @@ -59,6 +58,26 @@ class InformasiFasilitasTest(TestCase): 'links': "www.example.com;www.example.com" } + mock_kegiatan_time_order_test = { + 'nama_kegiatan': 'mock kegiatan', + 'penyelenggara': 'mock penyelenggara', + 'time_start':(datetime.now()+timedelta(days=2)).strftime("%Y-%m-%d %H:%M"), + 'time_end': (datetime.now()+timedelta(days=3)).strftime("%Y-%m-%d %H:%M"), + 'narahubung': 'sebuah narahubung', + 'deskripsi': 'sebuah deskripsi', + 'links': "www.example.com;www.example.com" + } + + mock_kegiatan_name_order_test = { + 'nama_kegiatan': 'aaaa mock kegiatan', + 'penyelenggara': 'mock penyelenggara', + 'time_start':(datetime.now()+timedelta(days=2)).strftime("%Y-%m-%d %H:%M"), + 'time_end': (datetime.now()+timedelta(days=3)).strftime("%Y-%m-%d %H:%M"), + 'narahubung': 'sebuah narahubung', + 'deskripsi': 'sebuah deskripsi', + 'links': "www.example.com;www.example.com" + } + mock_komentar_kegiatan_test = { 'deskripsi': 'sangat membantu' } diff --git a/informasi_fasilitas/test_views_kegiatan.py b/informasi_fasilitas/test_views_kegiatan.py index 76dcf03..c5426a3 100644 --- a/informasi_fasilitas/test_views_kegiatan.py +++ b/informasi_fasilitas/test_views_kegiatan.py @@ -60,6 +60,8 @@ class KegiatanRelatedViewTest(InformasiFasilitasViewTest): kwargs=self.kwargs_search_kegiatan_fail) self.list_foto_kegiatan_url = \ reverse('list-foto-kegiatan', kwargs=self.kwargs_get_foto_kegiatan) + self.list_kegiatan_by_name_url = reverse('list-kegiatan-by-name') + self.list_kegiatan_by_time_url = reverse('list-kegiatan-by-time') def tearDown(self): try: @@ -240,3 +242,47 @@ class KegiatanRelatedViewTest(InformasiFasilitasViewTest): def test_search_kegiatan_empty_result_or_fail(self): response = Client().get(self.search_kegiatan_fail_url) self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND) + + def test_get_all_kegiatan_by_name_order(self): + Kegiatan.objects.all().delete() + response_params = self.mock_kegiatan_test.copy() + response = self.client.post(self.add_kegiatan_url, response_params) + self.assertEqual(response.status_code, HTTPStatus.CREATED) + content = json.loads(response.content.decode('utf-8')) + base_mock_id = content['id'] + + response_params = self.mock_kegiatan_name_order_test.copy() + response = self.client.post(self.add_kegiatan_url, response_params) + self.assertEqual(response.status_code, HTTPStatus.CREATED) + content = json.loads(response.content.decode('utf-8')) + ordered_name_mock_id = content['id'] + + response = self.client.get(self.list_kegiatan_by_name_url) + self.assertEqual(response.status_code, HTTPStatus.OK) + content = json.loads(response.content.decode('utf-8')) + self.assertEqual(content[base_mock_id]['nama_kegiatan'], + self.mock_kegiatan_name_order_test['nama_kegiatan']) + self.assertEqual(content[ordered_name_mock_id]['nama_kegiatan'], + self.kegiatan['nama_kegiatan']) + + def test_get_all_kegiatan_by_time_order(self): + Kegiatan.objects.all().delete() + response_params = self.mock_kegiatan_test.copy() + response = self.client.post(self.add_kegiatan_url, response_params) + self.assertEqual(response.status_code, HTTPStatus.CREATED) + content = json.loads(response.content.decode('utf-8')) + base_mock_id = content['id'] + + response_params = self.mock_kegiatan_name_order_test.copy() + response = self.client.post(self.add_kegiatan_url, response_params) + self.assertEqual(response.status_code, HTTPStatus.CREATED) + content = json.loads(response.content.decode('utf-8')) + ordered_name_mock_id = content['id'] + + response = self.client.get(self.list_kegiatan_by_time_url) + self.assertEqual(response.status_code, HTTPStatus.OK) + content = json.loads(response.content.decode('utf-8')) + self.assertEqual(content[base_mock_id]['time_start'], + self.mock_kegiatan_name_order_test['time_start']) + self.assertEqual(content[ordered_name_mock_id]['time_start'], + self.kegiatan['time_start']) -- GitLab From 310c69d9cc9f41892cdc6a1956a33bf402778e0a Mon Sep 17 00:00:00 2001 From: Christopher Samuel Date: Mon, 24 May 2021 20:13:04 +0700 Subject: [PATCH 14/17] [CHORES] Update tests for agenda kegiatan functions --- informasi_fasilitas/test_views_kegiatan.py | 58 +++++++++++++++++----- 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/informasi_fasilitas/test_views_kegiatan.py b/informasi_fasilitas/test_views_kegiatan.py index c5426a3..0c15b6c 100644 --- a/informasi_fasilitas/test_views_kegiatan.py +++ b/informasi_fasilitas/test_views_kegiatan.py @@ -33,6 +33,14 @@ class KegiatanRelatedViewTest(InformasiFasilitasViewTest): self.kwargs_search_kegiatan_fail = {'query': 'this shouldnt exist',} self.kwargs_kegiatan_id = {'kegiatan_id' : self.kegiatan.lokasi.place_id} + self.kwargs_list_kegiatan_in_order = { + 'start_index': 0, + 'query_limit': 10, + } + self.kwargs_list_kegiatan_in_order_fail = { + 'start_index': 10, + 'query_limit': 20, + } image_path1, image_path2 = ("test_file/test1.jpg", "test_file/test2.jpg") image1 = SimpleUploadedFile("test1.jpg", content=open(image_path1, 'rb').read(), @@ -60,8 +68,14 @@ class KegiatanRelatedViewTest(InformasiFasilitasViewTest): kwargs=self.kwargs_search_kegiatan_fail) self.list_foto_kegiatan_url = \ reverse('list-foto-kegiatan', kwargs=self.kwargs_get_foto_kegiatan) - self.list_kegiatan_by_name_url = reverse('list-kegiatan-by-name') - self.list_kegiatan_by_time_url = reverse('list-kegiatan-by-time') + self.list_kegiatan_by_name_url = \ + reverse('list-kegiatan-by-name', kwargs=self.kwargs_list_kegiatan_in_order) + self.list_kegiatan_by_time_url = \ + reverse('list-kegiatan-by-time', kwargs=self.kwargs_list_kegiatan_in_order) + self.list_kegiatan_by_name_fail_url = \ + reverse('list-kegiatan-by-name', kwargs=self.kwargs_list_kegiatan_in_order_fail) + self.list_kegiatan_by_time_fail_url = \ + reverse('list-kegiatan-by-time', kwargs=self.kwargs_list_kegiatan_in_order_fail) def tearDown(self): try: @@ -243,46 +257,64 @@ class KegiatanRelatedViewTest(InformasiFasilitasViewTest): response = Client().get(self.search_kegiatan_fail_url) self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND) - def test_get_all_kegiatan_by_name_order(self): + def test_can_get_list_kegiatan_by_name_order(self): Kegiatan.objects.all().delete() response_params = self.mock_kegiatan_test.copy() response = self.client.post(self.add_kegiatan_url, response_params) self.assertEqual(response.status_code, HTTPStatus.CREATED) content = json.loads(response.content.decode('utf-8')) - base_mock_id = content['id'] + base_mock_id = str(content['id']) response_params = self.mock_kegiatan_name_order_test.copy() response = self.client.post(self.add_kegiatan_url, response_params) self.assertEqual(response.status_code, HTTPStatus.CREATED) content = json.loads(response.content.decode('utf-8')) - ordered_name_mock_id = content['id'] + ordered_name_mock_id = str(content['id']) response = self.client.get(self.list_kegiatan_by_name_url) self.assertEqual(response.status_code, HTTPStatus.OK) content = json.loads(response.content.decode('utf-8')) + + response_id_in_order = list(content.keys()) + self.assertEqual(content[base_mock_id]['nama_kegiatan'], - self.mock_kegiatan_name_order_test['nama_kegiatan']) + self.kegiatan.nama_kegiatan) self.assertEqual(content[ordered_name_mock_id]['nama_kegiatan'], - self.kegiatan['nama_kegiatan']) + self.mock_kegiatan_name_order_test['nama_kegiatan']) + self.assertEqual(response_id_in_order[0], ordered_name_mock_id) + self.assertEqual(response_id_in_order[1], base_mock_id) - def test_get_all_kegiatan_by_time_order(self): + def test_fail_get_list_kegiatan_by_name_order(self): + response = Client().get(self.list_kegiatan_by_name_fail_url) + self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND) + + def test_can_get_list_kegiatan_by_time_order(self): Kegiatan.objects.all().delete() response_params = self.mock_kegiatan_test.copy() response = self.client.post(self.add_kegiatan_url, response_params) self.assertEqual(response.status_code, HTTPStatus.CREATED) content = json.loads(response.content.decode('utf-8')) - base_mock_id = content['id'] + base_mock_id = str(content['id']) response_params = self.mock_kegiatan_name_order_test.copy() response = self.client.post(self.add_kegiatan_url, response_params) self.assertEqual(response.status_code, HTTPStatus.CREATED) content = json.loads(response.content.decode('utf-8')) - ordered_name_mock_id = content['id'] + ordered_time_mock_id = str(content['id']) response = self.client.get(self.list_kegiatan_by_time_url) self.assertEqual(response.status_code, HTTPStatus.OK) content = json.loads(response.content.decode('utf-8')) + + response_id_in_order = list(content.keys()) + self.assertEqual(content[base_mock_id]['time_start'], - self.mock_kegiatan_name_order_test['time_start']) - self.assertEqual(content[ordered_name_mock_id]['time_start'], - self.kegiatan['time_start']) + self.kegiatan.time_start) + self.assertEqual(content[ordered_time_mock_id]['time_start'], + self.mock_kegiatan_time_order_test['time_start']) + self.assertEqual(response_id_in_order[0], base_mock_id) + self.assertEqual(response_id_in_order[1], ordered_time_mock_id) + + def test_fail_get_list_kegiatan_by_time_order(self): + response = Client().get(self.list_kegiatan_by_time_fail_url) + self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND) -- GitLab From 4465b38881d8adc2da52946d0dfc28ffe702f178 Mon Sep 17 00:00:00 2001 From: Christopher Samuel Date: Mon, 24 May 2021 20:21:24 +0700 Subject: [PATCH 15/17] [GREEN] Add agenda kegiatan functions and endpoints --- informasi_fasilitas/urls.py | 14 ++++++++++++-- informasi_fasilitas/views_kegiatan.py | 26 ++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/informasi_fasilitas/urls.py b/informasi_fasilitas/urls.py index 6442517..1ad04fb 100644 --- a/informasi_fasilitas/urls.py +++ b/informasi_fasilitas/urls.py @@ -50,6 +50,18 @@ urlpatterns = [ path('lokasi/list-foto-kegiatan//', views_kegiatan.list_foto_kegiatan, name='list-foto-kegiatan'), + + path('lokasi/list-kegiatan-by-name//', + views_kegiatan.list_kegiatan_by_name, name='list-kegiatan-by-name'), + + path('lokasi/list-kegiatan-by-name/', + views_kegiatan.list_kegiatan_by_name, name='list-kegiatan-by-name'), + + path('lokasi/list-kegiatan-by-time//', + views_kegiatan.list_kegiatan_by_time, name='list-kegiatan-by-time'), + + path('lokasi/list-kegiatan-by-time/', + views_kegiatan.list_kegiatan_by_time, name='list-kegiatan-by-time'), path('lokasi/get-komentar-kegiatan///', views_komentar_kegiatan.get_komentar_kegiatan, name='get-komentar-kegiatan'), @@ -62,6 +74,4 @@ urlpatterns = [ path('lokasi/delete-komentar-kegiatan///', views_komentar_kegiatan.delete_komentar_kegiatan, name='delete-komentar-kegiatan'), - - ] diff --git a/informasi_fasilitas/views_kegiatan.py b/informasi_fasilitas/views_kegiatan.py index 3228f1a..5271959 100644 --- a/informasi_fasilitas/views_kegiatan.py +++ b/informasi_fasilitas/views_kegiatan.py @@ -109,6 +109,32 @@ def search_kegiatan(request, query): new_dict = {item['id']: _clean_json_kegiatan(dict(item)) for item in serializer.data} return JsonResponse(new_dict, status=HTTPStatus.OK) +@api_view(['GET']) +@authentication_classes([]) +@permission_classes([]) +def list_kegiatan_by_name(request, start_index, query_limit=9): + time_now = timezone.now() + queryset = Kegiatan.objects.filter(time_end__gte=time_now).order_by('nama_kegiatan') + queryset = queryset[start_index:start_index+query_limit] + if not queryset.exists(): + raise NotFound(detail="No Kegiatan available") + serializer = KegiatanSerializer(queryset, many=True) + new_dict = {item['id']: _clean_json_kegiatan(dict(item)) for item in serializer.data} + return JsonResponse(new_dict, status=HTTPStatus.OK) + +@api_view(['GET']) +@authentication_classes([]) +@permission_classes([]) +def list_kegiatan_by_time(request, start_index, query_limit=9): + time_now = timezone.now() + queryset = Kegiatan.objects.filter(time_end__gte=time_now).order_by('time_start') + queryset = queryset[start_index:start_index+query_limit] + if not queryset.exists(): + raise NotFound(detail="No Kegiatan available") + serializer = KegiatanSerializer(queryset, many=True) + new_dict = {item['id']: _clean_json_kegiatan(dict(item)) for item in serializer.data} + return JsonResponse(new_dict, status=HTTPStatus.OK) + def _clean_json_kegiatan(kegiatan): kegiatan.pop("user") kegiatan.pop("lokasi") -- GitLab From f79fabe44321322083d7c48ee982009a02b6ba60 Mon Sep 17 00:00:00 2001 From: Christopher Samuel Date: Mon, 24 May 2021 20:32:56 +0700 Subject: [PATCH 16/17] [RED] Add test for list kegiatan by newly added --- informasi_fasilitas/test_views_kegiatan.py | 27 ++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/informasi_fasilitas/test_views_kegiatan.py b/informasi_fasilitas/test_views_kegiatan.py index 0c15b6c..bf988d7 100644 --- a/informasi_fasilitas/test_views_kegiatan.py +++ b/informasi_fasilitas/test_views_kegiatan.py @@ -68,10 +68,14 @@ class KegiatanRelatedViewTest(InformasiFasilitasViewTest): kwargs=self.kwargs_search_kegiatan_fail) self.list_foto_kegiatan_url = \ reverse('list-foto-kegiatan', kwargs=self.kwargs_get_foto_kegiatan) + self.list_kegiatan_by_newly_added_url = \ + reverse('list-kegiatan-by-newly-added', kwargs=self.kwargs_list_kegiatan_in_order) self.list_kegiatan_by_name_url = \ reverse('list-kegiatan-by-name', kwargs=self.kwargs_list_kegiatan_in_order) self.list_kegiatan_by_time_url = \ reverse('list-kegiatan-by-time', kwargs=self.kwargs_list_kegiatan_in_order) + self.list_kegiatan_by_newly_added_fail_url = \ + reverse('list-kegiatan-by-newly-added', kwargs=self.kwargs_list_kegiatan_in_order_fail) self.list_kegiatan_by_name_fail_url = \ reverse('list-kegiatan-by-name', kwargs=self.kwargs_list_kegiatan_in_order_fail) self.list_kegiatan_by_time_fail_url = \ @@ -318,3 +322,26 @@ class KegiatanRelatedViewTest(InformasiFasilitasViewTest): def test_fail_get_list_kegiatan_by_time_order(self): response = Client().get(self.list_kegiatan_by_time_fail_url) self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND) + + def test_can_get_list_kegiatan_by_newly_added(self): + Kegiatan.objects.all().delete() + response_params = self.mock_kegiatan_test.copy() + response = self.client.post(self.add_kegiatan_url, response_params) + self.assertEqual(response.status_code, HTTPStatus.CREATED) + content = json.loads(response.content.decode('utf-8')) + + response_params = self.mock_kegiatan_test.copy() + response = self.client.post(self.add_kegiatan_url, response_params) + self.assertEqual(response.status_code, HTTPStatus.CREATED) + content = json.loads(response.content.decode('utf-8')) + + response = self.client.get(self.list_kegiatan_by_newly_added_url) + self.assertEqual(response.status_code, HTTPStatus.OK) + content = json.loads(response.content.decode('utf-8')) + + response_id_in_order = list(content.keys()) + self.assertGreater(int(response_id_in_order[0]), int(response_id_in_order[1])) + + def test_fail_get_list_kegiatan_by_newly_added(self): + response = Client().get(self.list_kegiatan_by_newly_added_url) + self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND) -- GitLab From 97b4eecadd37f7d2acf376a1ec434a82b4fc88a8 Mon Sep 17 00:00:00 2001 From: Christopher Samuel Date: Mon, 24 May 2021 20:39:15 +0700 Subject: [PATCH 17/17] [GREEN] Added search by latest created kegiatan for agenda kegiatan + renamed certain variables --- informasi_fasilitas/test_views_kegiatan.py | 16 ++++++++-------- informasi_fasilitas/urls.py | 6 ++++++ informasi_fasilitas/views_kegiatan.py | 13 +++++++++++++ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/informasi_fasilitas/test_views_kegiatan.py b/informasi_fasilitas/test_views_kegiatan.py index bf988d7..5802e0d 100644 --- a/informasi_fasilitas/test_views_kegiatan.py +++ b/informasi_fasilitas/test_views_kegiatan.py @@ -68,14 +68,14 @@ class KegiatanRelatedViewTest(InformasiFasilitasViewTest): kwargs=self.kwargs_search_kegiatan_fail) self.list_foto_kegiatan_url = \ reverse('list-foto-kegiatan', kwargs=self.kwargs_get_foto_kegiatan) - self.list_kegiatan_by_newly_added_url = \ - reverse('list-kegiatan-by-newly-added', kwargs=self.kwargs_list_kegiatan_in_order) + self.list_kegiatan_by_latest_added_url = \ + reverse('list-kegiatan-by-latest-added', kwargs=self.kwargs_list_kegiatan_in_order) self.list_kegiatan_by_name_url = \ reverse('list-kegiatan-by-name', kwargs=self.kwargs_list_kegiatan_in_order) self.list_kegiatan_by_time_url = \ reverse('list-kegiatan-by-time', kwargs=self.kwargs_list_kegiatan_in_order) - self.list_kegiatan_by_newly_added_fail_url = \ - reverse('list-kegiatan-by-newly-added', kwargs=self.kwargs_list_kegiatan_in_order_fail) + self.list_kegiatan_by_latest_added_fail_url = \ + reverse('list-kegiatan-by-latest-added', kwargs=self.kwargs_list_kegiatan_in_order_fail) self.list_kegiatan_by_name_fail_url = \ reverse('list-kegiatan-by-name', kwargs=self.kwargs_list_kegiatan_in_order_fail) self.list_kegiatan_by_time_fail_url = \ @@ -323,7 +323,7 @@ class KegiatanRelatedViewTest(InformasiFasilitasViewTest): response = Client().get(self.list_kegiatan_by_time_fail_url) self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND) - def test_can_get_list_kegiatan_by_newly_added(self): + def test_can_get_list_kegiatan_by_latest_added(self): Kegiatan.objects.all().delete() response_params = self.mock_kegiatan_test.copy() response = self.client.post(self.add_kegiatan_url, response_params) @@ -335,13 +335,13 @@ class KegiatanRelatedViewTest(InformasiFasilitasViewTest): self.assertEqual(response.status_code, HTTPStatus.CREATED) content = json.loads(response.content.decode('utf-8')) - response = self.client.get(self.list_kegiatan_by_newly_added_url) + response = self.client.get(self.list_kegiatan_by_latest_added_url) self.assertEqual(response.status_code, HTTPStatus.OK) content = json.loads(response.content.decode('utf-8')) response_id_in_order = list(content.keys()) self.assertGreater(int(response_id_in_order[0]), int(response_id_in_order[1])) - def test_fail_get_list_kegiatan_by_newly_added(self): - response = Client().get(self.list_kegiatan_by_newly_added_url) + def test_fail_get_list_kegiatan_by_latest_added(self): + response = Client().get(self.list_kegiatan_by_latest_added_fail_url) self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND) diff --git a/informasi_fasilitas/urls.py b/informasi_fasilitas/urls.py index 1ad04fb..05f598d 100644 --- a/informasi_fasilitas/urls.py +++ b/informasi_fasilitas/urls.py @@ -51,6 +51,12 @@ urlpatterns = [ path('lokasi/list-foto-kegiatan//', views_kegiatan.list_foto_kegiatan, name='list-foto-kegiatan'), + path('lokasi/list-kegiatan-by-latest-added//', + views_kegiatan.list_kegiatan_by_latest_added, name='list-kegiatan-by-latest-added'), + + path('lokasi/list-kegiatan-by-latest-added/', + views_kegiatan.list_kegiatan_by_latest_added, name='list-kegiatan-by-latest-added'), + path('lokasi/list-kegiatan-by-name//', views_kegiatan.list_kegiatan_by_name, name='list-kegiatan-by-name'), diff --git a/informasi_fasilitas/views_kegiatan.py b/informasi_fasilitas/views_kegiatan.py index 5271959..0c8094c 100644 --- a/informasi_fasilitas/views_kegiatan.py +++ b/informasi_fasilitas/views_kegiatan.py @@ -135,6 +135,19 @@ def list_kegiatan_by_time(request, start_index, query_limit=9): new_dict = {item['id']: _clean_json_kegiatan(dict(item)) for item in serializer.data} return JsonResponse(new_dict, status=HTTPStatus.OK) +@api_view(['GET']) +@authentication_classes([]) +@permission_classes([]) +def list_kegiatan_by_latest_added(request, start_index, query_limit=9): + time_now = timezone.now() + queryset = Kegiatan.objects.filter(time_end__gte=time_now).order_by('-id') + queryset = queryset[start_index:start_index+query_limit] + if not queryset.exists(): + raise NotFound(detail="No Kegiatan available") + serializer = KegiatanSerializer(queryset, many=True) + new_dict = {item['id']: _clean_json_kegiatan(dict(item)) for item in serializer.data} + return JsonResponse(new_dict, status=HTTPStatus.OK) + def _clean_json_kegiatan(kegiatan): kegiatan.pop("user") kegiatan.pop("lokasi") -- GitLab