diff --git a/app.py b/app.py index 053af50..200d228 100644 --- a/app.py +++ b/app.py @@ -3,12 +3,12 @@ from os import environ from controllers.web.endpoints import blueprint ''' - Main entrypoint for Flask application. - Initialises any components that are needed at runtime such as the + Main entrypoint for Flask application. + Initialises any components that are needed at runtime such as the Database manager... ''' -app = Flask(__name__) +app: Flask = Flask(__name__) # Set app secret key to sign session cookies secret_key = environ.get("APPSECRET") @@ -24,4 +24,3 @@ app.register_blueprint(blueprint) if __name__ == "__main__": app.run(debug=True, host="0.0.0.0", port=8080) - diff --git a/tests/functional/__init__.py b/tests/functional/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/functional/test_homepage.py b/tests/functional/test_homepage.py new file mode 100644 index 0000000..b66d439 --- /dev/null +++ b/tests/functional/test_homepage.py @@ -0,0 +1,41 @@ +from app import app +from flask.testing import FlaskClient +import pytest +import os + + +@pytest.fixture(scope="module") +def test_client() -> FlaskClient: + """ Test that required environment variables are set + ahead of runtime + """ + os.environ['CONFIG_TYPE'] = 'config.TestingConfig' + + with app.test_client() as testing_client: + with app.app_context(): + yield testing_client + + +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 diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/database/__init__.py b/tests/unit/database/__init__.py similarity index 97% rename from tests/database/__init__.py rename to tests/unit/database/__init__.py index 200380e..9bd5abe 100644 --- a/tests/database/__init__.py +++ b/tests/unit/database/__init__.py @@ -1,3 +1,3 @@ -# Ensure test environment is set before using -# Runs the database creation scripts -import scripts.create_database +# Ensure test environment is set before using +# Runs the database creation scripts +import scripts.create_database diff --git a/tests/database/test_products.py b/tests/unit/database/test_products.py similarity index 96% rename from tests/database/test_products.py rename to tests/unit/database/test_products.py index 0b7c69e..0b61633 100644 --- a/tests/database/test_products.py +++ b/tests/unit/database/test_products.py @@ -1,67 +1,67 @@ -import pytest -import sqlite3 -from datetime import datetime -from controllers.database.product import ProductController -from models.products.product import Product - -product = Product( - "product", - "brake-disks.bmp", - "description", - 10.00, - 1, - 1, - datetime.now(), - 1 -) - -# Tests a new product can be created - - -def test_create_product(): - 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(): - test_create_product() - -# Tests that products can be refined by category - - -def test_search_category(): - 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 - - -# 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__ +import pytest +import sqlite3 +from datetime import datetime +from controllers.database.product import ProductController +from models.products.product import Product + +product = Product( + "product", + "brake-disks.bmp", + "description", + 10.00, + 1, + 1, + datetime.now(), + 1 +) + +# Tests a new product can be created + + +def test_create_product(): + 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(): + test_create_product() + +# Tests that products can be refined by category + + +def test_search_category(): + 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 + + +# 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__ diff --git a/tests/database/test_users.py b/tests/unit/database/test_users.py similarity index 95% rename from tests/database/test_users.py rename to tests/unit/database/test_users.py index 0e82c3b..1f50c8a 100644 --- a/tests/database/test_users.py +++ b/tests/unit/database/test_users.py @@ -1,74 +1,74 @@ -import pytest -import sqlite3 -from controllers.database.user import UserController -from models.users.customer import Customer -from models.users.seller import Seller - -customer = Customer( - "testcustomer", - "Password1", - "firstname", - "lastname", - "test@test", - "123456789" -) - -seller = Seller( - "testseller", - "Password1", - "firstname", - "lastname", - "seller@seller", - "987654321" -) - -# Tests a new user can be created - - -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): - db.create(customer) - -# Test we the same user details get returned from the database - - -def test_read_user(): - db = UserController() - - # 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__ - - -# Tests a new seller can be created -def test_create_seller(): - db = UserController() - db.create(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__ +import pytest +import sqlite3 +from controllers.database.user import UserController +from models.users.customer import Customer +from models.users.seller import Seller + +customer = Customer( + "testcustomer", + "Password1", + "firstname", + "lastname", + "test@test", + "123456789" +) + +seller = Seller( + "testseller", + "Password1", + "firstname", + "lastname", + "seller@seller", + "987654321" +) + +# Tests a new user can be created + + +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): + db.create(customer) + +# Test we the same user details get returned from the database + + +def test_read_user(): + db = UserController() + + # 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__ + + +# Tests a new seller can be created +def test_create_seller(): + db = UserController() + db.create(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__ diff --git a/tests/general/test_env.py b/tests/unit/general/test_env.py similarity index 100% rename from tests/general/test_env.py rename to tests/unit/general/test_env.py diff --git a/tests/general/test_pep8.py b/tests/unit/general/test_pep8.py similarity index 96% rename from tests/general/test_pep8.py rename to tests/unit/general/test_pep8.py index 3a17a92..38cc521 100644 --- a/tests/general/test_pep8.py +++ b/tests/unit/general/test_pep8.py @@ -1,11 +1,11 @@ -import pycodestyle - -# 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 +import pycodestyle + +# 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