defmodule ToweropsWeb.Api.V1.ActivityControllerTest do use ToweropsWeb.ConnCase, async: true import Towerops.AccountsFixtures import Towerops.DevicesFixtures import Towerops.OrganizationsFixtures alias Towerops.ApiTokens setup do user = user_fixture() organization = organization_fixture(user.id) {:ok, {_token, raw_token}} = ApiTokens.create_api_token(%{ organization_id: organization.id, user_id: user.id, name: "Test Token" }) # Seed a device so the activity feed has data device_fixture(%{organization_id: organization.id}) conn = build_conn() |> put_req_header("authorization", "Bearer #{raw_token}") |> put_req_header("accept", "application/json") %{conn: conn, user: user, organization: organization} end describe "index/2" do test "returns activity feed data", %{conn: conn} do conn = get(conn, ~p"/api/v1/activity") assert %{"data" => data} = json_response(conn, 200) assert is_list(data) and data != [] end test "respects limit parameter", %{conn: conn} do conn = get(conn, ~p"/api/v1/activity?limit=5") assert %{"data" => data} = json_response(conn, 200) assert length(data) <= 5 end test "handles invalid limit gracefully (uses default)", %{conn: conn} do conn = get(conn, ~p"/api/v1/activity?limit=notanumber") assert %{"data" => _data} = json_response(conn, 200) end test "filters by types parameter", %{conn: conn} do conn = get(conn, ~p"/api/v1/activity?types=device_added") assert %{"data" => data} = json_response(conn, 200) assert is_list(data) and data != [] end test "handles invalid types gracefully", %{conn: conn} do conn = get(conn, ~p"/api/v1/activity?types=nonexistent_atom_xyz_12345") assert %{"data" => data} = json_response(conn, 200) assert data == [] end end describe "authentication" do test "returns 401 without authorization header" do conn = build_conn() |> put_req_header("accept", "application/json") |> get(~p"/api/v1/activity") assert %{"error" => _message} = json_response(conn, 401) end test "returns 401 with invalid token" do conn = build_conn() |> put_req_header("authorization", "Bearer towerops_invalid_token") |> put_req_header("accept", "application/json") |> get(~p"/api/v1/activity") assert %{"error" => _message} = json_response(conn, 401) end end end