test(package): gitea: cover heatmap author-date semantics

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus-Junior (openai/gpt-5.5) <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-06-06 22:10:18 +00:00
parent c2e0ba200c
commit 28dde5b9b1
@@ -12,9 +12,11 @@ import (
activities_model "code.gitea.io/gitea/models/activities" activities_model "code.gitea.io/gitea/models/activities"
"code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/organization" "code.gitea.io/gitea/models/organization"
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unittest" "code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user" user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/json" "code.gitea.io/gitea/modules/json"
"code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/timeutil"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@@ -33,7 +35,11 @@ func TestGetUserHeatmapDataByUser(t *testing.T) {
insertHeatmapContribution(t, 2, 1, "user2-public-author-date", 1603009800) insertHeatmapContribution(t, 2, 1, "user2-public-author-date", 1603009800)
insertHeatmapContribution(t, 2, 1, "user2-public-same-bucket", 1603009850) insertHeatmapContribution(t, 2, 1, "user2-public-same-bucket", 1603009850)
insertHeatmapContribution(t, 2, 2, "user2-private-hidden", 1603010700) insertHeatmapContribution(t, 2, 2, "user2-private-hidden", 1603010700)
insertHeatmapContribution(t, 2, 4, "user2-hidden-owner-hidden", 1603010700)
insertHeatmapContribution(t, 2, 1, "user2-future-hidden", timeutil.TimeStampNow()+900)
insertHeatmapContribution(t, 2, 999999, "user2-deleted-repo-hidden", 1603011600)
insertHeatmapContribution(t, 3, 1, "other-author-ignored", 1603010700) insertHeatmapContribution(t, 3, 1, "other-author-ignored", 1603010700)
setUserVisibility(t, 5, structs.VisibleTypePrivate)
testCases := []struct { testCases := []struct {
desc string desc string
@@ -85,6 +91,38 @@ func TestGetUserHeatmapDataByUser(t *testing.T) {
} }
} }
func TestGetUserHeatmapDataByUserUsesCurrentRepoVisibility(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase())
require.NoError(t, db.TruncateBeans(t.Context(), &activities_model.HeatmapContribution{}))
require.NoError(t, user_model.SetIncludePrivateContributions(t.Context(), 2, false))
timeutil.MockSet(time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC))
defer timeutil.MockUnset()
insertHeatmapContribution(t, 2, 1, "user2-visibility-flip", 1603009800)
target := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
heatmap, err := activities_model.GetUserHeatmapDataByUser(t.Context(), target, nil)
require.NoError(t, err)
assertHeatmapJSON(t, heatmap, `[{
"timestamp": 1603009800,
"contributions": 1
}]`)
setRepoPrivate(t, 1, true)
heatmap, err = activities_model.GetUserHeatmapDataByUser(t.Context(), target, nil)
require.NoError(t, err)
assert.Empty(t, heatmap)
require.NoError(t, user_model.SetIncludePrivateContributions(t.Context(), 2, true))
heatmap, err = activities_model.GetUserHeatmapDataByUser(t.Context(), target, nil)
require.NoError(t, err)
assertHeatmapJSON(t, heatmap, `[{
"timestamp": 1603009800,
"contributions": 1
}]`)
}
func TestGetUserHeatmapDataByOrgTeam(t *testing.T) { func TestGetUserHeatmapDataByOrgTeam(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase()) require.NoError(t, unittest.PrepareTestDatabase())
require.NoError(t, db.TruncateBeans(t.Context(), &activities_model.HeatmapContribution{})) require.NoError(t, db.TruncateBeans(t.Context(), &activities_model.HeatmapContribution{}))
@@ -136,9 +174,7 @@ func TestUserHeatmapPrivateContributionsOptIn(t *testing.T) {
require.NoError(t, user_model.SetIncludePrivateContributions(t.Context(), 16, true)) require.NoError(t, user_model.SetIncludePrivateContributions(t.Context(), 16, true))
heatmap, err := activities_model.GetUserHeatmapDataByUser(t.Context(), target, nil) heatmap, err := activities_model.GetUserHeatmapDataByUser(t.Context(), target, nil)
require.NoError(t, err) require.NoError(t, err)
jsonData, err := json.Marshal(heatmap) assertHeatmapJSON(t, heatmap, `[{"timestamp":1603009800,"contributions":2},{"timestamp":1603010700,"contributions":1}]`)
require.NoError(t, err)
assert.JSONEq(t, `[{"timestamp":1603009800,"contributions":2},{"timestamp":1603010700,"contributions":1}]`, string(jsonData))
target.KeepActivityPrivate = true target.KeepActivityPrivate = true
_, err = db.GetEngine(t.Context()).ID(target.ID).Cols("keep_activity_private").Update(target) _, err = db.GetEngine(t.Context()).ID(target.ID).Cols("keep_activity_private").Update(target)
@@ -172,6 +208,41 @@ func insertHeatmapContribution(t *testing.T, userID, repoID int64, commitSHA str
})) }))
} }
func setRepoPrivate(t *testing.T, repoID int64, isPrivate bool) {
t.Helper()
repo := &repo_model.Repository{ID: repoID, IsPrivate: isPrivate}
_, err := db.GetEngine(t.Context()).ID(repoID).Cols("is_private").Update(repo)
require.NoError(t, err)
}
func setUserVisibility(t *testing.T, userID int64, visibility structs.VisibleType) {
t.Helper()
user := &user_model.User{ID: userID, Visibility: visibility}
_, err := db.GetEngine(t.Context()).ID(userID).Cols("visibility").Update(user)
require.NoError(t, err)
}
func assertHeatmapJSON(t *testing.T, heatmap []*activities_model.UserHeatmapData, expected string) {
t.Helper()
jsonData, err := json.Marshal(heatmap)
require.NoError(t, err)
assert.JSONEq(t, expected, string(jsonData))
var decoded []map[string]any
require.NoError(t, json.Unmarshal(jsonData, &decoded))
for _, entry := range decoded {
assert.ElementsMatch(t, []string{"timestamp", "contributions"}, mapKeys(entry))
}
}
func mapKeys[K comparable, V any](m map[K]V) []K {
keys := make([]K, 0, len(m))
for key := range m {
keys = append(keys, key)
}
return keys
}
func countHeatmapContributions(heatmap []*activities_model.UserHeatmapData) int { func countHeatmapContributions(heatmap []*activities_model.UserHeatmapData) int {
var contributions int var contributions int
for _, hm := range heatmap { for _, hm := range heatmap {