Django – testowanie menadżera UserManager

Dla własnego modelu użytkownika tworzę menadżera, dzięki któremu będzie można tworzyć instancje dla zwykłych użytkowników jak i dla użytkowników uprzywilejowanych.

Model użytkownika wygląda następująco:

from django.db import models
from django.contrib.auth.models import AbstractUser
from .managers import ContractUserManager


class ContractUser(AbstractUser):

    class ProfileChoices(models.TextChoices):
        CLIENT = "client"
        CONTRACTOR = "contractor"

    profile = models.TextField(
        choices=ProfileChoices.choices, default=ProfileChoices.CLIENT
    )
    email = models.EmailField(max_length=255, unique=True)
    is_active = models.BooleanField(default=False)

    objects = ContractUserManager()

    def __str__(self):
        return self.username

Konto dla utworzonego zwykłego użytkownika jest nieaktywne tzn. nie można się zalogować przy użyciu podanych danych do czasu aktywacji konta za pomocą e-maila.

Tworzenie zwykłych użytkowników i uprzywilejowanych jest dokonywane za pomocą menadżera, który dziedziczy po klasie UserManager.

źródło pliku: backend/users/managers.py

from django.contrib.auth.models import UserManager
from django.utils.translation import gettext_lazy as _


class ContractUserManager(UserManager):

    def create_user(self, username, email, password, **extra_fields):
        if not email:
            raise ValueError(_("Email field is required"))
        email = self.normalize_email(email)
        user = self.model(username=username, email=email, **extra_fields)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, username, email, password, **extra_fields):
        extra_fields.setdefault("is_superuser", True)
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_active", True)
        user = self.create_user(username, email, password, **extra_fields)
        return user

Następnie przeprowadzam testy działania menadżera tzn. :

from django.test import TestCase
from .models import ContractUser


class ContractUserTestCase(TestCase):

    def setUp(self):
        self.user = ContractUser.objects.create_user(
            username="user", password="123", email="user@company.com"
        )
        self.superuser = ContractUser.objects.create_superuser(
            username="admin",
            password="123",
            email="admin@company.com",
        )

    def test_create(self):
        self.assertEqual(self.user.username, "user")
        self.assertEqual(self.user.email, "user@company.com")
        self.assertEqual(self.user.profile, "client")
        self.assertEqual(str(self.user), "user")
        self.assertFalse(self.user.is_active)

        with self.assertRaisesMessage(ValueError, "Email field is required"):
            ContractUser.objects.create_user(username="user1", email="", password="123")

    def test_create_superuser(self):
        self.assertTrue(self.superuser.is_superuser)
        self.assertTrue(self.superuser.is_staff)
        self.assertTrue(self.superuser.is_active)
        self.assertEqual(self.superuser.username, "admin")

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

− one = nine