def testResultsInSection(self): # Results with "only search in section" enabled notebook = self.setUpNotebook(content=tests.FULL_NOTEBOOK) page = notebook.get_page(Path('TaskList')) navigation = tests.MockObject() navigation.open_page = lambda page: tests.MockObject() dialog = SearchDialog(None, notebook, page, navigation) dialog.namespacecheckbox.set_active(True) dialog.query_entry.set_text('*fix*') dialog.query_entry.activate() model = dialog.results_treeview.get_model() self.assertTrue(len(model) > 1) col = dialog.results_treeview.get_column(0) dialog.results_treeview.row_activated(Gtk.TreePath((0,)), col)
def testOpenFolderCreate(self): from zim.gui.applications import open_folder_prompt_create from zim.fs import adapt_from_newfs widget = tests.MockObject() folder = self.setUpFolder(mock=tests.MOCK_ALWAYS_REAL) myfolder = folder.folder('test') entry = ApplicationManager().get_fallback_filebrowser() def answer_yes(dialog): dialog.answer_yes() def answer_no(dialog): dialog.answer_no() with tests.DialogContext(answer_no): open_folder_prompt_create(widget, myfolder) self.assertFalse(myfolder.exists()) self.assertEqual(self.calls, []) with tests.DialogContext(answer_yes): open_folder_prompt_create(widget, myfolder) self.assertTrue(myfolder.exists()) self.assertEqual(self.calls[-1], (widget, entry, adapt_from_newfs(myfolder), None))
def testTaskListTreeView(self): klass = PluginManager.get_plugin_class('tasklist') plugin = klass() notebook = tests.new_notebook() plugin.extend(notebook) notebook.index.check_and_update() from zim.plugins.tasklist.gui import TaskListTreeView view = TasksView.new_from_index(notebook.index) opener = tests.MockObject() treeview = TaskListTreeView(view, opener, task_labels=['TODO', 'FIXME']) menu = treeview.get_popup() # Check these do not cause errors - how to verify state ? tests.gtk_activate_menu_item(menu, _("Expand _All")) tests.gtk_activate_menu_item(menu, _("_Collapse All")) # Copy tasklist -> csv from zim.gui.clipboard import Clipboard tests.gtk_activate_menu_item(menu, 'gtk-copy') text = Clipboard.get_text() lines = text.splitlines() self.assertTrue(len(lines) > 10) self.assertTrue(len(lines[0].split(',')) > 3) self.assertFalse(any('<span' in l for l in lines)) # make sure encoding is removed # Test tags tags = treeview.get_tags() for tag in ('home', 'FIXME', '__no_tags__', 'tags'): self.assertIn(tag, tags) self.assertGreater(tags[tag], 0)
def testOpenFile(self): from zim.gui.applications import open_file, NoApplicationFoundError from zim.fs import adapt_from_newfs widget = tests.MockObject() with self.assertRaises(FileNotFoundError): open_file(widget, File('/non-existing')) folder = self.setUpFolder(mock=tests.MOCK_ALWAYS_REAL) myfile = folder.file('test.txt') myfile.touch() manager = ApplicationManager() entry = manager.create('text/plain', 'test', 'test') manager.set_default_application('text/plain', entry) open_file(widget, myfile) self.assertEqual(self.calls[-1], (widget, entry, adapt_from_newfs(myfile), None)) open_file(widget, myfile, mimetype='text/plain') self.assertEqual(self.calls[-1], (widget, entry, adapt_from_newfs(myfile), None)) with self.assertRaises(NoApplicationFoundError): open_file(widget, myfile, mimetype='x-mimetype/x-with-no-application')
def testSearchDialog(self): '''Test SearchDialog''' from zim.gui.searchdialog import SearchDialog self.ui.notebook = tests.new_notebook() mainwindow = tests.MockObject() mainwindow.pageview = tests.MockObject() mainwindow.ui = self.ui # XXX dialog = SearchDialog(mainwindow) dialog.query_entry.set_text('Foo') dialog.query_entry.activate() model = dialog.results_treeview.get_model() self.assertTrue(len(model) > 3) col = dialog.results_treeview.get_column(0) dialog.results_treeview.row_activated((0, ), col)
def setUp(self): self.ui = tests.MockObject() self.ui.page = Path('Test') self.notebook = tests.new_notebook() self.ui.notebook = self.notebook self.model = PageTreeStore(self.notebook.index) self.treeview = PageTreeView(self.ui, self.model)
def testTaskListTreeView(self): klass = PluginManager.get_plugin_class('tasklist') plugin = klass() notebook = tests.new_notebook() plugin.extend(notebook.index) index_ext = plugin.get_extension(IndexExtension) self.assertIsNotNone(index_ext) notebook.index.flush() notebook.index.update() from zim.plugins.tasklist import TaskListTreeView opener = tests.MockObject() treeview = TaskListTreeView(index_ext, opener) menu = treeview.get_popup() # Check these do not cause errors - how to verify state ? tests.gtk_activate_menu_item(menu, _("Expand _All")) tests.gtk_activate_menu_item(menu, _("_Collapse All")) # Copy tasklist -> csv from zim.gui.clipboard import Clipboard tests.gtk_activate_menu_item(menu, 'gtk-copy') text = Clipboard.get_text() lines = text.splitlines() self.assertTrue(len(lines) > 10) self.assertTrue(len(lines[0].split(',')) > 3) self.assertFalse(any('<span' in l for l in lines)) # make sure encoding is removed
def testContextMenu(self): notebook = self.setUpNotebook() navigation = tests.MockObject() pathbar = MyPathBar(None, notebook, navigation) button = pathbar.get_children()[2] menu = pathbar.get_button_popup(button) self.assertIsInstance(menu, Gtk.Menu)
def runTest(self): def basename(name): if ":" in name: return name.split(":")[-1] else: return name db = sqlite3.connect(':memory:') db.row_factory = sqlite3.Row pi = PagesIndexer(db, None, tests.MockObject()) for i, name, cont in self.PAGES: db.execute( 'INSERT INTO pages(id, name, lowerbasename, sortkey, parent, source_file) VALUES (?, ?, ?, ?, 1, 1)', (i, name, basename(name).lower(), natural_sort_key(name))) ## Test PagesViewInternal methods iview = PagesViewInternal(db) i, pn = iview.resolve_pagename(Path(''), ['foo']) self.assertEqual((i, pn), (3, Path('Foo'))) i, pn = iview.resolve_link(Path('Foo'), HRef.new_from_wiki_link('Bar')) self.assertEqual((i, pn), (2, Path('Bar'))) ## Test the actual indexer pageindexer = tests.MaskedObject(pi, 'connect') indexer = LinksIndexer(db, pageindexer) for i, name, cont in self.PAGES: row = { 'id': i, 'name': name, 'sortkey': natural_sort_key(name), 'is_link_placeholder': False } indexer.on_page_row_inserted(pageindexer, row) ### pageindexer.setObjectAccess('insert_link_placeholder') for i, name, text in self.PAGES: tree = WikiParser().parse(text) row = {'id': i, 'name': name} indexer.on_page_changed(pageindexer, row, tree) indexer.update() links = sorted((r['source'], r['target']) for r in db.execute('SELECT * FROM links')) self.assertEqual(links, [(3, 2), (3, 4)]) ### pageindexer.setObjectAccess('remove_page') for i, name, cont in self.PAGES: row = {'id': i, 'name': name, 'is_link_placeholder': False} indexer.on_page_row_deleted(pageindexer, row) indexer.update() rows = db.execute('SELECT * FROM links').fetchall() self.assertEqual(rows, [])
def testPersistent(self): # Make sure also not initialized values are kept text = '[Foo]\nb=test\na=test\n\n' file = tests.MockObject() file.readlines = lambda: text.splitlines(1) conf = INIConfigFile(file) self.assertEqual(list(conf['Foo'].all_items()), [('b', 'test'), ('a', 'test')]) self.assertEqual(conf.dump(), text.splitlines(1))
def runTest(self): window = tests.MockObject() window.pageview = setUpPageView() window.ui = tests.MockObject() window.ui.uimanager = tests.MockObject() window.ui.uistate = ConfigDict() window.ui.mainwindow = window # XXX plugin = SourceViewPlugin() extension = MainWindowExtension(plugin, window) with tests.DialogContext(self.checkInsertCodeBlockDialog): extension.insert_sourceview() tree = window.pageview.get_parsetree() #~ print tree.tostring() obj = tree.find('object') self.assertTrue(obj.attrib['type'] == 'code')
def setUp(self): self.ui = tests.MockObject() self.ui.page = Path('Test') self.notebook = tests.new_notebook() self.ui.notebook = self.notebook self.model = PageTreeStore(self.notebook.index) self.treeview = PageTreeView(self.ui, self.model) treepath = self.treeview.set_current_page(Path('Test')) self.treeview.select_treepath(treepath)
def testNewPageDialog(self): '''Test NewPageDialog''' mainwindow = tests.MockObject() mainwindow.pageview = tests.MockObject() mainwindow.ui = self.ui mainwindow.ui.uistate = { } # XXX needed to let Dialog what real ui object is ... for name, path in ( (':new', ':new'), #('foo:new', ':Test:foo:new'), ('new', ':Test:foo:new'), ('+new', ':Test:foo:bar:new'), ): dialog = zim.gui.NewPageDialog(mainwindow) dialog.form.widgets['page'].set_text(name) dialog.assert_response_ok() self.assertEqual(self.ui.mock_calls[-1], ('save_page', )) self.assertEqual(self.ui.mock_calls[-2], ('open_page', Path(path))) page = self.ui.notebook.get_page(Path(path)) self.assertTrue(page.exists()) page.modified = False # HACK so we can clean up self.ui.notebook.delete_page(page) for name, path in ( (':new', ':Test:foo:bar:new'), ('foo:new', ':Test:foo:bar:foo:new'), ('new', ':Test:foo:bar:new'), ('+new', ':Test:foo:bar:new'), ): dialog = zim.gui.NewPageDialog(mainwindow, subpage=True) dialog.form.widgets['page'].set_text(name) dialog.assert_response_ok() self.assertEqual(self.ui.mock_calls[-1], ('save_page', )) self.assertEqual(self.ui.mock_calls[-2], ('open_page', Path(path))) page = self.ui.notebook.get_page(Path(path)) self.assertTrue(page.exists()) page.modified = False # HACK so we can clean up self.ui.notebook.delete_page(page) dialog = zim.gui.NewPageDialog(mainwindow) dialog.form.widgets['page'].set_text(':Test:foo') self.assertRaises(Error, dialog.assert_response_ok)
def testDeletePages(self): '''Check deleting a bookmark after deleting a page in the notebook.''' self.uistate['bookmarks'] = list(self.PATHS) navigation = tests.MockObject() bar = BookmarkBar(self.notebook, navigation, self.uistate, get_page_func = lambda: '') for i, path in enumerate(self.PATHS): self.assertTrue(path in bar.paths) self.notebook.delete_page(Path(path)) self.assertTrue(path not in bar.paths) self.assertEqual(len(bar.paths), self.LEN_PATHS - i - 1) self.assertEqual(bar.paths, [])
def setUp(self): self.notebook = self.setUpNotebook(content=tests.FULL_NOTEBOOK) navigation = tests.MockObject() self.model = PageTreeStore(self.notebook.index) init_model_validator_wrapper(self, self.model) self.treeview = PageTreeView(self.notebook, navigation, model=self.model) treepath = self.treeview.set_current_page(Path('Test')) assert treepath is not None self.treeview.select_treepath(treepath)
def testTreePathMethods(self): db = new_test_database() mockindex = tests.MockObject() mockindex._db = db mockindex.update_iter = tests.MockObject() mockindex.update_iter.pages = tests.MockObject() model = PagesTreeModelMixin(mockindex) # Test all pages for name, treepath in TREEPATHS: myiter = model.get_mytreeiter(treepath) self.assertEqual(myiter.row['name'], name) self.assertEqual(myiter.treepath, treepath) my_treepath = model.find(Path(name)) self.assertEqual(my_treepath, treepath) # Test non-existing p = model.get_mytreeiter((1, 2, 3, 4, 5)) self.assertIsNone(p) self.assertRaises(IndexNotFoundError, model.find, Path('non-existing-page'))
def runTest(self): ui = MockUI() ui.notebook = tests.new_notebook() uistate = ConfigDict() widget = TagsPluginWidget(ui.notebook.index, uistate, ui) # Excersize all model switches and check we still have a sane state widget.toggle_treeview() widget.toggle_treeview() path = Path('Test:tags') ui.notebook.pages.lookup_by_pagename(path) treepath = widget.treeview.get_model().find(path) widget.disconnect_model() widget.reconnect_model() path = Path('Test:tags') treepath = widget.treeview.get_model().find(path) # Check signals widget.treeview.emit('populate-popup', gtk.Menu()) widget.treeview.emit('insert-link', path) # Toggles in popup widget.toggle_show_full_page_name() widget.toggle_show_full_page_name() # Check tag filtering cloud = widget.tagcloud self.assertFalse(cloud.get_tag_filter()) tag = None for button in cloud.get_children(): if button.indextag.name == 'tags': tag = button.indextag button.clicked() break else: raise AssertionError('No button for @tags ?') selected = cloud.get_tag_filter() self.assertEqual(selected, [tag]) model = widget.treeview.get_model() self.assertIsInstance(model, TaggedPageTreeStore) self.assertEqual(model.tags, [tag.name]) # check menu and sorting of tag cloud cloud.emit('populate-popup', gtk.Menu()) mockaction = tests.MockObject() mockaction.get_active = lambda: True cloud._switch_sorting(mockaction) mockaction.get_active = lambda: False cloud._switch_sorting(mockaction)
def runTest(self): db = sqlite3.connect(':memory:') db.row_factory = sqlite3.Row indexer = TagsIndexer(db, tests.MockObject(), tests.MockObject()) for i, name, text in self.PAGES: tree = WikiParser().parse(text) row = {'id': i, 'name': name} indexer.on_page_changed(None, row, tree) indexer.on_finish_update(None) self.assertTags(db, [('tag1', 1), ('tag2', 2), ('tag3', 3)], [(1, 2), (2, 2), (2, 3), (3, 3)]) for i, name, content in self.PAGES: row = {'id': i, 'name': name} indexer.on_page_row_deleted(None, row) indexer.on_finish_update(None) self.assertTags(db, [], [])
def runTest(self): someobject = tests.MockObject() someobject.uri = "file:///foo" for (input, uris, text) in ( ((File("/foo"),), (File("/foo").uri,), File("/foo").path), ((File("~/foo"),), (File("~/foo").uri,), "~/foo"), (("file:///foo",), ("file:///foo",), "file:///foo"), ((someobject,), ("file:///foo",), "file:///foo"), (("file:///foo", "file:///bar"), ("file:///foo", "file:///bar"), "file:///foo file:///bar"), ): data = UriData(*input) self.assertEqual(data.get_data_as(URI_TARGET_ID), uris) self.assertEqual(data.get_data_as(TEXT_TARGET_ID), text)
def testTagsTreePathMethods(self): db = new_test_database() mockindex = tests.MockObject() mockindex._db = db mockindex.update_iter = tests.MockObject() mockindex.update_iter.pages = tests.MockObject() mockindex.update_iter.tags = tests.MockObject() model = TagsTreeModelMixin(mockindex, tags=('tag1', 'tag2')) tags = TagsView(db) # Test all pages for name, treepath in TREEPATHS_TAGS_12: myiter = model.get_mytreeiter(treepath) self.assertEqual(myiter.row['name'], name) self.assertEqual(myiter.treepath, Gtk.TreePath(treepath)) if len(treepath) == 1: tag = tags.lookup_by_tagname(name) my_treepaths = model.find_all(tag) else: my_treepaths = model.find_all(Path(name)) self.assertIn(Gtk.TreePath(treepath), my_treepaths) for treepath in my_treepaths: myiter = model.get_mytreeiter(treepath) self.assertEqual(myiter.row['name'], name) # Test no more data than above treepaths = list(self.walk_treepaths(model)) self.assertEqual(treepaths, list(TREEPATHS_TAGS_12)) # Test non-existing p = model.get_mytreeiter((1, 2, 3, 4, 5)) self.assertIsNone(p) self.assertRaises(IndexNotFoundError, model.find_all, Path('non-existing-page'))
def testAttachFileDialog(self): '''Test AttachFileDialog''' tmp_dir = self.create_tmp_dir('testAttachFileDialog') file = File((tmp_dir, 'file_to_be_attached')) file.write('Test 1 2 3\n') newfile = File( (tmp_dir, 'attachments', 'Test', 'foo', 'file_to_be_attached')) self.assertTrue(file.exists()) self.assertFalse(newfile.exists()) mainwindow = tests.MockObject() mainwindow.pageview = tests.MockObject() mainwindow.ui = self.ui dialog = zim.gui.AttachFileDialog(mainwindow, self.ui.notebook, path=Path('Test:foo')) dialog.set_file(file) tests.gtk_process_events() dialog.assert_response_ok() self.assertTrue(file.exists()) # No move or delete happened self.assertTrue(newfile.exists()) self.assertTrue(newfile.compare(file))
def testOpenFolder(self): from zim.gui.applications import open_folder from zim.fs import adapt_from_newfs widget = tests.MockObject() with self.assertRaises(FileNotFoundError): open_folder(widget, File('/non-existing')) folder = self.setUpFolder(mock=tests.MOCK_ALWAYS_REAL) myfolder = folder.folder('test') myfolder.touch() entry = ApplicationManager().get_fallback_filebrowser() open_folder(widget, myfolder) self.assertEqual(self.calls[-1], (widget, entry, adapt_from_newfs(myfolder), None))
def runTest(self): folder = self.setUpFolder() layout = FilesLayout(folder) db = sqlite3.connect(':memory:') db.row_factory = sqlite3.Row file_indexer = tests.MockObject() indexer = PagesIndexer(db, layout, file_indexer) id1 = indexer.insert_page(Path('Test'), None) with tests.LoggingFilter('zim.notebook.index', 'Error while inserting page'): id2 = indexer.insert_page(Path('Test'), None) self.assertEqual(id1, id2)
def runTest(self): opener = tests.MockObject() iconview = FileBrowserIconView(opener) dir = self.SRC_DIR.folder('data/pixmaps') iconview.set_folder(dir) # simulate idle events while not iconview._thumbnailer.queue_empty(): iconview._on_check_thumbnail_queue() # refresh while nothing changed iconview.refresh() while not iconview._thumbnailer.queue_empty(): iconview._on_check_thumbnail_queue() iconview.teardown_folder()
def testOpenUrl(self): from zim.gui.applications import open_url widget = tests.MockObject() with self.assertRaises(ValueError): open_url(widget, '/test/some/file.txt') for uri in ( 'file://test/some/file.txt', 'http://example.com', 'mailto:[email protected]', 'smb://host/share/file.txt', ): open_url(widget, uri) self.assertEqual(self.calls[-1][2], uri) open_url(widget, '\\\\host\\share\\file.txt') self.assertEqual(self.calls[-1][2], 'smb://host/share/file.txt')
def testLatexExport(self): from zim.formats.wiki import Parser as WikiParser from zim.formats.latex import Dumper as LatexDumper folder = self.setUpFolder() folder.file('equation001.tex').write('a + b') # equation002.tex does not exist - check fallback to image wiki = '{{./equation001.png?type=equation}}\n{{./equation002.png?type=equation}}\n' wanted = '\\begin{math}\na + b\n\\end{math}\n\n\\includegraphics[]{./equation002.png}\n\n' linker = tests.MockObject() linker.resolve_source_file = lambda name: folder.file(name) linker.img = lambda name: name tree = WikiParser().parse(wiki) latex = LatexDumper(linker).dump(tree) self.assertEqual(latex, wanted.splitlines(True))
def runTest(self): notebook = self.setUpNotebook() config = VirtualConfigManager() navigation = tests.MockObject() model = PageTreeStore(notebook.index) init_model_validator_wrapper(self, model) treeview = PageTreeView(notebook, config, navigation, model=model) signals = [] def signal_logger(o, *a): path = a[0].to_string() signal = a[-1] signals.append((signal, path)) #print(">>>", signal, path) for signal in ('row-inserted', 'row-changed', 'row-deleted', 'row-has-child-toggled'): model.connect(signal, signal_logger, signal) for path in map(Path, self.PAGES): page = notebook.get_page(path) page.parse('plain', 'Test 123\n') notebook.store_page(page) expect_add = [('row-inserted', '0'), ('row-changed', '0'), ('row-inserted', '0:0'), ('row-has-child-toggled', '0'), ('row-changed', '0'), ('row-changed', '0:0'), ('row-inserted', '0:1'), ('row-changed', '0'), ('row-changed', '0:1'), ('row-inserted', '1'), ('row-changed', '1'), ('row-inserted', '2'), ('row-changed', '2')] self.assertEqual(signals, expect_add) signals[:] = [] for path in reversed(self.PAGES): notebook.delete_page(Path(path)) expect_del = [('row-deleted', '2'), ('row-deleted', '1'), ('row-deleted', '0:1'), ('row-changed', '0'), ('row-deleted', '0:0'), ('row-has-child-toggled', '0'), ('row-changed', '0'), ('row-deleted', '0')] self.assertEqual(signals, expect_del)
def testTreeView(self): self.notebook.index.flush() # we want to index ourselves navigation = tests.MockObject() treestore = self.storeclass(self.notebook.index, self.tags) init_model_validator_wrapper(self, treestore) treeview = self.viewclass(self.notebook, navigation, treestore) # Process signals on by one self.assertEqual(self.notebook.pages.n_all_pages(), 0) # assert we start blank for p in self.notebook.index.update_iter(): tests.gtk_process_events() tests.gtk_process_events() # Try some TreeView methods path = Path('foobar') treepath = treeview.get_model().find(path) self.assertEqual(treeview.set_current_page(path), treepath) col = treeview.get_column(0) treeview.row_activated(treepath, col) #~ treeview.emit('popup-menu') treeview.emit('insert-link', path) treeview.emit('copy') # Check signals for page change page = self.notebook.get_page(Path('Foo')) page.parse('wiki', 'Fooo @tag1 @tag2\n') self.notebook.store_page(page) tests.gtk_process_events() page.parse('wiki', 'Fooo @foo @bar @tag2\n') self.notebook.store_page(page) tests.gtk_process_events() # Check if all the signals go OK in delete for page in reversed(list( self.notebook.pages.walk())): # delete bottom up self.notebook.delete_page(page) tests.gtk_process_events()
def testGeneral(self): '''Test general functions: add, delete bookmarks.''' navigation = tests.MockObject() bar = BookmarkBar(self.notebook, navigation, self.uistate, get_page_func = lambda: '') bar.max_bookmarks = 15 # set maximum number of bookmarks # Add paths to the beginning of the bar. for i, path in enumerate(self.PATHS): bar._add_new(path, add_bookmarks_to_beginning = True) self.assertEqual(len(bar.paths), i + 1) self.assertTrue(bar.paths == list(reversed(self.PATHS))) # Add paths to the end of the bar. bar.paths = [] for i, path in enumerate(self.PATHS): bar._add_new(path, add_bookmarks_to_beginning = False) self.assertEqual(len(bar.paths), i + 1) self.assertEqual(bar.paths, list(self.PATHS)) # Check that the same path can't be added to the bar. bar._add_new(self.PATHS[0]) bar._add_new(self.PATHS[1]) self.assertEqual(bar.paths, list(self.PATHS)) # Delete paths from the bar. for i, button in enumerate(bar.scrolledbox.get_scrolled_children()): path = button.zim_path self.assertTrue(path in bar.paths) bar.delete(button.zim_path) self.assertEqual(len(bar.paths), self.LEN_PATHS - i - 1) self.assertTrue(path not in bar.paths) self.assertEqual(bar.paths, []) # Delete all bookmarks from the bar. bar.delete_all() self.assertEqual(bar.paths, [])
def testActivatePage(self): navigation = tests.MockObject() pathbar = MyPathBar(None, None, navigation) button = pathbar.get_children()[2] button.clicked() self.assertEqual(navigation.mock_calls, [('open_page', Path('bbb'))])