# test_with_pytest.py
import pytest
import asyncio
import aiomqtt
import logging

from mock import patch, Mock
from singleton import Singleton
from proxy import Proxy
from mqtt import Mqtt
from gen3plus.solarman_v5 import SolarmanV5
from cnf.config import Config


pytest_plugins = ('pytest_asyncio',)


@pytest.fixture(scope="module", autouse=True)
def module_init():
    def new_init(cls, cb_mqtt_is_up):
        pass  # empty test methos

    Singleton._instances.clear()
    with patch.object(Mqtt, '__init__', new_init):
        yield

@pytest.fixture(scope="module")
def test_port():
    return 1883

@pytest.fixture(scope="module")
def test_hostname():
    # if getenv("GITHUB_ACTIONS") == "true":
    #     return 'mqtt'
    # else:
        return 'test.mosquitto.org'

@pytest.fixture
def config_conn(test_hostname, test_port):
    Config.act_config = {
                        'mqtt':{
                            'host': test_hostname,
                            'port': test_port,
                            'user': '',
                            'passwd': ''
                        },
                        'ha':{
                            'auto_conf_prefix': 'homeassistant',
                            'discovery_prefix': 'homeassistant', 
                            'entity_prefix': 'tsun',
                            'proxy_node_id': 'test_1',
                            'proxy_unique_id': ''
                        },
                        'inverters': {
                            'allow_all': True,
                            "R170000000000001":{
                                'node_id': 'inv_1'
                            }
                        }
    }

@pytest.mark.asyncio
async def test_inverter_cb(config_conn):
    _ = config_conn

    with patch.object(Proxy, '_cb_mqtt_is_up', wraps=Proxy._cb_mqtt_is_up) as spy:
        print('call Proxy.class_init')
        Proxy.class_init()
        assert 'homeassistant/' == Proxy.discovery_prfx
        assert 'tsun/' == Proxy.entity_prfx
        assert 'test_1/' == Proxy.proxy_node_id
        await Proxy._cb_mqtt_is_up()
        spy.assert_called_once()

@pytest.mark.asyncio
async def test_mqtt_is_up(config_conn):
    _ = config_conn

    with patch.object(Mqtt, 'publish') as spy:
        Proxy.class_init()
        await Proxy._cb_mqtt_is_up()
        spy.assert_called()

@pytest.mark.asyncio
async def test_mqtt_proxy_statt_invalid(config_conn):
    _ = config_conn

    with patch.object(Mqtt, 'publish') as spy:
        Proxy.class_init()
        await Proxy._async_publ_mqtt_proxy_stat('InValId_kEy')
        spy.assert_not_called()
