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__
