228 lines
7.4 KiB
Python
228 lines
7.4 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
from genericpath import exists
|
|
import imp
|
|
import os
|
|
from tempfile import TemporaryDirectory
|
|
import unittest
|
|
from os.path import join, expanduser
|
|
import sqlite3
|
|
|
|
buku = imp.load_source('buku', '../buku')
|
|
|
|
TEST_TEMP_DIR_OBJ = TemporaryDirectory(prefix='bukutest_')
|
|
TEST_TEMP_DIR_PATH = TEST_TEMP_DIR_OBJ.name
|
|
TEST_TEMP_DBDIR_PATH = join(TEST_TEMP_DIR_PATH, 'buku')
|
|
TEST_TEMP_DBFILE_PATH = join(TEST_TEMP_DBDIR_PATH, 'bookmarks.db')
|
|
|
|
from buku import BukuDb, parse_tags
|
|
|
|
|
|
class TestBukuDb(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
os.environ['XDG_DATA_HOME'] = TEST_TEMP_DIR_PATH
|
|
|
|
# start every test from a clean state
|
|
if exists(TEST_TEMP_DBFILE_PATH):
|
|
os.remove(TEST_TEMP_DBFILE_PATH)
|
|
|
|
self.bookmarks = [ ['http://slashdot.org',
|
|
'SLASHDOT',
|
|
parse_tags(['old,news']),
|
|
"News for old nerds, stuff that doesn't matter",
|
|
],
|
|
|
|
['http://www.zażółćgęśląjaźń.pl/',
|
|
'ZAŻÓŁĆ',
|
|
parse_tags(['zażółć,gęślą,jaźń']),
|
|
"Testing UTF-8, zażółć gęślą jaźń.",
|
|
],
|
|
|
|
['https://test.com:8080',
|
|
'test',
|
|
parse_tags(['test,tes,est,es']),
|
|
"a case for replace_tag test",
|
|
],
|
|
]
|
|
|
|
def tearDown(self):
|
|
os.environ['XDG_DATA_HOME'] = TEST_TEMP_DIR_PATH
|
|
|
|
# @unittest.skip('skipping')
|
|
def test_get_dbdir_path(self):
|
|
dbdir_expected = TEST_TEMP_DBDIR_PATH
|
|
dbdir_local_expected = join(expanduser('~'), '.local', 'share', 'buku')
|
|
dbdir_relative_expected = join('.', 'buku')
|
|
|
|
# desktop linux
|
|
self.assertEqual(dbdir_expected, BukuDb.get_dbdir_path())
|
|
|
|
# desktop generic
|
|
os.environ.pop('XDG_DATA_HOME')
|
|
self.assertEqual(dbdir_local_expected, BukuDb.get_dbdir_path())
|
|
|
|
# no desktop
|
|
|
|
# -- home is defined differently on various platforms.
|
|
# -- keep a copy and set it back once done
|
|
originals = {}
|
|
for env_var in ['HOME', 'HOMEPATH', 'HOMEDIR']:
|
|
try:
|
|
originals[env_var] = os.environ.pop(env_var)
|
|
except KeyError:
|
|
pass
|
|
self.assertEqual(dbdir_relative_expected, BukuDb.get_dbdir_path())
|
|
for key, value in originals.items():
|
|
os.environ[key] = value
|
|
|
|
# # not sure how to test this in nondestructive manner
|
|
# def test_move_legacy_dbfile(self):
|
|
# self.fail()
|
|
|
|
# @unittest.skip('skipping')
|
|
def test_initdb(self):
|
|
if exists(TEST_TEMP_DBFILE_PATH):
|
|
os.remove(TEST_TEMP_DBFILE_PATH)
|
|
self.assertIs(False, exists(TEST_TEMP_DBFILE_PATH))
|
|
conn, curr = BukuDb.initdb()
|
|
self.assertIsInstance(conn, sqlite3.Connection)
|
|
self.assertIsInstance(curr, sqlite3.Cursor)
|
|
self.assertIs(True, exists(TEST_TEMP_DBFILE_PATH))
|
|
curr.close()
|
|
conn.close()
|
|
|
|
|
|
# @unittest.skip('skipping')
|
|
def test_add_and_retrieve_bookmark(self):
|
|
bdb = BukuDb()
|
|
|
|
for idx, bookmark in enumerate(self.bookmarks):
|
|
# adding bookmark from self.bookmarks to database
|
|
bdb.add_bookmark(*bookmark)
|
|
# checking indexes
|
|
index = bdb.get_bookmark_index(bookmark[0])
|
|
self.assertEqual(idx + 1, index)
|
|
# retrieving bookmark from database
|
|
from_db = bdb.get_bookmark_by_index(index)
|
|
self.assertIsNotNone(from_db)
|
|
# comparing data
|
|
for pair in zip(from_db[1:], bookmark):
|
|
self.assertEqual(*pair)
|
|
|
|
# TODO: tags should be passed to the api as a sequence...
|
|
|
|
# @unittest.skip('skipping')
|
|
def test_update_bookmark(self):
|
|
bdb = BukuDb()
|
|
old_values = self.bookmarks[0]
|
|
new_values = self.bookmarks[1]
|
|
|
|
# adding bookmark and getting index
|
|
bdb.add_bookmark(*old_values)
|
|
index = bdb.get_bookmark_index(old_values[0])
|
|
# updating with new values
|
|
bdb.update_bookmark(index, *new_values)
|
|
# retrieving bookmark from database
|
|
from_db = bdb.get_bookmark_by_index(index)
|
|
self.assertIsNotNone(from_db)
|
|
# checking if values are updated
|
|
for pair in zip(from_db[1:], new_values):
|
|
self.assertEqual(*pair)
|
|
|
|
# @unittest.skip('skipping')
|
|
def test_refreshdb(self):
|
|
bdb = BukuDb()
|
|
|
|
bdb.add_bookmark("https://www.google.com/ncr", "?")
|
|
bdb.refreshdb(1)
|
|
from_db = bdb.get_bookmark_by_index(1)
|
|
self.assertEqual(from_db[2], "Google")
|
|
|
|
# def test_searchdb(self):
|
|
# self.fail()
|
|
|
|
# def test_search_by_tag(self):
|
|
# self.fail()
|
|
|
|
# def test_compactdb(self):
|
|
# self.fail()
|
|
|
|
# @unittest.skip('skipping')
|
|
def test_delete_bookmark(self):
|
|
bdb = BukuDb()
|
|
# adding bookmark and getting index
|
|
bdb.add_bookmark(*self.bookmarks[0])
|
|
index = bdb.get_bookmark_index(self.bookmarks[0][0])
|
|
# deleting bookmark
|
|
bdb.delete_bookmark(index)
|
|
# asserting it doesn't exist
|
|
from_db = bdb.get_bookmark_by_index(index)
|
|
self.assertIsNone(from_db)
|
|
|
|
# TODO: test deleting all bookmarks (index == 0)
|
|
|
|
# def test_print_bookmark(self):
|
|
# self.fail()
|
|
|
|
# def test_list_tags(self):
|
|
# self.fail()
|
|
|
|
# @unittest.skip('skipping')
|
|
def test_replace_tag(self):
|
|
bdb = BukuDb()
|
|
indices = []
|
|
for bookmark in self.bookmarks:
|
|
# adding bookmark, getting index
|
|
bdb.add_bookmark(*bookmark)
|
|
index = bdb.get_bookmark_index(bookmark[0])
|
|
indices += [index]
|
|
# replacing tags
|
|
bdb.replace_tag("news", ["__01"])
|
|
bdb.replace_tag("zażółć", ["__02,__03"])
|
|
# replacing tag which is also a substring of other tag
|
|
bdb.replace_tag("es", ["__04"])
|
|
# removing tags
|
|
bdb.replace_tag("gęślą")
|
|
bdb.replace_tag("old")
|
|
# removing nonexistent tag
|
|
bdb.replace_tag("_")
|
|
# removing nonexistent tag which is also a substring of other tag
|
|
bdb.replace_tag("e")
|
|
|
|
for url, title, _, _ in self.bookmarks:
|
|
# retrieving from db
|
|
index = bdb.get_bookmark_index(url)
|
|
from_db = bdb.get_bookmark_by_index(index)
|
|
# asserting tags were replaced
|
|
if title == "SLASHDOT":
|
|
self.assertEqual(from_db[3], parse_tags(["__01"]))
|
|
elif title == "ZAŻÓŁĆ":
|
|
self.assertEqual(from_db[3], parse_tags(["__02,__03,jaźń"]))
|
|
elif title == "test":
|
|
self.assertEqual(from_db[3], parse_tags(["test,tes,est,__04"]))
|
|
|
|
# def test_browse_by_index(self):
|
|
# self.fail()
|
|
|
|
# @unittest.skip('skipping')
|
|
def test_close_quit(self):
|
|
bdb=BukuDb()
|
|
# quitting with no args
|
|
try:
|
|
bdb.close_quit()
|
|
except SystemExit as err:
|
|
self.assertEqual(err.args[0], 0)
|
|
# quitting with custom arg
|
|
try:
|
|
bdb.close_quit(1)
|
|
except SystemExit as err:
|
|
self.assertEqual(err.args[0], 1)
|
|
|
|
# def test_import_bookmark(self):
|
|
# self.fail()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|