From ad074e34792c20571b8eaa2e768d1037c008ab68 Mon Sep 17 00:00:00 2001 From: irfan Date: Sun, 23 Oct 2022 20:31:43 +0300 Subject: [PATCH 1/4] Initial models and tests --- app/backend/backend/constants.py | 13 +++ .../backend/migrations/0001_initial.py | 90 ++++++++++++++++++ app/backend/backend/migrations/__init__.py | 0 app/backend/backend/models.py | 92 +++++++++++++++++++ app/backend/backend/settings.py | 9 +- app/backend/backend/utils.py | 7 ++ app/backend/tests/__init__.py | 0 app/backend/tests/test_models.py | 30 ++++++ 8 files changed, 238 insertions(+), 3 deletions(-) create mode 100644 app/backend/backend/constants.py create mode 100644 app/backend/backend/migrations/0001_initial.py create mode 100644 app/backend/backend/migrations/__init__.py create mode 100644 app/backend/backend/models.py create mode 100644 app/backend/backend/utils.py create mode 100644 app/backend/tests/__init__.py create mode 100644 app/backend/tests/test_models.py diff --git a/app/backend/backend/constants.py b/app/backend/backend/constants.py new file mode 100644 index 00000000..3b09970c --- /dev/null +++ b/app/backend/backend/constants.py @@ -0,0 +1,13 @@ +from enum import Enum + +""" +c = UserType.ADMIN +print(c) -> UserType.ADMIN +print(c.name) -> ADMIN +print(c.value) -> 0 +print(c is UserType.ADMIN) -> True +""" +class UserType(Enum): + ADMIN = 0 + DOCTOR = 1 + MEMBER = 2 diff --git a/app/backend/backend/migrations/0001_initial.py b/app/backend/backend/migrations/0001_initial.py new file mode 100644 index 00000000..76dfd8e8 --- /dev/null +++ b/app/backend/backend/migrations/0001_initial.py @@ -0,0 +1,90 @@ +# Generated by Django 4.1.2 on 2022-10-23 16:29 + +import django.contrib.postgres.fields +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Category', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50)), + ('definition', models.CharField(max_length=100, null=True)), + ], + ), + migrations.CreateModel( + name='MemberInfo', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('firstname', models.CharField(max_length=25)), + ('lastname', models.CharField(max_length=25)), + ('address', models.CharField(max_length=100, null=True)), + ('weight', models.DecimalField(decimal_places=1, max_digits=3, null=True)), + ('height', models.DecimalField(decimal_places=1, max_digits=3, null=True)), + ('age', models.IntegerField(null=True)), + ('past_illnesses', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=25), null=True, size=None)), + ('allergies', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=25), null=True, size=None)), + ('chronic_diseases', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=25), null=True, size=None)), + ('undergone_operations', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=25), null=True, size=None)), + ('used_drugs', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=25), null=True, size=None)), + ], + ), + migrations.CreateModel( + name='User', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=200)), + ('email', models.CharField(max_length=100)), + ('type', models.IntegerField()), + ], + ), + migrations.CreateModel( + name='Admin', + fields=[ + ('user_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='backend.user')), + ('username', models.CharField(max_length=50)), + ], + bases=('backend.user',), + ), + migrations.CreateModel( + name='Report', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('message', models.CharField(max_length=500)), + ('reported_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reported_user', to='backend.user')), + ('reporter_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reporter_user', to='backend.user')), + ('reviewed_by', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='reviewed_by', to='backend.admin')), + ], + ), + migrations.CreateModel( + name='Member', + fields=[ + ('user_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='backend.user')), + ('username', models.CharField(max_length=50)), + ('avatar', models.CharField(max_length=200)), + ('banned_by', models.CharField(max_length=50, null=True)), + ('info', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='backend.memberinfo')), + ], + bases=('backend.user',), + ), + migrations.CreateModel( + name='Doctor', + fields=[ + ('user_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='backend.user')), + ('full_name', models.CharField(max_length=50)), + ('hospital_name', models.CharField(max_length=100, null=True)), + ('verified', models.BooleanField(default=False, max_length=100)), + ('specialization', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='backend.category')), + ], + bases=('backend.user',), + ), + ] diff --git a/app/backend/backend/migrations/__init__.py b/app/backend/backend/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/backend/backend/models.py b/app/backend/backend/models.py new file mode 100644 index 00000000..abc2f411 --- /dev/null +++ b/app/backend/backend/models.py @@ -0,0 +1,92 @@ +# from backend.auth_system import models +# from backend.follow_system import models +# from backend.profile_management import models + +from django.db import models +from django.contrib.postgres.fields import ArrayField + + +class User(models.Model): + password = models.CharField(max_length=200, null=False) + email = models.CharField(max_length=100, null=False) + + type = models.IntegerField(null=False) + + def __str__(self): + return self.email + + +class Admin(User): + # user = models.ForeignKey(User, on_delete=models.CASCADE) + username = models.CharField(max_length=50, null=False) + + def __str__(self): + return self.username + +class MemberInfo(models.Model): + firstname = models.CharField(max_length=25, null=False) + lastname = models.CharField(max_length=25, null=False) + address = models.CharField(max_length=100, null=True) + weight = models.DecimalField(null=True, max_digits=3, decimal_places=1) + height = models.DecimalField(null=True, max_digits=3, decimal_places=1) + age = models.IntegerField(null=True) + + past_illnesses = ArrayField( + models.CharField(max_length=25), null=True + ) + allergies = ArrayField( + models.CharField(max_length=25), null=True + ) + chronic_diseases = ArrayField( + models.CharField(max_length=25), null=True + ) + undergone_operations = ArrayField( + models.CharField(max_length=25), null=True + ) + used_drugs = ArrayField( + models.CharField(max_length=25), null=True + ) + + +class Member(User): + username = models.CharField(max_length=50, null=False) + avatar = models.CharField(max_length=200, null=False) + banned_by = models.CharField(max_length=50, null=True) # username of admin + + info = models.ForeignKey(MemberInfo, null=False, on_delete=models.CASCADE) + + def __str__(self): + retval = "" + if self.info.firstname != None: + retval += self.info.firstname + " " + if self.info.lastname != None: + retval += self.info.firstname + + if retval != " ": + return retval + + return self.username + + +class Category(models.Model): + name = models.CharField(max_length=50, null=False) + definition = models.CharField(max_length=100, null=True) + + +class Doctor(User): + full_name = models.CharField(max_length=50, null=False) + specialization = models.ForeignKey(Category, null=True, on_delete=models.SET_NULL) + hospital_name = models.CharField(max_length=100, null=True) + verified = models.BooleanField(max_length=100, null=False, default=False) + + def __str__(self): + return self.full_name + + +class Report(models.Model): + reporter_user = models.ForeignKey(User, null=False, on_delete=models.CASCADE, related_name='reporter_user') + reported_user = models.ForeignKey(User, null=False, on_delete=models.CASCADE, related_name='reported_user') + message = models.CharField(max_length=500, null=False) + reviewed_by = models.ForeignKey(Admin, null=True, default=None, on_delete=models.SET_NULL, related_name='reviewed_by') + + diff --git a/app/backend/backend/settings.py b/app/backend/backend/settings.py index 968cda68..2b9e05d0 100644 --- a/app/backend/backend/settings.py +++ b/app/backend/backend/settings.py @@ -11,6 +11,8 @@ """ from pathlib import Path +import os + # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -31,6 +33,7 @@ # Application definition INSTALLED_APPS = [ + 'backend', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', @@ -78,9 +81,9 @@ 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'app', 'USER': 'postgres', - 'PASSWORD': 'a1b2c3d4', - 'HOST':'ec2-100-24-23-233.compute-1.amazonaws.com', - 'PORT':'5432', + 'PASSWORD': os.environ['DATABASE_PW'], + 'HOST': 'ec2-100-24-23-233.compute-1.amazonaws.com', + 'PORT': '5432', } } diff --git a/app/backend/backend/utils.py b/app/backend/backend/utils.py new file mode 100644 index 00000000..3e5fbcca --- /dev/null +++ b/app/backend/backend/utils.py @@ -0,0 +1,7 @@ +import django.contrib.auth.hashers + +def make_password(password): + assert password + return django.contrib.auth.hashers.make_password( + password=password + ) diff --git a/app/backend/tests/__init__.py b/app/backend/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/backend/tests/test_models.py b/app/backend/tests/test_models.py new file mode 100644 index 00000000..363c5d3f --- /dev/null +++ b/app/backend/tests/test_models.py @@ -0,0 +1,30 @@ +from django.test import TestCase +from django.contrib.auth.hashers import check_password + +from backend import models +from backend import constants +from backend import utils + +TEST_ADMIN_EMAIL = "test_admin@test.com" +TEST_ADMIN_PASSWORD = "test_password" +TEST_ADMIN_USERNAME = "test_admin_unsername" + +class AdminTestCase(TestCase): + def setUp(self): + models.Admin.objects.create( + email=TEST_ADMIN_EMAIL, + password=utils.make_password(TEST_ADMIN_PASSWORD), + type=constants.UserType.ADMIN.value, + username=TEST_ADMIN_USERNAME + ) + + def test_admin_name(self): + testAdmin = models.Admin.objects.get(username=TEST_ADMIN_USERNAME) + + self.assertTrue(isinstance(testAdmin, models.Admin)) + + self.assertEqual(testAdmin.email, TEST_ADMIN_EMAIL) + self.assertTrue(check_password(TEST_ADMIN_PASSWORD, testAdmin.password)) + self.assertEqual(str(testAdmin), TEST_ADMIN_USERNAME) + self.assertEqual(testAdmin.type, constants.UserType.ADMIN.value) + From fb6b4a32d4a8b3975a60e645a475869974f6166a Mon Sep 17 00:00:00 2001 From: irfan Date: Sun, 23 Oct 2022 22:19:34 +0300 Subject: [PATCH 2/4] Unit tests for model classes --- ...ve_member_avatar_alter_member_banned_by.py | 22 +++ .../0003_alter_memberinfo_height.py | 18 +++ ...n_username_alter_category_name_and_more.py | 33 ++++ .../0005_report_date_report_reviewed_date.py | 24 +++ app/backend/backend/models.py | 21 +-- app/backend/tests/constants.py | 33 ++++ app/backend/tests/test_models.py | 150 +++++++++++++++++- 7 files changed, 285 insertions(+), 16 deletions(-) create mode 100644 app/backend/backend/migrations/0002_remove_member_avatar_alter_member_banned_by.py create mode 100644 app/backend/backend/migrations/0003_alter_memberinfo_height.py create mode 100644 app/backend/backend/migrations/0004_alter_admin_username_alter_category_name_and_more.py create mode 100644 app/backend/backend/migrations/0005_report_date_report_reviewed_date.py create mode 100644 app/backend/tests/constants.py diff --git a/app/backend/backend/migrations/0002_remove_member_avatar_alter_member_banned_by.py b/app/backend/backend/migrations/0002_remove_member_avatar_alter_member_banned_by.py new file mode 100644 index 00000000..9533defb --- /dev/null +++ b/app/backend/backend/migrations/0002_remove_member_avatar_alter_member_banned_by.py @@ -0,0 +1,22 @@ +# Generated by Django 4.1.2 on 2022-10-23 17:46 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('backend', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='member', + name='avatar', + ), + migrations.AlterField( + model_name='member', + name='banned_by', + field=models.CharField(default=None, max_length=50, null=True), + ), + ] diff --git a/app/backend/backend/migrations/0003_alter_memberinfo_height.py b/app/backend/backend/migrations/0003_alter_memberinfo_height.py new file mode 100644 index 00000000..494f3564 --- /dev/null +++ b/app/backend/backend/migrations/0003_alter_memberinfo_height.py @@ -0,0 +1,18 @@ +# Generated by Django 4.1.2 on 2022-10-23 18:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('backend', '0002_remove_member_avatar_alter_member_banned_by'), + ] + + operations = [ + migrations.AlterField( + model_name='memberinfo', + name='height', + field=models.IntegerField(null=True), + ), + ] diff --git a/app/backend/backend/migrations/0004_alter_admin_username_alter_category_name_and_more.py b/app/backend/backend/migrations/0004_alter_admin_username_alter_category_name_and_more.py new file mode 100644 index 00000000..d156f525 --- /dev/null +++ b/app/backend/backend/migrations/0004_alter_admin_username_alter_category_name_and_more.py @@ -0,0 +1,33 @@ +# Generated by Django 4.1.2 on 2022-10-23 18:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('backend', '0003_alter_memberinfo_height'), + ] + + operations = [ + migrations.AlterField( + model_name='admin', + name='username', + field=models.CharField(max_length=50, unique=True), + ), + migrations.AlterField( + model_name='category', + name='name', + field=models.CharField(max_length=50, unique=True), + ), + migrations.AlterField( + model_name='member', + name='username', + field=models.CharField(max_length=50, unique=True), + ), + migrations.AlterField( + model_name='user', + name='email', + field=models.CharField(max_length=100, unique=True), + ), + ] diff --git a/app/backend/backend/migrations/0005_report_date_report_reviewed_date.py b/app/backend/backend/migrations/0005_report_date_report_reviewed_date.py new file mode 100644 index 00000000..b2eef654 --- /dev/null +++ b/app/backend/backend/migrations/0005_report_date_report_reviewed_date.py @@ -0,0 +1,24 @@ +# Generated by Django 4.1.2 on 2022-10-23 19:10 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('backend', '0004_alter_admin_username_alter_category_name_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='report', + name='date', + field=models.DateField(default=datetime.date.today), + ), + migrations.AddField( + model_name='report', + name='reviewed_date', + field=models.DateField(null=True), + ), + ] diff --git a/app/backend/backend/models.py b/app/backend/backend/models.py index abc2f411..57f5f8a9 100644 --- a/app/backend/backend/models.py +++ b/app/backend/backend/models.py @@ -4,11 +4,11 @@ from django.db import models from django.contrib.postgres.fields import ArrayField - +import datetime class User(models.Model): password = models.CharField(max_length=200, null=False) - email = models.CharField(max_length=100, null=False) + email = models.CharField(max_length=100, null=False, unique=True) type = models.IntegerField(null=False) @@ -18,7 +18,7 @@ def __str__(self): class Admin(User): # user = models.ForeignKey(User, on_delete=models.CASCADE) - username = models.CharField(max_length=50, null=False) + username = models.CharField(max_length=50, null=False, unique=True) def __str__(self): return self.username @@ -28,7 +28,7 @@ class MemberInfo(models.Model): lastname = models.CharField(max_length=25, null=False) address = models.CharField(max_length=100, null=True) weight = models.DecimalField(null=True, max_digits=3, decimal_places=1) - height = models.DecimalField(null=True, max_digits=3, decimal_places=1) + height = models.IntegerField(null=True) age = models.IntegerField(null=True) past_illnesses = ArrayField( @@ -49,9 +49,8 @@ class MemberInfo(models.Model): class Member(User): - username = models.CharField(max_length=50, null=False) - avatar = models.CharField(max_length=200, null=False) - banned_by = models.CharField(max_length=50, null=True) # username of admin + username = models.CharField(max_length=50, null=False, unique=True) + banned_by = models.CharField(max_length=50, null=True, default=None) # username of admin info = models.ForeignKey(MemberInfo, null=False, on_delete=models.CASCADE) @@ -62,14 +61,14 @@ def __str__(self): if self.info.lastname != None: retval += self.info.firstname - if retval != " ": + if retval != "": return retval return self.username class Category(models.Model): - name = models.CharField(max_length=50, null=False) + name = models.CharField(max_length=50, null=False, unique=True) definition = models.CharField(max_length=100, null=True) @@ -87,6 +86,10 @@ class Report(models.Model): reporter_user = models.ForeignKey(User, null=False, on_delete=models.CASCADE, related_name='reporter_user') reported_user = models.ForeignKey(User, null=False, on_delete=models.CASCADE, related_name='reported_user') message = models.CharField(max_length=500, null=False) + date = models.DateField(null=False, default=datetime.date.today) reviewed_by = models.ForeignKey(Admin, null=True, default=None, on_delete=models.SET_NULL, related_name='reviewed_by') + reviewed_date = models.DateField(null=True) + def __str__(self): + return self.message diff --git a/app/backend/tests/constants.py b/app/backend/tests/constants.py new file mode 100644 index 00000000..18e68369 --- /dev/null +++ b/app/backend/tests/constants.py @@ -0,0 +1,33 @@ +TEST_PASSWORD = "test_password" + +TEST_ADMIN_EMAIL = "test_admin@test.com" +TEST_ADMIN_USERNAME = "test_admin_username" + +TEST_CATEGORY_NAME = "Test Category" +TEST_CATEGORY_DEFINITION = "Definition for Test Category" + +TEST_DOCTOR_EMAIL = "test_doctor@test.com" +TEST_DOCTOR_FULLNAME = "Testname Testsurname" +TEST_DOCTOR_HOSPITAL_NAME = "Rumeli Tıp" + +TEST_MEMBER_EMAIL = "test_member@test.com" +TEST_MEMBER_USERNAME = "test_member_username" +TEST_MEMBER_FIRSTNAME = "test_member_firstname" +TEST_MEMBER_LASTNAME = "test_member_lastname" +TEST_MEMBER_ADDRESS = "Istanbul" +TEST_MEMBER_WEIGHT = 75.5 +TEST_MEMBER_HEIGHT = 183 +TEST_MEMBER_AGE = 25 +TEST_MEMBER_PAST_ILLNESSES = ["cancer", "vertigo"] +TEST_MEMBER_ALLERGIES = ["pollen", "peanut"] +TEST_MEMBER_CHRONIC_DISEASES = ["down syndrome"] +TEST_MEMBER_UNDERGONE_OPERATIONS = None +TEST_MEMBER_USED_DRUGS = ["LSD", "DMT", "Weed"] + +TEST_MEMBER_2_EMAIL = "test_member_2@test.com" +TEST_MEMBER_2_USERNAME = "test_member_2_username" + +TEST_MEMBER_3_EMAIL = "test_member_3@test.com" +TEST_MEMBER_3_USERNAME = "test_member_3_username" + +TEST_REPORT_MESSAGE = "This user called me an idiot." diff --git a/app/backend/tests/test_models.py b/app/backend/tests/test_models.py index 363c5d3f..ee6ad757 100644 --- a/app/backend/tests/test_models.py +++ b/app/backend/tests/test_models.py @@ -5,26 +5,162 @@ from backend import constants from backend import utils -TEST_ADMIN_EMAIL = "test_admin@test.com" -TEST_ADMIN_PASSWORD = "test_password" -TEST_ADMIN_USERNAME = "test_admin_unsername" +from tests.constants import * + class AdminTestCase(TestCase): - def setUp(self): + def createAdmin(self): models.Admin.objects.create( email=TEST_ADMIN_EMAIL, - password=utils.make_password(TEST_ADMIN_PASSWORD), + password=utils.make_password(TEST_PASSWORD), type=constants.UserType.ADMIN.value, username=TEST_ADMIN_USERNAME ) + + def setUp(self): + self.createAdmin() - def test_admin_name(self): + def test_admin_creation(self): testAdmin = models.Admin.objects.get(username=TEST_ADMIN_USERNAME) self.assertTrue(isinstance(testAdmin, models.Admin)) self.assertEqual(testAdmin.email, TEST_ADMIN_EMAIL) - self.assertTrue(check_password(TEST_ADMIN_PASSWORD, testAdmin.password)) + self.assertTrue(check_password(TEST_PASSWORD, testAdmin.password)) self.assertEqual(str(testAdmin), TEST_ADMIN_USERNAME) self.assertEqual(testAdmin.type, constants.UserType.ADMIN.value) + +class MemberTestCase(TestCase): + def createMember(self, email = None, username = None): + member_info = models.MemberInfo.objects.create( + firstname = TEST_MEMBER_FIRSTNAME, + lastname = TEST_MEMBER_LASTNAME, + address = TEST_MEMBER_ADDRESS, + weight = TEST_MEMBER_WEIGHT, + height = TEST_MEMBER_HEIGHT, + age = TEST_MEMBER_AGE, + past_illnesses = TEST_MEMBER_PAST_ILLNESSES, + allergies = TEST_MEMBER_ALLERGIES, + chronic_diseases = TEST_MEMBER_CHRONIC_DISEASES, + undergone_operations = TEST_MEMBER_UNDERGONE_OPERATIONS, + used_drugs = TEST_MEMBER_USED_DRUGS + ) + return models.Member.objects.create( + email=TEST_MEMBER_EMAIL if email == None else email, + password=utils.make_password(TEST_PASSWORD), + type=constants.UserType.MEMBER.value, + username=TEST_MEMBER_USERNAME if username == None else username, + info=member_info + ) + + def setUp(self): + self.createMember() + + def test_member_creation(self): + testMember = models.Member.objects.get(username=TEST_MEMBER_USERNAME) + + self.assertTrue(isinstance(testMember, models.Member)) + self.assertTrue(isinstance(testMember.info, models.MemberInfo)) + + self.assertEqual(testMember.email, TEST_MEMBER_EMAIL) + self.assertTrue(check_password(TEST_PASSWORD, testMember.password)) + self.assertEqual(testMember.type, constants.UserType.MEMBER.value) + + self.assertNotEqual(str(testMember), "") + self.assertNotEqual(str(testMember), " ") + + self.assertEqual(testMember.info.firstname, TEST_MEMBER_FIRSTNAME) + self.assertEqual(testMember.info.lastname, TEST_MEMBER_LASTNAME) + self.assertEqual(testMember.info.address, TEST_MEMBER_ADDRESS) + self.assertEqual(testMember.info.weight, TEST_MEMBER_WEIGHT) + self.assertEqual(testMember.info.height, TEST_MEMBER_HEIGHT) + self.assertEqual(testMember.info.age, TEST_MEMBER_AGE) + self.assertEqual( + testMember.info.past_illnesses, + TEST_MEMBER_PAST_ILLNESSES + ) + self.assertEqual( + testMember.info.allergies, + TEST_MEMBER_ALLERGIES + ) + self.assertEqual( + testMember.info.chronic_diseases, + TEST_MEMBER_CHRONIC_DISEASES + ) + self.assertEqual( + testMember.info.undergone_operations, + TEST_MEMBER_UNDERGONE_OPERATIONS + ) + self.assertEqual( + testMember.info.used_drugs, + TEST_MEMBER_USED_DRUGS + ) + + +class DoctorTestCase(TestCase): + def createDoctor(self): + models.Doctor.objects.create( + email=TEST_DOCTOR_EMAIL, + password=utils.make_password(TEST_PASSWORD), + type=constants.UserType.DOCTOR.value, + full_name=TEST_DOCTOR_FULLNAME, + hospital_name=TEST_DOCTOR_HOSPITAL_NAME, + specialization=models.Category.objects.create( + name=TEST_CATEGORY_NAME, + definition=TEST_CATEGORY_DEFINITION + ) + ) + + def setUp(self): + self.createDoctor() + + def test_doctor_creation(self): + testDoctor = models.Doctor.objects.get(email=TEST_DOCTOR_EMAIL) + + self.assertTrue(isinstance(testDoctor, models.Doctor)) + + self.assertEqual(testDoctor.email, TEST_DOCTOR_EMAIL) + self.assertTrue(check_password(TEST_PASSWORD, testDoctor.password)) + self.assertEqual(str(testDoctor), TEST_DOCTOR_FULLNAME) + self.assertEqual(testDoctor.type, constants.UserType.DOCTOR.value) + self.assertEqual(testDoctor.verified, False) + self.assertEqual(testDoctor.hospital_name, TEST_DOCTOR_HOSPITAL_NAME) + + self.assertTrue(isinstance(testDoctor.specialization, models.Category)) + self.assertEqual(testDoctor.specialization.name, TEST_CATEGORY_NAME) + self.assertEqual( + testDoctor.specialization.definition, + TEST_CATEGORY_DEFINITION + ) + + +class ReportTestCase(TestCase): + def createReport(self): + mtc = MemberTestCase() + models.Report.objects.create( + reporter_user = mtc.createMember( + email=TEST_MEMBER_2_EMAIL, + username=TEST_MEMBER_2_USERNAME + ), + reported_user = mtc.createMember( + email=TEST_MEMBER_3_EMAIL, + username=TEST_MEMBER_3_USERNAME + ), + message = TEST_REPORT_MESSAGE + ) + + def setUp(self): + self.createReport() + + def test_report_creation(self): + testReport = models.Report.objects.get(message=TEST_REPORT_MESSAGE) + + self.assertTrue(isinstance(testReport, models.Report)) + self.assertTrue(isinstance(testReport.reporter_user, models.User)) + self.assertTrue(isinstance(testReport.reported_user, models.User)) + + self.assertEqual(str(testReport), TEST_REPORT_MESSAGE) + self.assertIsNotNone(testReport.date) + self.assertIsNone(testReport.reviewed_by) + self.assertIsNone(testReport.reviewed_date) From e48894583918c05ddae71116dbcb56c3f6149201 Mon Sep 17 00:00:00 2001 From: irfan Date: Sun, 23 Oct 2022 22:23:03 +0300 Subject: [PATCH 3/4] Unit tests README --- app/backend/tests/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 app/backend/tests/README.md diff --git a/app/backend/tests/README.md b/app/backend/tests/README.md new file mode 100644 index 00000000..8f1a3df0 --- /dev/null +++ b/app/backend/tests/README.md @@ -0,0 +1,10 @@ +# Run The Tests +Staying on **app/backend**: + +1. ``` + source env/bin/activate + ``` + +2. ``` + python manage.py test + ``` \ No newline at end of file From 51b5cf2aa8882c8eb007ebebbe299127b5b55cc4 Mon Sep 17 00:00:00 2001 From: irfan Date: Sun, 23 Oct 2022 23:11:42 +0300 Subject: [PATCH 4/4] after review --- ...nfo_firstname_alter_memberinfo_lastname.py | 23 +++++++++++++++++++ app/backend/backend/models.py | 6 ++--- 2 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 app/backend/backend/migrations/0006_alter_memberinfo_firstname_alter_memberinfo_lastname.py diff --git a/app/backend/backend/migrations/0006_alter_memberinfo_firstname_alter_memberinfo_lastname.py b/app/backend/backend/migrations/0006_alter_memberinfo_firstname_alter_memberinfo_lastname.py new file mode 100644 index 00000000..cd597f15 --- /dev/null +++ b/app/backend/backend/migrations/0006_alter_memberinfo_firstname_alter_memberinfo_lastname.py @@ -0,0 +1,23 @@ +# Generated by Django 4.1.2 on 2022-10-23 20:11 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('backend', '0005_report_date_report_reviewed_date'), + ] + + operations = [ + migrations.AlterField( + model_name='memberinfo', + name='firstname', + field=models.CharField(max_length=25, null=True), + ), + migrations.AlterField( + model_name='memberinfo', + name='lastname', + field=models.CharField(max_length=25, null=True), + ), + ] diff --git a/app/backend/backend/models.py b/app/backend/backend/models.py index 57f5f8a9..915fb9a8 100644 --- a/app/backend/backend/models.py +++ b/app/backend/backend/models.py @@ -24,8 +24,8 @@ def __str__(self): return self.username class MemberInfo(models.Model): - firstname = models.CharField(max_length=25, null=False) - lastname = models.CharField(max_length=25, null=False) + firstname = models.CharField(max_length=25, null=True) + lastname = models.CharField(max_length=25, null=True) address = models.CharField(max_length=100, null=True) weight = models.DecimalField(null=True, max_digits=3, decimal_places=1) height = models.IntegerField(null=True) @@ -59,7 +59,7 @@ def __str__(self): if self.info.firstname != None: retval += self.info.firstname + " " if self.info.lastname != None: - retval += self.info.firstname + retval += self.info.lastname if retval != "": return retval