From b883b0869692765d0614717349575c1cfe0b855d Mon Sep 17 00:00:00 2001 From: Todd Dembrey <todd.dembrey@torchbox.com> Date: Fri, 23 Feb 2018 12:50:05 +0000 Subject: [PATCH] Make the blocks generate their own data for answers --- .../apply/funds/tests/factories/blocks.py | 44 +++++++++++++++++++ .../apply/funds/tests/factories/models.py | 12 +++-- 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/opentech/apply/funds/tests/factories/blocks.py b/opentech/apply/funds/tests/factories/blocks.py index 4d5863edc..218067c05 100644 --- a/opentech/apply/funds/tests/factories/blocks.py +++ b/opentech/apply/funds/tests/factories/blocks.py @@ -1,6 +1,9 @@ import json import uuid +from django.core.files.uploadedfile import InMemoryUploadedFile + +import factory from wagtail.wagtailcore.blocks import CharBlock import wagtail_factories @@ -17,19 +20,33 @@ class CharBlockFactory(wagtail_factories.blocks.BlockFactory): class FormFieldBlockFactory(wagtail_factories.StructBlockFactory): + default_value = factory.Faker('word') + class Meta: model = stream_blocks.FormFieldBlock + @classmethod + def make_answer(cls, params=dict()): + return cls.default_value.generate(params) + class CharFieldBlockFactory(FormFieldBlockFactory): + default_value = factory.Faker('sentence') + class Meta: model = stream_blocks.CharFieldBlock class NumberFieldBlockFactory(FormFieldBlockFactory): + default_value = 100 + class Meta: model = stream_blocks.NumberFieldBlock + @classmethod + def make_answer(cls, params=dict()): + return cls.default_value + class RadioFieldBlockFactory(FormFieldBlockFactory): choices = wagtail_factories.ListBlockFactory(CharBlockFactory) @@ -38,6 +55,30 @@ class RadioFieldBlockFactory(FormFieldBlockFactory): model = stream_blocks.RadioButtonsFieldBlock +class UploadableMediaFactory(FormFieldBlockFactory): + default_value = factory.django.FileField + + @classmethod + def make_answer(cls, params=dict()): + file_name, file = cls.default_value()._make_content(params) + return InMemoryUploadedFile(file, 'file', file_name, None, file.tell(), None) + + +class ImageFieldBlockFactory(UploadableMediaFactory): + class Meta: + model = stream_blocks.ImageFieldBlock + + +class FileFieldBlockFactory(UploadableMediaFactory): + class Meta: + model = stream_blocks.FileFieldBlock + + +class MultiFileFieldBlockFactory(UploadableMediaFactory): + class Meta: + model = stream_blocks.MultiFileFieldBlock + + class TitleBlockFactory(FormFieldBlockFactory): class Meta: model = blocks.TitleBlock @@ -78,4 +119,7 @@ CustomFormFieldsFactory = StreamFieldUUIDFactory({ 'number': NumberFieldBlockFactory, 'radios': RadioFieldBlockFactory, 'rich_text': RichTextFieldBlockFactory, + 'image': ImageFieldBlockFactory, + 'file': FileFieldBlockFactory, + 'multi_file': MultiFileFieldBlockFactory, }) diff --git a/opentech/apply/funds/tests/factories/models.py b/opentech/apply/funds/tests/factories/models.py index 5fada1821..8cd5754e3 100644 --- a/opentech/apply/funds/tests/factories/models.py +++ b/opentech/apply/funds/tests/factories/models.py @@ -5,6 +5,8 @@ import json import factory import wagtail_factories +from wagtail.wagtailcore.blocks import StreamBlock + from opentech.apply.funds.models import ( AbstractRelatedForm, ApplicationSubmission, @@ -132,14 +134,16 @@ class LabFormFactory(AbstractRelatedFormFactory): class FormDataFactory(factory.Factory): def _create(self, *args, form_fields='{}', **kwargs): - form_fields = json.loads(form_fields) + form_fields = ApplicationSubmission.form_fields.field.to_python(form_fields) form_data = {} for field in form_fields: try: - answer = kwargs[field['type']] + answer = kwargs[field.block_type] except KeyError: - answer = 'the answer' - form_data[field['id']] = answer + # Get the factory and delegate to the block to make an answer + factory = blocks.CustomFormFieldsFactory.factories[field.block_type] + answer = factory.make_answer() + form_data[field.id] = answer return form_data -- GitLab