|
9 | 9 | """Test the dumpers API.""" |
10 | 10 |
|
11 | 11 | from datetime import date, datetime |
| 12 | +from enum import Enum |
12 | 13 | from uuid import UUID |
13 | 14 |
|
14 | 15 | import pytest |
| 16 | +from invenio_db import db |
15 | 17 | from sqlalchemy.dialects import mysql |
| 18 | +from sqlalchemy_utils.types import ChoiceType |
16 | 19 |
|
17 | 20 | from invenio_records.api import Record |
18 | 21 | from invenio_records.dumpers import ElasticsearchDumper, ElasticsearchDumperExt |
19 | 22 | from invenio_records.dumpers.relations import RelationDumperExt |
20 | 23 | from invenio_records.models import RecordMetadataBase |
| 24 | +from invenio_records.systemfields import SystemFieldsMixin |
| 25 | +from invenio_records.systemfields.model import ModelField |
21 | 26 | from invenio_records.systemfields.relations import PKListRelation, \ |
22 | 27 | PKRelation, RelationsField |
23 | 28 |
|
@@ -215,3 +220,40 @@ class RecordWithRelations(Record): |
215 | 220 | # Load it |
216 | 221 | # new_record = Record.loads(dump, loader=dumper) |
217 | 222 | # assert 'count' not in new_record |
| 223 | + |
| 224 | + |
| 225 | +def test_load_dump_type(testapp): |
| 226 | + dumper = ElasticsearchDumper() |
| 227 | + rec = TestRecord.create({}, test=EnumTestModel.REGISTERED) |
| 228 | + # Serialize |
| 229 | + dumped_data = dumper.dump(rec, {}) |
| 230 | + assert isinstance(dumped_data["test"], str) |
| 231 | + # Deserialize |
| 232 | + loaded_data = dumper.load(dumped_data, TestRecord) |
| 233 | + assert isinstance(loaded_data.test, EnumTestModel) |
| 234 | + |
| 235 | + |
| 236 | +# Similar to PIDStatus |
| 237 | +class EnumTestModel(Enum): |
| 238 | + NEW = "N" |
| 239 | + REGISTERED = "R" |
| 240 | + |
| 241 | + def __init__(self, value): |
| 242 | + """Hack.""" |
| 243 | + |
| 244 | + def __str__(self): |
| 245 | + """Return its value.""" |
| 246 | + return self.value |
| 247 | + |
| 248 | + |
| 249 | +class TestMetadata(db.Model, RecordMetadataBase): |
| 250 | + """Represent a record metadata.""" |
| 251 | + |
| 252 | + __tablename__ = 'test_dumper_table' |
| 253 | + test = db.Column(ChoiceType(EnumTestModel, impl=db.CHAR(1))) |
| 254 | + |
| 255 | + |
| 256 | +# Similar to ModelPIDField |
| 257 | +class TestRecord(Record, SystemFieldsMixin): |
| 258 | + model_cls = TestMetadata |
| 259 | + test = ModelField(dump_type=str) |
0 commit comments