diff --git a/module/VuFind/tests/fixtures/marc/marctraits.xml b/module/VuFind/tests/fixtures/marc/marctraits.xml new file mode 100644 index 0000000000000000000000000000000000000000..fda580cf3acd719380ac347e599007a7321cac05 --- /dev/null +++ b/module/VuFind/tests/fixtures/marc/marctraits.xml @@ -0,0 +1,202 @@ +<?xml version="1.0" encoding="UTF-8"?> +<collection xmlns='http://www.loc.gov/MARC21/slim'> + + <record + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd" + xmlns="http://www.loc.gov/MARC21/slim"> + <leader>00000cam a22000004i 4500</leader> + <controlfield tag="001">123</controlfield> + <controlfield tag="008">021122s2020 en 000 0 eng d</controlfield> + <datafield tag="020" ind1=" " ind2=" "> + <subfield code="a">978-3-16-148410-0</subfield> + <subfield code="z">978-3-16-148410-1</subfield> + </datafield> + <datafield tag="010" ind1=" " ind2=" "> + <subfield code="a">LC123</subfield> + </datafield> + <datafield tag="015" ind1=" " ind2=" "> + <subfield code="a">NBN12</subfield> + <subfield code="7">NB</subfield> + </datafield> + <datafield tag="022" ind1=" " ind2=" "> + <subfield code="a">0000-1111</subfield> + </datafield> + <datafield tag="024" ind1="1" ind2=" "> + <subfield code="a">upc</subfield> + </datafield> + <datafield tag="024" ind1="2" ind2=" "> + <subfield code="a">ismn</subfield> + </datafield> + <datafield tag="024" ind1="3" ind2=" "> + <subfield code="a">ian</subfield> + </datafield> + <datafield tag="035" ind1=" " ind2=" "> + <subfield code="a">(FOO)123</subfield> + </datafield> + <datafield tag="035" ind1=" " ind2=" "> + <subfield code="a">(Baz)456</subfield> + </datafield> + <datafield tag="041" ind1="0" ind2=" "> + <subfield code="a">ger</subfield> + </datafield> + <datafield tag="041" ind1="1" ind2="7"> + <subfield code="a">spa</subfield> + </datafield> + <datafield tag="050" ind1=" " ind2="0"> + <subfield code="b">c3</subfield> + </datafield> + <datafield tag="082" ind1="0" ind2=" "> + <subfield code="a">d1</subfield> + </datafield> + <datafield tag="090" ind1=" " ind2=" "> + <subfield code="a">c1</subfield> + </datafield> + <datafield tag="090" ind1=" " ind2=" "> + <subfield code="a">c2</subfield> + </datafield> + <datafield tag="100" ind1="1" ind2=" "> + <subfield code="a">Author, Test</subfield> + <subfield code="d">(1800-)</subfield> + </datafield> + <datafield tag="110" ind1="2" ind2=" "> + <subfield code="a">Testcorp</subfield> + </datafield> + <datafield tag="245" ind1="0" ind2="4"> + <subfield code="a">The Foo:</subfield> + <subfield code="b">Bar! /</subfield> + <subfield code="c">Test Author.</subfield> + <subfield code="n">2.</subfield> + <subfield code="p">Return</subfield> + <subfield code="h">Format 1</subfield> + <subfield code="h">Format 2</subfield> + </datafield> + <datafield tag="250" ind1=" " ind2=" "> + <subfield code="a">2nd ed.</subfield> + </datafield> + <datafield tag="260" ind1=" " ind2=" "> + <subfield code="a">Place :</subfield> + <subfield code="b">Publisher,</subfield> + <subfield code="c">2020</subfield> + </datafield> + <datafield tag="264" ind1=" " ind2="0"> + <subfield code="a">Place :</subfield> + <subfield code="b">Producer,</subfield> + <subfield code="c">2019</subfield> + </datafield> + <datafield tag="264" ind1=" " ind2="1"> + <subfield code="a">Location :</subfield> + <subfield code="b">The Publishers,</subfield> + <subfield code="c">2020</subfield> + </datafield> + <datafield tag="300" ind1=" " ind2=" "> + <subfield code="a">1 book :</subfield> + <subfield code="b">colored,</subfield> + <subfield code="c">28 cm</subfield> + <subfield code="e">1 cd</subfield> + </datafield> + <datafield tag="306" ind1=" " ind2=" "> + <subfield code="a">002010</subfield> + <subfield code="a">013055</subfield> + </datafield> + <datafield tag="310" ind1=" " ind2=" "> + <subfield code="a">Frequency varies,</subfield> + <subfield code="b">2020-</subfield> + </datafield> + <datafield tag="362" ind1=" " ind2=" "> + <subfield code="a">2020-</subfield> + </datafield> + <datafield tag="440" ind1=" " ind2="0"> + <subfield code="a">Development Series</subfield> + <subfield code="x">1111-2222</subfield> + </datafield> + <datafield tag="490" ind1="0" ind2=" "> + <subfield code="a">System Collection</subfield> + <subfield code="x">2222-3333</subfield> + </datafield> + <datafield tag="500" ind1=" " ind2=" "> + <subfield code="a">General notes here.</subfield> + </datafield> + <datafield tag="500" ind1=" " ind2=" "> + <subfield code="a">Translation.</subfield> + </datafield> + <datafield tag="504" ind1=" " ind2=" "> + <subfield code="a">Bibliography: p. 122</subfield> + </datafield> + <datafield tag="506" ind1=" " ind2=" "> + <subfield code="a">Classified.</subfield> + </datafield> + <datafield tag="508" ind1=" " ind2=" "> + <subfield code="a">Producer: VuFind</subfield> + </datafield> + <datafield tag="520" ind1=" " ind2=" "> + <subfield code="a">Summary.</subfield> + <subfield code="b">Expanded.</subfield> + </datafield> + <datafield tag="521" ind1=" " ind2=" "> + <subfield code="a">Developers</subfield> + </datafield> + <datafield tag="538" ind1=" " ind2=" "> + <subfield code="a">Data in UTF-8</subfield> + </datafield> + <datafield tag="555" ind1="0" ind2=" "> + <subfield code="a">Finding aid available</subfield> + </datafield> + <datafield tag="580" ind1=" " ind2=" "> + <subfield code="a">Merged with several branches</subfield> + </datafield> + <datafield tag="586" ind1=" " ind2=" "> + <subfield code="a">VuFind Golden Award, 2020</subfield> + </datafield> + <datafield tag="650" ind1=" " ind2="4"> + <subfield code="a">Foo</subfield> + <subfield code="g">test</subfield> + <subfield code="7">null</subfield> + </datafield> + <datafield tag="650" ind1=" " ind2="4"> + <subfield code="a">Bar</subfield> + <subfield code="g">test again</subfield> + <subfield code="7">null</subfield> + </datafield> + <datafield tag="710" ind1="2" ind2=" "> + <subfield code="a">Foobar Inc.</subfield> + </datafield> + <datafield tag="730" ind1="0" ind2=" "> + <subfield code="x">3333-4444</subfield> + </datafield> + <datafield tag="752" ind1=" " ind2=" "> + <subfield code="a">Zoolandia</subfield> + <subfield code="b">City.</subfield> + </datafield> + <datafield tag="752" ind1=" " ind2=" "> + <subfield code="a">Funland</subfield> + <subfield code="b">Funtown.</subfield> + </datafield> + <datafield tag="773" ind1="0" ind2=" "> + <subfield code="z">1-84356-028-3</subfield> + </datafield> + <datafield tag="773" ind1="0" ind2=" "> + <subfield code="x">4444-5555</subfield> + </datafield> + <datafield tag="776" ind1="0" ind2=" "> + <subfield code="x">5555-6666</subfield> + </datafield> + <datafield tag="780" ind1="0" ind2="0"> + <subfield code="a">Old Journal</subfield> + <subfield code="x">6666-7777</subfield> + </datafield> + <datafield tag="785" ind1="0" ind2="0"> + <subfield code="a">New Journal</subfield> + <subfield code="x">7777-8888</subfield> + </datafield> + <datafield tag="830" ind1=" " ind2="0"> + <subfield code="a">Development</subfield> + <subfield code="v">no. 2</subfield> + <subfield code="x">7777-8888</subfield> + </datafield> + <datafield tag="856" ind1="4" ind2="2"> + <subfield code="u">https://vufind.org/vufind/</subfield> + <subfield code="y">VuFind Home Page</subfield> + </datafield> + </record> +</collection> diff --git a/module/VuFind/tests/unit-tests/src/VuFindTest/RecordDriver/MarcBasicTraitTest.php b/module/VuFind/tests/unit-tests/src/VuFindTest/RecordDriver/MarcBasicTraitTest.php new file mode 100644 index 0000000000000000000000000000000000000000..305168654c42649d025f087b4a8fed894cb83420 --- /dev/null +++ b/module/VuFind/tests/unit-tests/src/VuFindTest/RecordDriver/MarcBasicTraitTest.php @@ -0,0 +1,91 @@ +<?php +/** + * Record Driver Marc Traits Test Class + * + * PHP version 7 + * + * Copyright (C) The National Library of Finland 2020. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category VuFind + * @package Tests + * @author Ere Maijala <ere.maijala@helsinki.fi> + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link https://vufind.org/wiki/development:testing:unit_tests Wiki + */ +namespace VuFindTest\RecordDriver; + +/** + * Record Driver Marc Traits Test Class + * + * @category VuFind + * @package Tests + * @author Ere Maijala <ere.maijala@helsinki.fi> + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link https://vufind.org/wiki/development:testing:unit_tests Wiki + */ +class MarcBasicTraitTest extends \VuFindTest\Unit\TestCase +{ + use \VuFindTest\Unit\FixtureTrait; + + /** + * Test methods in MarcBasicTrait. + * + * @return void + */ + public function testMarcBasicTrait() + { + $xml = $this->getFixture('marc/marctraits.xml'); + $record = (new \File_MARCXML($xml, \File_MARCXML::SOURCE_STRING))->next(); + $obj = $this->getMockBuilder(\VuFind\RecordDriver\WorldCat::class) + ->onlyMethods(['getMarcRecord'])->getMock(); + $obj->expects($this->any()) + ->method('getMarcRecord') + ->will($this->returnValue($record)); + + $this->assertEquals( + ['9783161484100', '9783161484101', '1843560283'], + $obj->getISBNs() + ); + $this->assertEquals( + [ + '0000-1111', '1111-2222', '2222-3333', '3333-4444', '4444-5555', + '5555-6666', '6666-7777', '7777-8888' + ], + $obj->getISSNs() + ); + $this->assertEquals(['Format 1 Format 2'], $obj->getFormats()); + $this->assertEquals('123', $obj->getUniqueID()); + $this->assertEquals(['c1', 'c3', 'd1'], $obj->getCallNumbers()); + $this->assertEquals(['Author, Test (1800-)'], $obj->getPrimaryAuthors()); + $this->assertEquals(['eng', 'ger'], $obj->getLanguages()); + $this->assertEquals('The Foo: Bar! /', $obj->getTitle()); + $this->assertEquals('The Foo:', $obj->getShortTitle()); + $this->assertEquals('Bar! /', $obj->getSubtitle()); + $this + ->assertEquals(['Publisher,', 'The Publishers,'], $obj->getPublishers()); + $this->assertEquals(['2020', '2020'], $obj->getPublicationDates()); + $this->assertEquals(['2020-'], $obj->getDateSpan()); + $this + ->assertEquals(['Testcorp', 'Foobar Inc.'], $obj->getCorporateAuthors()); + $this->assertEquals([], $obj->getSecondaryAuthors()); + $this->assertEquals(['New Journal'], $obj->getNewerTitles()); + $this->assertEquals(['Old Journal'], $obj->getPreviousTitles()); + $this->assertEquals('2nd ed.', $obj->getEdition()); + $this->assertEquals( + ['1 book : colored, 28 cm 1 cd'], $obj->getPhysicalDescriptions() + ); + } +} diff --git a/module/VuFind/tests/unit-tests/src/VuFindTest/RecordDriver/SolrMarcTest.php b/module/VuFind/tests/unit-tests/src/VuFindTest/RecordDriver/SolrMarcTest.php index a484c6af0d960476898e75edf22968f42305d993..ff803e99c40002ff1906ca6ec36af31b0057639b 100644 --- a/module/VuFind/tests/unit-tests/src/VuFindTest/RecordDriver/SolrMarcTest.php +++ b/module/VuFind/tests/unit-tests/src/VuFindTest/RecordDriver/SolrMarcTest.php @@ -212,4 +212,108 @@ class SolrMarcTest extends \VuFindTest\Unit\TestCase $record->getFormattedMarcDetails('245', $input) ); } + + /** + * Test methods in MarcAdvancedTrait. + * + * Note that some methods are covered by the other tests. + * + * @return void + */ + public function testMarcAdvancedTrait() + { + $xml = $this->getFixture('marc/marctraits.xml'); + $record = (new \File_MARCXML($xml, \File_MARCXML::SOURCE_STRING))->next(); + $obj = $this->getMockBuilder(\VuFind\RecordDriver\SolrMarc::class) + ->onlyMethods(['getMarcRecord'])->getMock(); + $obj->expects($this->any()) + ->method('getMarcRecord') + ->will($this->returnValue($record)); + + $this->assertEquals(['Classified.'], $obj->getAccessRestrictions()); + $this->assertEquals(['VuFind Golden Award, 2020'], $obj->getAwards()); + $this->assertEquals(['Bibliography: p. 122'], $obj->getBibliographyNotes()); + $this->assertRegExp( + '/<collection.*?>.*<record>.*<\/record>.*<\/collection>/s', + $obj->getFilteredXML() + ); + $this->assertEquals(['Finding aid available'], $obj->getFindingAids()); + $this->assertEquals( + ['General notes here.', 'Translation.'], $obj->getGeneralNotes() + ); + $this->assertEquals( + ['2020', '2020'], $obj->getHumanReadablePublicationDates() + ); + $this->assertEquals( + ['Place :', 'Location :'], $obj->getPlacesOfPublication() + ); + $this->assertEquals(['00:20:10', '01:30:55'], $obj->getPlayingTimes()); + $this->assertEquals(['Producer: VuFind'], $obj->getProductionCredits()); + $this->assertEquals( + ['Frequency varies, 2020-'], $obj->getPublicationFrequency() + ); + $this->assertEquals( + ['Merged with several branches'], $obj->getRelationshipNotes() + ); + $this->assertEquals( + [ + ['name' => 'Development Series'], + ['name' => 'Development', 'number' => 'no. 2'] + ], + $obj->getSeries() + ); + $this->assertEquals(['Summary.'], $obj->getSummary()); + $this->assertEquals(['Data in UTF-8'], $obj->getSystemDetails()); + $this->assertEquals(['Developers'], $obj->getTargetAudienceNotes()); + $this->assertEquals('2. Return', $obj->getTitleSection()); + $this->assertEquals('Test Author.', $obj->getTitleStatement()); + $this->assertEquals( + ['Zoolandia -- City.', 'Funland -- Funtown.'], + $obj->getHierarchicalPlaceNames() + ); + $this->assertEquals( + [ + [ + 'url' => 'https://vufind.org/vufind/', + 'desc' => 'VuFind Home Page' + ] + ], + $obj->getURLs() + ); + $this->assertEquals(['(FOO)123', '(Baz)456'], $obj->getConsortialIDs()); + $this->assertEquals('ismn', $obj->getCleanISMN()); + $this->assertEquals( + ['nbn' => 'NBN12', 'source' => 'NB'], $obj->getCleanNBN() + ); + $marc21Xml = $obj->getXML('marc21'); + $this->assertStringStartsWith( + '<record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' + . ' xmlns="http://www.loc.gov/MARC21/slim" xsi:schemaLocation="' + . 'http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml' + . '/schema/MARC21slim.xsd" type="Bibliographic">', + $marc21Xml + ); + $this->assertStringContainsString('<leader>', $marc21Xml); + $this->assertEquals( + 1, substr_count($marc21Xml, '<leader>00000cam a22000004i 4500</leader>') + ); + $this->assertEquals(2, substr_count($marc21Xml, '<controlfield ')); + $this->assertEquals(52, substr_count($marc21Xml, '<datafield ')); + $this->assertEquals(86, substr_count($marc21Xml, '<subfield ')); + $rdfXml = $obj->getRDFXML(); + $this->assertStringContainsString( + '<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"' + . ' xmlns="http://www.loc.gov/mods/v3">', + $rdfXml + ); + $this->assertStringContainsString('<nonSort>The </nonSort>', $rdfXml); + $this->assertStringContainsString( + '<namePart>Author, Test</namePart>', + $rdfXml + ); + $this->assertStringContainsString( + '<identifier type="isbn">978-3-16-148410-0</identifier>', + $rdfXml + ); + } }