Add comment node to room entry

This commit is contained in:
Ramon Wenger 2021-08-23 15:57:08 +02:00
parent 30b123523a
commit 9f858ea46c
5 changed files with 81 additions and 19 deletions

View File

@ -12,7 +12,7 @@ from wagtail.images import get_image_model
from users.models import Role, UserRole from users.models import Role, UserRole
fake = Faker('de_CH') fake = Faker(['de_CH', 'en-US'])
def fake_title(x=None, min_words=2, max_words=4): def fake_title(x=None, min_words=2, max_words=4):

View File

@ -2,7 +2,7 @@ from django.test import TestCase, RequestFactory
from graphene.test import Client from graphene.test import Client
from api.schema import schema from api.schema import schema
from users.models import User from users.models import SchoolClass, User
from users.services import create_users from users.services import create_users
@ -15,6 +15,8 @@ class SkillboxTestCase(TestCase):
self.student2 = User.objects.get(username='student2') self.student2 = User.objects.get(username='student2')
self.student_second_class = User.objects.get(username='student_second_class') self.student_second_class = User.objects.get(username='student_second_class')
self.school_class = SchoolClass.objects.get(name='skillbox')
def get_client(self, user=None) -> Client: def get_client(self, user=None) -> Client:
request = RequestFactory().get('/') request = RequestFactory().get('/')
if user is None: if user is None:

View File

@ -8,7 +8,7 @@ from wagtail.core.rich_text import RichText
from books.factories import TextBlockFactory, ImageUrlBlockFactory, LinkBlockFactory from books.factories import TextBlockFactory, ImageUrlBlockFactory, LinkBlockFactory
from core.factories import fake, fake_paragraph from core.factories import fake, fake_paragraph
from rooms.models import Room, RoomEntry, ModuleRoomSlug from rooms.models import Comment, Room, RoomEntry, ModuleRoomSlug
from users.models import SchoolClass from users.models import SchoolClass
@ -86,3 +86,9 @@ class ModuleRoomSlugFactory(factory.django.DjangoModelFactory):
slug = factory.Sequence(lambda n: u'slug-{:d}'.format(n)) slug = factory.Sequence(lambda n: u'slug-{:d}'.format(n))
title = factory.Sequence(lambda n: u'Title {:d}'.format(n)) title = factory.Sequence(lambda n: u'Title {:d}'.format(n))
class CommentFactory(factory.django.DjangoModelFactory):
class Meta:
model = Comment
text = factory.LazyAttribute(lambda x: fake.sentence(nb_words=random.randint(10, 30)))

View File

@ -13,9 +13,20 @@ from users.schema import PublicUserNode
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class CommentNode(DjangoObjectType):
owner = graphene.Field(PublicUserNode)
class Meta:
model = Comment
interfaces = (relay.Node,)
filter_fields = ['owner', ]
only_fields = ('owner', 'text', 'created')
class RoomEntryNode(DjangoObjectType): class RoomEntryNode(DjangoObjectType):
pk = graphene.Int() pk = graphene.Int()
author = graphene.Field('users.schema.PublicUserNode') author = graphene.Field('users.schema.PublicUserNode')
comments = DjangoFilterConnectionField(CommentNode)
class Meta: class Meta:
model = RoomEntry model = RoomEntry
@ -42,14 +53,6 @@ class RoomNode(DjangoObjectType):
return self.room_entries.count() return self.room_entries.count()
class CommentNode(DjangoObjectType):
owner = graphene.Field(PublicUserNode)
class Meta:
model = Comment
interfaces = (relay.Node,)
class RoomsQuery(object): class RoomsQuery(object):
# room = relay.Node.Field(RoomNode) # room = relay.Node.Field(RoomNode)
room_entry = graphene.Field(RoomEntryNode, id=graphene.ID(), slug=graphene.String()) room_entry = graphene.Field(RoomEntryNode, id=graphene.ID(), slug=graphene.String())

View File

@ -1,16 +1,26 @@
from graphql_relay import to_global_id from graphql_relay import to_global_id
from core.tests.base_test import SkillboxTestCase from core.tests.base_test import SkillboxTestCase
from rooms.factories import RoomEntryFactory from rooms.factories import CommentFactory, RoomEntryFactory, RoomFactory
class GQLResult:
def __init__(self, result):
self.data = result.get('data')
self.errors = result.get('errors')
class CommentTestCase(SkillboxTestCase): class CommentTestCase(SkillboxTestCase):
def setUp(self) -> None: def setUp(self) -> None:
self.createDefault() self.createDefault()
room = RoomFactory(school_class=self.school_class)
self.room_entry = RoomEntryFactory(room=room, author=self.teacher)
self.room_entry_id = to_global_id('RoomEntryNode', self.room_entry.id)
self.text = 'First!!!'
def test_add_comment(self): def test_add_comment(self):
room_entry = RoomEntryFactory() room_entry = self.room_entry
text = 'First!!!'
mutation = """ mutation = """
mutation AddComment($input: AddCommentInput!) { mutation AddComment($input: AddCommentInput!) {
@ -21,16 +31,57 @@ mutation AddComment($input: AddCommentInput!) {
""" """
self.assertEqual(room_entry.comments.count(), 0) self.assertEqual(room_entry.comments.count(), 0)
room_entry_id = to_global_id('RoomEntryNode', room_entry.id)
result = self.get_client().execute(mutation, variables={ result = self.get_client().execute(mutation, variables={
'input': { 'input': {
'roomEntry': room_entry_id, 'roomEntry': self.room_entry_id,
'comment': text 'comment': self.text
} }
}) })
self.assertIsNone(result.get('errors')) self.assertIsNone(result.get('errors'))
self.assertEqual(room_entry.comments.count(), 1) self.assertEqual(room_entry.comments.count(), 1)
comment = room_entry.comments.first() comment = room_entry.comments.first()
self.assertEqual(comment.text, text) self.assertEqual(comment.text, self.text)
self.assertEqual(comment.owner.id, self.teacher.id) self.assertEqual(comment.owner.id, self.teacher.id)
def test_get_comment(self):
CommentFactory(room_entry=self.room_entry, text=self.text, owner=self.teacher)
query = """
query CommentsQuery($id: ID!) {
roomEntry(id: $id) {
comments {
edges {
node {
text
}
}
}
}
}
"""
result = self.get_client().execute(query, variables={"id": self.room_entry_id})
self.assertIsNone(result.get('errors'))
comment_node = result.get('data').get('roomEntry').get('comments').get('edges')[0].get('node')
self.assertEqual(comment_node['text'], self.text)
def test_get_comment_for_other_user(self):
CommentFactory(room_entry=self.room_entry, text=self.text, owner=self.teacher)
query = """
query CommentsQuery($id: ID!) {
roomEntry(id: $id) {
comments {
edges {
node {
text
}
}
}
}
}
"""
result = self.get_client(self.student_second_class).execute(query, variables={"id": self.room_entry_id})
gql_result = GQLResult(result)
self.assertIsNone(gql_result.errors)
self.assertIsNone(gql_result.data.get('roomEntry'))