コード例 #1
0
 def setUp(self):
     self.tempdir = mkdtemp()
     self.target = CallTrace("Target")
     self.target.path = self.tempdir
     self.target.oaiEnvelope = False
     logger = CallTrace("Logger")
     collection = None
     self.uploader = FileSystemUploader(self.target, logger, collection)
コード例 #2
0
 def setUp(self):
     self.tempdir = mkdtemp()
     self.target = CallTrace("Target")
     self.target.path = self.tempdir
     self.target.oaiEnvelope = False
     logger = CallTrace("Logger")
     collection = None
     self.uploader = FileSystemUploader(self.target, logger, collection)
コード例 #3
0
class FileSystemUploaderTest(SeecrTestCase):

    def setUp(self):
        self.tempdir = mkdtemp()
        self.target = CallTrace("Target")
        self.target.path = self.tempdir
        self.target.oaiEnvelope = False
        logger = CallTrace("Logger")
        collection = None
        self.uploader = FileSystemUploader(self.target, logger, collection)

    def tearDown(self):
        shutil.rmtree(self.tempdir, ignore_errors=True)

    def testFilenameForId(self):
        def getFilename(anId):
            repository = CallTrace('Repository')
            repository.repositoryGroupId = 'groupId'
            repository.id = 'repositoryId'

            upload = Upload(repository=repository)
            upload.id = anId
            return self.uploader._filenameFor(upload)

        self.assertEquals(self.tempdir + '/groupId/repositoryId/aa:bb_SLASH_cc.dd.record', getFilename('aa:bb/cc.dd'))
        self.assertTrue(getFilename('.').startswith(self.tempdir + '/groupId/repositoryId/_malformed_id.'))
        self.assertTrue(getFilename('..').startswith(self.tempdir + '/groupId/repositoryId/_malformed_id.'))
        self.assertTrue(getFilename('').startswith(self.tempdir + '/groupId/repositoryId/_malformed_id.'))
        self.assertTrue(getFilename('a'*256).startswith(self.tempdir + '/groupId/repositoryId/_malformed_id.'))

    def testDeleteWithoutOaiEnvelope(self):
        recordFile = join(self.tempdir, 'id.record')
        os.system('touch ' + recordFile)
        self.assertTrue(isfile(recordFile))
        self.uploader._filenameFor = lambda *args: recordFile
        self.target.oaiEnvelope = False

        repository = CallTrace('Repository')
        repository.repositoryGroupId = 'groupId'
        repository.id = 'repositoryId'


        upload = Upload(repository=repository)
        upload.id = 'id'

        self.uploader.delete(upload)

        DELETED_RECORDS = join(self.tempdir, 'deleted_records')

        self.assertTrue(isfile(DELETED_RECORDS))
        self.assertEquals(['id\n'], open(DELETED_RECORDS).readlines())
        self.assertFalse(isfile(recordFile))

        upload.id = 'second:id'
        self.uploader.delete(upload)
        self.assertEquals(['id\n', 'second:id\n'], open(DELETED_RECORDS).readlines())

    def testDeleteWithOaiEnvelope(self):
        RECORD_FILENAME = join(self.tempdir, 'id.record')
        self.uploader._filenameFor = lambda *args: RECORD_FILENAME
        self.uploader.tznow = lambda: "VANDAAG_EN_NU"
        self.target.oaiEnvelope = True

        repository = CallTrace('Repository')
        repository.repositoryGroupId = 'groupId'
        repository.metadataPrefix = 'oai_dc'
        repository.baseurl = "http://repository"
        repository.id = 'repositoryId'

        upload = Upload(repository=repository, oaiResponse=oaiResponse(identifier='id.record', deleted=True))

        self.assertFalse(isfile(RECORD_FILENAME))
        self.uploader.delete(upload)
        self.assertTrue(isfile(RECORD_FILENAME))

        self.assertEqualsWS("""<OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
    <responseDate>VANDAAG_EN_NU</responseDate>
    <request verb="GetRecord" metadataPrefix="oai_dc" identifier="id.record">http://repository</request>
    <GetRecord>
        <record>
            <header status="deleted">
                <identifier>id.record</identifier>
                <datestamp>2005-08-29T07:08:09Z</datestamp>
            </header>
        </record>
    </GetRecord>
</OAI-PMH>""", open(RECORD_FILENAME).read())


    def testSend(self):
        recordFile = self.tempdir + '/group/repo/id.record'
        self.uploader._filenameFor = lambda *args: recordFile

        upload = createUpload()
        self.uploader.send(upload)

        self.assertTrue(isfile(recordFile))
        self.assertEqualsLxml(oaiResponse().record, parse(open(recordFile)))

    def testSendWithAbout(self):
        ABOUT = '<about xmlns="%(oai)s">abouttext</about>' % namespaces
        recordFile = self.tempdir + '/group/repo/id.record'
        self.uploader._filenameFor = lambda *args: recordFile

        upload = createUpload(about=ABOUT)
        self.uploader.send(upload)

        self.assertTrue(isfile(recordFile))
        self.assertEquals(ABOUT, lxmltostring(xpathFirst(parse(open(recordFile)), '//oai:about')))

    def testSendWithMultipleAbout(self):
        ABOUT = '<about xmlns="%(oai)s">about_1</about><about xmlns="%(oai)s">about_2</about>' % namespaces

        recordFile = self.tempdir + '/group/repo/id.record'
        self.uploader._filenameFor = lambda *args: recordFile

        upload = createUpload(about=ABOUT)
        self.uploader.send(upload)

        self.assertTrue(isfile(recordFile))
        self.assertEquals(ABOUT, ''.join(lxmltostring(x) for x in xpath(parse(open(recordFile)), '//oai:about')))


    def testSendRaisesError(self):
        def raiseError(*args, **kwargs):
            raise Exception('Catch me')
        self.uploader._filenameFor = raiseError

        try:
            upload = createUpload()
            self.uploader.send(upload)
            self.fail()
        except UploaderException:
            pass


    def testSendOaiEnvelope(self):
        self.target.oaiEnvelope = 'true'
        recordFile = self.tempdir + '/group/repo/id.record'
        self.uploader._filenameFor = lambda *args: recordFile

        upload = createUpload()
        upload.repository = CallTrace('Repository')
        upload.repository.baseurl = 'http://www.example.com'
        upload.repository.metadataPrefix = 'weird&strange'

        self.uploader.send(upload)

        self.assertTrue(isfile(recordFile))
        xmlGetRecord = parse(open(recordFile))
        self.assertEquals('oai:ident:321', xpathFirst(xmlGetRecord, '/oai:OAI-PMH/oai:GetRecord/oai:record/oai:header/oai:identifier/text()'))
        self.assertEquals('http://www.example.com', xpathFirst(xmlGetRecord, '/oai:OAI-PMH/oai:request/text()'))
        self.assertEquals('weird&strange', xpathFirst(xmlGetRecord, '/oai:OAI-PMH/oai:request/@metadataPrefix'))

    def testSendTwice(self):
        self.testSend()
        self.testSend()
