From 6f2a10be9579de5d7c8cee7dab47eabfcfef0e85 Mon Sep 17 00:00:00 2001 From: Steven Maude Date: Fri, 12 Dec 2025 17:01:51 +0000 Subject: [PATCH 1/4] Switch to pytest --- .github/workflows/ci-build.yml | 2 +- pyproject.toml | 2 +- tests.py => test_scraperwiki.py | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename tests.py => test_scraperwiki.py (100%) diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index ddcd8ed..b44ef4e 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -27,4 +27,4 @@ jobs: pip install .[dev] - name: Run tests - run: nosetests --exe + run: pytest diff --git a/pyproject.toml b/pyproject.toml index 289bcf2..e2734e9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,7 +31,7 @@ dependencies = [ [project.optional-dependencies] dev = [ - "pynose", + "pytest", "lxml", ] diff --git a/tests.py b/test_scraperwiki.py similarity index 100% rename from tests.py rename to test_scraperwiki.py From c33e76e9faf23c297a16ba6591e8d23133366c12 Mon Sep 17 00:00:00 2001 From: Steven Maude Date: Fri, 12 Dec 2025 17:32:45 +0000 Subject: [PATCH 2/4] Move tests --- test_scraperwiki.py => tests/test_scraperwiki.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test_scraperwiki.py => tests/test_scraperwiki.py (100%) diff --git a/test_scraperwiki.py b/tests/test_scraperwiki.py similarity index 100% rename from test_scraperwiki.py rename to tests/test_scraperwiki.py From 0e4440d00e61a809a334bcd0fd0988ebb23bcae2 Mon Sep 17 00:00:00 2001 From: Steven Maude Date: Fri, 12 Dec 2025 17:32:59 +0000 Subject: [PATCH 3/4] Remove executable bit from `test_scraperwiki.py` --- tests/test_scraperwiki.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 tests/test_scraperwiki.py diff --git a/tests/test_scraperwiki.py b/tests/test_scraperwiki.py old mode 100755 new mode 100644 From cf854c3fe74a426dd09abe54694d08179dc370f8 Mon Sep 17 00:00:00 2001 From: Steven Maude Date: Fri, 12 Dec 2025 17:41:16 +0000 Subject: [PATCH 4/4] Ensure better clean up of database in tests --- tests/test_scraperwiki.py | 57 ++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 16 deletions(-) diff --git a/tests/test_scraperwiki.py b/tests/test_scraperwiki.py index 9951bcc..d4751a0 100644 --- a/tests/test_scraperwiki.py +++ b/tests/test_scraperwiki.py @@ -17,23 +17,48 @@ # scraperwiki.sql._State.echo = True DB_NAME = 'scraperwiki.sqlite' -class Setup(TestCase): - def test_setup(self): - try: - os.remove('scraperwiki.sqlite') - except OSError: - pass +class DBTestCase(TestCase): + """ + Ensures database cleanup. + """ + def setUp(self): + self.clean_db() + super().setUp() + + def clean_db(self): + if scraperwiki.sql._State._connection: + scraperwiki.sql._State._connection.close() + scraperwiki.sql._State._connection = None + + if scraperwiki.sql._State.engine: + scraperwiki.sql._State.engine.dispose() + scraperwiki.sql._State.engine = None + + if scraperwiki.sql._State._transaction: + scraperwiki.sql._State._transaction.rollback() + scraperwiki.sql._State._transaction = None + + scraperwiki.sql._State.metadata = None + scraperwiki.sql._State.table = None + scraperwiki.sql._State.table_pending = None + + if os.path.exists(DB_NAME): + try: + os.remove(DB_NAME) + except OSError: + pass + # called TestAAAWarning so that it gets run first by nosetests, # which we need, otherwise the warning has already happened. -class TestAAAWarning(TestCase): +class TestAAAWarning(DBTestCase): def test_save_no_warn(self): with warnings.catch_warnings(): warnings.simplefilter("error") scraperwiki.sql.save(['id'], dict(id=4, tumble='weed'), table_name="warning_test") -class TestSaveGetVar(TestCase): +class TestSaveGetVar(DBTestCase): def savegetvar(self, var): scraperwiki.sql.save_var(u"weird\u1234", var) self.assertEqual(scraperwiki.sql.get_var(u"weird\u1234"), var) @@ -73,11 +98,11 @@ def test_save_multiple_values(self): self.assertEqual(u'hello', scraperwiki.sql.get_var(u'foo\xc3')) self.assertEqual(u'goodbye\u1234', scraperwiki.sql.get_var(u'bar')) -class TestGetNonexistantVar(TestCase): +class TestGetNonexistantVar(DBTestCase): def test_get(self): self.assertIsNone(scraperwiki.sql.get_var(u'meatball\xff')) -class TestSaveVar(TestCase): +class TestSaveVar(DBTestCase): def setUp(self): super(TestSaveVar, self).setUp() scraperwiki.sql.save_var(u"birthday\xfe", u"\u1234November 30, 1888") @@ -95,7 +120,7 @@ def test_insert(self): observed = [(colname, value.decode('utf-8'), _type)] self.assertEqual(observed, expected) -class SaveAndCheck(TestCase): +class SaveAndCheck(DBTestCase): def save_and_check(self, dataIn, tableIn, dataOut, tableOut=None, twice=True): if tableOut == None: tableOut = '[' + tableIn + ']' @@ -122,7 +147,7 @@ def save_and_check(self, dataIn, tableIn, dataOut, tableOut=None, twice=True): self.assertListEqual(observed1, expected1) self.assertListEqual(observed2, expected2) -class SaveAndSelect(TestCase): +class SaveAndSelect(DBTestCase): def save_and_select(self, d): scraperwiki.sql.save([], {u"foo\xdd": d}) observed = scraperwiki.sql.select(u'* FROM swdata')[0][u'foo\xdd'] @@ -175,7 +200,7 @@ def test_two(self): uniquecol = indices[u"keys"].index(u'unique') self.assertEqual(index[uniquecol], 1) -class TestSaveColumn(TestCase): +class TestSaveColumn(DBTestCase): def test_add_column(self): # Indicative for # https://github.com/scraperwiki/scraperwiki-python/issues/64 @@ -275,7 +300,7 @@ def test_save_and_drop(self): scraperwiki.sql.execute(u"DROP TABLE dropper\xaa") scraperwiki.sql.save([], dict(foo=9), table_name=u"dropper\xaa") -class TestQuestionMark(TestCase): +class TestQuestionMark(DBTestCase): def test_one_question_mark_with_nonlist(self): scraperwiki.sql.execute(u'CREATE TABLE zhuozi\xaa (\xaa TEXT);') scraperwiki.sql.execute(u'INSERT INTO zhuozi\xaa VALUES (?)', u'apple\xff') @@ -299,7 +324,7 @@ def test_multiple_question_marks(self): scraperwiki.sql.execute('DROP TABLE zhuozi') -class TestDateTime(TestCase): +class TestDateTime(DBTestCase): def rawdate(self, table="swdata", column="datetime"): connection = sqlite3.connect(DB_NAME) cursor = connection.cursor() @@ -351,7 +376,7 @@ def test_status(self): self.assertEqual(scraperwiki.status('ok'), None) -class TestUnicodeColumns(TestCase): +class TestUnicodeColumns(DBTestCase): maxDiff = None def test_add_column_once_only(self): scraperwiki.sqlite.save(data = {"i": 1, u"a\xa0b": 1}, unique_keys = ['i'])