lib/mix/tasks/foundry.scenarios.extract.ex

defmodule Mix.Tasks.Foundry.Scenarios.Extract do
  use Mix.Task

  alias Foundry.Context.GraphBuilder
  alias Foundry.Context.ScenarioCache
  alias Foundry.Context.Scenarios.Adapters
  alias Foundry.Context.Scenarios.ModuleIndex

  @shortdoc "Run tests with tracing and extract scenario data for Foundry UI"

  def run(args) do
    report = ScenarioTracer.MixTask.run(__MODULE__, args)
    ScenarioCache.update(report)
    report
  end

  def project_root, do: File.cwd!()

  def adapters do
    [
      Adapters.Page,
      Adapters.Rule,
      Adapters.Reactor,
      Adapters.Trigger,
      Adapters.Oban,
      Adapters.Ash
    ]
  end

  def lookup_builder(root, nodes, runtime), do: ModuleIndex.build(nodes, root, runtime)
  def node_source(root) do
    with {:ok, manifest} <- Foundry.Manifest.Parser.read(root) do
      {nodes, _edges} = GraphBuilder.build(root, manifest)
      nodes
    else
      _ -> []
    end
  end
  def trace_dir(root), do: Path.join(root, ".foundry/scenario_traces")

  def frameworks do
    [ScenarioTracer.TestFrameworks.ExUnit, ScenarioTracer.TestFrameworks.StreamData]
  end
end