Forgejo/routers/web/admin/admin_test.go
Gusted f68bc0ec6a
[REFACTOR] Simplify converting struct to map in admin stats
- Instead of relying on JSON to convert the struct to map, use
`reflect` to do this conversion. Also simplify it a bit by only passing
one variable to the template.
- This avoids issues where the conversion to JSON causes changes in
the value, for example huge numbers are converted to its scientific
notation but are consequently not converted back when being displayed.
- Adds unit tests.
- Resolves an issue where the amount of comments is being displayed in
scientific notation on Codeberg.
2024-02-22 22:25:19 +01:00

117 lines
3.5 KiB
Go

// Copyright 2019 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package admin
import (
"testing"
activities_model "code.gitea.io/gitea/models/activities"
"code.gitea.io/gitea/models/unittest"
"code.gitea.io/gitea/modules/contexttest"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/test"
"github.com/stretchr/testify/assert"
)
func TestShadowPassword(t *testing.T) {
kases := []struct {
Provider string
CfgItem string
Result string
}{
{
Provider: "redis",
CfgItem: "network=tcp,addr=:6379,password=gitea,db=0,pool_size=100,idle_timeout=180",
Result: "network=tcp,addr=:6379,password=******,db=0,pool_size=100,idle_timeout=180",
},
{
Provider: "mysql",
CfgItem: "root:@tcp(localhost:3306)/gitea?charset=utf8",
Result: "root:******@tcp(localhost:3306)/gitea?charset=utf8",
},
{
Provider: "mysql",
CfgItem: "/gitea?charset=utf8",
Result: "/gitea?charset=utf8",
},
{
Provider: "mysql",
CfgItem: "user:mypassword@/dbname",
Result: "user:******@/dbname",
},
{
Provider: "postgres",
CfgItem: "user=pqgotest dbname=pqgotest sslmode=verify-full",
Result: "user=pqgotest dbname=pqgotest sslmode=verify-full",
},
{
Provider: "postgres",
CfgItem: "user=pqgotest password= dbname=pqgotest sslmode=verify-full",
Result: "user=pqgotest password=****** dbname=pqgotest sslmode=verify-full",
},
{
Provider: "postgres",
CfgItem: "postgres://user:pass@hostname/dbname",
Result: "postgres://user:******@hostname/dbname",
},
{
Provider: "couchbase",
CfgItem: "http://dev-couchbase.example.com:8091/",
Result: "http://dev-couchbase.example.com:8091/",
},
{
Provider: "couchbase",
CfgItem: "http://user:the_password@dev-couchbase.example.com:8091/",
Result: "http://user:******@dev-couchbase.example.com:8091/",
},
}
for _, k := range kases {
assert.EqualValues(t, k.Result, shadowPassword(k.Provider, k.CfgItem))
}
}
func TestMonitorStats(t *testing.T) {
unittest.PrepareTestEnv(t)
t.Run("Normal", func(t *testing.T) {
defer test.MockVariableValue(&setting.Metrics.EnabledIssueByLabel, false)()
defer test.MockVariableValue(&setting.Metrics.EnabledIssueByRepository, false)()
ctx, _ := contexttest.MockContext(t, "admin/stats")
MonitorStats(ctx)
// Test some of the stats manually.
mappedStats := ctx.Data["Stats"].(map[string]any)
stats := activities_model.GetStatistic(ctx).Counter
assert.EqualValues(t, stats.Comment, mappedStats["Comment"])
assert.EqualValues(t, stats.Issue, mappedStats["Issue"])
assert.EqualValues(t, stats.User, mappedStats["User"])
assert.EqualValues(t, stats.Milestone, mappedStats["Milestone"])
// Ensure that these aren't set.
assert.Empty(t, stats.IssueByLabel)
assert.Empty(t, stats.IssueByRepository)
assert.Nil(t, mappedStats["IssueByLabel"])
assert.Nil(t, mappedStats["IssueByRepository"])
})
t.Run("IssueByX", func(t *testing.T) {
defer test.MockVariableValue(&setting.Metrics.EnabledIssueByLabel, true)()
defer test.MockVariableValue(&setting.Metrics.EnabledIssueByRepository, true)()
ctx, _ := contexttest.MockContext(t, "admin/stats")
MonitorStats(ctx)
mappedStats := ctx.Data["Stats"].(map[string]any)
stats := activities_model.GetStatistic(ctx).Counter
assert.NotEmpty(t, stats.IssueByLabel)
assert.NotEmpty(t, stats.IssueByRepository)
assert.EqualValues(t, stats.IssueByLabel, mappedStats["IssueByLabel"])
assert.EqualValues(t, stats.IssueByRepository, mappedStats["IssueByRepository"])
})
}