from MetadataSourceAggregator import *
from FileMetadataSource import *
import unittest
import os
sources = [
("source1", FileMetadataSource("testdata/FileSource1/")),
("source2", FileMetadataSource("testdata/FileSource2/")),
("source3", FileMetadataSource("testdata/FileSource3/")),
]
map = [
("Song::Artist", "source1", "File::Singer"),
("Song::Title", "source1", "File::Name"),
("Song::Genre", "source1", "File::Style"),
("Song::DynamicComplexity", "source2", "WaveFile::Complexity"),
("Frame::Energy", "source3", "Frame::SpectralEnergy"),
]
badMap = map + [("BadSourceScope::At", "badSource", "BadSourceScope::At")]
class MetadataSourceAggregatorTest(unittest.TestCase):
def dumpXml(self, dom) :
output = StringIO()
dom.Dump(output)
return output.getvalue()
def setUp(self) :
files=[
"testdata/FileSource1/newId.pool",
"testdata/FileSource2/newId.pool",
"testdata/FileSource3/newId.pool",
]
for file in files :
if os.access(file, os.F_OK) :
os.remove(file)
def tearDown(self):
files=[
"testdata/FileSource1/newId.pool",
"testdata/FileSource2/newId.pool",
"testdata/FileSource3/newId.pool",
]
for file in files :
if os.access(file, os.F_OK) :
os.remove(file)
def testAggregatorScriptBuilding_partialFirstSource(self) :
provider = MetadataSourceAggregator(sources, map)
(script, sourceIds) = provider._AggregatorScriptFor(["Song::Artist"])
self.assertEquals(
"copy 1 File::Singer Song::Artist\n" +
"", script)
self.assertEquals(["source1"], sourceIds)
def testAggregatorScriptBuilding_partialSecondSource(self) :
provider = MetadataSourceAggregator(sources, map)
(script, sourceIds) = provider._AggregatorScriptFor(["Song::DynamicComplexity"])
self.assertEquals(
"copy 1 WaveFile::Complexity Song::DynamicComplexity\n" +
"", script)
self.assertEquals(["source2"], sourceIds)
def testAggregatorScriptBuilding_partialThirdSource(self) :
provider = MetadataSourceAggregator(sources, map)
(script, sourceIds) = provider._AggregatorScriptFor(["Frame::Energy"])
self.assertEquals(
"copy 1 Frame::SpectralEnergy Frame::Energy\n" +
"", script)
self.assertEquals(["source3"], sourceIds)
def testAggregatorScriptBuilding_severalSources(self) :
provider = MetadataSourceAggregator(sources, map)
(script, sourceIds) = provider._AggregatorScriptFor(
[
"Song::Artist",
"Song::Title",
"Song::DynamicComplexity",
])
self.assertEquals(
"copy 1 File::Singer Song::Artist\n" +
"copy 1 File::Name Song::Title\n" +
"copy 2 WaveFile::Complexity Song::DynamicComplexity\n" +
"", script)
self.assertEquals(["source1","source2"], sourceIds)
def testQuerySchema_noDescriptor(self) :
provider = MetadataSourceAggregator(sources, map)
schema = provider.QuerySchema([])
self.assertEquals(
"\n"+
"\n"+
" \n"+
"\n" +
"", self.dumpXml(schema))
def testQuerySchema_singleSource(self) :
provider = MetadataSourceAggregator(sources, map)
schema = provider.QuerySchema(["Song::Artist"])
self.assertEquals(
"\n"+
"\n"+
" \n"+
" \n"+
" \n"+
"\n" +
"", self.dumpXml(schema))
def testQuerySchema_otherSource(self) :
provider = MetadataSourceAggregator(sources, map)
schema = provider.QuerySchema(
[
"Song::DynamicComplexity",
])
self.assertEquals(
"\n"+
"\n"+
" \n"+
" \n"+
" \n"+
" 0\n"+
" 10\n"+
" \n"+
" \n"+
" \n"+
"\n" +
"", self.dumpXml(schema))
def testQuerySchema_severalSources(self) :
provider = MetadataSourceAggregator(sources, map)
schema = provider.QuerySchema(
[
"Song::Artist",
"Song::Title",
"Song::DynamicComplexity"
])
self.assertEquals(
"\n"+
"\n"+
" \n"+
" \n"+
" \n"+
" \n"+
" \n"+
" 0\n"+
" 10\n"+
" \n"+
" \n"+
" \n"+
"\n" +
"", self.dumpXml(schema))
def testQueryDescriptors_noDescriptor(self) :
provider = MetadataSourceAggregator(sources, map)
descriptors = provider.QueryDescriptors('id1', [])
self.assertEquals(
"\n"+
"\n" +
"", self.dumpXml(descriptors))
def testQueryDescriptors_singleDescriptor(self) :
provider = MetadataSourceAggregator(sources, map)
descriptors = provider.QueryDescriptors('id1', ["Song::Artist"])
self.assertEquals(
"\n"+
"\n" +
" \n"+
" Artist 1\n"+
" \n"+
"\n" +
"", self.dumpXml(descriptors))
def testQueryDescriptors_multipleDescriptors(self) :
provider = MetadataSourceAggregator(sources, map)
descriptors = provider.QueryDescriptors('id1',
[
"Song::Artist",
"Song::Title",
"Song::DynamicComplexity",
])
self.assertEquals(
"\n"+
"\n" +
" \n"+
" Artist 1\n"+
" Title 1\n"+
" 8.1\n"+
" \n"+
"\n" +
"", self.dumpXml(descriptors))
def testDisgregatorScriptsBuilding_severalSources(self) :
provider = MetadataSourceAggregator(sources, map)
script = provider._DisgregatorScripts(
[
"Song::Artist",
"Song::Title",
"Song::DynamicComplexity",
])
self.assertEquals( {
"source1":
"copy 1 Song::Artist File::Singer\n" +
"copy 1 Song::Title File::Name\n",
"source2":
"copy 1 Song::DynamicComplexity WaveFile::Complexity\n",
"source3":
""
} , script)
def testUpdateDescriptors_noDescriptor(self) :
provider = MetadataSourceAggregator(sources, map)
descriptors = provider.QueryDescriptors('id1', [])
provider.UpdateDescriptors('newId', descriptors)
descriptors = provider.QueryDescriptors('newId', [])
self.assertEquals(
"\n"+
"\n" +
"", self.dumpXml(descriptors))
def testUpdateDescriptors_singleDescriptor(self) :
attributeIds = [ "Song::Artist" ]
provider = MetadataSourceAggregator(sources, map)
poolToCopy = provider.QueryDescriptors('id1', attributeIds)
provider.UpdateDescriptors('newId', poolToCopy)
descriptors = provider.QueryDescriptors('newId', attributeIds)
self.assertEquals(
"\n"+
"\n" +
" \n"+
" Artist 1\n"+
" \n"+
"\n" +
"", self.dumpXml(descriptors))
def testUpdateDescriptors_multipleSources(self) :
attributeIds = [
"Song::Artist",
"Song::Title",
"Song::DynamicComplexity",
]
provider = MetadataSourceAggregator(sources, map)
poolToCopy = provider.QueryDescriptors('id1', attributeIds)
provider.UpdateDescriptors('newId', poolToCopy)
descriptors = provider.QueryDescriptors('newId', attributeIds)
self.assertEquals(
"\n"+
"\n" +
" \n"+
" Artist 1\n"+
" Title 1\n"+
" 8.1\n"+
" \n"+
"\n" +
"", self.dumpXml(descriptors))
def testUpdateDescriptors_mergesExistingData(self) :
provider = MetadataSourceAggregator(sources, map)
# Init newId just with some attributes of id1
attributeIds = [
"Song::Artist",
"Song::Title",
]
poolToCopy = provider.QueryDescriptors('id1', attributeIds)
provider.UpdateDescriptors('newId', poolToCopy)
# Merge them with some others from id2
attributeIds = [
"Song::Artist",
]
poolToCopy = provider.QueryDescriptors('id2', attributeIds)
provider.UpdateDescriptors('newId', poolToCopy)
attributeIds = [
"Song::Artist",
"Song::Title",
]
descriptors = provider.QueryDescriptors('newId', attributeIds)
self.assertEquals(
"\n"+
"\n" +
" \n"+
" Artist 2\n"+
" Title 1\n"+
" \n"+
"\n" +
"", self.dumpXml(descriptors))
def testUpdateDescriptors_partialPool(self) :
provider = MetadataSourceAggregator(sources, map)
# Init newId just with some attributes of id1
attributeIds = [
"Song::Artist",
"Song::Title",
]
poolToCopy = provider.QueryDescriptors('id1', attributeIds)
provider.UpdateDescriptors('newId', poolToCopy)
# Merge them with some others from id2
poolToCopy = provider.QueryDescriptors('id2', attributeIds)
attributeIds = [
"Song::Artist",
]
provider.UpdateDescriptors('newId', poolToCopy, attributeIds)
attributeIds = [
"Song::Artist",
"Song::Title",
]
descriptors = provider.QueryDescriptors('newId', attributeIds)
self.assertEquals(
"\n"+
"\n" +
" \n"+
" Artist 2\n"+
" Title 1\n"+
" \n"+
"\n" +
"", self.dumpXml(descriptors))
def testAvailableDescriptors(self) :
provider = MetadataSourceAggregator(sources, map)
attributeIds = provider.AvailableDescriptors()
expectedAttributeIds = [
"Song::Artist",
"Song::Title",
"Song::Genre",
"Song::DynamicComplexity",
"Frame::Energy",
]
self.assertEquals( expectedAttributeIds, attributeIds)
if __name__ == "__main__":
unittest.main()