jojo/tests/integration/user_keys_test.go
2026-05-16 11:51:17 +02:00

52 lines
1.9 KiB
Go

// Copyright 2025 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: GPL-3.0-or-later
package integration
import (
"fmt"
"net/http"
"net/url"
"testing"
"forgejo.org/modules/test"
"forgejo.org/tests"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestVerifySSHkeyPage(t *testing.T) {
defer tests.PrepareTestEnv(t)()
// user2 has an SSH key in fixtures to test this on
session := loginUser(t, "user2")
page := NewHTMLParser(t, session.MakeRequest(t, NewRequest(t, "GET", "/user/settings/keys"), http.StatusOK).Body)
link, exists := page.Find("#keys-ssh a.button[href^='?verify_ssh=']").Attr("href")
assert.True(t, exists)
page = NewHTMLParser(t, session.MakeRequest(t, NewRequest(t, "GET", fmt.Sprintf("/user/settings/keys%s", link)), http.StatusOK).Body)
// The hint contains a link to the same page the user is at now to get it reloaded if followed
linkShown, exists := page.Find("#keys-ssh form[action='/user/settings/keys'] .help a").Attr("href")
assert.True(t, exists)
// QueryUnescape links before comparison, because they contain "%3a" versus "%3A", both unescaping to ":"
linkUnescaped, err := url.QueryUnescape(link)
require.NoError(t, err)
linkShownUnescaped, err := url.QueryUnescape(linkShown)
require.NoError(t, err)
assert.Equal(t, linkUnescaped, linkShownUnescaped)
// The token changes every minute, we can avoid this sleep via timeutil and mocking.
test.SleepTillNextMinute()
// Verify that if you refresh it via the link another token is shown.
token, exists := page.Find("#keys-ssh form input[readonly]").Attr("value")
assert.True(t, exists)
page = NewHTMLParser(t, session.MakeRequest(t, NewRequestf(t, "GET", "/user/settings/keys%s", linkShown), http.StatusOK).Body)
otherToken, exists := page.Find("#keys-ssh form .field input[readonly]").Attr("value")
assert.True(t, exists)
assert.NotEqual(t, token, otherToken)
}