defmodule CSVLoader do @moduledoc """ Loads test cases from CSV files. """ @doc """ Loads test cases from a CSV file. ## Parameters - csv_path: Path to the CSV file ## Returns List of test case maps """ def load(csv_path) do if !File.exists?(csv_path) do raise "CSV file not found: #{csv_path}" end csv_path |> File.stream!() |> Stream.map(&String.trim/1) |> Stream.reject(&(&1 == "")) |> Enum.to_list() |> parse_csv() end defp parse_csv([header_line | data_lines]) do headers = parse_csv_line(header_line) Enum.map(data_lines, fn line -> values = parse_csv_line(line) headers |> Enum.zip(values) |> Enum.into(%{}, fn {key, value} -> {String.to_atom(key), value} end) end) end defp parse_csv([]), do: [] defp parse_csv_line(line) do # Simple CSV parser (handles basic cases without quoted fields with commas) String.split(line, ",") |> Enum.map(&String.trim/1) end @doc """ Loads test cases and filters by specific test IDs if provided. """ def load_with_filter(csv_path, test_ids \\ nil) do test_cases = load(csv_path) if test_ids && test_ids != [] do Enum.filter(test_cases, fn tc -> Enum.member?(test_ids, tc.test_id) end) else test_cases end end end