Files
forge/tests/integration/org_worktime_test.go
zeekayandHanzo Dev aa87442fdd Record upstream authorship centrally in NOTICE instead of in every file header
Source files keep their SPDX-License-Identifier and Hanzo copyright line; the
Gitea, Gogs and LFS Test Server copyrights they used to repeat now live once in
NOTICE, alongside LICENSE. The header lint accepts any copyright line above the
SPDX line, so it no longer demands an upstream one.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-10 17:50:35 -07:00

293 lines
6.3 KiB
Go

// Copyright 2026 Hanzo AI, Inc. All rights reserved.
// SPDX-License-Identifier: MIT
package integration_test
import (
"testing"
"github.com/hanzoai/git/models/organization"
"github.com/hanzoai/git/models/unittest"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// TestTimesByRepos tests TimesByRepos functionality
func testTimesByRepos(t *testing.T) {
kases := []struct {
name string
unixfrom int64
unixto int64
orgname int64
expected []organization.WorktimeSumByRepos
}{
{
name: "Full sum for org 1",
unixfrom: 0,
unixto: 9223372036854775807,
orgname: 1,
expected: []organization.WorktimeSumByRepos(nil),
},
{
name: "Full sum for org 2",
unixfrom: 0,
unixto: 9223372036854775807,
orgname: 2,
expected: []organization.WorktimeSumByRepos{
{
RepoName: "repo1",
SumTime: 4083,
},
{
RepoName: "repo2",
SumTime: 75,
},
},
},
{
name: "Simple time bound",
unixfrom: 946684801,
unixto: 946684802,
orgname: 2,
expected: []organization.WorktimeSumByRepos{
{
RepoName: "repo1",
SumTime: 3662,
},
},
},
{
name: "Both times inclusive",
unixfrom: 946684801,
unixto: 946684801,
orgname: 2,
expected: []organization.WorktimeSumByRepos{
{
RepoName: "repo1",
SumTime: 3661,
},
},
},
{
name: "Should ignore deleted",
unixfrom: 947688814,
unixto: 947688815,
orgname: 2,
expected: []organization.WorktimeSumByRepos{
{
RepoName: "repo2",
SumTime: 71,
},
},
},
}
// Run test kases
for _, kase := range kases {
t.Run(kase.name, func(t *testing.T) {
org, err := organization.GetOrgByID(t.Context(), kase.orgname)
assert.NoError(t, err)
results, err := organization.GetWorktimeByRepos(t.Context(), org, kase.unixfrom, kase.unixto)
assert.NoError(t, err)
assert.Equal(t, kase.expected, results)
})
}
}
// TestTimesByMilestones tests TimesByMilestones functionality
func testTimesByMilestones(t *testing.T) {
kases := []struct {
name string
unixfrom int64
unixto int64
orgname int64
expected []organization.WorktimeSumByMilestones
}{
{
name: "Full sum for org 1",
unixfrom: 0,
unixto: 9223372036854775807,
orgname: 1,
expected: []organization.WorktimeSumByMilestones(nil),
},
{
name: "Full sum for org 2",
unixfrom: 0,
unixto: 9223372036854775807,
orgname: 2,
expected: []organization.WorktimeSumByMilestones{
{
RepoName: "repo1",
MilestoneName: "",
MilestoneID: 0,
SumTime: 401,
HideRepoName: false,
},
{
RepoName: "repo1",
MilestoneName: "milestone1",
MilestoneID: 1,
SumTime: 3682,
HideRepoName: true,
},
{
RepoName: "repo2",
MilestoneName: "",
MilestoneID: 0,
SumTime: 75,
HideRepoName: false,
},
},
},
{
name: "Simple time bound",
unixfrom: 946684801,
unixto: 946684802,
orgname: 2,
expected: []organization.WorktimeSumByMilestones{
{
RepoName: "repo1",
MilestoneName: "milestone1",
MilestoneID: 1,
SumTime: 3662,
HideRepoName: false,
},
},
},
{
name: "Both times inclusive",
unixfrom: 946684801,
unixto: 946684801,
orgname: 2,
expected: []organization.WorktimeSumByMilestones{
{
RepoName: "repo1",
MilestoneName: "milestone1",
MilestoneID: 1,
SumTime: 3661,
HideRepoName: false,
},
},
},
{
name: "Should ignore deleted",
unixfrom: 947688814,
unixto: 947688815,
orgname: 2,
expected: []organization.WorktimeSumByMilestones{
{
RepoName: "repo2",
MilestoneName: "",
MilestoneID: 0,
SumTime: 71,
HideRepoName: false,
},
},
},
}
// Run test kases
for _, kase := range kases {
t.Run(kase.name, func(t *testing.T) {
org, err := organization.GetOrgByID(t.Context(), kase.orgname)
require.NoError(t, err)
results, err := organization.GetWorktimeByMilestones(t.Context(), org, kase.unixfrom, kase.unixto)
if assert.NoError(t, err) {
assert.Equal(t, kase.expected, results)
}
})
}
}
// TestTimesByMembers tests TimesByMembers functionality
func testTimesByMembers(t *testing.T) {
kases := []struct {
name string
unixfrom int64
unixto int64
orgname int64
expected []organization.WorktimeSumByMembers
}{
{
name: "Full sum for org 1",
unixfrom: 0,
unixto: 9223372036854775807,
orgname: 1,
expected: []organization.WorktimeSumByMembers(nil),
},
{
// Test case: Sum of times forever in org no. 2
name: "Full sum for org 2",
unixfrom: 0,
unixto: 9223372036854775807,
orgname: 2,
expected: []organization.WorktimeSumByMembers{
{
UserName: "user2",
SumTime: 3666,
},
{
UserName: "user1",
SumTime: 491,
},
},
},
{
name: "Simple time bound",
unixfrom: 946684801,
unixto: 946684802,
orgname: 2,
expected: []organization.WorktimeSumByMembers{
{
UserName: "user2",
SumTime: 3662,
},
},
},
{
name: "Both times inclusive",
unixfrom: 946684801,
unixto: 946684801,
orgname: 2,
expected: []organization.WorktimeSumByMembers{
{
UserName: "user2",
SumTime: 3661,
},
},
},
{
name: "Should ignore deleted",
unixfrom: 947688814,
unixto: 947688815,
orgname: 2,
expected: []organization.WorktimeSumByMembers{
{
UserName: "user1",
SumTime: 71,
},
},
},
}
// Run test kases
for _, kase := range kases {
t.Run(kase.name, func(t *testing.T) {
org, err := organization.GetOrgByID(t.Context(), kase.orgname)
assert.NoError(t, err)
results, err := organization.GetWorktimeByMembers(t.Context(), org, kase.unixfrom, kase.unixto)
assert.NoError(t, err)
assert.Equal(t, kase.expected, results)
})
}
}
func TestOrgWorktime(t *testing.T) {
// we need to run these tests in integration test because there are complex SQL queries
assert.NoError(t, unittest.PrepareTestDatabase())
t.Run("ByRepos", testTimesByRepos)
t.Run("ByMilestones", testTimesByMilestones)
t.Run("ByMembers", testTimesByMembers)
}