diff --git a/pep8.bat b/pep8.bat new file mode 100644 index 0000000..96105a1 --- /dev/null +++ b/pep8.bat @@ -0,0 +1 @@ +autopep8 --exclude '*/.*/*' --in-place --recursive . \ No newline at end of file diff --git a/scripts/create_database.py b/scripts/create_database.py index 9c8f1b8..31cfd0c 100644 --- a/scripts/create_database.py +++ b/scripts/create_database.py @@ -37,11 +37,6 @@ def create_connection(path: str, filename: str): conn.close() -# Ensure a directory is created given a path to it -if __name__ == "__main__": - run() - - def run(): """ Create the database for the application""" dir = r"./data/" @@ -55,3 +50,8 @@ def run(): remove_file(dir + db_name) create_connection(dir, db_name) + + +# Ensure a directory is created given a path to it +if __name__ == "__main__": + run() diff --git a/tests/__init__.py b/tests/__init__.py index b79d54f..e69de29 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,28 +0,0 @@ -import pytest -import os -from scripts.create_database import run -from app import app -from dotenv import load_dotenv -from flask.testing import FlaskClient - - -# Setup test environment variables -load_dotenv() - -# Capture environment variables at start of testing so we can -# Monitor current setting during tests -old_env = os.environ.get("ENVIRON") -os.environ["ENVIRON"] = "test" - -run() - - -@pytest.fixture(scope="module") -def test_client() -> FlaskClient: - """ Enables tests to create requests to the web app - """ - os.environ['CONFIG_TYPE'] = 'config.TestingConfig' - - with app.test_client() as testing_client: - with app.app_context(): - yield testing_client diff --git a/tests/base_test.py b/tests/base_test.py new file mode 100644 index 0000000..f503345 --- /dev/null +++ b/tests/base_test.py @@ -0,0 +1,39 @@ +import pytest +import os +from scripts.create_database import run +from app import app +from dotenv import load_dotenv +from flask.testing import FlaskClient + + +class TestBase: + """ Base test class that ensures environment variables + and test setup is complete before any other unit tests are run + """ + + def setup_class(self): + """ Setup class level resources or configurations + Setup test environment variables + """ + load_dotenv() + + # Capture environment variables at start of testing so we can + # Monitor current setting during tests + self.old_env = os.environ.get("ENVIRON") + os.environ["ENVIRON"] = "test" + + run() + + def teardown_class(self): + """ Teardown class level resources or configurations """ + pass + + @pytest.fixture(scope="class") + def test_client(self) -> FlaskClient: + """ Enables tests to create requests to the web app + """ + os.environ['CONFIG_TYPE'] = 'config.TestingConfig' + + with app.test_client() as testing_client: + with app.app_context(): + yield testing_client diff --git a/tests/endtoend/use_cases_test.py b/tests/endtoend/use_cases_test.py index 17babdc..d62a04f 100644 --- a/tests/endtoend/use_cases_test.py +++ b/tests/endtoend/use_cases_test.py @@ -1,9 +1,9 @@ -import pytest from bs4 import BeautifulSoup -from tests import test_client from flask.testing import FlaskClient +from tests.base_test import TestBase -def test_use_case(test_client: FlaskClient): - response = test_client.get('/products/Car Parts') - assert response.status_code == 200 +class TestFunctionalRequirements(TestBase): + def test_use_case(self, test_client: FlaskClient): + response = test_client.get('/products/Car Parts') + assert response.status_code == 200 diff --git a/tests/functional/test_homepage.py b/tests/functional/test_homepage.py deleted file mode 100644 index b2803cb..0000000 --- a/tests/functional/test_homepage.py +++ /dev/null @@ -1,39 +0,0 @@ -from flask.testing import FlaskClient -from tests import test_client -import pytest - - -def test_homepage(test_client: FlaskClient): - """ Tests that the main homepage loads correctly - once the '/' endpoint is hit - """ - response = test_client.get('/') - assert response.status_code == 302 - - response = test_client.get('/products') - assert response.status_code == 308 - - -def test_products(test_client: FlaskClient): - """ Tests that a product page is displayed when - hitting one of the product endpoints - """ - response = test_client.get('/products/2') - assert response.status_code == 200 - - response = test_client.get('/products/50') - assert response.status_code == 302 - - response = test_client.get('/products/Books') - assert response.status_code == 200 - - -def test_admin(test_client: FlaskClient): - """ Tests that the admin pages can be reached and redirect - upon reaching - """ - response = test_client.get('/admin/users/') - assert response.status_code == 302 - - response = test_client.get('/admin/products/') - assert response.status_code == 302 diff --git a/tests/functional/test_pages.py b/tests/functional/test_pages.py new file mode 100644 index 0000000..dbf51ef --- /dev/null +++ b/tests/functional/test_pages.py @@ -0,0 +1,41 @@ +from flask.testing import FlaskClient +from tests.base_test import TestBase + + +class TestPages(TestBase): + """ Test class that encapsulates tests for + the main pages on the site + """ + + def test_homepage(self, test_client: FlaskClient): + """ Tests that the main homepage loads correctly + once the '/' endpoint is hit + """ + response = test_client.get('/') + assert response.status_code == 302 + + response = test_client.get('/products') + assert response.status_code == 308 + + def test_products(self, test_client: FlaskClient): + """ Tests that a product page is displayed when + hitting one of the product endpoints + """ + response = test_client.get('/products/2') + assert response.status_code == 200 + + response = test_client.get('/products/50') + assert response.status_code == 302 + + response = test_client.get('/products/Books') + assert response.status_code == 200 + + def test_admin(self, test_client: FlaskClient): + """ Tests that the admin pages can be reached and redirect + upon reaching + """ + response = test_client.get('/admin/users/') + assert response.status_code == 302 + + response = test_client.get('/admin/products/') + assert response.status_code == 302 diff --git a/tests/unit/database/database_test_class.py b/tests/unit/database/database_test_class.py new file mode 100644 index 0000000..48007f0 --- /dev/null +++ b/tests/unit/database/database_test_class.py @@ -0,0 +1,8 @@ +from tests.base_test import TestBase + + +class TestDatabase(TestBase): + """ Class that controls the + testing of the WMGZON database + """ + pass diff --git a/tests/unit/database/test_products.py b/tests/unit/database/test_products.py index 0b61633..1ef4cbe 100644 --- a/tests/unit/database/test_products.py +++ b/tests/unit/database/test_products.py @@ -1,5 +1,4 @@ -import pytest -import sqlite3 +from tests.unit.database.database_test_class import TestDatabase from datetime import datetime from controllers.database.product import ProductController from models.products.product import Product @@ -15,53 +14,52 @@ product = Product( 1 ) -# Tests a new product can be created +class TestProduct(TestDatabase): + """ Class that controls the + testing of the WMGZON database + """ -def test_create_product(): - db = ProductController() - db.create(product) + def test_create_product(self): + """Tests a new product can be created""" + db = ProductController() + db.create(product) -# Tests the database maintains integrity when we try -# and add a product with the same details + def test_duplicate_product(self): + """ Tests the database maintains integrity when we try + and add a product with the same detail + """ + self.test_create_product() + def test_search_category(self): + """ Tests that products can be refined by category """ + db = ProductController() -def test_duplicate_product(): - test_create_product() + # Check each category for correct amount of test products + assert len(db.read_all("Car Parts")) == 9 + \ + 2 # Added in previous tests + assert len(db.read_all("Books")) == 9 + assert db.read_all("Phones") is None -# Tests that products can be refined by category + def test_search_term(self): + """ Tests that products can be refined by search term""" + db = ProductController() + # Check each search term for correct amount of test products + assert len(db.read_all(search_term="Alloy")) == 9 + assert len(db.read_all("Car Parts", "tur")) == 2 + assert len(db.read_all(search_term="fold")) == 8 + assert db.read_all(search_term="Twin") is None -def test_search_category(): - db = ProductController() + def test_read_product(self): + """ Test we the same product details get returned from the database """ + db = ProductController() - # Check each category for correct amount of test products - assert len(db.read_all("Car Parts")) == 9 + 2 # Added in previous tests - assert len(db.read_all("Books")) == 9 - assert db.read_all("Phones") is None + # Test the same product is returned + new_product = db.read("product") + assert isinstance(new_product, list) + assert isinstance(new_product[0], Product) - -# Tests that products can be refined by search term -def test_search_term(): - db = ProductController() - - # Check each search term for correct amount of test products - assert len(db.read_all(search_term="Alloy")) == 9 - assert len(db.read_all("Car Parts", "tur")) == 2 - assert len(db.read_all(search_term="fold")) == 8 - assert db.read_all(search_term="Twin") is None - -# Test we the same product details get returned from the database - - -def test_read_product(): - db = ProductController() - - # Test the same product is returned - new_product = db.read("product") - assert isinstance(new_product, list) - assert isinstance(new_product[0], Product) - - # Update the ID on the item as database assigns new id - product.id = new_product[0].id - assert new_product[0].__dict__ == product.__dict__ + # Update the ID on the item as database assigns new id + product.id = new_product[0].id + assert new_product[0].__dict__ == product.__dict__ diff --git a/tests/unit/database/test_users.py b/tests/unit/database/test_users.py index 1f50c8a..3804ce1 100644 --- a/tests/unit/database/test_users.py +++ b/tests/unit/database/test_users.py @@ -1,5 +1,6 @@ import pytest import sqlite3 +from tests.unit.database.database_test_class import TestDatabase from controllers.database.user import UserController from models.users.customer import Customer from models.users.seller import Seller @@ -22,53 +23,53 @@ seller = Seller( "987654321" ) -# Tests a new user can be created +class TestUsers(TestDatabase): + """ Class to encapsulate all of the user + datbase tests + """ -def test_create_user(): - db = UserController() - db.create(customer) - -# Tests the database maintains integrity when we try -# and add a user with the same details - - -def test_duplicate_user(): - db = UserController() - with pytest.raises(sqlite3.IntegrityError): + def test_create_user(self): + """ Tests a new user can be created """ + db = UserController() db.create(customer) -# Test we the same user details get returned from the database + def test_duplicate_user(self): + """ Tests the database maintains integrity when we try + and add a user with the same details + """ + db = UserController() + with pytest.raises(sqlite3.IntegrityError): + db.create(customer) + def test_read_user(self): + """ Test we the same user details get returned from the database """ + db = UserController() -def test_read_user(): - db = UserController() + # Test the same user is returned + user = db.read(customer.username) + assert isinstance(user, Customer) - # Test the same user is returned - user = db.read(customer.username) - assert isinstance(user, Customer) + # Update the ID on the item as database assigns new id + customer.id = user.id + assert user.__dict__ == customer.__dict__ - # Update the ID on the item as database assigns new id - customer.id = user.id - assert user.__dict__ == customer.__dict__ + def test_create_seller(self): + """ Tests a new seller can be created """ + db = UserController() + db.create(seller) + def test_read_seller(self): + """ Test that the same seller details get + returned from the database + """ + db = UserController() -# Tests a new seller can be created -def test_create_seller(): - db = UserController() - db.create(seller) + # Test the same user is returned + user = db.read(seller.username) + assert isinstance(user, Seller) -# Test that the same seller details get returned from the database - - -def test_read_seller(): - db = UserController() - - # Test the same user is returned - user = db.read(seller.username) - assert isinstance(user, Seller) - - # Update the ID on the item as database assigns new id - seller.id = user.id - user.store = "" - assert user.__dict__ == seller.__dict__ + # Update the ID on the item as database assigns new id + seller.id = user.id + user.store = "" + assert user.__dict__ == seller.__dict__ diff --git a/tests/unit/general/test_env.py b/tests/unit/general/test_env.py index 3ca13d5..c18f0d1 100644 --- a/tests/unit/general/test_env.py +++ b/tests/unit/general/test_env.py @@ -1,31 +1,31 @@ +from tests.base_test import TestBase from os import environ from warnings import warn -from tests import old_env - -# Tests environment variables used within the projects domain are -# set in the correct environment - -VARS = ['ENVIRON', 'APPSECRET', 'FILESTORE'] - -ENV_STATES = ['test', 'prod'] -def test_env_vars(): - """ Test that required environment variables are set - ahead of runtime +class TestEnv(TestBase): + """ Tests environment variables used within the projects domain are + set in the correct environment """ - for var in VARS: - env = environ.get(var) + VARS = ['ENVIRON', 'APPSECRET', 'FILESTORE'] - # Check to see what variable we are comparing - if env is None: - warn(f"Variable {var} is not set!") + ENV_STATES = ['test', 'prod'] + def test_env_vars(self): + """ Test that required environment variables are set + ahead of runtime + """ + for var in self.VARS: + env = environ.get(var) -def test_environment_var_state(): - """ Tests that the 'ENVIRON' Environment variable - is in a correct state - """ - var = old_env - assert var is not None - assert (var in ENV_STATES) + # Check to see what variable we are comparing + if env is None: + warn(f"Variable {var} is not set!") + + def test_environment_var_state(self): + """ Tests that the 'ENVIRON' Environment variable + is in a correct state + """ + var = self.old_env + assert var is not None + assert (var in self.ENV_STATES) diff --git a/tests/unit/general/test_pep8.py b/tests/unit/general/test_pep8.py index 38cc521..804854b 100644 --- a/tests/unit/general/test_pep8.py +++ b/tests/unit/general/test_pep8.py @@ -1,11 +1,13 @@ import pycodestyle +from tests.base_test import TestBase # Tests files to ensure they conform to pep8 standards -def test_pep8_conformance(): - """Test that we conform to PEP8.""" - pep8style = pycodestyle.StyleGuide() - dirs = ["./controllers", "./models", "./scripts", "./tests", "./utils"] - result = pep8style.check_files(dirs) - assert result.total_errors == 0 +class TestPep8(TestBase): + def test_pep8_conformance(self): + """Test that we conform to PEP8.""" + pep8style = pycodestyle.StyleGuide() + dirs = ["./controllers", "./models", "./scripts", "./tests", "./utils"] + result = pep8style.check_files(dirs) + assert result.total_errors == 0 diff --git a/venv.bat b/venv.bat deleted file mode 100644 index 1e5301b..0000000 --- a/venv.bat +++ /dev/null @@ -1 +0,0 @@ -./.venv/Scripts/activate