mirror of
https://github.com/hanzoai/forge.git
synced 2026-10-30 15:00:39 +00:00
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]>
293 lines
6.3 KiB
Go
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)
|
|
}
|