Исходный код core.tests

from django.test import TestCase, Client, TransactionTestCase
from django.urls import reverse
from channels.testing import WebsocketCommunicator
from asgiref.sync import sync_to_async

from django.contrib.auth.models import User
from config.asgi import application


from .models import Document, Comment

import json


[документация] class DocumentTests(TestCase):
[документация] def setUp(self): self.client = Client() self.owner = User.objects.create_user( username='owner', password='test123' ) self.editor = User.objects.create_user( username='editor', password='test123' ) self.viewer = User.objects.create_user( username='viewer', password='test123' ) self.stranger = User.objects.create_user( username='stranger', password='test123' ) self.doc = Document.objects.create( owner=self.owner, title='Test document', doc_type='text' ) self.doc.editors.add(self.editor) self.doc.viewers.add(self.viewer)
# ===================================================== # 1. REGISTRATION TEST # =====================================================
[документация] def test_user_registration(self): response = self.client.post( reverse('register'), { 'username': 'newuser', 'email': 'new@test.com', 'password': 'pass12345', 'password2': 'pass12345' } ) self.assertEqual(response.status_code, 302) self.assertTrue( User.objects.filter(username='newuser').exists() )
# ===================================================== # 2. ACCESS RIGHTS TEST # =====================================================
[документация] def test_document_access(self): # OWNER self.client.login(username='owner', password='test123') response = self.client.get( reverse('editor', args=[self.doc.id]) ) self.assertEqual(response.status_code, 200) self.client.logout() # EDITOR self.client.login(username='editor', password='test123') response = self.client.get( reverse('editor', args=[self.doc.id]) ) self.assertEqual(response.status_code, 200) self.client.logout() # VIEWER self.client.login(username='viewer', password='test123') response = self.client.get( reverse('editor', args=[self.doc.id]) ) self.assertEqual(response.status_code, 200) self.client.logout() # STRANGER self.client.login(username='stranger', password='test123') response = self.client.get( reverse('editor', args=[self.doc.id]) ) self.assertEqual(response.status_code, 403)
# ===================================================== # 3. COMMENT TEST # =====================================================
[документация] def test_add_comment(self): self.client.login(username='viewer', password='test123') response = self.client.post( reverse('add_comment', args=[self.doc.id]), { 'text': 'Hello owner' } ) self.assertEqual(response.status_code, 200) self.assertTrue( Comment.objects.filter( document=self.doc, sender=self.viewer ).exists() )
# ===================================================== # 4. DOCUMENT SAVE TEST # =====================================================
[документация] def test_save_document(self): self.client.login(username='editor', password='test123') response = self.client.post( reverse('save_compressed', args=[self.doc.id]), data=json.dumps({ 'content': 'Updated content' }), content_type='application/json' ) self.assertEqual(response.status_code, 200) self.doc.refresh_from_db() self.assertEqual( self.doc.get_content(), 'Updated content' )
# ===================================================== # 5. VIEWER CANNOT EDIT # =====================================================
[документация] def test_viewer_cannot_save_document(self): self.client.login(username='viewer', password='test123') response = self.client.post( reverse('save_compressed', args=[self.doc.id]), data=json.dumps({ 'content': 'HACK' }), content_type='application/json' ) self.assertEqual(response.status_code, 403)
# ===================================================== # 6. DOCUMENT COMPRESSION # =====================================================
[документация] def test_document_compression(self): text = "Compressed text" self.doc.set_content(text) self.doc.save() self.doc.refresh_from_db() self.assertTrue( str(self.doc.content).startswith("gz:") ) self.assertEqual( self.doc.get_content(), text )
# ========================================================= # WEBSOCKET TESTS # =========================================================
[документация] class WebSocketTests(TransactionTestCase):
[документация] async def test_websocket_connection(self): user = await sync_to_async(User.objects.create_user)( username='wsuser', password='test123' ) doc = await sync_to_async(Document.objects.create)( owner=user, title='WS Test' ) communicator = WebsocketCommunicator( application, f"/ws/doc/{doc.id}/" ) # НЕ трогаем scope руками connected, _ = await communicator.connect() self.assertFalse(connected)