Я не могу создать тесты, в которых участвуют группы авторизации
Салюты,
Я создавал тесты для тестирования веб-
Я облазил весь интернет в поисках решения.
Я создавал фикстуру для группы, которая позволяет пользователям создавать записи в блогах. Это серия тестов, которые я создавал для целей авторизации. Я использовал как фикстуры Pytest, так и фабрики с похожими результатами.
Вот тестовый класс:
import pytest
import factory
from django.contrib.auth import get_user_model
from posts.models import Post
from members.models import Member
from factories import MemberFactory, PostFactory
from faker import Faker
from django.contrib.auth.models import Group
# Create your tests here.
User = get_user_model()
fake = Faker()
#Fixture
@pytest.fixture(scope="session")
def contributor_group(db):
return Group.objects.create("Contributor")
@pytest.fixture(scope="session")
def authorized_user(db):
authorized_user = MemberFactory()
return authorized_user
# Post Tests
class TestPosts:
#Disallows user to create a post if they're not a contributor
@pytest.mark.django_db
def test_is_not_contributor(db):
reg = MemberFactory()
assert reg.has_post_permissions() is False
#Allows a user to create a post if they're a contributor.
@pytest.mark.django_db
def test_can_post(db):
contributor_group.
print(authorized_user)
print(contributor_group)
print(authorized_user.has_post_permissions())
assert authorized_user.has_post_permissions() is True
Я также создал фабрики для них обоих.
import factory
from faker import Faker
from django.contrib.auth.models import PermissionsMixin
from django.contrib.auth import get_user_model
from posts.models import Post
from members.models import Member
fake = Faker()
User = get_user_model()
class MemberFactory(factory.django.DjangoModelFactory):
class Meta:
model = User
username = factory.Faker('user_name')
email = factory.Faker('email')
password = 'password'
is_active = True
is_superuser = False
@classmethod
def has_post_permissions(self):
self.has_post_permissions()
class PostFactory(factory.django.DjangoModelFactory):
class Meta:
model = Post
title = fake.text(150)
author = factory.SubFactory(MemberFactory)
content = fake.text()
Я создал группу «Соавтор». Группу с помощью страницы администратора разработки. Я не могу понять, почему группы регистрируют классы групп и пользователей. Я даже пытался создать MemberFactory, но в итоге получил тот же результат. Я хотел бы знать, как я могу интегрировать группы авторизации в мои тесты. Я не могу понять этого.
Заранее спасибо.
Вы должны тестировать разрешение, создавая объект, чтобы полностью проверить функциональность вашего представления, также вот кое-что, что вы можете улучшить:
test_permissions.py
import pytest
from myapp.models import Post
from django.urls import reverse
from django.test import Client
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
User = get_user_model()
@pytest.mark.django_db
class TestPermissions:
def test_post_add_contributor_group_permission(db):
client = Client()
user = User.objects.create_user(
username="testuser",
email="test@example.com",
password="pass123"
)
post_data = {
"title": "Post Title",
"content": "post content",
"author": user.id
}
group = Group.objects.create(name="Contributor")
client.login(username="testuser", password="pass123")
# Send request without permission
response = client.post(reverse("post-add"), post_data)
assert response.status_code == 200
assert Post.objects.all().count() == 0
# Add permission to group, group to user and resend request
content_type = ContentType.objects.get_for_model(Post)
permission = Permission.objects.get(
content_type=content_type,
codename__icontains="add"
)
group.permissions.add(permission)
user.groups.add(group)
response = client.post(reverse("post-add"), post_data)
assert response.status_code == 200
assert Post.objects.all().count() == 1
views.py
def create_post(request):
if request.method == "POST":
title = request.POST.get("title")
content = request.POST.get("content")
user_id = request.POST.get("author")
if request.user.has_perm("myapp.add_post"):
Post.objects.create(
title=title,
content=content,
author=User.objects.get(pk=user_id)
)
else:
pass
return render(request, "post_create.html")