Files
gitea-tea/internal/app/teams_test.go
T
bircni a3f5468628 fix(team): name the team in delete prompts and protect the owner team
team delete confirmed with "delete team 3 on <host>" and deleted
whatever the ID pointed at, including an organization's owner team.
It now looks the team up first and asks to delete team "devs" (ID 5)
from acme. Deleting an owner team requires --force and, interactively,
typing the team's org/name.

Signed-off-by: bircni <bircni@icloud.com>
2026-10-11 21:54:57 +02:00

55 lines
2.3 KiB
Go

// Copyright 2026 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package app
import (
"context"
"net/http"
"testing"
"gitea.dev/tea/internal/clierr"
"github.com/stretchr/testify/require"
)
func TestTeamDeleteNamesTheTeamAndProtectsTheOwnerTeam(t *testing.T) {
var deleted []string
server := newAuthenticatedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
switch r.Method + " " + r.URL.Path {
case "GET /api/v1/teams/3":
_, _ = w.Write([]byte(`{"id":3,"name":"Owners","permission":"owner","organization":{"username":"acme"}}`))
case "GET /api/v1/teams/5":
_, _ = w.Write([]byte(`{"id":5,"name":"devs","permission":"write","organization":{"username":"acme"}}`))
case "DELETE /api/v1/teams/3", "DELETE /api/v1/teams/5":
deleted = append(deleted, r.URL.Path)
w.WriteHeader(http.StatusNoContent)
default:
t.Errorf("unexpected request %s %s", r.Method, r.URL.Path)
w.WriteHeader(http.StatusTeapot)
}
}))
defer server.Close()
deps, _, _ := serverDeps(t, server.URL)
err := Execute(context.Background(), deps, []string{"team", "delete", "3", "--yes"})
require.Equal(t, clierr.Usage, clierr.ExitCode(err), "%v", err)
require.ErrorContains(t, err, `team "Owners" (ID 3) from acme is the organization's owner team`)
require.ErrorContains(t, err, "--force")
require.Empty(t, deleted)
deps.Streams.InTTY, deps.Streams.ErrTTY = true, true
prompt := &scriptedPrompter{inputs: map[string]string{`Delete owner team "Owners" (ID 3) from acme? Its members lose owner access. Type acme/Owners to confirm:`: "Owners"}}
deps.Prompter = prompt
err = Execute(context.Background(), deps, []string{"team", "delete", "3", "--force"})
require.Equal(t, clierr.Canceled, clierr.ExitCode(err), "%v", err)
require.Len(t, prompt.asked, 1)
require.Empty(t, deleted)
prompt.inputs[prompt.asked[0]] = "acme/Owners"
require.NoError(t, Execute(context.Background(), deps, []string{"team", "delete", "3", "--force"}))
require.Equal(t, []string{"/api/v1/teams/3"}, deleted)
prompt.accept = true
require.NoError(t, Execute(context.Background(), deps, []string{"team", "delete", "5"}))
require.Equal(t, []string{`Delete team "devs" (ID 5) from acme?`}, prompt.confirmations)
require.Equal(t, []string{"/api/v1/teams/3", "/api/v1/teams/5"}, deleted)
}