def testProvenance(self):
        observable = Observable()
        provenance = OaiProvenance(
            nsMap={'oai_dc': "http://www.openarchives.org/OAI/2.0/"},
            baseURL=('meta', '/meta/repository/baseurl/text()'),
            harvestDate=('meta', '/meta/repository/harvestDate/text()'),
            metadataNamespace=('meta',
                               '/meta/repository/metadataNamespace/text()'),
            identifier=('header', '/oai_dc:header/oai_dc:identifier/text()'),
            datestamp=('header', '/oai_dc:header/oai_dc:datestamp/text()'))
        observable.addObserver(provenance)
        observer = MockStorage()
        provenance.addObserver(observer)

        result = asString(observable.any.provenance("recordId"))
        self.assertEqualsWS(
            """<provenance xmlns="http://www.openarchives.org/OAI/2.0/provenance"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/provenance
                      http://www.openarchives.org/OAI/2.0/provenance.xsd">

<originDescription harvestDate="HARVESTDATE" altered="true">
  <baseURL>BASEURL</baseURL>
  <identifier>recordId</identifier>
  <datestamp>DATESTAMP</datestamp>
  <metadataNamespace>METADATANAMESPACE</metadataNamespace>
</originDescription>
</provenance>""", result)
    def testProvenance(self):
        observable = Observable()
        provenance = OaiProvenance(
            nsMap = {'oai_dc': "http://www.openarchives.org/OAI/2.0/"},
            baseURL = ('meta', '/meta/repository/baseurl/text()'),
            harvestDate = ('meta', '/meta/repository/harvestDate/text()'),
            metadataNamespace = ('meta', '/meta/repository/metadataNamespace/text()'),
            identifier = ('header','/oai_dc:header/oai_dc:identifier/text()'),
            datestamp = ('header', '/oai_dc:header/oai_dc:datestamp/text()')
        )
        observable.addObserver(provenance)
        observer = MockStorage()
        provenance.addObserver(observer)

        result = asString(observable.any.provenance("recordId"))
        self.assertEqualsWS("""<provenance xmlns="http://www.openarchives.org/OAI/2.0/provenance"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/provenance
                      http://www.openarchives.org/OAI/2.0/provenance.xsd">

<originDescription harvestDate="HARVESTDATE" altered="true">
  <baseURL>BASEURL</baseURL>
  <identifier>recordId</identifier>
  <datestamp>DATESTAMP</datestamp>
  <metadataNamespace>METADATANAMESPACE</metadataNamespace>
</originDescription>
</provenance>""", result)
    def testNoOutputIfValueMissing(self):
        observable = Observable()
        provenance = OaiProvenance(
            nsMap={},
            baseURL=('meta', 'meta/repository/baseurl'),
            harvestDate=('meta', 'meta/does/not/exist'),
            metadataNamespace=('meta', 'meta/repository/metadataNamespace'),
            identifier=('header', 'header/identifier'),
            datestamp=('header', 'header/datestamp'))
        observable.addObserver(provenance)
        observer = MockStorage()
        provenance.addObserver(observer)

        result = asString(observable.any.provenance("recordId"))
        self.assertEqual('', result)
    def testNoOutputIfValueMissing(self):
        observable = Observable()
        provenance = OaiProvenance(
            nsMap = {},
            baseURL = ('meta', 'meta/repository/baseurl'),
            harvestDate = ('meta', 'meta/does/not/exist'),
            metadataNamespace = ('meta', 'meta/repository/metadataNamespace'),
            identifier = ('header','header/identifier'),
            datestamp = ('header', 'header/datestamp')
        )
        observable.addObserver(provenance)
        observer = MockStorage()
        provenance.addObserver(observer)

        result = asString(observable.any.provenance("recordId"))
        self.assertEquals('', result)
    def testCacheStorageResults(self):
        observable = Observable()
        provenance = OaiProvenance(
            nsMap={},
            baseURL=('meta', 'meta/repository/baseurl/text()'),
            harvestDate=('meta', 'meta/repository/harvestDate/text()'),
            metadataNamespace=('meta',
                               'meta/repository/metadataNamespace/text()'),
            identifier=('header', 'header/identifier/text()'),
            datestamp=('header', 'header/datestamp/text()'))
        observable.addObserver(provenance)
        storage = MockStorage()
        observer = storage
        provenance.addObserver(observer)

        self.assertEqual(0, storage.timesCalled)
        asString(observable.any.provenance("recordId"))
        self.assertEqual(2, storage.timesCalled)
    def testCacheStorageResults(self):
        observable = Observable()
        provenance = OaiProvenance(
            nsMap = {},
            baseURL = ('meta', 'meta/repository/baseurl/text()'),
            harvestDate = ('meta', 'meta/repository/harvestDate/text()'),
            metadataNamespace = ('meta', 'meta/repository/metadataNamespace/text()'),
            identifier = ('header','header/identifier/text()'),
            datestamp = ('header', 'header/datestamp/text()')
        )
        observable.addObserver(provenance)
        storage = MockStorage()
        observer = storage
        provenance.addObserver(observer)

        self.assertEquals(0, storage.timesCalled)
        asString(observable.any.provenance("recordId"))
        self.assertEquals(2, storage.timesCalled)