import pytest
from unittest.mock import patch , Mock, MagicMock
from app.models import User
from app.config.extensions import bcrypt
from datetime import datetime


class TestUser:
    def test_user_string_represetation(self,user_model_factory):
        user = user_model_factory
        assert str(user) == user["username"]

    @patch.object(bcrypt,"generate_password_hash")
    def test_set_password(self,mocker,user_model_factory):
        user_factory = user_model_factory
        user = User()
        print(user_factory['password'])
        result = user.set_password(password=user_factory['password'])
        mocker.assert_called_once()
        mocker.assert_called_once_with(user_factory['password'])

    @patch.object(bcrypt,"check_password_hash")
    def test_check_password(self,mocker,user_model_factory):
        user_factory = user_model_factory
        user = User()
        print(user_factory['password'])
        result = user.check_password(password=user_factory['password'])
        mocker.assert_called_once()


    def test_mark_as_online(self,user_model_factory):
        # print(user_model_factory.is_online)
        
        user_model_factory.mark_as_online()
        assert user_model_factory.is_online == True
    
    def test_mark_as_offline(self,user_model_factory):
        user_model_factory.mark_as_offline()
        assert user_model_factory.is_online == False

    def test_block_user(self,user_model_factory):
        user_model_factory.block_user()
        assert user_model_factory.is_blocked == True

    
    def test_unblock_user(self,user_model_factory):
        user_model_factory.unblock_user()
        assert user_model_factory.is_blocked == False
    
    @pytest.mark.skip
    def test_update_last_seen(self,user_model_factory):
        user_model_factory.update_last_seen()
        # print(user_model_factory.last_seen_at)
        assert user_model_factory.last_seen_at == datetime.utcnow()


    @patch('app.models.base.Base.to_dict')
    def test_to_dict(self, mock_to_dict):
        user = User()
        # Mock the to_dict method of the Base class to return a specific value
        mock_to_dict.return_value = {'key': 'value'}

        user_dict = user.to_dict()
        assert user_dict, {'key': 'value'}




    