import argparse
import importlib.metadata
from pathlib import Path

import pytest

import py3status
from py3status.core import ENTRY_POINT_KEY, Py3statusWrapper


@pytest.fixture(name="status_wrapper")
def make_status_wrapper():
    args = argparse.Namespace()
    status_wrapper = Py3statusWrapper(args)
    return status_wrapper


def test__get_path_included_modules(status_wrapper):
    """Use the list of inbuilt modules as reference to check against."""
    path_included_modules_path = Path(py3status.__file__).resolve().parent / "modules"
    status_wrapper.options.__dict__["include_paths"] = [path_included_modules_path]
    assert path_included_modules_path.exists()
    expected_keys = [n.stem for n in path_included_modules_path.iterdir() if n.suffix == ".py"]
    modules = status_wrapper._get_path_included_modules()
    assert sorted(modules) == sorted(expected_keys)


def test__get_entry_point_based_modules(status_wrapper, monkeypatch):
    def return_fake_entry_points(*args, **kwargs):
        class FakePy3status:
            Py3status = "I am a fake class"

            def __init__(self, name):
                self.name = name
                self.value = f"{name}.module"

            @staticmethod
            def load():
                from py3status.modules import air_quality

                return air_quality

        return [FakePy3status("spam"), FakePy3status("eggs")]

    monkeypatch.setattr(importlib.metadata, "entry_points", return_fake_entry_points)

    discoverable_modules = status_wrapper._get_entry_point_based_modules()
    assert len(discoverable_modules) == 2
    for name, info in discoverable_modules.items():
        assert any(n in name for n in ["spam", "eggs"])
        kind, klass = info
        assert kind == ENTRY_POINT_KEY
        assert klass.__name__ == "Py3status"