def test_when_user_selects_different_type(self): view = MockView(combos={'name_combo': [], 'type_combo': []}) prefs.prefs[bauble.conn_default_pref] = 'nugkui' prefs.prefs[bauble.conn_list_pref] = { 'nugkui': { 'type': 'SQLite', 'default': True, 'pictures': 'nugkui', 'file': 'nugkui.db' }, 'quisquis': { 'type': 'PostgreSQL', 'passwd': False, 'pictures': '', 'db': 'quisquis', 'host': 'localhost', 'user': '******' } } presenter = ConnMgrPresenter(view) # T_0 self.assertEquals(presenter.connection_name, 'nugkui') self.assertTrue(presenter.view.widget_get_visible('sqlite_parambox')) # action view.widget_set_value('name_combo', 'quisquis') presenter.dbtype = 'PostgreSQL' # who to trigger this in tests? presenter.on_name_combo_changed('name_combo') # result self.assertEquals(presenter.connection_name, 'quisquis') presenter.refresh_view() # in reality this is triggered by gtk view self.assertEquals(presenter.dbtype, 'PostgreSQL') ## if the above succeeds, the following is riggered by the view! #presenter.on_combo_changed('type_combo', 'PostgreSQL') # T_1 self.assertTrue(presenter.view.widget_get_visible('dbms_parambox'))
def test_partial_taxonomic_with_synonymy(self): "exporting one genus which is not an accepted name." f = self.session.query( Family).filter( Family.family == u'Orchidaceae').one() bu = Genus(family=f, genus=u'Bulbophyllum') # accepted zy = Genus(family=f, genus=u'Zygoglossum') # synonym bu.synonyms.append(zy) self.session.add_all([f, bu, zy]) self.session.commit() selection = self.session.query(Genus).filter( Genus.genus == u'Zygoglossum').all() exporter = JSONExporter(MockView()) exporter.view.selection = selection exporter.selection_based_on == 'sbo_selection' exporter.include_private = True exporter.filename = self.temp_path exporter.run() result = json.load(open(self.temp_path)) self.assertEquals(len(result), 1) self.assertEquals(result[0]['rank'], 'genus') self.assertEquals(result[0]['epithet'], 'Zygoglossum') self.assertEquals(result[0]['ht-rank'], 'familia') self.assertEquals(result[0]['ht-epithet'], 'Orchidaceae') accepted = result[0].get('accepted') self.assertTrue(isinstance(accepted, dict)) self.assertEquals(accepted['rank'], 'genus') self.assertEquals(accepted['epithet'], 'Bulbophyllum') self.assertEquals(accepted['ht-rank'], 'familia') self.assertEquals(accepted['ht-epithet'], 'Orchidaceae')
def test_check_parameters_valid(self): import copy view = MockView(combos={'name_combo': [], 'type_combo': []}) prefs.prefs[bauble.conn_default_pref] = 'quisquis' prefs.prefs[bauble.conn_list_pref] = { 'quisquis': {'type': 'PostgreSQL', 'passwd': False, 'pictures': '/tmp/', 'db': 'quisquis', 'host': 'localhost', 'user': '******'}} presenter = ConnMgrPresenter(view) params = presenter.connections['quisquis'] valid, message = presenter.check_parameters_valid(params) self.assertTrue(valid) params = copy.copy(presenter.connections['quisquis']) params['user'] = '' valid, message = presenter.check_parameters_valid(params) self.assertFalse(valid) params = copy.copy(presenter.connections['quisquis']) params['host'] = '' valid, message = presenter.check_parameters_valid(params) self.assertFalse(valid) sqlite_params = {'type': 'SQLite', 'default': False, 'file': '/tmp/test.db', 'pictures': '/tmp/'} params = copy.copy(sqlite_params) valid, message = presenter.check_parameters_valid(params) self.assertTrue(valid) params = copy.copy(sqlite_params) params['file'] = '/usr/bin/sh' valid, message = presenter.check_parameters_valid(params) self.assertFalse(valid)
def test_pictureroot2_chosen(self): view = MockView(combos={'name_combo': [], 'type_combo': []}) view.reply_file_chooser_dialog.append('chosen') presenter = ConnMgrPresenter(view) presenter.on_pictureroot2_btnbrowse_clicked() presenter.on_text_entry_changed('pictureroot2_entry') self.assertEquals(presenter.pictureroot, 'chosen')
def test_no_connections_then_message(self): view = MockView(combos={'name_combo': [], 'type_combo': []}) prefs.prefs[bauble.conn_list_pref] = {} presenter = ConnMgrPresenter(view) self.assertFalse(presenter.view.widget_get_visible('expander')) self.assertTrue(presenter.view.widget_get_visible('noconnectionlabel'))
def test_on_dialog_response_ok_creates_picture_folders_no_exist(self): # make sure thumbnails and pictures folder do not exist. import tempfile path = tempfile.mktemp() # create view and presenter. view = MockView(combos={'name_combo': [], 'type_combo': []}) prefs.prefs[bauble.conn_list_pref] = { 'nugkui': { 'default': False, 'pictures': path, 'type': 'SQLite', 'file': path + '.db' } } ( prefs.prefs[prefs.picture_root_pref], prefs.prefs[bauble.conn_default_pref], ) = os.path.split(path) view.reply_file_chooser_dialog = [] presenter = ConnMgrPresenter(view) dialog = MockDialog() view.invoked = [] # invoke action presenter.on_dialog_response(dialog, RESPONSE_OK) # check existence of pictures folder self.assertTrue(os.path.isdir(path)) # check existence of thumbnails folder self.assertTrue(os.path.isdir(os.path.join(path, 'thumbs')))
def test_pictureroot2_not_chosen(self): view = MockView(combos={'name_combo': [], 'type_combo': []}) view.reply_file_chooser_dialog = [] presenter = ConnMgrPresenter(view) presenter.pictureroot = 'previously' presenter.on_pictureroot2_btnbrowse_clicked() self.assertEquals(presenter.pictureroot, 'previously')
def test_on_dialog_response_cancel_params_changed(self): view = MockView(combos={'name_combo': [], 'type_combo': []}) prefs.prefs[bauble.conn_list_pref] = { 'nugkui': { 'default': False, 'pictures': '/tmp/nugkui', 'type': 'SQLite', 'file': '/tmp/nugkui.db' } } prefs.prefs[bauble.conn_default_pref] = 'nugkui' view.reply_file_chooser_dialog = [] presenter = ConnMgrPresenter(view) ## change something view.widget_set_value('usedefaults_chkbx', True) presenter.on_usedefaults_chkbx_toggled('usedefaults_chkbx') ## press escape dialog = MockDialog() view.reply_yes_no_dialog = [True] view.invoked = [] presenter.on_dialog_response(dialog, RESPONSE_CANCEL) ## question was asked whether to save self.assertFalse('run_message_dialog' in view.invoked) self.assertTrue('run_yes_no_dialog' in view.invoked) self.assertTrue(dialog.hidden)
def test_on_dialog_response_ok_creates_picture_folders_half_exist(self): # make sure pictures and thumbs folders respectively do and do not # already exist as folders. import tempfile path = tempfile.mktemp() os.mkdir(path) view = MockView(combos={'name_combo': [], 'type_combo': []}) prefs.prefs[bauble.conn_list_pref] = { 'nugkui': { 'default': False, 'pictures': path, 'type': 'SQLite', 'file': path + '.db' } } ( prefs.prefs[prefs.picture_root_pref], prefs.prefs[bauble.conn_default_pref], ) = os.path.split(path) view.reply_file_chooser_dialog = [] presenter = ConnMgrPresenter(view) dialog = MockDialog() view.invoked = [] # invoke action presenter.on_dialog_response(dialog, RESPONSE_OK) # superfluous action is not performed, view is closed # check existence of pictures folder self.assertTrue(os.path.isdir(path)) # check existence of thumbnails folder self.assertTrue(os.path.isdir(os.path.join(path, 'thumbs')))
def test_export_with_vernacular(self): "exporting one genus which is not an accepted name." ## precondition sola = Family(family='Solanaceae') brug = Genus(family=sola, genus=u'Brugmansia') arbo = Species(genus=brug, sp=u'arborea') vern = VernacularName(species=arbo, language=u"es", name=u"Floripondio") self.session.add_all([sola, brug, arbo, vern]) self.session.commit() ## action exporter = JSONExporter(MockView()) exporter.view.selection = None exporter.selection_based_on = 'sbo_taxa' exporter.include_private = False exporter.filename = self.temp_path exporter.run() ## check result = json.load(open(self.temp_path)) vern_from_json = [i for i in result if i['object'] == 'vernacular_name'] self.assertEquals(len(vern_from_json), 1) self.assertEquals(vern_from_json[0]['language'], 'es')
def test_connection_uri_property(self): view = MockView(combos={'name_combo': [], 'type_combo': []}) prefs.prefs[bauble.conn_default_pref] = 'quisquis' prefs.prefs[bauble.conn_list_pref] = { 'quisquis': { 'type': 'PostgreSQL', 'passwd': False, 'pictures': '/tmp/', 'db': 'quisquis', 'host': 'localhost', 'user': '******' } } presenter = ConnMgrPresenter(view) self.assertEquals(presenter.connection_name, 'quisquis') self.assertEquals(presenter.dbtype, 'PostgreSQL') ## we need trigger all signals that would go by gtk p = presenter.connections[presenter.connection_name] presenter.view.widget_set_value('database_entry', p['db']) presenter.on_text_entry_changed('database_entry') presenter.view.widget_set_value('user_entry', p['user']) presenter.on_text_entry_changed('user_entry') presenter.view.widget_set_value('host_entry', p['host']) presenter.on_text_entry_changed('host_entry') self.assertEquals(presenter.connection_uri, 'postgresql://pg@localhost/quisquis')
def test_parameters_to_uri_sqlite(self): view = MockView(combos={'name_combo': [], 'type_combo': []}) prefs.prefs[bauble.conn_default_pref] = None prefs.prefs[bauble.conn_list_pref] = {} presenter = ConnMgrPresenter(view) params = {'type': 'SQLite', 'default': False, 'file': '/tmp/test.db', 'pictures': '/tmp/'} self.assertEquals(presenter.parameters_to_uri(params), 'sqlite:////tmp/test.db') params = {'type': 'PostgreSQL', 'passwd': False, 'pictures': '/tmp/', 'db': 'quisquis', 'host': 'localhost', 'user': '******'} self.assertEquals(presenter.parameters_to_uri(params), 'postgresql://pg@localhost/quisquis') params = {'type': 'PostgreSQL', 'passwd': True, 'pictures': '/tmp/', 'db': 'quisquis', 'host': 'localhost', 'user': '******'} view.reply_entry_dialog.append('secret') self.assertEquals(presenter.parameters_to_uri(params), 'postgresql://*****:*****@localhost/quisquis') params = {'type': 'PostgreSQL', 'passwd': False, 'pictures': '/tmp/', 'port': '9876', 'db': 'quisquis', 'host': 'localhost', 'user': '******'} self.assertEquals(presenter.parameters_to_uri(params), 'postgresql://pg@localhost:9876/quisquis') params = {'type': 'PostgreSQL', 'passwd': True, 'pictures': '/tmp/', 'port': '9876', 'db': 'quisquis', 'host': 'localhost', 'user': '******'} view.reply_entry_dialog.append('secret') self.assertEquals(presenter.parameters_to_uri(params), 'postgresql://*****:*****@localhost:9876/quisquis') params = {'type': 'PostgreSQL', 'passwd': False, 'pictures': '/tmp/', 'options': ['is_this_possible=no', 'why_do_we_test=because'], 'db': 'quisquis', 'host': 'localhost', 'user': '******'} self.assertEquals(presenter.parameters_to_uri(params), 'postgresql://pg@localhost/quisquis?' 'is_this_possible=no&why_do_we_test=because')
def test_on_btnbrowse_clicked(self): view = MockView() exporter = JSONExporter(view) view.reply_file_chooser_dialog = ['/tmp/test.json'] exporter.on_btnbrowse_clicked('button') exporter.on_text_entry_changed('filename') self.assertEquals(exporter.filename, '/tmp/test.json') self.assertEquals(JSONExporter.last_folder, '/tmp')
def test_on_dialog_response_cancel(self): view = MockView(combos={'name_combo': [], 'type_combo': []}) view.reply_file_chooser_dialog = [] presenter = ConnMgrPresenter(view) dialog = MockDialog() view.reply_yes_no_dialog = [False] presenter.on_dialog_response(dialog, RESPONSE_CANCEL) self.assertFalse('run_message_dialog' in view.invoked) self.assertTrue(dialog.hidden)
def test_prev_page(self): view = MockView() m = StoredQueriesModel() presenter = StoredQueriesPresenter(m, view) self.assertEquals(m.page, 1) presenter.on_prev_button_clicked(None) self.assertEquals(m.page, 10) presenter.on_prev_button_clicked(None) self.assertEquals(m.page, 9)
def test_export_private_if_sbo_plants(self): exporter = JSONExporter(MockView()) exporter.view.selection = None exporter.selection_based_on = 'sbo_plants' exporter.include_private = True exporter.filename = self.temp_path exporter.run() result = json.load(open(self.temp_path)) self.assertEquals(len(result), 8)
def test_on_dialog_response_ok_invalid_params(self): view = MockView(combos={'name_combo': [], 'type_combo': []}) prefs.prefs[bauble.conn_list_pref] = {} view.reply_file_chooser_dialog = [] presenter = ConnMgrPresenter(view) dialog = MockDialog() presenter.on_dialog_response(dialog, RESPONSE_OK) self.assertTrue('run_message_dialog' in view.invoked) self.assertTrue(dialog.hidden)
def test_when_selection_huge_ask(self): view = MockView() exporter = JSONExporter(view) exporter.selection_based_on == 'sbo_selection' view.selection = range(5000) view.reply_yes_no_dialog = [False] exporter.run() self.assertTrue('run_yes_no_dialog' in view.invoked) self.assertEquals(view.reply_yes_no_dialog, [])
def test_on_dialog_close_or_delete(self): view = MockView(combos={'name_combo': [], 'type_combo': []}) view.reply_file_chooser_dialog = [] presenter = ConnMgrPresenter(view) # T_0 self.assertFalse(view.get_window().hidden) # action presenter.on_dialog_close_or_delete("widget") # T_1 self.assertTrue(view.get_window().hidden)
def test_no_connection_on_add_confirm_negative(self): view = MockView(combos={'name_combo': [], 'type_combo': []}) prefs.prefs[bauble.conn_list_pref] = {} presenter = ConnMgrPresenter(view) presenter.view.reply_entry_dialog.append('') presenter.on_add_button_clicked('button') ## nothing changes self.assertFalse(presenter.view.widget_get_visible('expander')) self.assertFalse(presenter.view.widget_get_sensitive('connect_button')) self.assertTrue(presenter.view.widget_get_visible('noconnectionlabel'))
def test_no_connection_on_add_confirm_positive(self): view = MockView(combos={'name_combo': [], 'type_combo': []}) prefs.prefs[bauble.conn_list_pref] = {} presenter = ConnMgrPresenter(view) presenter.view.reply_entry_dialog.append('conn_name') presenter.on_add_button_clicked('button') presenter.refresh_view() # this is done by gtk ## visibility swapped self.assertTrue(presenter.view.widget_get_visible('expander')) self.assertTrue(presenter.view.widget_get_sensitive('connect_button')) self.assertFalse( presenter.view.widget_get_visible('noconnectionlabel'))
def test_select_page(self): view = MockView() m = StoredQueriesModel() presenter = StoredQueriesPresenter(m, view) self.assertEquals(m.page, 1) bname = 'stqr_05_button' presenter.on_button_clicked(bname) self.assertEquals(m.page, 5) self.assertTrue(('widget_set_active', (bname, True)) in presenter.view.invoked_detailed) self.assertTrue(('widget_set_active', ('stqr_01_button', False)) in presenter.view.invoked_detailed)
def test_export_ignores_private_if_sbo_selection(self): exporter = JSONExporter(MockView()) selection = [o for o in self.objects if isinstance(o, Accession)] non_private = [a for a in selection if a.private is False] self.assertEquals(len(selection), 3) self.assertEquals(len(non_private), 2) exporter.view.selection = selection exporter.selection_based_on == 'sbo_selection' exporter.include_private = False exporter.filename = self.temp_path exporter.run() result = json.load(open(self.temp_path)) self.assertEquals(len(result), 3)
def test_set_default_toggles_sensitivity(self): view = MockView(combos={'name_combo': [], 'type_combo': []}) prefs.prefs[bauble.conn_default_pref] = 'nugkui' prefs.prefs[bauble.conn_list_pref] = { 'nugkui': {'type': 'SQLite', 'default': True, 'pictures': 'nugkui', 'file': 'nugkui.db'}, } presenter = ConnMgrPresenter(view) view.widget_set_value('usedefaults_chkbx', True) presenter.on_usedefaults_chkbx_toggled('usedefaults_chkbx') self.assertFalse(view.widget_get_sensitive('file_entry'))
def test_one_connection_shown_and_selected_sqlite(self): view = MockView(combos={'name_combo': [], 'type_combo': []}) prefs.prefs[bauble.conn_list_pref] = { 'nugkui': {'default': True, 'pictures': 'nugkui', 'type': 'SQLite', 'file': 'nugkui.db'}} prefs.prefs[bauble.conn_default_pref] = 'nugkui' presenter = ConnMgrPresenter(view) self.assertEquals(presenter.connection_name, 'nugkui') self.assertTrue(presenter.view.widget_get_visible( 'expander')) self.assertFalse(presenter.view.widget_get_visible( 'noconnectionlabel'))
def test_change_page(self): view = MockView() m = StoredQueriesModel() presenter = StoredQueriesPresenter(m, view) m.page = 2 presenter.refresh_view() for i in range(1, 11): bname = 'stqr_%02d_button' % i self.assertTrue(('widget_set_active', (bname, i == m.page)) in presenter.view.invoked_detailed) lname = 'stqr_%02d_label' % i self.assertTrue(('widget_set_attributes', (lname, presenter.weight[i == m.page] )) in presenter.view.invoked_detailed)
def test_writes_full_taxonomic_info(self): "exporting one family: export full taxonomic information below family" selection = self.session.query(Family).filter( Family.family == u'Orchidaceae').all() exporter = JSONExporter(MockView()) exporter.selection_based_on == 'sbo_selection' exporter.include_private = False exporter.view.selection = selection exporter.filename = self.temp_path exporter.run() result = json.load(open(self.temp_path)) self.assertEquals(len(result), 1) self.assertEquals(result[0]['rank'], 'familia') self.assertEquals(result[0]['epithet'], 'Orchidaceae')
def test_one_connection_on_remove_confirm_negative(self): view = MockView(combos={'name_combo': [], 'type_combo': []}) prefs.prefs[bauble.conn_list_pref] = { 'nugkui': {'default': True, 'pictures': 'nugkui', 'type': 'SQLite', 'file': 'nugkui.db'}} presenter = ConnMgrPresenter(view) presenter.view.reply_yes_no_dialog.append(False) presenter.on_remove_button_clicked('button') ## nothing changes self.assertTrue(presenter.view.widget_get_visible( 'expander')) self.assertFalse(presenter.view.widget_get_visible( 'noconnectionlabel'))
def test_writes_complete_database(self): "exporting without specifying what: export complete database" exporter = JSONExporter(MockView()) exporter.view.selection = None exporter.selection_based_on == 'sbo_selection' exporter.include_private = False exporter.filename = self.temp_path exporter.run() ## must still check content of generated file! result = json.load(open(self.temp_path)) self.assertEquals(len(result), 11) families = [i for i in result if i['object'] == 'taxon' and i['rank'] == 'familia'] self.assertEquals(len(families), 2) genera = [i for i in result if i['object'] == 'taxon' and i['rank'] == 'genus'] self.assertEquals(len(genera), 2) species = [i for i in result if i['object'] == 'taxon' and i['rank'] == 'species'] self.assertEquals(len(species), 1) target = [ {"epithet": "Orchidaceae", "object": "taxon", "rank": "familia"}, {"epithet": "Myrtaceae", "object": "taxon", "rank": "familia"}, {"author": "R. Br.", "epithet": "Calopogon", "ht-epithet": "Orchidaceae", "ht-rank": "familia", "object": "taxon", "rank": "genus"}, {"author": "", "epithet": "Panisea", "ht-epithet": "Orchidaceae", "ht-rank": "familia", "object": "taxon", "rank": "genus"}, {"epithet": "tuberosus", "ht-epithet": "Calopogon", "ht-rank": "genus", "hybrid": False, "object": "taxon", "rank": "species"}, {"code": "2015.0001", "object": "accession", "private": False, "species": "Calopogon tuberosus"}, {"code": "2015.0002", "object": "accession", "private": False, "species": "Calopogon tuberosus"}, {"code": "2015.0003", "object": "accession", "private": True, "species": "Calopogon tuberosus"}, {"code": "1", "object": "location"}, {"accession": "2015.0001", "code": "1", "location": "1", "memorial": False, "object": "plant", "quantity": 1}, {"accession": "2015.0003", "code": "1", "location": "1", "memorial": False, "object": "plant", "quantity": 1}] for o1 in result: self.assertTrue(o1 in target) for o2 in target: self.assertTrue(o1 in result)
def start_institution_editor(): glade_path = os.path.join(paths.lib_dir(), "plugins", "garden", "institution.glade") from bauble import prefs from bauble.editor import GenericEditorView, MockView if prefs.testing: view = MockView() else: view = GenericEditorView(glade_path, parent=None, root_widget_name='inst_dialog') view._tooltips = { 'inst_name': _('The full name of the institution.'), 'inst_abbr': _('The standard abbreviation of the ' 'institution.'), 'inst_code': _('The intitution code should be unique among ' 'all institions.'), 'inst_contact': _('The name of the person to contact for ' 'information related to the institution.'), 'inst_tech': _('The email address or phone number of the ' 'person to contact for technical ' 'information related to the institution.'), 'inst_email': _('The email address of the institution.'), 'inst_tel': _('The telephone number of the institution.'), 'inst_fax': _('The fax number of the institution.'), 'inst_addr': _('The mailing address of the institition.') } o = Institution() inst_pres = InstitutionPresenter(o, view) response = inst_pres.start() if response == gtk.RESPONSE_OK: o.write() inst_pres.commit_changes() else: inst_pres.session.rollback() inst_pres.session.close()