@Boldy

Как писать тесты в django?

Только начал писать тесты. В проекте используется django-mptt. Как писать к нему тесты? SQLite.

В этом тесте user2 становится потомком user1, а user1.invite_period_expire_date присваивается значение user2.contract_date+timedelta(days=30). Только вызов user2.get_ancestors() возвращает пустой массив. В аттрибутах указаны только те поля, на которые жаловался django. Сейчас просто тесты не проходят.

from django.test import TestCase
from models import TreeNode
from datetime import date, timedelta


class TreeTest(TestCase):
    def test_invite_period_works_correctly(self):
        user1 = TreeNode.objects.create(id=4,
                         date_of_birth=date.today(),
                         passport_address_id=1,
                         identity_expire_date=date.today(),
                         contract_date=date(2014, 1, 1),
                         itn=1, account_id=1, level=1, lft=1, rght=4, tree_id=1).save()
        user2 = TreeNode.objects.create(id=15,
                         date_of_birth=date.today(),
                         passport_address_id=1,
                         identity_expire_date=date.today(),
                         contract_date=date(2014, 1, 2),
                         itn=2, account_id=2, level=2, lft=1, rght=3, tree_id=1)\
            .insert_at(TreeNode.objects.get(id=4),, save=True)
        self.assertEqual(user2.get_parent_of_level(1).invite_period_expire_date, user2.contract_date + timedelta(days=30))


тестируемая модель
class TreeNode(MPTTModel):

    id = models.CharField(verbose_name='Клиентский ID', max_length=10, primary_key=True)
    parent = TreeForeignKey('self', verbose_name='ID пригласившего', null=True, blank=True, related_name='child')

    contract_date = models.DateField(null=False, blank=False)
    invite_period_expire_date = models.DateField(null=True, blank=True)

    def save(self, *args, **kwargs):
        super(TreeNode, self).save(*args, **kwargs)
        if self.get_parent_of_level(1):
            if not self.get_parent_of_level(1).invite_period_expire_date:
                self.get_parent_of_level(1).start_invite_period(self.contract_date)
    
    def start_invite_period(self, start_date):
        self.invite_period_expire_date = start_date + invite_period
        self.save()

    def get_parent_of_level(self, level):
        if self.get_level() - level >= 0:
            return self.get_ancestors().get(level=self.get_level() - level)
        return None
  • Вопрос задан
  • 2716 просмотров
Решения вопроса 1
@Boldy Автор вопроса
У user2 неправильно указал lft. После исправления заработало. Внезапно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы