diff --git a/bookwyrm/tests/models/test_fields.py b/bookwyrm/tests/models/test_fields.py index e7393096..2b2d3939 100644 --- a/bookwyrm/tests/models/test_fields.py +++ b/bookwyrm/tests/models/test_fields.py @@ -1,11 +1,20 @@ ''' testing models ''' +from io import BytesIO from collections import namedtuple +import pathlib +import re + +from PIL import Image +import responses from django.core.exceptions import ValidationError +from django.core.files.base import ContentFile from django.db import models from django.test import TestCase +from django.utils import timezone -from bookwyrm.models import fields +from bookwyrm.models import fields, User +from bookwyrm.settings import DOMAIN class ActivitypubFields(TestCase): def test_validate_remote_id(self): @@ -103,3 +112,78 @@ class ActivitypubFields(TestCase): instance.field_to_activity(items), 'example.com/snake_case' ) + + def test_tag_field(self): + instance = fields.TagField('User') + + Serializable = namedtuple( + 'Serializable', + ('to_activity', 'remote_id', 'name_field', 'name') + ) + Queryset = namedtuple('Queryset', ('all', 'instance')) + item = Serializable( + lambda: {'a': 'b'}, 'https://e.b/c', 'name', 'Name') + another_item = Serializable( + lambda: {}, 'example.com', '', '') + items = Queryset(lambda: [item], another_item) + + result = instance.field_to_activity(items) + self.assertIsInstance(result, list) + self.assertEqual(len(result), 1) + self.assertEqual(result[0].href, 'https://e.b/c') + self.assertEqual(result[0].name, 'Name') + self.assertEqual(result[0].type, 'Serializable') + + + @responses.activate + def test_image_field(self): + user = User.objects.create_user( + 'mouse', 'mouse@mouse.mouse', 'mouseword', local=True) + image_file = pathlib.Path(__file__).parent.joinpath( + '../../static/images/default_avi.jpg') + image = Image.open(image_file) + output = BytesIO() + image.save(output, format=image.format) + user.avatar.save( + 'test.jpg', + ContentFile(output.getvalue()) + ) + + output = fields.image_serializer(user.avatar) + self.assertIsNotNone( + re.match( + r'https://%s/images/avatars/test_[A-z0-9]+\.jpg' % DOMAIN, + output.url, + ) + ) + self.assertEqual(output.type, 'Image') + + instance = fields.ImageField() + + self.assertEqual(instance.field_to_activity(user.avatar), output) + + responses.add( + responses.GET, + 'http://www.example.com/image.jpg', + body=user.avatar.file.read(), + status=200) + loaded_image = instance.field_from_activity( + 'http://www.example.com/image.jpg') + self.assertIsInstance(loaded_image, list) + self.assertIsNotNone(re.match(r'.*\.jpg', loaded_image[0])) + self.assertIsInstance(loaded_image[1], ContentFile) + + + def test_datetime_field(self): + instance = fields.DateTimeField() + now = timezone.now() + self.assertEqual(instance.field_to_activity(now), now.isoformat()) + self.assertEqual( + instance.field_from_activity(now.isoformat()), now + ) + self.assertEqual(instance.field_from_activity('bip'), None) + + + def test_array_field(self): + instance = fields.ArrayField(fields.IntegerField) + self.assertEqual(instance.field_to_activity([0, 1]), ['0', '1'])