Package elisa :: Package plugins :: Package good :: Package xmlmenu :: Package tests :: Module test_uri_node_builder
[hide private]
[frames] | no frames]

Source Code for Module elisa.plugins.good.xmlmenu.tests.test_uri_node_builder

  1   
  2  from twisted.internet import defer, reactor 
  3   
  4  from elisa.core.media_uri import MediaUri 
  5  from elisa.core import common 
  6  from elisa.extern.coherence.et import parse_xml 
  7   
  8  from node_builder_test import NodeBuilderTest, StupidModel 
  9  from elisa.core.tests.elisa_test_case import ElisaTestCase 
 10   
 11  from elisa.core.tests.elisa_test_case import BoilerPlateApp, DEFAULT_CONFIG 
 12   
 13  from elisa.core.observers.list import ListObservable 
 14   
 15   
16 -class StupidObserver(object):
17 18 stopped = False 19
20 - def stop(self):
21 self.stopped = True
22
23 -class StupidModelList(ListObservable):
24 activity = None
25
26 -class StupidMediaManager(object):
27 28 uri_to_media_type = {} 29 direct_children_for_uri = {} 30
31 - def get_media_type(self, uri):
32 uri = unicode(uri) 33 media_type = self.uri_to_media_type.get(uri, {'file_type':'nothing'}) 34 return defer.succeed(media_type)
35
36 - def get_direct_children(self, uri, lst):
37 uri = unicode(uri) 38 children = self.direct_children_for_uri.get(uri, []) 39 for i in children: 40 lst.append(i) 41 return defer.succeed(lst)
42 43 44
45 -class UriNodeBuilderTest(NodeBuilderTest, ElisaTestCase):
46 component_path = 'xmlmenu:uri_node_builder' 47 entry_identifiers = ['uri_node'] 48
49 - def test_build_entry(self):
50 51 data = """ 52 <MenuEntry type='uri_node'> 53 <URI>elisa://localhost/artists</URI> 54 </MenuEntry> 55 """ 56 xml = parse_xml(data) 57 root = xml.getroot() 58 59 def done_callback(data, test_model): 60 # There should be exaclty ONE item 61 self.assertEquals(len(test_model.children), 1)
62 63 test_model = StupidModel() 64 test_model.children = [] 65 menu_config = { 66 'DefaultDirsIcon' : 'dir_icon', 67 'DefaultFilesIcon' : 'file_icon', 68 'MediaFilter' : 'ANY', 69 'ContentType' : 'sections' } 70 self.xmlmenu._model_configs[test_model] = menu_config 71 72 dfr = self.component.build_menu_entry(test_model, root) 73 dfr.addCallback(done_callback, test_model)
74
75 - def test_missing_uri_entry(self):
76 77 data = """ 78 <MenuEntry type='uri_node'> 79 </MenuEntry> 80 """ 81 xml = parse_xml(data) 82 root = xml.getroot() 83 84 def done_callback(data, test_model): 85 # There should be exaclty ONE item 86 self.assertEquals(len(test_model.children), 0)
87 88 test_model = StupidModel() 89 test_model.children = [] 90 menu_config = { 91 'DefaultDirsIcon' : 'dir_icon', 92 'DefaultFilesIcon' : 'file_icon', 93 'MediaFilter' : 'ANY', 94 'ContentType' : 'sections' } 95 self.xmlmenu._model_configs[test_model] = menu_config 96 97 dfr = self.component.build_menu_entry(test_model, root) 98 dfr.addCallback(done_callback, test_model) 99
100 - def test_menu_creation(self):
101 uri = MediaUri('elisa://localhost/test') 102 uri.label = 'test' 103 menu = self.component.create_menu_for_uri(uri, {}) 104 self.failIf(menu is None) 105 self.assertEquals(menu.text, uri.label) 106 self.assertEquals(menu.activity, self.component) 107 self.failUnless(self.component.model_configs.has_key(menu))
108
109 - def test_clean_up(self):
110 a = StupidObserver() 111 self.component._observers['a'] = a 112 self.component.clean() 113 self.assertEquals(a.stopped, True)
114
115 - def test_loadmore(self):
116 m = StupidMediaManager() 117 m.direct_children_for_uri = {'file:///a' : [(MediaUri('e:/a'), {}), 118 (MediaUri('e:/b'), {'default_image':'c'}), 119 (MediaUri('e:/c'), {}), 120 (MediaUri('e:/d'), {})]} 121 m.media_type_for_uri = {'e:/a' : {'file_type' : 'audio'}, 122 'e:/b' : {'file_type' : 'video'}, 123 'e:/c' : {'file_type' : 'image'}, 124 'e:/d' : {'file_type' : 'directory'} 125 } 126 common.application.media_manager = m 127 model = StupidModel() 128 model.uri = MediaUri('file:///a') 129 self.component.files_index_start = 0 130 model.activity = self.component 131 menu_config = { 132 'DefaultDirsIcon' : 'dir_icon', 133 'DefaultFilesIcon' : 'file_icon', 134 'MediaFilter' : 'ANY', 135 'ContentType' : 'sections' } 136 self.xmlmenu._model_configs[model] = menu_config 137 model.children = StupidModelList() 138 dfr = self.component.loadmore(model) 139 dfr = defer.Deferred() 140 # this is just a kind of guess-trick 141 def do_callback(model): 142 self.failIf(len(model.children) == 0) 143 self.component.unload(model.children) 144 self.assertEquals(len(model.children), 0) 145 dfr.callback(True)
146 147 reactor.callLater(3, do_callback, model) 148 return dfr 149 150 # Update that path after moving the plugin 151 from elisa.plugins.good.xmlmenu.xmlmenu_components.uri_node_builder import MetadataObserver, UriObserver 152
153 -class ThumbnailModel(object):
154 thumbnail_source = None
155
156 -class MetadataObserverTest(ElisaTestCase):
157
158 - def test_thumbnail_source(self):
159 model = ThumbnailModel 160 ob = MetadataObserver(model) 161 ob.modified('default_image', 'test') 162 self.assertEquals(model.thumbnail_source, 'test')
163
164 -class UriObserverTest(ElisaTestCase):
165
166 - def setUp(self):
167 ElisaTestCase.setUp(self) 168 common.set_application(BoilerPlateApp(DEFAULT_CONFIG, 169 load_all_plugins=True)) 170 common.application.media_manager = StupidMediaManager() 171 172 self.observer = None 173 self.activity = self 174 self.player_model = None 175 self.slideshow_model = None 176 self.files_index_start = 0
177
178 - def create_menu_for_uri(self, uri, config):
179 registry = common.application.plugin_registry 180 # This might returns a deferred! 181 menu_model = registry.create_component('base:menu_node_model') 182 menu_model.uri = uri 183 menu_model.text = uri 184 menu_model.activity = self 185 return menu_model
186
187 - def test_insert_remove(self):
188 m = common.application.media_manager 189 m.uri_to_media_type = { 190 'file:///testdir' : {'file_type' : 'directory'}, 191 'file:///music1.mp3' : {'file_type' : 'audio'}, 192 'file:///music2.mp3' : {'file_type' : 'audio'}, 193 'file:///music3.mp3' : {'file_type' : 'audio'}, 194 'file:///music4.mp3' : {'file_type' : 'audio'}, 195 'file:///music5.mp3' : {'file_type' : 'audio'}, 196 'file:///video1.mp3' : {'file_type' : 'video'}, 197 'file:///video2.mp3' : {'file_type' : 'video'}, 198 'file:///video3.mp3' : {'file_type' : 'video'}, 199 'file:///video4.mp3' : {'file_type' : 'video'}, 200 'file:///video5.mp3' : {'file_type' : 'video'}, 201 'file:///image1.mp3' : {'file_type' : 'image'}, 202 'file:///image2.mp3' : {'file_type' : 'image'}, 203 'file:///image3.mp3' : {'file_type' : 'image'}, 204 'file:///image4.mp3' : {'file_type' : 'image'}, 205 'file:///image5.mp3' : {'file_type' : 'image'}, 206 } 207 208 first_element_dfr = defer.Deferred() 209 model = StupidModel() 210 model.activity = self 211 model.children = [] 212 default_config = { 213 'DefaultDirsIcon' : 'dir_icon', 214 'DefaultFilesIcon' : 'file_icon', 215 'MediaFilter' : 'ANY', 216 'ContentType' : 'sections' } 217 self.observer = UriObserver(model, default_config, first_element_dfr) 218 219 for key in m.uri_to_media_type.keys(): 220 self.observer.inserted([(key, {})], -1) 221 222 dfr = defer.Deferred() 223 # this is just a kind of guess-trick 224 def do_callback(): 225 self.failIf(len(model.children) == 0) 226 self.observer.removed(model.children, 0) 227 self.assertEquals(len(model.children), 0) 228 dfr.callback(True)
229 230 reactor.callLater(3, do_callback) 231 return dfr
232
233 - def tearDown(self):
234 if self.observer: 235 self.observer.stop()
236