|
| 1 | +from typing import cast |
| 2 | + |
| 3 | +from pydantic import BaseModel |
| 4 | + |
| 5 | +from excelalchemy import FieldMeta |
| 6 | +from excelalchemy import MultiCheckbox |
| 7 | +from excelalchemy import OptionId |
| 8 | +from excelalchemy import ProgrammaticError |
| 9 | +from excelalchemy.const import MULTI_CHECKBOX_SEPARATOR |
| 10 | +from excelalchemy.const import Option |
| 11 | +from tests import BaseTestCase |
| 12 | + |
| 13 | + |
| 14 | +class TestMultiCheckbox(BaseTestCase): |
| 15 | + async def test_comment(self): |
| 16 | + class Importer(BaseModel): |
| 17 | + multi_checkbox: MultiCheckbox = FieldMeta(label='多选框', order=1) |
| 18 | + |
| 19 | + alchemy = self.build_alchemy(Importer) |
| 20 | + field = alchemy.ordered_field_meta[0] |
| 21 | + field.value_type = cast(MultiCheckbox, field.value_type) |
| 22 | + |
| 23 | + assert field.value_type.comment(field) == '必填性:必填\n\n单/多选:多选\n' |
| 24 | + |
| 25 | + async def test_serialize(self): |
| 26 | + class Importer(BaseModel): |
| 27 | + multi_checkbox: MultiCheckbox = FieldMeta(label='多选框', order=1) |
| 28 | + |
| 29 | + alchemy = self.build_alchemy(Importer) |
| 30 | + field = alchemy.ordered_field_meta[0] |
| 31 | + field.value_type = cast(MultiCheckbox, field.value_type) |
| 32 | + |
| 33 | + assert field.value_type.serialize(['a', 'b'], field) == ['a', 'b'] |
| 34 | + assert field.value_type.serialize(f'a{MULTI_CHECKBOX_SEPARATOR}b', field) == ['a', 'b'] |
| 35 | + assert field.value_type.serialize('a', field) == ['a'] |
| 36 | + assert field.value_type.serialize(None, field) is None |
| 37 | + assert field.value_type.serialize('', field) == [''] |
| 38 | + |
| 39 | + async def test_validate(self): |
| 40 | + class Importer(BaseModel): |
| 41 | + multi_checkbox: MultiCheckbox = FieldMeta( |
| 42 | + label='多选框', |
| 43 | + order=1, |
| 44 | + options=[ |
| 45 | + Option(id=OptionId('a'), name='a'), |
| 46 | + Option(id=OptionId('b'), name='b'), |
| 47 | + ], |
| 48 | + ) |
| 49 | + |
| 50 | + alchemy = self.build_alchemy(Importer) |
| 51 | + field = alchemy.ordered_field_meta[0] |
| 52 | + field.value_type = cast(MultiCheckbox, field.value_type) |
| 53 | + |
| 54 | + self.assertRaises(ValueError, field.value_type.__validate__, None, field) |
| 55 | + self.assertRaises(ValueError, field.value_type.__validate__, 'ddd', field) |
| 56 | + assert field.value_type.__validate__(['a', 'b'], field) == ['a', 'b'] |
| 57 | + self.assertRaises(ValueError, field.value_type.__validate__, ['a', 'b', 'c'], field) |
| 58 | + self.assertRaises(ValueError, field.value_type.__validate__, ['a', 'b', 'c', 'c'], field) |
| 59 | + self.assertRaises(ValueError, field.value_type.__validate__, ['a', 'b', 'c', ''], field) |
| 60 | + |
| 61 | + field.options = None |
| 62 | + self.assertRaises(ProgrammaticError, field.value_type.__validate__, ['a', 'b'], field) |
| 63 | + |
| 64 | + async def test_deserialize(self): |
| 65 | + class Importer(BaseModel): |
| 66 | + multi_checkbox: MultiCheckbox = FieldMeta( |
| 67 | + label='多选框', |
| 68 | + order=1, |
| 69 | + options=[ |
| 70 | + Option(id=OptionId('age'), name='年龄'), |
| 71 | + Option(id=OptionId('sex'), name='性别'), |
| 72 | + ], |
| 73 | + ) |
| 74 | + |
| 75 | + alchemy = self.build_alchemy(Importer) |
| 76 | + field = alchemy.ordered_field_meta[0] |
| 77 | + field.value_type = cast(MultiCheckbox, field.value_type) |
| 78 | + |
| 79 | + assert field.value_type.deserialize([OptionId('age'), OptionId('性别')], field) == '年龄,性别' |
| 80 | + assert field.value_type.deserialize(f'a{MULTI_CHECKBOX_SEPARATOR}b', field) == 'a,b' |
| 81 | + assert field.value_type.deserialize('a', field) == 'a' |
| 82 | + assert field.value_type.deserialize(None, field) == '' |
| 83 | + assert field.value_type.deserialize('', field) == '' |
0 commit comments