Switch to faker for test data

This commit is contained in:
Keannu Christian Bernasol 2025-09-14 00:35:28 +08:00
parent 1e88f1ba53
commit 7e9501e75f
13 changed files with 190 additions and 126 deletions

View file

@ -8,7 +8,7 @@ from core.settings import * # noqa: F403
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "test_db.sqlite3", # noqa: F405
"NAME": BASE_DIR / "db.sqlite3", # noqa: F405
}
}

View file

@ -2,71 +2,89 @@
Post-migrate signal handlers for creating initial data for accounts app.
"""
import json
import logging
import os
from faker import Faker
from accounts.models import CustomUser
from core.settings import TESTS_DIR, config
from core.settings import config
logger = logging.getLogger(__name__)
fake = Faker()
def get_users_json():
def generate_random_user(active: bool = False):
"""
Function to read test user data from JSON file
Function to generate a single random user
Args:
active (bool, optional): User active status. Defaults to False.
Returns:
CustomUser: Newly created USER instance
"""
with open(os.path.join(TESTS_DIR, "users", "users.json"), "r") as f:
# Load JSON data
data = json.loads(f.read())
return data
USER = CustomUser.objects.create_user(
username=fake.user_name(),
email=fake.email(),
password=config.DEBUG_USER_PASSWORD,
)
# Additional user fields not covered by create() method
USER.first_name = fake.first_name()
USER.last_name = fake.last_name()
USER.is_active = active
USER.save()
return USER
def generate_test_users():
def generate_superuser():
"""
Function to create test users.
Function to generate a test superuser account
"""
data = get_users_json()
for user in data["users"]:
# Check if user already exists
USER = CustomUser.objects.filter(username=user["username"]).first()
if not USER:
# Create user
if user["is_superuser"]:
USER = CustomUser.objects.create_superuser(
username=user["username"],
email=user["email"],
password=config.DEBUG_USER_PASSWORD,
)
logger.info("Created Superuser:", user["username"])
else:
USER = CustomUser.objects.create_user(
username=user["username"],
email=user["email"],
password=config.DEBUG_USER_PASSWORD,
)
logger.info("Created User:", user["username"])
# Additional user fields not covered by create() methods
USER.first_name = user["first_name"]
USER.last_name = user["last_name"]
USER.is_active = True
USER.save()
USER = CustomUser.objects.filter(is_superuser=True).first()
if not USER:
CustomUser.objects.create_superuser(
username=config.DEBUG_USER_USERNAME,
email=config.DEBUG_USER_EMAIL,
password=config.DEBUG_USER_PASSWORD,
)
return USER
def remove_test_users():
def generate_test_users(count=3, active: bool = False) -> list[CustomUser]:
"""
Function to remove test users in DEBUG mode.
Function to generate a list of test users.
Args:
count (int, optional): Number of regular test users to generate. Defaults to 10.
Returns:
list[CustomUser]: List containing the test superuser and generated regular users.
"""
if config.DEBUG:
data = get_users_json()
for user in data["users"]:
# Check if user already exists
USER = CustomUser.objects.filter(username=user["username"]).first()
if USER:
USER.delete()
else:
logger.warning(
f"Skipping user deletion for {user['username']}: Does not exist"
)
USERS = []
# Superuser
USERS.append(generate_superuser())
# Regular users
USERS.extend([generate_random_user(active=active) for _ in range(count)])
return USERS
def remove_test_users(
USERS: list[CustomUser] = CustomUser.objects.filter(
is_superuser=False),
):
"""
Function to remove test users.
"""
for USER in USERS:
USER = CustomUser.objects.filter(username=USER.username).first()
if USER:
USER.delete()
else:
logger.warning(
f"Skipping user deletion for {USER.username}: Does not exist"
)

View file

@ -0,0 +1,32 @@
import pytest
import users
from django.contrib.auth.tokens import default_token_generator
from django.test.client import RequestFactory
from djoser.utils import encode_uid
from accounts.views import CustomUserViewSet
factory = RequestFactory()
@pytest.mark.django_db(transaction=True)
def test_user_activation():
"""
Test activation
"""
# Generate test user
USER = users.generate_random_user(active=False)
uid = encode_uid(USER.pk)
token = default_token_generator.make_token(USER)
view = CustomUserViewSet.as_view(actions={"post": "activation"})
request = factory.post(
"/accounts/users/activation/", data={"uid": uid, "token": token}
)
response = view(request)
response.render()
assert response.status_code == 204

View file

@ -1,38 +1,45 @@
import pytest
import users
from accounts.models import CustomUser
from users import generate_test_users, remove_test_users
def assert_users_created():
data = users.get_users_json()
def assert_users_exist(USERS: list[CustomUser] = []):
"""
Asserts that each user in the provided list exists in the database.
for user in data["users"]:
USER = CustomUser.objects.filter(username=user["username"]).first()
Args:
USERS (list[CustomUser], optional): A list of CustomUser instances to check for existence. Defaults to an empty list.
# Assert user exists
assert USER
Raises:
AssertionError: If any user in the list does not exist in the database.
"""
if user["is_superuser"]:
# Assert is superuser
assert USER.is_superuser
for USER in USERS:
assert CustomUser.objects.filter(username=USER.username).first()
def assert_users_removed():
data = users.get_users_json()
for user in data["users"]:
USER = CustomUser.objects.filter(username=user["username"]).first()
def assert_users_removed(USERS: list[CustomUser] = []):
"""
Asserts that the specified users have been removed from the database.
# Assert user does not exist
assert not USER
Args:
USERS (list[CustomUser], optional): A list of user objects (dictionaries) containing at least the 'username' key.
Defaults to an empty list.
Raises:
AssertionError: If any user in the USERS list still exists in the database.
"""
for USER in USERS:
assert not CustomUser.objects.filter(username=USER.username).first()
@pytest.mark.django_db(transaction=True)
def test_user_creation_deletion():
"""
Test user creation and deletion
Test multiple instances of user creations and deletions
"""
users.generate_test_users()
assert_users_created()
users.remove_test_users()
assert_users_removed()
USERS = generate_test_users()
assert_users_exist(USERS)
remove_test_users(USERS)
assert_users_removed(USERS)

View file

@ -1,6 +1,6 @@
import pytest
import users
from rest_framework.test import APIClient
from users import generate_test_users
from core.settings import config
@ -10,19 +10,15 @@ client = APIClient()
@pytest.mark.django_db(transaction=True)
def test_user_login():
"""
Test login
Test login with multiple user accounts
"""
data = users.get_users_json()
USERS = generate_test_users(active=True)
# Generate test users
users.generate_test_users()
for user in data["users"]:
for USER in USERS:
login_response = client.post(
"/api/v1/accounts/jwt/create/",
{"username": user["username"],
"password": config.DEBUG_USER_PASSWORD},
{"username": USER.username, "password": config.DEBUG_USER_PASSWORD},
format="json",
).json()

View file

@ -1,32 +0,0 @@
{
"users": [
{
"username": "admin",
"email": "admin@test.com",
"is_superuser": true,
"first_name": "Test",
"last_name": "Admin"
},
{
"username": "testuser1",
"email": "user1@test.com",
"is_superuser": false,
"first_name": "Test",
"last_name": "User 1"
},
{
"username": "testuser2",
"email": "user2@test.com",
"is_superuser": false,
"first_name": "Test",
"last_name": "User 2"
},
{
"username": "testuser3",
"email": "user3@test.com",
"is_superuser": false,
"first_name": "Test",
"last_name": "User 3"
}
]
}