__author__ = "Florian Kaiser"
__copyright__ = "Copyright 2022, Project Aktienbot"
__credits__ = ["Florian Kaiser", "Florian Kellermann", "Linus Eickhof", "Kevin Pauer"]
__license__ = "GPL 3.0"
__version__ = "1.0.0"

"""
This file (test_models.py) contains the unit tests for the models.py file.
"""
from app.helper_functions import hash_password
from app.models import User, Transaction, Keyword, Share


def test_new_user():
    """
    GIVEN a User model
    WHEN a new User is created
    THEN check the email, password, username, telegram_user_id and admin fields are defined correctly
    """
    user = User(
        email="user@example.com",
        username="user",
        password=hash_password("password"),
        admin=False,
        cron="0 8 * * *",
    )
    assert user.email == 'user@example.com'
    assert user.password != 'password'
    assert user.username == "user"
    assert user.telegram_user_id is None
    assert user.admin is False
    assert user.as_dict() == {'cron': '0 8 * * *', 'email': 'user@example.com', 'username': 'user', 'telegram_user_id': None, 'admin': False}


def test_new_user_with_fixture(new_user):
    """
    GIVEN a User model
    WHEN a new User is created
    THEN check the email and password_hashed fields are defined correctly
    """
    assert new_user.email == 'user@example.com'
    assert new_user.password != 'password'


def test_new_transaction():
    """
    GIVEN a Transaction model
    WHEN a new Transaction is created
    THEN check the email, symbol, time count and price fields are defined correctly
    """
    transaction = Transaction(
        email="user@example.com",
        symbol="DTEGY",
        time="2022-03-29T10:00:00.000Z",
        count=10,
        price=9.99
    )
    assert transaction.email == 'user@example.com'
    assert transaction.symbol == "DTEGY"
    assert transaction.count == 10
    assert transaction.price == 9.99
    assert transaction.as_dict() == {'t_id': None, 'email': 'user@example.com', 'symbol': 'DTEGY', 'time': '2022-03-29T10:00:00.000Z', 'count': 10, 'price': 9.99}


def test_new_transaction_with_fixture(new_transaction):
    """
    GIVEN a User model
    WHEN a new User is created
    THEN check the email and password_hashed fields are defined correctly
    """
    assert new_transaction.email == 'user@example.com'
    assert new_transaction.symbol == 'DTEGY'


def test_new_keyword():
    """
    GIVEN a Transaction model
    WHEN a new Transaction is created
    THEN check the email, symbol, time count and price fields are defined correctly
    """
    keyword = Keyword(
        email="user@example.com",
        keyword="Elon Musk"
    )
    assert keyword.email == 'user@example.com'
    assert keyword.keyword == "Elon Musk"
    assert keyword.as_dict() == {'s_id': None, 'email': 'user@example.com', 'keyword': 'Elon Musk'}


def test_new_keyword_with_fixture(new_keyword):
    """
    GIVEN a User model
    WHEN a new User is created
    THEN check the email and password_hashed fields are defined correctly
    """
    assert new_keyword.email == 'user@example.com'
    assert new_keyword.keyword == 'Elon Musk'


def test_new_share():
    """
    GIVEN a Transaction model
    WHEN a new Transaction is created
    THEN check the email, symbol, time count and price fields are defined correctly
    """
    share = Share(
        email="user@example.com",
        symbol="DTEGY"
    )
    assert share.email == 'user@example.com'
    assert share.symbol == "DTEGY"
    assert share.as_dict() == {'a_id': None, 'email': 'user@example.com', 'symbol': 'DTEGY'}


def test_new_share_with_fixture(new_share):
    """
    GIVEN a User model
    WHEN a new User is created
    THEN check the email and password_hashed fields are defined correctly
    """
    assert new_share.email == 'user@example.com'
    assert new_share.symbol == 'DTEGY'
