import pytest
import json
from pathlib import Path
from dss.analyze.project_analyzer import run_project_analysis

def test_run_project_analysis(mock_react_project: Path):
    """
    Tests the run_project_analysis function to ensure it creates the analysis graph
    and that the graph contains the expected file nodes.
    """
    # Run the analysis on the mock project
    run_project_analysis(str(mock_react_project))

    # Check if the analysis file was created
    analysis_file = mock_react_project / ".dss" / "analysis_graph.json"
    assert analysis_file.exists(), "The analysis_graph.json file was not created."

    # Load the analysis data
    with open(analysis_file, 'r') as f:
        data = json.load(f)

    # Verify the graph structure
    assert "nodes" in data, "Graph data should contain 'nodes'."
    assert "links" in data, "Graph data should contain 'links'."

    # Get a list of node IDs (which are the relative file paths)
    node_ids = [node['id'] for node in data['nodes']]

    # Check for the presence of the files from the mock project
    expected_files = [
        "package.json",
        "src/App.js",
        "src/components/ComponentA.css",
        "src/components/ComponentA.jsx",
        "src/components/ComponentB.tsx",
    ]

    for file_path in expected_files:
        # Path separators might be different on different OSes, so we normalize
        normalized_path = str(Path(file_path))
        assert normalized_path in node_ids, f"Expected file '{normalized_path}' not found in the analysis graph."

    # Verify the number of nodes
    # There should be exactly the number of files we created
    assert len(node_ids) == len(expected_files), "The number of nodes in the graph does not match the number of files."
