| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374 | # ============================================================================# This file is part of Pwman3.## Pwman3 is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License, version 2# as published by the Free Software Foundation;## Pwman3 is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with Pwman3; if not, write to the Free Software# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA# ============================================================================# Copyright (C) 2013 Oz Nahum <nahumoz@gmail.com># ============================================================================from pwman.data import factory#from pwman.data.drivers.sqlite import DatabaseExceptionfrom pwman.util.config import get_pass_conffrom pwman.util.generator import leetlistfrom pwman.util.crypto_engine import CryptoEnginefrom pwman.ui import get_ui_platformfrom pwman.ui.tools import CMDLoop, CliMenuItem# from pwman import (parser_options, get_conf_options, get_conf, set_umask)from pwman.data.database import __DB_FORMAT__import sysimport unittestif sys.version_info.major > 2:    from io import StringIOelse:    from StringIO import StringIOimport osimport os.pathdummyfile = """[Encryption][Readline][Global]xsel = /usr/bin/xselcolors = yesumask = 0100cls_timeout = 5[Database]"""#def node_factory(username, password, url, notes, tags=None):#    node = NewNode()#    node.username = username#    node.password = password#    node.url = url#    node.notes = notes#    tags = [TagNew(tn) for tn in tags]#    node.tags = tags##    return node_saveconfig = FalsePwmanCliNew, OSX = get_ui_platform(sys.platform)from .test_tools import (SetupTester)  # DummyCallback2,                         #  DummyCallback3, DummyCallback4)testdb = os.path.join(os.path.dirname(__file__), "test.pwman.db")#class DBTests(unittest.TestCase):##    """test everything related to db"""##    def setUp(self):#        "test that the right db instance was created"#        dbver = __DB_FORMAT__#        self.dbtype = 'SQLite'#        self.db = factory.create(self.dbtype, dbver, testdb)#        self.tester = SetupTester(dbver, testdb)#        self.tester.create()##    def test_1_db_created(self):#        "test that the right db instance was created"#        self.assertIn(self.dbtype, self.db.__class__.__name__)##    def test_2_db_opened(self):#        "db was successfuly opened"#        # it will have a file name associated#        self.assertTrue(hasattr(self.db, '_filename'))##    def test_3_create_node(self):#        "test that a node can be successfuly created"#        # this method does not test do_new#        # which is a UI method, rather we test#        # _db.addnodes#        username = u'tester'#        password = u'Password'#        url = u'example.org'#        notes = u'some notes'#        node = NewNode()#        node.username = username#        node.password = password#        node.url = url#        node.notes = notes#        # node = NewNode(username, password, url, notes)#        tags = [TagNew(tn) for tn in ['testing1', 'testing2']]#        node.tags = tags#        self.db.open()#        self.db.addnodes([node])#        idx_created = node._id#        new_node = self.db.getnodes([idx_created])[0]##        for key, attr in {'password': password, 'username': username,#                          'url': url, 'notes': notes}.items():#            self.assertEqual(attr, getattr(new_node, key).decode())#        self.db.close()##    def test_4_tags(self):#        enc = CryptoEngine.get()#        got_tags = self.tester.cli._tags(enc)#        self.assertEqual(2, len(got_tags))##    def test_5_change_pass(self):#        enc = CryptoEngine.get()#        enc.callback = DummyCallback2()#        self.tester.cli._db.changepassword()##    @unittest.skip("This is broken as long as changepassword isn't working.")#    def test_6_db_change_pass(self):#        "fuck yeah, we change the password and the new dummy works"#        enc = CryptoEngine.get()#        enc.callback = DummyCallback3()#        self.tester.cli._db.changepassword()#        self.tester.cli.do_forget('')#        enc.callback = DummyCallback4()#        # TODO: this is broken!#        self.tester.cli.do_ls('')##    def test_7_db_list_tags(self):#        # tags are return as ecrypted strings#        tags = self.tester.cli._db.listtags()#        self.assertEqual(2, len(tags))#        self.tester.cli.do_filter('testing1')#        tags = self.tester.cli._db.listtags()#        self.assertEqual(2, len(tags))#        self.tester.cli.do_ls('')##    def test_8_db_remove_node(self):#        node = self.tester.cli._db.getnodes([1])#        self.tester.cli._db.removenodes(node)#        # create the removed node again#        node = NewNode()#        node.username = 'tester'#        node.password = 'Password'#        node.url = 'example.org'#        node.notes = 'some notes'#        tags = [TagNew(tn) for tn in ['testing1', 'testing2']]#        node.tags = tags#        self.db.open()#        self.db.addnodes([node])##    def test_9_sqlite_init(self):#        db = SQLiteDatabaseNewForm("test")#        self.assertEqual("test", db._filename)class CLITests(unittest.TestCase):    """    test command line functionallity    """    def setUp(self):        "test that the right db instance was created"        self.dbtype = 'SQLite'        self.db = factory.create(self.dbtype, __DB_FORMAT__, testdb)        self.tester = SetupTester(__DB_FORMAT__, testdb)        self.tester.create()    def test_input(self):        name = self.tester.cli.get_username(reader=lambda: u'alice')        self.assertEqual(name, u'alice')    def test_password(self):        password = self.tester.cli.get_password(None,                                                reader=lambda x: u'hatman')        self.assertEqual(password, u'hatman')    def test_random_password(self):        password = self.tester.cli.get_password(None, length=7)        self.assertEqual(len(password), 7)    def test_random_leet_password(self):        password = self.tester.cli.get_password(None, leetify=True, length=7)        l_num = 0        for v in leetlist.values():            if v in password:                l_num += 1        # sometime despite all efforts, randomness dictates that no        # leetifying happens ...        self.assertTrue(l_num >= 0)    def test_leet_password(self):        password = self.tester.cli.get_password(None, leetify=True,                                                reader=lambda x: u'HAtman')        # python3 compatability        if sys.version_info.major < 3:            self.assertRegexpMatches(password,                                     ("(H|h)?(A|a|4)?(T|t|\+)?(m|M|\|"                                      "\/\|)?(A|a|4)?(N|n|\|\\|)?"))        else:            self.assertRegex(password, ("(H|h)?(A|a|4)?(T|t|\+)?(m|M|\|"                                        "\/\|)?(A|a|4)?(N|n|\|\\|)?"))    def test_get_url(self):        url = self.tester.cli.get_url(reader=lambda: u'example.com')        self.assertEqual(url, u'example.com')    def test_get_notes(self):        notes = self.tester.cli.get_notes(reader=lambda:                                          u'test 123\n test 456')        self.assertEqual(notes, u'test 123\n test 456')    #def test_get_tags(self):    #    tags = self.tester.cli.get_tags(reader=lambda: u'looking glass')    #    for t in tags:    #        self.assertIsInstance(t, TagNew)    #    for t, n in zip(tags, u'looking glass'.split()):    #        self.assertEqual(t.name.strip().decode(), n)    # creating all the components of the node does    # the node is still not added !    #def test_add_new_entry(self):    #    # node = NewNode('alice', 'dough!', 'example.com',        #               'lorem impsum')    #    node = NewNode()    #    node.username = b'alice'    #    node.password = b'dough!'    #    node.url = b'example.com'    #    node.notes = b'somenotes'    #    node.tags = b'lorem ipsum'    #    tags = self.tester.cli.get_tags(reader=lambda: u'looking glass')    #    node.tags = tags    #    self.tester.cli._db.addnodes([node])    #    self.tester.cli._db._cur.execute(    #        "SELECT ID FROM NODES ORDER BY ID ASC", [])    #    rows = self.tester.cli._db._cur.fetchall()        # by now the db should have 2 new nodes        # the first one was added by test_create_node in DBTests        # the second was added just now.        # This will pass only when running all the tests then ...    #    self.assertEqual(len(rows), 2)    #    node = NewNode()    #    node.username = b'alice'    #    node.password = b'dough!'    #    node.url = b'example.com'    #    node.notes = b'somenotes'    #    node.tags = b'lorem ipsum'    #    tags = self.tester.cli.get_tags(reader=lambda: u'looking glass')    #    node.tags = tags    #    self.tester.cli._db.addnodes([node])    def test_get_ids(self):        # used by do_cp or do_open,        # this spits many time could not understand your input        self.assertEqual([1], self.tester.cli.get_ids('1'))        self.assertListEqual([1, 2, 3, 4, 5], self.tester.cli.get_ids('1-5'))        self.assertListEqual([], self.tester.cli.get_ids('5-1'))        self.assertListEqual([], self.tester.cli.get_ids('5x-1'))        self.assertListEqual([], self.tester.cli.get_ids('5x'))        self.assertListEqual([], self.tester.cli.get_ids('5\\'))    def test_edit(self):        node = self.tester.cli._db.getnodes([2])[0]        menu = CMDLoop()        menu.add(CliMenuItem("Username", self.tester.cli.get_username,                             node.username,                             node.username))        menu.add(CliMenuItem("Password", self.tester.cli.get_password,                             node.password,                             node.password))        menu.add(CliMenuItem("Url", self.tester.cli.get_url,                             node.url,                             node.url))        menunotes = CliMenuItem("Notes",                                self.tester.cli.get_notes(reader=lambda:                                                          u'bla bla'),                                node.notes,                                node.notes)        menu.add(menunotes)        menu.add(CliMenuItem("Tags", self.tester.cli.get_tags,                             node.tags,                             node.tags))        dummy_stdin = StringIO('4\n\nX')        class dummy_stdin(object):            def __init__(self):                self.idx = -1                self.ans = ['4', 'some fucking notes', 'X']            def __call__(self, msg):                self.idx += 1                return self.ans[self.idx]        dstin = dummy_stdin()        menu.run(node, reader=dstin)        self.tester.cli._db.editnode(2, node)    def test_get_pass_conf(self):        numerics, leet, s_chars = get_pass_conf(self.tester.cli.config)        self.assertFalse(numerics)        self.assertFalse(leet)        self.assertFalse(s_chars)    def test_do_tags(self):        self.tester.cli.do_filter('bank')    def test_do_forget(self):        self.tester.cli.do_forget('')    def test_do_auth(self):        crypto = CryptoEngine.get()        rv = crypto.authenticate('12345')        self.assertTrue(rv)        self.assertFalse(crypto.authenticate('WRONG'))    def test_do_clear(self):        self.tester.cli.do_clear('')    def test_do_exit(self):        self.assertTrue(self.tester.cli.do_exit(''))class FactoryTest(unittest.TestCase):    def test_factory_check_db_ver(self):        self.assertEqual(factory.check_db_version('SQLite', testdb), 0.5)    def test_factory_check_db_file(self):        factory.create('SQLite', version='0.3', filename='baz.db')        self.assertEqual(factory.check_db_version('SQLite', 'baz.db'), 0.3)        os.unlink('baz.db')    #def test_factory_create(self):    #    db = factory.create('SQLite', filename='foo.db')    #    db._open()    #    self.assertTrue(os.path.exists('foo.db'))    #    db.close()    #    os.unlink('foo.db')    #    self.assertIsInstance(db, SQLiteDatabaseNewForm)    #    self.assertRaises(DatabaseException, factory.create, 'UNKNOWN')if __name__ == '__main__':    # make sure we use local pwman    sys.path.insert(0, os.getcwd())    # check if old DB exists, if so remove it.    # excuted only once when invoked upon import or    # upon run    SetupTester().clean()    unittest.main(verbosity=1, failfast=True)
 |