Skip to content

Commit 40064e2

Browse files
authored
Merge pull request #28 from SundayWindy/feat/multi_checkbox
feat(multi_checkbox): add test for multi_checkbox
2 parents 3b1e589 + 2d56c5d commit 40064e2

File tree

2 files changed

+84
-1
lines changed

2 files changed

+84
-1
lines changed

excelalchemy/types/value/multi_checkbox.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def __validate__(cls, value: list[str] | Any, field_meta: FieldMetaInfo) -> list
4343
raise ValueError('选项不存在,请参照表头的注释填写')
4444

4545
if field_meta.options is None:
46-
raise ProgrammaticError('options cannot be None when validate RADIO, MULTI_CHECKBOX and SELECT')
46+
raise ProgrammaticError(f'options cannot be None when validate {cls.__name__}')
4747

4848
if not field_meta.options: # empty
4949
logging.warning('类型【%s】的字段【%s】的选项为空, 将返回原值', cls.__name__, field_meta.label)
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
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

Comments
 (0)