class TestDBSqlite(unittest.TestCase):

    def _delete_dbfile(self):
        try:
            os.remove(self.config['NAME'])
        except OSError:
            pass

    def setUp(self):
        self.config = {'NAME': 'lai_test.db',
                       'TABLE': 'client'}

        self.db = DBSqlite(self.config)

    def tearDown(self):
        self._delete_dbfile()

    def test_connect_should_create_dbfile(self):
        DBSqlite(self.config)
        self.assertTrue(os.path.exists(self.config['NAME']))

    def test_table_should_not_exists(self):
        self.assertFalse(self.db._table_exists('imposible_que_exista.db'))

    def test_table_creation(self):
        self.db.config['TABLE'] = 'Probando' 
        self.assertTrue(self.db._initialize_database())

    def test_docs_count(self):
        self.assertEqual(self.db.docs_count(), 0)

    def test_insert_new_document(self):
        doc = Document(data='probando probando', keys='nada')
        self.db.save(doc)
        self.assertEqual(self.db.docs_count(), 1)

    def test_get_doc_by_id(self):
        new_doc = Document(sid=1, tid=2, data='sarlanga', users=['alfredo', 'maria'])
        self.db.save(new_doc)
        doc = self.db.get(1)
        self.assertEqual(doc.data, 'sarlanga')
        self.assertEqual(doc.sid, '1')
        self.assertEqual(doc.tid, '2')
        self.assertEqual(doc.users, [u'alfredo', u'maria'])

    def test_update(self):
        new_doc = Document(data='1 2 3')
        self.db.save(new_doc)
        edit_doc = self.db.get(1)
        edit_doc.data = '1 2 3 4'
        self.db.save(edit_doc)

        doc = self.db.get(1)
        self.assertEqual(doc.data, '1 2 3 4')

    def test_get_last_tid(self):
        self.assertEqual(self.db.get_last_tid(),0)
    
    def test_exist(self):
        self.db.save(Document('git log --graph --oneline --all #fancy git log'))
        self.assertTrue(self.db._exists('id', 1))
        self.assertFalse(self.db._exists('id', 0))
        self.assertFalse(self.db._exists('id', None))

    def test_exist_with_sid(self):
        self.db.save(Document('git log --graph --oneline --all #fancy git log', sid=33))
        self.assertTrue(self.db._exists('sid', 33))
        self.assertFalse(self.db._exists('sid', 0))
        self.assertFalse(self.db._exists('sid', None))

    def test_search(self):
        '''guardo algunos documentos luego los busco por
           diferentes criterios'''

        self.db.save(Document('ls -l --color'))
        self.db.save(Document('git log --graph --oneline --all #fancy git log'))
        self.db.save(Document('can(){ shift 2; sudo "$@"; } #sudo like a sir'))
        self.db.save(Document('git fetcho upstream/aster'))

        res = self.db.search('ls')
        self.assertEqual(len(res), 1)

        res = self.db.search('git')
        self.assertEqual(len(res), 2)

        res = self.db.search('o')
        self.assertEqual(len(res), 4)

        res = self.db.search('Z')
        self.assertEqual(len(res), 0)

        res = self.db.search(None)
        self.assertEqual(len(res), 0)

        res = self.db.search('')
        self.assertEqual(len(res), 0)

    def test_get_docs_for_commit(self):

        self.db.save(Document('ls -l --color'))
        self.db.save(Document('git log --graph --oneline --all #fancy git log'))
        self.db.save(Document('can(){ shift 2; sudo "$@"; } #sudo like a sir'))
        self.db.save(Document('git fetcho upstream/aster'), synched=True)

        docs = self.db.get_docs_for_commit()
        self.assertEqual(len(docs), 3)