# -*- coding: utf-8 -*- from io import BytesIO import json from hwp5 import recordstream as RS from hwp5.recordstream import RecordStream from hwp5.recordstream import dump_record from hwp5.recordstream import read_record from hwp5.recordstream import record_to_json from hwp5.storage import ExtraItemStorage from hwp5.tagids import HWPTAG_DOCUMENT_PROPERTIES from hwp5.tagids import HWPTAG_ID_MAPPINGS from hwp5.tagids import HWPTAG_PARA_HEADER from hwp5.utils import cached_property from . import test_filestructure class TestBase(test_filestructure.TestBase): @property def hwp5file_rec(self): return RS.Hwp5File(self.olestg) hwp5file = hwp5file_rec class TestRecord(TestBase): def test_read_record(self): docinfo_stream = self.hwp5file['DocInfo'] record = read_record(docinfo_stream.open(), 0) self.assertEqual(HWPTAG_DOCUMENT_PROPERTIES, record['tagid']) def test_dump_record(self): docinfo_stream = self.hwp5file['DocInfo'] record = read_record(docinfo_stream.open(), 0) stream = BytesIO() dump_record(stream, record) stream.seek(0) record2 = read_record(stream, 0) self.assertEqual(record2, record) class TestRecordStream(TestBase): @cached_property def docinfo(self): return RecordStream(self.hwp5file_fs['DocInfo'], self.hwp5file_fs.header.version) def test_records(self): self.assertEqual(67, len(list(self.docinfo.records()))) def test_records_kwargs_treegroup(self): records = self.docinfo.records(treegroup=1) self.assertEqual(66, len(records)) self.assertEqual(HWPTAG_ID_MAPPINGS, records[0]['tagid']) records = self.docinfo.records(treegroup=0) self.assertEqual(1, len(records)) self.assertEqual(HWPTAG_DOCUMENT_PROPERTIES, records[0]['tagid']) records = self.bodytext.section(0).records(treegroup=5) self.assertEqual(26, records[0]['seqno']) self.assertEqual(37, len(records)) def test_record(self): record = self.docinfo.record(0) self.assertEqual(0, record['seqno']) record = self.docinfo.record(10) self.assertEqual(10, record['seqno']) def test_records_treegrouped(self): groups = self.docinfo.records_treegrouped() document_properties_treerecords = next(groups) self.assertEqual(1, len(document_properties_treerecords)) idmappings_treerecords = next(groups) self.assertEqual(66, len(idmappings_treerecords)) section = self.bodytext.section(0) for group_idx, records in enumerate(section.records_treegrouped()): # print group_idx, records[0]['seqno'], len(records) self.assertEqual(HWPTAG_PARA_HEADER, records[0]['tagid']) def test_records_treegrouped_as_iterable(self): groups = self.docinfo.records_treegrouped(group_as_list=False) group = next(groups) self.assertFalse(isinstance(group, list)) def test_records_treegroped_as_list(self): groups = self.docinfo.records_treegrouped() group = next(groups) self.assertTrue(isinstance(group, list)) def test_records_treegroup(self): records = self.docinfo.records_treegroup(1) self.assertEqual(66, len(records)) self.assertEqual(HWPTAG_ID_MAPPINGS, records[0]['tagid']) records = self.docinfo.records_treegroup(0) self.assertEqual(1, len(records)) self.assertEqual(HWPTAG_DOCUMENT_PROPERTIES, records[0]['tagid']) records = self.bodytext.section(0).records_treegroup(5) self.assertEqual(26, records[0]['seqno']) self.assertEqual(37, len(records)) class TestHwp5File(TestBase): def test_if_hwp5file_contains_other_formats(self): stg = ExtraItemStorage(self.hwp5file) self.assertTrue('DocInfo.records' in list(stg)) def test_docinfo(self): docinfo = self.hwp5file.docinfo self.assertTrue(isinstance(docinfo, RS.RecordStream)) records = list(docinfo.records()) self.assertEqual(67, len(records)) def test_bodytext(self): bodytext = self.hwp5file.bodytext self.assertTrue(isinstance(bodytext, RS.Sections)) stg = ExtraItemStorage(bodytext) self.assertEqual(['Section0', 'Section0.records'], list(stg)) class TestJson(TestBase): def test_record_to_json(self): record = next(self.hwp5file.docinfo.records()) json_string = record_to_json(record) jsonobject = json.loads(json_string) self.assertEqual(16, jsonobject['tagid']) self.assertEqual(0, jsonobject['level']) self.assertEqual(26, jsonobject['size']) self.assertEqual(['01 00 01 00 01 00 01 00 01 00 01 00 01 00 00 00', '00 00 07 00 00 00 05 00 00 00'], jsonobject['payload']) self.assertEqual(0, jsonobject['seqno']) self.assertEqual('HWPTAG_DOCUMENT_PROPERTIES', jsonobject['tagname']) def test_generate_json(self): records_json = self.hwp5file.docinfo.records_json() json_string = ''.join(records_json.generate()) jsonobject = json.loads(json_string) self.assertEqual(67, len(jsonobject))