jojo/tests/integration/navbar_test.go
0ko 3cafb7fa6c chore(ui): change /devtest to /-/demo (#11019)
It has always been largely used for showcasing UI elements but that name didn't work too well for it.

Testing:
Some of existing tests depend on these pages, making it redundant to create extra tests.

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/11019
Reviewed-by: Michael Kriese <michael.kriese@gmx.de>
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
2026-01-26 13:12:25 +01:00

136 lines
5.4 KiB
Go

// Copyright 2025 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: GPL-3.0-or-later
package integration
import (
"net/http"
"strings"
"testing"
"forgejo.org/modules/setting"
"forgejo.org/modules/test"
"forgejo.org/modules/translation"
"forgejo.org/tests"
"github.com/stretchr/testify/assert"
)
/* TestNavbarItems asserts go tmpl logic of navbar */
func TestNavbarItems(t *testing.T) {
defer tests.PrepareTestEnv(t)()
// The navbar can be tested on any page, but preferably a lightweight one
testPage := "/explore/organizations"
locale := translation.NewLocale("en-US")
adminUser := loginUser(t, "user1")
regularUser := loginUser(t, "user2")
t.Run(`"Create..." dropdown - migrations disallowed`, func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
defer test.MockVariableValue(&setting.Repository.DisableMigrations, true)()
page := NewHTMLParser(t, regularUser.MakeRequest(t, NewRequest(t, "GET", testPage), http.StatusOK).Body)
page.AssertElement(t, `details.dropdown a[href="/repo/migrate"]`, false)
})
t.Run(`"Create..." dropdown - creating orgs disallowed`, func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
defer test.MockVariableValue(&setting.Admin.DisableRegularOrgCreation, true)()
// The restriction applies to a regular user
page := NewHTMLParser(t, regularUser.MakeRequest(t, NewRequest(t, "GET", testPage), http.StatusOK).Body)
page.AssertElement(t, `details.dropdown a[href="/org/create"]`, false)
// The restriction does not apply to an admin
page = NewHTMLParser(t, adminUser.MakeRequest(t, NewRequest(t, "GET", testPage), http.StatusOK).Body)
page.AssertElement(t, `details.dropdown a[href="/org/create"]`, true)
})
t.Run(`"Create..." dropdown - default conditions`, func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
// Assert that items are present and their contents
assertItems := func(t *testing.T, session *TestSession) {
page := NewHTMLParser(t, session.MakeRequest(t, NewRequest(t, "GET", testPage), http.StatusOK).Body)
links := page.Find(`#navbar .dropdown:has(summary[data-tooltip-content="Create…"]) .content`)
assert.Equal(t, locale.TrString("new_repo.link"), strings.TrimSpace(links.Find(`a[href="/repo/create"]`).Text()))
assert.Equal(t, locale.TrString("new_migrate.link"), strings.TrimSpace(links.Find(`a[href="/repo/migrate"]`).Text()))
assert.Equal(t, locale.TrString("new_org.link"), strings.TrimSpace(links.Find(`a[href="/org/create"]`).Text()))
}
assertItems(t, regularUser)
assertItems(t, adminUser)
})
t.Run(`User dropdown - stars are disabled`, func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
defer test.MockVariableValue(&setting.Repository.DisableStars, true)()
page := NewHTMLParser(t, regularUser.MakeRequest(t, NewRequest(t, "GET", testPage), http.StatusOK).Body)
page.AssertElement(t, `details.dropdown a[href$="?tab=stars"]`, false)
})
t.Run(`User dropdown - instance in dev mode`, func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
defer test.MockVariableValue(&setting.IsProd, false)()
page := NewHTMLParser(t, regularUser.MakeRequest(t, NewRequest(t, "GET", testPage), http.StatusOK).Body)
page.AssertElement(t, `details.dropdown a[href="/-/demo"]`, true)
testNavbarUserMenuActiveItem(t, regularUser, "/user/settings")
testNavbarUserMenuActiveItem(t, adminUser, "/admin")
})
t.Run(`User dropdown - default conditions`, func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
// What regular user sees
assertions := []struct {
selector string
exists bool
}{
{`details.dropdown a[href="/user2"]`, true},
{`details.dropdown a[href="/user2?tab=stars"]`, true},
{`details.dropdown a[href="/notifications/subscriptions"]`, true},
{`details.dropdown a[href="/user/settings"]`, true},
{`details.dropdown a[href="/admin"]`, false},
{`details.dropdown a[href="/-/demo"]`, false},
{`details.dropdown a[href="https://forgejo.org/docs/latest/"]`, true},
{`details.dropdown a[data-url="/user/logout"]`, true},
}
page := NewHTMLParser(t, regularUser.MakeRequest(t, NewRequest(t, "GET", testPage), http.StatusOK).Body)
for _, assertion := range assertions {
page.AssertElement(t, assertion.selector, assertion.exists)
}
// What admin user sees
assertions = []struct {
selector string
exists bool
}{
{`details.dropdown a[href="/user1"]`, true},
{`details.dropdown a[href="/user1?tab=stars"]`, true},
{`details.dropdown a[href="/notifications/subscriptions"]`, true},
{`details.dropdown a[href="/user/settings"]`, true},
{`details.dropdown a[href="/admin"]`, true},
{`details.dropdown a[href="/-/demo"]`, false},
{`details.dropdown a[href="https://forgejo.org/docs/latest/"]`, true},
{`details.dropdown a[data-url="/user/logout"]`, true},
}
page = NewHTMLParser(t, adminUser.MakeRequest(t, NewRequest(t, "GET", testPage), http.StatusOK).Body)
for _, assertion := range assertions {
page.AssertElement(t, assertion.selector, assertion.exists)
}
testNavbarUserMenuActiveItem(t, regularUser, "/user/settings")
testNavbarUserMenuActiveItem(t, adminUser, "/admin")
})
}
// When visiting certain pages, the corresponding entry of user menu is highlighted
func testNavbarUserMenuActiveItem(t *testing.T, session *TestSession, url string) {
page := NewHTMLParser(t, session.MakeRequest(t, NewRequest(t, "GET", url), http.StatusOK).Body)
// AssertElement will only pass if there's just one such element
page.AssertElement(t, "#navbar details.dropdown li > .active", true)
}