mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2026-05-15 23:40:26 +00:00
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>
136 lines
5.4 KiB
Go
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)
|
|
}
|