diff --git a/modules/bibedit/lib/bibrecord_tests.py b/modules/bibedit/lib/bibrecord_tests.py index 41d99032e..a6f7b5199 100644 --- a/modules/bibedit/lib/bibrecord_tests.py +++ b/modules/bibedit/lib/bibrecord_tests.py @@ -1,282 +1,334 @@ # -*- coding: utf-8 -*- ## ## $Id$ ## ## This file is part of CDS Invenio. ## Copyright (C) 2002, 2003, 2004, 2005, 2006 CERN. ## ## CDS Invenio is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License as ## published by the Free Software Foundation; either version 2 of the ## License, or (at your option) any later version. ## ## CDS Invenio is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ## General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with CDS Invenio; if not, write to the Free Software Foundation, Inc., ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. import unittest from string import expandtabs, replace from invenio.config import tmpdir, etcdir from invenio import bibrecord class SanityTest(unittest.TestCase): """ bibrecord - sanity test (xml -> create records -> xml)""" def test_for_sanity(self): """ bibrecord - demo file sanity test (xml -> create records -> xml)""" f=open(tmpdir + '/demobibdata.xml','r') xmltext = f.read() f.close() # let's try to reproduce the demo XML MARC file by parsing it and printing it back: recs = map((lambda x:x[0]), bibrecord.create_records(xmltext)) xmltext_reproduced = bibrecord.records_xml_output(recs) x = xmltext_reproduced y = xmltext # 'normalize' the two XML MARC files for the purpose of comparing x = expandtabs(x) y = expandtabs(y) x = x.replace(' ','') y = y.replace(' ','') x = x.replace('<!DOCTYPEcollectionSYSTEM"file://%s/bibedit/MARC21slim.dtd">\n<collection>' % etcdir, '<collectionxmlns="http://www.loc.gov/MARC21/slim">') x = x.replace('</record><record>', "</record>\n<record>") x = x.replace('</record></collection>', "</record>\n</collection>\n") self.assertEqual(x,y) class SuccessTest(unittest.TestCase): """ bibrecord - demo file parsing test """ def setUp(self): f=open(tmpdir + '/demobibdata.xml','r') xmltext = f.read() f.close() self.recs = map((lambda x:x[0]),bibrecord.create_records(xmltext)) def test_records_created(self): """ bibrecord - demo file how many records are created """ self.assertEqual(76,len(self.recs)) def test_tags_created(self): """ bibrecord - demo file which tags are created """ ## check if the tags are correct tags= ['020', '037', '041', '080', '088', '100', '245', '246', '250', '260', '270', '300', '340', '490', '500', '502', '520', '590', '595', '650', '653', '690', '700', '710', '856','909','980','999'] t=[] for rec in self.recs: t.extend(rec.keys()) t.sort() #eliminate the elements repeated tt = [] for x in t: if not x in tt: tt.append(x) self.assertEqual(tags,tt) def test_fields_created(self): """bibrecord - demo file how many fields are created""" ## check if the number of fields for each record is correct fields=[13,13, 8, 11, 10,12, 10, 14, 10, 17, 13, 15, 10, 9, 14, 10, 11, 11, 11, 9, 10, 10, 10, 8, 8, 8, 9, 9, 9, 10, 8, 8, 8,8, 14, 13, 14, 14, 15, 12,12, 12,14, 13, 11, 15, 15, 14, 14, 13, 15, 14, 14, 14, 15, 14, 15, 14, 14, 15, 14, 13, 13, 14, 11, 13, 11, 14, 8, 10, 13, 12, 11, 12, 6, 6] cr=[] ret=[] for rec in self.recs: cr.append(len(rec.values())) ret.append(rec) self.assertEqual(fields,cr) class BadInputTreatmentTest(unittest.TestCase): """ bibrecord - testing for bad input treatment """ def test_wrong_attribute(self): """bibrecord - bad input subfield \'cde\' instead of \'code\'""" ws = bibrecord.cfg_bibrecord_warning_msgs xml_error1 = """ <record> <controlfield tag="001">33</controlfield> <datafield tag="041" ind1="" ind2=""> <subfield code="a">eng</subfield> </datafield> <datafield tag="100" ind1="" ind2=""> <subfield code="a">Doe, John</subfield> </datafield> <datafield tag="245" ind1="" ind2=""> <subfield cde="a">On the foo and bar</subfield> </datafield> </record> """ (rec,st,e) = bibrecord.create_record(xml_error1,1,1) ee='' for i in e: if type(i).__name__ == 'str': if i.count(ws[3])>0: ee = i self.assertEqual(bibrecord.warning((3,'(field number: 4)')),ee) def test_missing_attribute(self): """ bibrecord - bad input missing \"tag\" """ ws = bibrecord.cfg_bibrecord_warning_msgs xml_error2 = """ <record> <controlfield tag="001">33</controlfield> <datafield ind1="" ind2=""> <subfield code="a">eng</subfield> </datafield> <datafield tag="100" ind1="" ind2=""> <subfield code="a">Doe, John</subfield> </datafield> <datafield tag="245" ind1="" ind2=""> <subfield code="a">On the foo and bar</subfield> </datafield> </record> """ (rec,st,e) = bibrecord.create_record(xml_error2,1,1) ee='' for i in e: if type(i).__name__ == 'str': if i.count(ws[1])>0: ee = i self.assertEqual(bibrecord.warning((1,'(field number(s): [2])')),ee) def test_empty_datafield(self): """ bibrecord - bad input no subfield """ ws = bibrecord.cfg_bibrecord_warning_msgs xml_error3 = """ <record> <controlfield tag="001">33</controlfield> <datafield tag="041" ind1="" ind2=""> </datafield> <datafield tag="100" ind1="" ind2=""> <subfield code="a">Doe, John</subfield> </datafield> <datafield tag="245" ind1="" ind2=""> <subfield code="a">On the foo and bar</subfield> </datafield> </record> """ (rec,st,e) = bibrecord.create_record(xml_error3,1,1) ee='' for i in e: if type(i).__name__ == 'str': if i.count(ws[8])>0: ee = i self.assertEqual(bibrecord.warning((8,'(field number: 2)')),ee) def test_missing_tag(self): """bibrecord - bad input missing end \"tag\"""" ws = bibrecord.cfg_bibrecord_warning_msgs xml_error4 = """ <record> <controlfield tag="001">33</controlfield> <datafield tag="041" ind1="" ind2=""> <subfield code="a">eng</subfield> </datafield> <datafield tag="100" ind1="" ind2=""> <subfield code="a">Doe, John</subfield> </datafield> <datafield tag="245" ind1="" ind2=""> <subfield code="a">On the foo and bar</subfield> </record> """ (rec,st,e) = bibrecord.create_record(xml_error4,1,1) ee = '' for i in e: if type(i).__name__ == 'str': if i.count(ws[99])>0: ee = i self.assertEqual(bibrecord.warning((99,'(Tagname : datafield)')),ee) class AccentedUnicodeLettersTest(unittest.TestCase): """ bibrecord - testing accented UTF-8 letters """ def setUp(self): xml_example_record = """ <record> <controlfield tag="001">33</controlfield> <datafield tag="041" ind1="" ind2=""> <subfield code="a">eng</subfield> </datafield> <datafield tag="100" ind1="" ind2=""> <subfield code="a">Döè1, John</subfield> </datafield> <datafield tag="100" ind1="" ind2=""> <subfield code="a">Doe2, J>ohn</subfield> <subfield code="b">editor</subfield> </datafield> <datafield tag="245" ind1="" ind2="1"> <subfield code="a">Пушкин</subfield> </datafield> <datafield tag="245" ind1="" ind2="2"> <subfield code="a">On the foo and bar2</subfield> </datafield> </record> """ (self.rec, st, e) = bibrecord.create_record(xml_example_record,1,1) def test_accented_unicode_characters(self): """bibrecord - accented Unicode letters""" self.assertEqual(bibrecord.record_get_field_instances(self.rec, "100", "", ""), [([('a', 'Döè1, John')], '', '', '', 3), ([('a', 'Doe2, J>ohn'), ('b', 'editor')], '', '', '', 4)]) self.assertEqual(bibrecord.record_get_field_instances(self.rec, "245", "", "1"), [([('a', 'Пушкин')], '', '1', '', 5)]) class GettingFieldValuesTest(unittest.TestCase): """ bibrecord - testing for getting field/subfield values """ def setUp(self): xml_example_record = """ <record> <controlfield tag="001">33</controlfield> <datafield tag="041" ind1="" ind2=""> <subfield code="a">eng</subfield> </datafield> <datafield tag="100" ind1="" ind2=""> <subfield code="a">Doe1, John</subfield> </datafield> <datafield tag="100" ind1="" ind2=""> <subfield code="a">Doe2, John</subfield> <subfield code="b">editor</subfield> </datafield> <datafield tag="245" ind1="" ind2="1"> <subfield code="a">On the foo and bar1</subfield> </datafield> <datafield tag="245" ind1="" ind2="2"> <subfield code="a">On the foo and bar2</subfield> </datafield> </record> """ (self.rec, st, e) = bibrecord.create_record(xml_example_record,1,1) def test_get_field_instances(self): """bibrecord - getting field instances""" self.assertEqual(bibrecord.record_get_field_instances(self.rec, "100", "", ""), [([('a', 'Doe1, John')], '', '', '', 3), ([('a', 'Doe2, John'), ('b', 'editor')], '', '', '', 4)]) self.assertEqual(bibrecord.record_get_field_instances(self.rec, "", "", ""), [('245', [([('a', 'On the foo and bar1')], '', '1', '', 5), ([('a', 'On the foo and bar2')], '', '2', '', 6)]), ('001', [([], '', '', '33', 1)]), ('100', [([('a', 'Doe1, John')], '', '', '', 3), ([('a', 'Doe2, John'), ('b', 'editor')], '', '', '', 4)]), ('041', [([('a', 'eng')], '', '', '', 2)])]) def test_get_field_values(self): """bibrecord - getting field values""" self.assertEqual(bibrecord.record_get_field_values(self.rec, "100", "", "", "a"), ['Doe1, John', 'Doe2, John']) self.assertEqual(bibrecord.record_get_field_values(self.rec, "100", "", "", "b"), ['editor']) def test_get_subfield_values(self): """bibrecord - getting subfield values""" fi1, fi2 = bibrecord.record_get_field_instances(self.rec, "100", "", "") self.assertEqual(bibrecord.field_get_subfield_values(fi1, "b"), []) self.assertEqual(bibrecord.field_get_subfield_values(fi2, "b"), ["editor"]) +class AddFieldTest(unittest.TestCase): + """ bibrecord - testing adding field """ + + def setUp(self): + xml_example_record = """ + <record> + <controlfield tag="001">33</controlfield> + <datafield tag="041" ind1="" ind2=""> + <subfield code="a">eng</subfield> + </datafield> + <datafield tag="100" ind1="" ind2=""> + <subfield code="a">Doe1, John</subfield> + </datafield> + <datafield tag="100" ind1="" ind2=""> + <subfield code="a">Doe2, John</subfield> + <subfield code="b">editor</subfield> + </datafield> + <datafield tag="245" ind1="" ind2="1"> + <subfield code="a">On the foo and bar1</subfield> + </datafield> + <datafield tag="245" ind1="" ind2="2"> + <subfield code="a">On the foo and bar2</subfield> + </datafield> + </record> + """ + (self.rec, st, e) = bibrecord.create_record(xml_example_record,1,1) + + def test_add_controlfield(self): + """bibrecord - adding controlfield""" + field_number_1 = bibrecord.record_add_field(self.rec, "003", "", "", "SzGeCERN") + field_number_2 = bibrecord.record_add_field(self.rec, "004", "", "", "Test") + self.assertEqual(field_number_1, 7) + self.assertEqual(field_number_2, 8) + self.assertEqual(bibrecord.record_get_field_values(self.rec, "003", "", "", ""), + ['SzGeCERN']) + self.assertEqual(bibrecord.record_get_field_values(self.rec, "004", "", "", ""), + ['Test']) + + def test_add_datafield(self): + """bibrecord - adding datafield""" + field_number_1 = bibrecord.record_add_field(self.rec, "100", "", "", "", + [('a', 'Doe3, John')]) + field_number_2 = bibrecord.record_add_field(self.rec, "100", "", "", "", + [('a', 'Doe4, John'), ('b', 'editor')]) + self.assertEqual(field_number_1, 7) + self.assertEqual(field_number_2, 8) + self.assertEqual(bibrecord.record_get_field_values(self.rec, "100", "", "", "a"), + ['Doe1, John', 'Doe2, John', 'Doe3, John', 'Doe4, John']) + self.assertEqual(bibrecord.record_get_field_values(self.rec, "100", "", "", "b"), + ['editor', 'editor']) + def create_test_suite(): """Return test suite for the bibrecord module""" return unittest.TestSuite((unittest.makeSuite(SanityTest,'test'), unittest.makeSuite(SuccessTest,'test'), unittest.makeSuite(BadInputTreatmentTest,'test'), unittest.makeSuite(GettingFieldValuesTest,'test'), + unittest.makeSuite(AddFieldTest,'test'), unittest.makeSuite(AccentedUnicodeLettersTest,'test'))) if __name__ == '__main__': unittest.TextTestRunner(verbosity=2).run(create_test_suite())