コード例 #4
0
class FileSystemUploaderTest(SeecrTestCase):
    def setUp(self):
        self.tempdir = mkdtemp()
        self.target = CallTrace("Target")
        self.target.path = self.tempdir
        self.target.oaiEnvelope = False
        logger = CallTrace("Logger")
        collection = None
        self.uploader = FileSystemUploader(self.target, logger, collection)

    def tearDown(self):
        shutil.rmtree(self.tempdir, ignore_errors=True)

    def testFilenameForId(self):
        def getFilename(anId):
            repository = CallTrace('Repository')
            repository.repositoryGroupId = 'groupId'
            repository.id = 'repositoryId'

            upload = Upload(repository=repository)
            upload.id = anId
            return self.uploader._filenameFor(upload)

        self.assertEqual(
            self.tempdir + '/groupId/repositoryId/aa:bb_SLASH_cc.dd.record',
            getFilename('aa:bb/cc.dd'))
        self.assertTrue(
            getFilename('.').startswith(
                self.tempdir + '/groupId/repositoryId/_malformed_id.'))
        self.assertTrue(
            getFilename('..').startswith(
                self.tempdir + '/groupId/repositoryId/_malformed_id.'))
        self.assertTrue(
            getFilename('').startswith(self.tempdir +
                                       '/groupId/repositoryId/_malformed_id.'))
        self.assertTrue(
            getFilename(
                'a' * 256).startswith(self.tempdir +
                                      '/groupId/repositoryId/_malformed_id.'))

    def testDeleteWithoutOaiEnvelope(self):
        recordFile = join(self.tempdir, 'id.record')
        os.system('touch ' + recordFile)
        self.assertTrue(isfile(recordFile))
        self.uploader._filenameFor = lambda *args: recordFile
        self.target.oaiEnvelope = False

        repository = CallTrace('Repository')
        repository.repositoryGroupId = 'groupId'
        repository.id = 'repositoryId'

        upload = Upload(repository=repository)
        upload.id = 'id'

        self.uploader.delete(upload)

        DELETED_RECORDS = join(self.tempdir, 'deleted_records')

        self.assertTrue(isfile(DELETED_RECORDS))
        with open(DELETED_RECORDS) as fp:
            self.assertEqual(['id\n'], fp.readlines())
        self.assertFalse(isfile(recordFile))

        upload.id = 'second:id'
        self.uploader.delete(upload)
        with open(DELETED_RECORDS) as fp:
            self.assertEqual(['id\n', 'second:id\n'], fp.readlines())

    def testDeleteWithOaiEnvelope(self):
        RECORD_FILENAME = join(self.tempdir, 'id.record')
        self.uploader._filenameFor = lambda *args: RECORD_FILENAME
        self.uploader.tznow = lambda: "VANDAAG_EN_NU"
        self.target.oaiEnvelope = True

        repository = CallTrace('Repository')
        repository.repositoryGroupId = 'groupId'
        repository.metadataPrefix = 'oai_dc'
        repository.baseurl = "http://repository"
        repository.id = 'repositoryId'

        upload = Upload(repository=repository,
                        oaiResponse=oaiResponse(identifier='id.record',
                                                deleted=True))

        self.assertFalse(isfile(RECORD_FILENAME))
        self.uploader.delete(upload)
        self.assertTrue(isfile(RECORD_FILENAME))

        with open(RECORD_FILENAME) as f:
            self.assertEqualsWS(
                """<OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
    <responseDate>VANDAAG_EN_NU</responseDate>
    <request verb="GetRecord" metadataPrefix="oai_dc" identifier="id.record">http://repository</request>
    <GetRecord>
        <record>
            <header status="deleted">
                <identifier>id.record</identifier>
                <datestamp>2005-08-29T07:08:09Z</datestamp>
            </header>
        </record>
    </GetRecord>
</OAI-PMH>""", f.read())

    def testSend(self):
        recordFile = self.tempdir + '/group/repo/id.record'
        self.uploader._filenameFor = lambda *args: recordFile

        upload = createUpload()
        self.uploader.send(upload)

        self.assertTrue(isfile(recordFile))
        with open(recordFile) as fp:
            self.assertEqualsLxml(oaiResponse().record, parse(fp))

    def testSendWithAbout(self):
        ABOUT = '<about xmlns="%(oai)s">abouttext</about>' % namespaces
        recordFile = self.tempdir + '/group/repo/id.record'
        self.uploader._filenameFor = lambda *args: recordFile

        upload = createUpload(about=ABOUT)
        self.uploader.send(upload)

        self.assertTrue(isfile(recordFile))
        with open(recordFile) as fp:
            self.assertEqual(
                ABOUT, lxmltostring(xpathFirst(parse(fp), '//oai:about')))

    def testSendWithMultipleAbout(self):
        ABOUT = '<about xmlns="%(oai)s">about_1</about><about xmlns="%(oai)s">about_2</about>' % namespaces

        recordFile = self.tempdir + '/group/repo/id.record'
        self.uploader._filenameFor = lambda *args: recordFile

        upload = createUpload(about=ABOUT)
        self.uploader.send(upload)

        self.assertTrue(isfile(recordFile))
        with open(recordFile) as fp:
            self.assertEqual(
                ABOUT, ''.join(
                    lxmltostring(x) for x in xpath(parse(fp), '//oai:about')))

    def testSendRaisesError(self):
        def raiseError(*args, **kwargs):
            raise Exception('Catch me')

        self.uploader._filenameFor = raiseError

        try:
            upload = createUpload()
            self.uploader.send(upload)
            self.fail()
        except UploaderException:
            pass

    def testSendOaiEnvelope(self):
        self.target.oaiEnvelope = 'true'
        recordFile = self.tempdir + '/group/repo/id.record'
        self.uploader._filenameFor = lambda *args: recordFile

        upload = createUpload()
        upload.repository = CallTrace('Repository')
        upload.repository.baseurl = 'http://www.example.com'
        upload.repository.metadataPrefix = 'weird&strange'

        self.uploader.send(upload)

        self.assertTrue(isfile(recordFile))
        with open(recordFile) as fp:
            xmlGetRecord = parse(fp)
            self.assertEqual(
                'oai:ident:321',
                xpathFirst(
                    xmlGetRecord,
                    '/oai:OAI-PMH/oai:GetRecord/oai:record/oai:header/oai:identifier/text()'
                ))
            self.assertEqual(
                'http://www.example.com',
                xpathFirst(xmlGetRecord, '/oai:OAI-PMH/oai:request/text()'))
            self.assertEqual(
                'weird&strange',
                xpathFirst(xmlGetRecord,
                           '/oai:OAI-PMH/oai:request/@metadataPrefix'))

    def testSendTwice(self):
        self.testSend()
        self.testSend()