tarakan/test/tarakan_web/live/repository_new_live_test.exs
Maxfield Luke af6077b9c3
All checks were successful
CI and deploy / Test (push) Successful in 4m52s
CI and deploy / Deploy production (push) Successful in 23s
Initial commit on Forgejo
Fresh repository history for elektrine/tarakan hosted at
https://git.elektrine.com/elektrine/tarakan.
2026-07-29 04:43:40 -04:00

111 lines
3.5 KiB
Elixir

defmodule TarakanWeb.RepositoryNewLiveTest do
use TarakanWeb.ConnCase, async: false
import Phoenix.LiveViewTest
alias Tarakan.HostedRepositories
alias Tarakan.Repositories
setup :register_and_log_in_account
setup do
on_exit(fn ->
File.rm_rf(Application.fetch_env!(:tarakan, Tarakan.HostedRepositories)[:root])
end)
:ok
end
test "requires authentication" do
conn = Phoenix.ConnTest.build_conn()
assert {:error, {:redirect, %{to: path}}} = live(conn, ~p"/repositories/new")
assert path =~ "/accounts/log-in"
end
test "creates a hosted repository and navigates to it", %{conn: conn, account: account} do
{:ok, view, _html} = live(conn, ~p"/repositories/new")
assert has_element?(view, "#new-repository-form")
view
|> form("#new-repository-form", repository: %{name: "from-the-ui"})
|> render_submit()
assert_redirect(view, "/#{account.handle}/from-the-ui")
assert HostedRepositories.resolve(account.handle, "from-the-ui")
# the bare GitHub-style path must dispatch through the hosted scope
{:ok, repo_view, _html} = live(conn, "/#{account.handle}/from-the-ui")
assert has_element?(repo_view, "#repository-name")
end
test "shows validation errors inline", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/repositories/new")
html =
view
|> form("#new-repository-form", repository: %{name: "bad name"})
|> render_submit()
assert html =~ "may only contain"
end
describe "remote registration" do
setup %{conn: conn} do
%{conn: log_in_account(conn, github_account_fixture())}
end
test "registers a repository and opens its public record", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/repositories/new")
view
|> form("#register-remote-form", repository: %{url: "github.com/OpenAI/Codex"})
|> render_submit()
assert_redirect(view, ~p"/github.com/openai/codex")
assert Repositories.get_github_repository("openai", "codex")
{:ok, record_view, _html} = live(conn, ~p"/github.com/openai/codex/security")
assert has_element?(record_view, "#repository-name")
assert has_element?(record_view, "#repository-source-link")
assert has_element?(record_view, "#github-metadata")
assert has_element?(record_view, "#repository-submitter")
assert has_element?(record_view, "#scans-empty")
end
test "shows a useful error for an invalid repository", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/repositories/new")
view
|> form("#register-remote-form",
repository: %{url: "https://example.com/not/github"}
)
|> render_submit()
assert has_element?(view, "#repository_url-error")
end
test "rejects a valid-looking repository that GitHub cannot find", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/repositories/new")
view
|> form("#register-remote-form", repository: %{url: "missing/repository"})
|> render_submit()
assert has_element?(view, "#repository_url-error")
refute Repositories.get_github_repository("missing", "repository")
end
test "shows the same safe error for a private repository", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/repositories/new")
view
|> form("#register-remote-form", repository: %{url: "private/repository"})
|> render_submit()
assert has_element?(view, "#repository_url-error")
refute Repositories.get_github_repository("private", "repository")
end
end
end