Prechádzať zdrojové kódy

fix importer and add coverage

oz123 10 rokov pred
rodič
commit
f52cdb8901
2 zmenil súbory, kde vykonal 73 pridanie a 9 odobranie
  1. 36 5
      pwman/exchange/importer.py
  2. 37 4
      pwman/tests/test_importer.py

+ 36 - 5
pwman/exchange/importer.py

@@ -20,6 +20,7 @@
 A module to hold the importer class
 '''
 import csv
+from pwman.data.nodes import Node
 
 
 class BaseImporter(object):
@@ -38,20 +39,50 @@ class CSVImporter(BaseImporter):
     """
     A reference implementation which imports a CSV to the pwman database
     """
-    def __init__(self, args, config):
+    def __init__(self, args, config, db):
         self.args = args
         self.config = config
+        self._db = db
+import ipdb; ipdb.set_trace()
 
     def _read_file(self):
-        return []
+        """read the csv file, remove empty lines and the header"""
+        with open(self.args.import_file) as fh:
+            csv_f = csv.reader(fh, delimiter=';')
+            lines = [line for line in csv_f]
+            lines = list(filter(None, lines))
+        return lines[1:]
 
     def _create_node(self, row):
-        pass
+        """create a node object with encrypted properties"""
+        n = {'clear_text': True,
+             'username': row[0], 'password': row[2], 'url': row[1], 'notes': row[3],
+             'tags': row[4].split(',')}
+        node = Node(**n)
+        return node
+
+    def _insert_node(self, node):
+        "insert the node object to the database"
+        self._db.add_node(node)
+
+    def _open_db(self):
+        """
+        open existing db or create a new db
+
+        This will expect a CRYPTO table!
+        Hence if not CRYPTO table one should create it...
+        """
+        self._db._open()
+        self._db._create_tables()
+        self._db._con.commit()
+        self._db.open()
 
     def runner(self):
-        for row in self._read_file():
-            self._create_node()
+        self._open_db()
 
+        for row in self._read_file():
+            node = self._create_node(row)
+            self._insert_node(node)
 
 class Importer(object):
 

+ 37 - 4
pwman/tests/test_importer.py

@@ -22,6 +22,7 @@ from pwman.util.crypto_engine import CryptoEngine
 from collections import namedtuple
 from .test_crypto_engine import give_key, DummyCallback
 from pwman.exchange.importer import CSVImporter
+from pwman.data.drivers.sqlite import SQLite
 
 import_example = """
 Username;URL;Password;Notes;Tags
@@ -37,18 +38,50 @@ class TestImporter(unittest.TestCase):
 
     def setUp(self):
         config = {}
+        db = SQLite('test-importer.db')
         Args = namedtuple('args', 'import_file')
-        self.importer = CSVImporter(Args(import_file='foo'), config)
+        self.importer = CSVImporter(Args(import_file='import_file.csv'),
+                                    config, db)
+
+    def test_read_file(self):
+        lines = self.importer._read_file()
+        self.assertNotIn(["Username", "URL", "Password", "Notes"," Tags"],
+                         lines)
+
+    def test_create_node(self):
+        # create a node , should be encrypted, but not yet inserted to db
+        n = "alice;wonderland.com;secert;scratch;foo,bar".split(";")
+        node = self.importer._create_node(n)
+        ce = CryptoEngine.get()
+        self.assertEqual(ce.decrypt(node._username).decode(), u'alice')
+        self.assertEqual(['foo', 'bar'], [t.decode() for t in node.tags])
+
+    def test_insert_node(self):
+        n = "alice;wonderland.com;secert;scratch;foo,bar".split(";")
+        node = self.importer._create_node(n)
+        self.importer._open_db()
+        # do the actual insert of the node to the databse
+        self.importer._insert_node(node)
+
+    def test_runner(self):
+        # test the whole procees:
+        """
+          open csv
+          open db
+          for line in csv:
+              create node
+              insert node
+
+          close db
+        """
+        pass
 
-    def test_fail(self):
-        self.assertTrue(True)
 
 if __name__ == '__main__':
 
     ce = CryptoEngine.get()
     ce.callback = DummyCallback()
     ce.changepassword(reader=give_key)
-
     try:
         unittest.main(verbosity=2, failfast=True)
     except SystemExit: