From 3e02286f6b86107b75cf1e6e452c63b89214b607 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 10 Apr 2026 20:58:45 +0530 Subject: [PATCH] feat: implement basic Letter model and unit tests --- backend/letters/migrations/0001_initial.py | 46 ++++++++++++++++++++++ backend/letters/models.py | 27 ++++++++++++- backend/letters/tests.py | 25 +++++++++++- 3 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 backend/letters/migrations/0001_initial.py diff --git a/backend/letters/migrations/0001_initial.py b/backend/letters/migrations/0001_initial.py new file mode 100644 index 0000000..8f0900d --- /dev/null +++ b/backend/letters/migrations/0001_initial.py @@ -0,0 +1,46 @@ +# Generated by Django 6.0.4 on 2026-04-10 15:26 + +import uuid + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="Letter", + fields=[ + ("public_id", models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ( + "type", + models.CharField( + choices=[("KEPT", "Kept"), ("SENT", "Sent"), ("VAULT", "Vault")], default="KEPT", max_length=10 + ), + ), + ( + "status", + models.CharField( + choices=[("DRAFT", "Draft"), ("SEALED", "Sealed"), ("BURNED", "Burned")], + default="DRAFT", + max_length=10, + ), + ), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("updated_at", models.DateTimeField(auto_now=True)), + ( + "user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, related_name="letters", to=settings.AUTH_USER_MODEL + ), + ), + ], + ), + ] diff --git a/backend/letters/models.py b/backend/letters/models.py index 6b20219..8f296d7 100644 --- a/backend/letters/models.py +++ b/backend/letters/models.py @@ -1 +1,26 @@ -# Create your models here. +import uuid + +from django.conf import settings +from django.db import models + + +class Letter(models.Model): + class Type(models.TextChoices): + KEPT = "KEPT", "Kept" + SENT = "SENT", "Sent" + VAULT = "VAULT", "Vault" + + class Status(models.TextChoices): + DRAFT = "DRAFT", "Draft" + SEALED = "SEALED", "Sealed" + BURNED = "BURNED", "Burned" + + public_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="letters") + type = models.CharField(max_length=10, choices=Type.choices, default=Type.KEPT) + status = models.CharField(max_length=10, choices=Status.choices, default=Status.DRAFT) + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + def __str__(self): + return f"{self.type} - {self.status}" diff --git a/backend/letters/tests.py b/backend/letters/tests.py index a39b155..a723ce4 100644 --- a/backend/letters/tests.py +++ b/backend/letters/tests.py @@ -1 +1,24 @@ -# Create your tests here. +from django.contrib.auth import get_user_model +from django.test import TestCase + +from .models import Letter + +User = get_user_model() + + +class LetterModelTest(TestCase): + def setUp(self): + self.user = User.objects.create_user(email="test@pi-ku.app", password="password1234", full_name="Test User") + + def test_create_letter_basic(self): + """create a basic Letter model with required fields""" + letter = Letter.objects.create(user=self.user, type="KEPT", status="DRAFT") + + self.assertEqual(letter.user, self.user) + self.assertEqual(letter.type, "KEPT") + self.assertEqual(letter.status, "DRAFT") + self.assertIsNotNone(letter.public_id) + + # Verify timestamps are auto-added + self.assertIsNotNone(letter.created_at) + self.assertIsNotNone(letter.updated_at)