4
0
Bifurcation 1

feat(blocks): add RadioShowChooserBlock rendered as <select>

pull/12/head
Jérôme Lebleu 2021-11-25 14:22:59 +01:00
Parent 04020eef09
révision 1596b4884f
2 fichiers modifiés avec 115 ajouts et 0 suppressions

90
tests/test_blocks.py Normal file
Voir le fichier

@ -0,0 +1,90 @@
from django import forms
from django.core.exceptions import ValidationError
from wagtail.core.blocks.field_block import FieldBlockAdapter
import pytest
from wagtail_webradio.blocks import RadioShowChooserBlock
from .factories import RadioShowFactory
class TestRadioShowChooserBlock:
def test_serialize(self):
block = RadioShowChooserBlock()
radio_show = RadioShowFactory()
assert block.get_prep_value(radio_show) == radio_show.id
assert block.get_prep_value(None) is None
def test_deserialize(self):
block = RadioShowChooserBlock()
radio_show = RadioShowFactory()
assert block.to_python(radio_show.id) == radio_show
assert block.to_python(None) is None
def test_adapt(self):
block = RadioShowChooserBlock(help_text="pick a radio show")
block.set_name('test_radioshowchooserblock')
js_args = FieldBlockAdapter().js_args(block)
assert js_args[0] == 'test_radioshowchooserblock'
assert type(js_args[1]) is forms.Select
assert js_args[2] == {
'label': 'Radio show',
'required': True,
'icon': 'microphone',
'helpText': 'pick a radio show',
'classname': (
'field model_choice_field widget-select '
'fieldname-test_radioshowchooserblock'
),
'showAddCommentButton': True,
'strings': {'ADD_COMMENT': 'Add Comment'},
}
def test_form_response(self):
block = RadioShowChooserBlock()
radio_show = RadioShowFactory()
value = block.value_from_datadict(
{'radio_show': str(radio_show.id)}, {}, 'radio_show'
)
assert value == radio_show
empty_value = block.value_from_datadict(
{'radio_show': ''}, {}, 'radio_show'
)
assert empty_value is None
def test_clean(self):
required_block = RadioShowChooserBlock()
nonrequired_block = RadioShowChooserBlock(required=False)
radio_show = RadioShowFactory()
assert required_block.clean(radio_show) == radio_show
with pytest.raises(ValidationError):
required_block.clean(None)
assert nonrequired_block.clean(radio_show) == radio_show
assert nonrequired_block.clean(None) is None
def test_field_queryset(self):
block = RadioShowChooserBlock()
radio_shows = RadioShowFactory.create_batch(2)
assert set(block.field.queryset) == set(radio_shows)
def test_widget_choices(self):
RadioShowFactory.reset_sequence()
radio_shows = RadioShowFactory.create_batch(2)
block = RadioShowChooserBlock()
js_args = FieldBlockAdapter().js_args(block)
assert [c for c in js_args[1].choices] == [
('', '---------'),
(radio_shows[0].pk, "Radio Show #1"),
(radio_shows[1].pk, "Radio Show #2"),
]

Voir le fichier

@ -0,0 +1,25 @@
from django import forms
from django.utils.functional import cached_property
from django.utils.translation import gettext_lazy as _
from wagtail.core import blocks
from wagtail.core.utils import resolve_model_string
class RadioShowChooserBlock(blocks.ChooserBlock):
class Meta:
label = _("Radio show")
icon = 'microphone'
@cached_property
def target_model(self):
return resolve_model_string('wagtail_webradio.RadioShow')
@cached_property
def widget(self):
return forms.Select()
def value_from_form(self, value):
if value == '':
return None
return super().value_from_form(value)