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
# =====================================================
# =====================================================
# 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)