mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-03 17:23:55 +00:00
f09f6e029b
This implements "repository flags", a way for instance administrators to
assign custom flags to repositories. The idea is that custom templates
can look at these flags, and display banners based on them, Forgejo does
not provide anything built on top of it, just the foundation. The
feature is optional, and disabled by default. To enable it, set
`[repository].ENABLE_FLAGS = true`.
On the UI side, instance administrators will see a new "Manage flags"
tab on repositories, and a list of enabled tags (if any) on the
repository home page. The "Manage flags" page allows them to remove
existing flags, or add any new ones that are listed in
`[repository].SETTABLE_FLAGS`.
The model does not enforce that only the `SETTABLE_FLAGS` are present.
If the setting is changed, old flags may remain present in the database,
and anything that uses them, will still work. The repository flag
management page will allow an instance administrator to remove them, but
not set them, once removed.
Signed-off-by: Gergely Nagy <forgejo@gergo.csillger.hu>
(cherry picked from commit ba735ce222
)
115 lines
3.1 KiB
Go
115 lines
3.1 KiB
Go
// Copyright 2024 The Forgejo Authors c/o Codeberg e.V.. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package repo_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"code.gitea.io/gitea/models/db"
|
|
repo_model "code.gitea.io/gitea/models/repo"
|
|
"code.gitea.io/gitea/models/unittest"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestRepositoryFlags(t *testing.T) {
|
|
assert.NoError(t, unittest.PrepareTestDatabase())
|
|
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 10})
|
|
|
|
// ********************
|
|
// ** NEGATIVE TESTS **
|
|
// ********************
|
|
|
|
// Unless we add flags, the repo has none
|
|
flags, err := repo.ListFlags(db.DefaultContext)
|
|
assert.NoError(t, err)
|
|
assert.Empty(t, flags)
|
|
|
|
// If the repo has no flags, it is not flagged
|
|
flagged := repo.IsFlagged(db.DefaultContext)
|
|
assert.False(t, flagged)
|
|
|
|
// Trying to find a flag when there is none
|
|
has := repo.HasFlag(db.DefaultContext, "foo")
|
|
assert.False(t, has)
|
|
|
|
// Trying to retrieve a non-existent flag indicates not found
|
|
has, _, err = repo.GetFlag(db.DefaultContext, "foo")
|
|
assert.NoError(t, err)
|
|
assert.False(t, has)
|
|
|
|
// Deleting a non-existent flag fails
|
|
deleted, err := repo.DeleteFlag(db.DefaultContext, "no-such-flag")
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, int64(0), deleted)
|
|
|
|
// ********************
|
|
// ** POSITIVE TESTS **
|
|
// ********************
|
|
|
|
// Adding a flag works
|
|
err = repo.AddFlag(db.DefaultContext, "foo")
|
|
assert.NoError(t, err)
|
|
|
|
// Adding it again fails
|
|
err = repo.AddFlag(db.DefaultContext, "foo")
|
|
assert.Error(t, err)
|
|
|
|
// Listing flags includes the one we added
|
|
flags, err = repo.ListFlags(db.DefaultContext)
|
|
assert.NoError(t, err)
|
|
assert.Len(t, flags, 1)
|
|
assert.Equal(t, "foo", flags[0].Name)
|
|
|
|
// With a flag added, the repo is flagged
|
|
flagged = repo.IsFlagged(db.DefaultContext)
|
|
assert.True(t, flagged)
|
|
|
|
// The flag can be found
|
|
has = repo.HasFlag(db.DefaultContext, "foo")
|
|
assert.True(t, has)
|
|
|
|
// Added flag can be retrieved
|
|
_, flag, err := repo.GetFlag(db.DefaultContext, "foo")
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, "foo", flag.Name)
|
|
|
|
// Deleting a flag works
|
|
deleted, err = repo.DeleteFlag(db.DefaultContext, "foo")
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, int64(1), deleted)
|
|
|
|
// The list is now empty
|
|
flags, err = repo.ListFlags(db.DefaultContext)
|
|
assert.NoError(t, err)
|
|
assert.Empty(t, flags)
|
|
|
|
// Replacing an empty list works
|
|
err = repo.ReplaceAllFlags(db.DefaultContext, []string{"bar"})
|
|
assert.NoError(t, err)
|
|
|
|
// The repo is now flagged with "bar"
|
|
has = repo.HasFlag(db.DefaultContext, "bar")
|
|
assert.True(t, has)
|
|
|
|
// Replacing a tag set with another works
|
|
err = repo.ReplaceAllFlags(db.DefaultContext, []string{"baz", "quux"})
|
|
assert.NoError(t, err)
|
|
|
|
// The repo now has two tags
|
|
flags, err = repo.ListFlags(db.DefaultContext)
|
|
assert.NoError(t, err)
|
|
assert.Len(t, flags, 2)
|
|
assert.Equal(t, "baz", flags[0].Name)
|
|
assert.Equal(t, "quux", flags[1].Name)
|
|
|
|
// Replacing flags with an empty set deletes all flags
|
|
err = repo.ReplaceAllFlags(db.DefaultContext, []string{})
|
|
assert.NoError(t, err)
|
|
|
|
// The repo is now unflagged
|
|
flagged = repo.IsFlagged(db.DefaultContext)
|
|
assert.False(t, flagged)
|
|
}
|