From dc723ddf5d4fcfaa169c1f878f7ab46b66027486 Mon Sep 17 00:00:00 2001 From: Bruce Schubert Date: Wed, 19 Aug 2020 09:46:22 -0700 Subject: [PATCH] Moved blacklist unit tests to pytest based test_blacklist.py - Re: #67 --- src/screening/blacklist.py | 184 ++++++++++--------------------------- tests/test_blacklist.py | 116 +++++++++++++++++++++++ 2 files changed, 166 insertions(+), 134 deletions(-) create mode 100644 tests/test_blacklist.py diff --git a/src/screening/blacklist.py b/src/screening/blacklist.py index c6cbf58..a776b28 100644 --- a/src/screening/blacklist.py +++ b/src/screening/blacklist.py @@ -36,6 +36,40 @@ class Blacklist(object): + def __init__(self, db, config): + """Ensures database access to the Blacklist table""" + self.db = db + self.config = config + + if self.config["DEBUG"]: + print("Initializing Blacklist") + + sql = ''' + CREATE TABLE IF NOT EXISTS Blacklist ( + PhoneNo TEXT PRIMARY KEY, + Name TEXT, + Reason TEXT, + SystemDateTime TEXT); + ''' + curs = self.db.cursor() + curs.executescript(sql) + curs.close() + + if self.config["TESTING"]: + # Add a record to the test db; + # The number should match a value in the Modem's TEST_DATA + caller = { + "NAME": "Bruce", + "NMBR": "3605554567", + "DATE": "0801", + "TIME": "1802", + "REASON": "Blacklist test", + } + self.add_caller(caller) + + if self.config["DEBUG"]: + print("Blacklist initialized") + def add_caller(self, callerid, reason=""): """ Add a caller to the blocked list. @@ -83,23 +117,34 @@ def update_number(self, phone_no, name, reason): "reason": reason, "time": (datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:19]) } - self.db.execute(sql, arguments) - self.db.commit() + try: + self.db.execute(sql, arguments) + self.db.commit() + except Exception as e: + print("** Failed to update caller in blacklist:") + pprint(e) + return False if self.config["DEBUG"]: print("Blacklist entry updated") pprint(arguments) + return True def remove_number(self, phone_no): '''Removes records for the given number (without dashes or formatting)''' query = 'DELETE FROM Blacklist WHERE PhoneNo=:phone_no' arguments = {'phone_no': phone_no} - self.db.execute(query, arguments) - self.db.commit() - + try: + self.db.execute(query, arguments) + self.db.commit() + except Exception as e: + print("** Failed to delete caller from blacklist:") + pprint(e) + return False if self.config["DEBUG"]: print("blacklist entry removed") pprint(arguments) + return True def check_number(self, number): """ @@ -120,132 +165,3 @@ def get_number(self, number): args = (number,) results = query_db(self.db, query, args, False) return results - - def __init__(self, db, config): - """Ensures database access to the Blacklist table""" - self.db = db - self.config = config - - if self.config["DEBUG"]: - print("Initializing Blacklist") - - sql = ''' - CREATE TABLE IF NOT EXISTS Blacklist ( - PhoneNo TEXT PRIMARY KEY, - Name TEXT, - Reason TEXT, - SystemDateTime TEXT); - ''' - curs = self.db.cursor() - curs.executescript(sql) - curs.close() - - if self.config["TESTING"]: - # Add a record to the test db; - # The number should match a value in the Modem's TEST_DATA - caller = { - "NAME": "Bruce", - "NMBR": "3605554567", - "DATE": "0801", - "TIME": "1802", - "REASON": "Blacklist test", - } - self.add_caller(caller) - - if self.config["DEBUG"]: - print("Blacklist initialized") - - -def test(db, config): - """ Unit Tests """ - - print("*** Running Blacklist Unit Tests ***") - - # Create the blacklist to be tested - blacklist = Blacklist(db, config) - - # Add a record - callerid = {"NAME": "Bruce", "NMBR": "1234567890", "DATE": "1012", "TIME": "0600",} - blacklist.add_caller(callerid, "Test") - - # List the records - query = 'select * from Blacklist' - results = query_db(db, query) - print(query + " results:") - pprint(results) - - try: - number = "1234567890" - print("Assert is blacklisted: " + number) - is_blacklisted, reason = blacklist.check_number(number) - assert is_blacklisted, number + " should be blacklisted " + reason - print(reason) - - number = "1111111111" - print("Assert not blacklisted: " + number) - is_blacklisted, reason = blacklist.check_number(number) - assert not is_blacklisted, number + " should not be blacklisted " + reason - print(reason) - - number = "1234567890" - print("Get number: " + number) - caller = blacklist.get_number(number) - pprint(caller) - assert caller[0][0] == number, number + " should match get_number "+ caller[0][0] - - new_caller = {"NAME": "New Caller", "NMBR": "12312351234", "DATE": "1012", "TIME": "0600"} - number = new_caller["NMBR"] - name = new_caller["NAME"] - reason = "Test" - print("Assert add caller:") - pprint(new_caller) - blacklist.add_caller(new_caller, reason) - caller = blacklist.get_number(number) - pprint(caller) - assert caller[0][0] == number, number + " != "+ caller[0][0] - assert caller[0][1] == name, name + " != "+ caller[0][1] - assert caller[0][2] == reason, reason + " != "+ caller[0][2] - - name = "Joe" - reason = "Confirm" - print("Assert update number: " + number) - blacklist.update_number(number, name, reason) - caller = blacklist.get_number(number) - pprint(caller) - assert caller[0][0] == number, number + " != "+ caller[0][0] - assert caller[0][1] == name, name + " != "+ caller[0][1] - assert caller[0][2] == reason, reason + " != "+ caller[0][2] - - except AssertionError as e: - print("*** Unit Test FAILED ***") - pprint(e) - return 1 - - print("*** Unit Tests PASSED ***") - return 0 - - -if __name__ == '__main__': - """ Run the unit tests """ - - # Create the test db in RAM - import sqlite3 - db = sqlite3.connect(":memory:") - - # Add the parent directory to the path so callattendant can be found - import os - import sys - currentdir = os.path.dirname(os.path.realpath(__file__)) - parentdir = os.path.dirname(currentdir) - sys.path.append(parentdir) - - # Create and tweak a default config suitable for unit testing - from callattendant import make_config, print_config - config = make_config() - config['DEBUG'] = True - print_config(config) - - # Run the tests - sys.exit(test(db, config)) - - print("Tests complete") diff --git a/tests/test_blacklist.py b/tests/test_blacklist.py new file mode 100644 index 0000000..1d786ef --- /dev/null +++ b/tests/test_blacklist.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# test_blacklist.py +# +# Copyright 2020 Bruce Schubert +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import os +import sys +import sqlite3 +from pprint import pprint + +import pytest + +from src.callattendant import make_config +from src.screening.blacklist import Blacklist +from src.screening.query_db import query_db +from src.screening.query_db import query_db + +@pytest.fixture(scope='module') +def blacklist(): + + # Create the test db in RAM + db = sqlite3.connect(":memory:") + + # Load and tweak the default config + config = make_config() + config['DEBUG'] = True + config['TESTING'] = True + + # Create the blacklist to be tested + blacklist = Blacklist(db, config) + + return blacklist + +def test_add_caller(blacklist): + # Add a record + callerid = {"NAME": "Bruce", "NMBR": "1234567890", "DATE": "1012", "TIME": "0600",} + assert blacklist.add_caller(callerid, "Test") + + +def test_check_number(blacklist): + number = "1234567890" + + is_blacklisted, reason = blacklist.check_number(number) + + assert is_blacklisted + assert reason == "Test" + + number = "1111111111" + + is_blacklisted, reason = blacklist.check_number(number) + + assert not is_blacklisted + +def test_get_number(blacklist): + number = "1234567890" + + caller = blacklist.get_number(number) + pprint(caller) + + assert caller[0][0] == number + +def test_multiple(blacklist): + new_caller = {"NAME": "New Caller", "NMBR": "12312351234", "DATE": "1012", "TIME": "0600"} + number = new_caller["NMBR"] + name = new_caller["NAME"] + reason = "Test" + pprint(new_caller) + + assert blacklist.add_caller(new_caller, reason) + + caller = blacklist.get_number(number) + pprint(caller) + + assert caller[0][0] == number + assert caller[0][1] == name + assert caller[0][2] == reason + + name = "Joe" + reason = "Confirm" + + assert blacklist.update_number(number, name, reason) + + caller = blacklist.get_number(number) + pprint(caller) + + assert caller[0][0] == number + assert caller[0][1] == name + assert caller[0][2] == reason + + assert blacklist.remove_number(number) + + is_blacklisted, reason = blacklist.check_number(number) + assert not is_blacklisted + + caller = blacklist.get_number(number) + pprint(caller)