Files
noteflow/tests/infrastructure/ai/graphs/test_workspace_qa.py
Travis Vasceannie d8090a98e8
Some checks failed
CI / test-typescript (push) Has been cancelled
CI / test-rust (push) Has been cancelled
CI / test-python (push) Has been cancelled
ci/cd fixes
2026-01-26 00:28:15 +00:00

122 lines
5.0 KiB
Python

"""Tests for infrastructure/ai/graphs/workspace_qa.py - workspace Q&A graph."""
from __future__ import annotations
from typing import TYPE_CHECKING, Final
import pytest
from noteflow.infrastructure.ai.graphs.workspace_qa import (
NO_INFORMATION_ANSWER,
WORKSPACE_QA_GRAPH_NAME,
WORKSPACE_QA_GRAPH_VERSION,
WorkspaceQAConfig,
WorkspaceQADependencies,
)
if TYPE_CHECKING:
from tests.infrastructure.ai.conftest import MockEmbedder, MockLLM
EXPECTED_GRAPH_NAME: Final[str] = "workspace_qa"
EXPECTED_GRAPH_VERSION: Final[int] = 2
EXPECTED_NO_INFO_ANSWER: Final[str] = "I couldn't find relevant information across your meetings."
class TestWorkspaceQAGraphConstants:
"""Tests for workspace_qa module constants."""
def test_workspace_qa_graph_name_value(self) -> None:
"""WORKSPACE_QA_GRAPH_NAME has expected value."""
assert WORKSPACE_QA_GRAPH_NAME == EXPECTED_GRAPH_NAME, "graph name should match"
def test_workspace_qa_graph_version_value(self) -> None:
"""WORKSPACE_QA_GRAPH_VERSION has expected value."""
assert WORKSPACE_QA_GRAPH_VERSION == EXPECTED_GRAPH_VERSION, "graph version should match"
def test_workspace_qa_no_information_answer_value(self) -> None:
"""NO_INFORMATION_ANSWER has expected value."""
assert NO_INFORMATION_ANSWER == EXPECTED_NO_INFO_ANSWER, "no info answer should match"
class TestWorkspaceQAConfig:
"""Tests for WorkspaceQAConfig dataclass."""
def test_workspace_qa_config_default_enable_web_search_is_false(self) -> None:
"""Default enable_web_search is False."""
config = WorkspaceQAConfig()
assert config.enable_web_search is False, "enable_web_search default should be False"
def test_workspace_qa_config_default_require_web_approval_is_true(self) -> None:
"""Default require_web_approval is True."""
config = WorkspaceQAConfig()
assert config.require_web_approval is True, "require_web_approval default should be True"
def test_workspace_qa_config_default_require_annotation_approval_is_false(self) -> None:
"""Default require_annotation_approval is False."""
config = WorkspaceQAConfig()
assert config.require_annotation_approval is False, "require_annotation_approval default should be False"
def test_workspace_qa_config_accepts_custom_enable_web_search(self) -> None:
"""Config accepts custom enable_web_search value."""
config = WorkspaceQAConfig(enable_web_search=True)
assert config.enable_web_search is True, "should accept custom value"
def test_workspace_qa_config_accepts_custom_require_web_approval(self) -> None:
"""Config accepts custom require_web_approval value."""
config = WorkspaceQAConfig(require_web_approval=False)
assert config.require_web_approval is False, "should accept custom value"
def test_workspace_qa_config_accepts_custom_require_annotation_approval(self) -> None:
"""Config accepts custom require_annotation_approval value."""
config = WorkspaceQAConfig(require_annotation_approval=True)
assert config.require_annotation_approval is True, "should accept custom value"
def test_workspace_qa_config_is_frozen(self) -> None:
"""Config is a frozen dataclass."""
config = WorkspaceQAConfig()
with pytest.raises(AttributeError, match="cannot assign"):
config.enable_web_search = True
class TestWorkspaceQADependencies:
"""Tests for WorkspaceQADependencies dataclass."""
def test_workspace_qa_deps_stores_embedder(self, mock_embedder: MockEmbedder, mock_llm: MockLLM) -> None:
"""Dependencies stores embedder."""
deps = WorkspaceQADependencies(
embedder=mock_embedder,
segment_repo=None,
llm=mock_llm,
)
assert deps.embedder is mock_embedder, "should store embedder"
def test_workspace_qa_deps_stores_llm(self, mock_embedder: MockEmbedder, mock_llm: MockLLM) -> None:
"""Dependencies stores llm."""
deps = WorkspaceQADependencies(
embedder=mock_embedder,
segment_repo=None,
llm=mock_llm,
)
assert deps.llm is mock_llm, "should store llm"
def test_workspace_qa_deps_default_web_search_provider_is_none(
self, mock_embedder: MockEmbedder, mock_llm: MockLLM
) -> None:
"""Dependencies default web_search_provider is None."""
deps = WorkspaceQADependencies(
embedder=mock_embedder,
segment_repo=None,
llm=mock_llm,
)
assert deps.web_search_provider is None, "default web_search_provider should be None"
def test_workspace_qa_deps_is_frozen(self, mock_embedder: MockEmbedder, mock_llm: MockLLM) -> None:
"""Dependencies is a frozen dataclass."""
deps = WorkspaceQADependencies(
embedder=mock_embedder,
segment_repo=None,
llm=mock_llm,
)
with pytest.raises(AttributeError, match="cannot assign"):
deps.embedder = None