<aside> 💡

</aside>

یکی از کارایی که تو هر پروژه باید کنید ساخت سمپل دیتا هست برای اون پروژه

تو ریپو student app هم من همینکارو کردم که میتونید کل کدشو ببینید

خیلی خوبه که فانکشن هاتون کاملا از هم دیکاپل شده باشن و بگن چقدر از یک سمپل میخواین.

مثلا:


```python
def add_sample_data(
    count_admin: int = 1,
    count_classroom: int = 3,
    count_advisor: int = 3,
    count_student: int = 100,
    count_teacher: int = 8,
) -> Type[Database]:
    teachers = [create_teacher() for _ in range(count_teacher)]
    classrooms = [create_classroom() for _ in range(count_classroom)]
    students = [create_student() for _ in range(count_student)]
    advisors = [create_advisor() for _ in range(count_advisor)]
    admins = [create_admin() for _ in range(count_admin)]

    for classroom in classrooms:
        # Assign a random teacher to the classroom
        teacher = random.choice(teachers)
        relation = create_relation(classroom_id=classroom.id, teacher_id=teacher.id)
        Database.add_relation(relation)

        # Assign random students to the classroom
        students_for_classroom = random.sample(
            students, k=random.randint(1, len(students) // 2)
        )
        for student in students_for_classroom:
            relation = create_relation(classroom_id=classroom.id, student_id=student.id)
            Database.add_relation(relation)

    Database.classrooms = classrooms
    Database.teachers = teachers
    Database.students = students
    Database.admins = admins
    Database.advisors = advisors

    print(Database.read_relations())
    return Database

def create_user(role: UserRoles) -> User:
    return User(
        role=role,
        username=fake.name(),
        password=fake.name(),
    )

def create_classroom():
    topics = ["MATH", "PHYSIC", "CHEMISTERY"]
    classroom = ClassRoom(topic=random.choice(topics))
    return classroom

def create_teacher() -> Teacher:
    user = create_user(role=UserRoles.TEACHER)
    return Teacher(user_id=user.id)

def create_student() -> Student:
    user = create_user(role=UserRoles.STUDENT)
    return Student(user_id=user.id)

def create_advisor() -> Advisor:
    user = create_user(role=UserRoles.ADVISOR)
    return Advisor(user_id=user.id)

def create_admin() -> Admin:
    user = create_user(role=UserRoles.ADMIN)
    return Admin(user_id=user.id)

def create_relation(
    classroom_id: ClassRoomId,
    student_id: StudentId | None = None,
    teacher_id: TeacherId | None = None,
) -> ClassRoomRelation:
    if int(student_id is None) + int(teacher_id is None) != 1:
        raise ValueError("XOR of student_id and teacher_id")

    return ClassRoomRelation(
        teacher_id=teacher_id,
        student_id=student_id,
        classroom_id=classroom_id,
        expires_at=datetime.now()
        + timedelta(days=random.randint(0, 30))
        - timedelta(days=random.randint(0, 30)),
    )

این expires_at چیه؟ همونطور که تو live گفتم نشون میده دانش آموز کی ریلیشنش با اون کلاس قطع میشه. مثلا دانش اموز یک سال درس میخونه دیگه درسته؟

۲ سوال دارم ازتون یکم فکر کنید میتونید جواب بدید

۱. چرا تو سمپل دیتا موقع ساختن من اومدم expıres-at رو تایم الان گرفتم بعد منهای ۱ تا ۳۰ روز (رندوم) کردم و بعدش دوباره رندوم (۱ تا ۳۰ روز) اضافه کردم؟

۲. چرا اصلا سمپل دیتا باید بنویسیم؟ به چه دردی میخوره؟ مزایاش چیه اگه مثلا سمپل دیتامون دامپ پروداکشن باشه؟ یا نسبت به حالتی که کلا سمپل دیتا نداریم؟


‍۱. تنوع یا diversity

۲. حجم یا scale

خیلی وقتا تستای ما پاس میشن, چون دیتایی که قبل از تستا ساختیم(تازه اگه ساخته باشیم) خوب ساخته نشدن. وقتی دارین سمپل دیتا میسازید برای هر آبجکت تمام حالت های ممکن رو باید داشته باشید تو سمپل دیتاتون. پروداکشن نمیتونه به ما تضمین بده که همه حالت هارو کاورد کرده.

نکته دوم اینه که حجم دیتا production دست ما نیست. پس نمیتونیم stress test بنویسیم. خود حجم دیتا هم ممکنه تاثیر گذار باشه رو pass شدن تستمون.

و نکته آخر اینه که برای استفاده از دیتا پروداکشن, اولا دارین به تمام developer ها این دسترسی رو میدین که جالب نیست. دوما دارید کل دیتابیس رو میذارین تو ریپازیتوری git اتون!‌ ‌که اینم جالب نیست.