loading up the forgejo repo on tangled to test page performance
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request 'feat(UI): add package counter to repo/user/org overview pages' (#4697) from mahlzahn/forgejo:add_packages_counter into forgejo

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/4697
Reviewed-by: Gusted <gusted@noreply.codeberg.org>

Gusted a05d4c61 ca5a5bf1

+341 -25
+44 -10
models/packages/package.go
··· 1 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 + // Copyright 2024 The Forgejo Authors. All rights reserved. 2 3 // SPDX-License-Identifier: MIT 3 4 4 5 package packages ··· 12 13 "code.gitea.io/gitea/modules/util" 13 14 14 15 "xorm.io/builder" 16 + "xorm.io/xorm" 15 17 ) 16 18 17 19 func init() { ··· 212 214 213 215 // DeletePackageByID deletes a package by id 214 216 func DeletePackageByID(ctx context.Context, packageID int64) error { 215 - _, err := db.GetEngine(ctx).ID(packageID).Delete(&Package{}) 217 + n, err := db.GetEngine(ctx).ID(packageID).Delete(&Package{}) 218 + if n == 0 && err == nil { 219 + return ErrPackageNotExist 220 + } 216 221 return err 217 222 } 218 223 219 224 // SetRepositoryLink sets the linked repository 220 225 func SetRepositoryLink(ctx context.Context, packageID, repoID int64) error { 221 - _, err := db.GetEngine(ctx).ID(packageID).Cols("repo_id").Update(&Package{RepoID: repoID}) 226 + n, err := db.GetEngine(ctx).ID(packageID).Cols("repo_id").Update(&Package{RepoID: repoID}) 227 + if n == 0 && err == nil { 228 + return ErrPackageNotExist 229 + } 222 230 return err 223 231 } 224 232 ··· 293 301 return pIDs, nil 294 302 } 295 303 296 - // HasOwnerPackages tests if a user/org has accessible packages 297 - func HasOwnerPackages(ctx context.Context, ownerID int64) (bool, error) { 304 + func getPackages(ctx context.Context) *xorm.Session { 298 305 return db.GetEngine(ctx). 299 306 Table("package_version"). 300 307 Join("INNER", "package", "package.id = package_version.package_id"). 301 - Where(builder.Eq{ 302 - "package_version.is_internal": false, 303 - "package.owner_id": ownerID, 304 - }). 305 - Exist(&PackageVersion{}) 308 + Where("package_version.is_internal = ?", false) 309 + } 310 + 311 + func getOwnerPackages(ctx context.Context, ownerID int64) *xorm.Session { 312 + return getPackages(ctx). 313 + Where("package.owner_id = ?", ownerID) 314 + } 315 + 316 + // HasOwnerPackages tests if a user/org has accessible packages 317 + func HasOwnerPackages(ctx context.Context, ownerID int64) (bool, error) { 318 + return getOwnerPackages(ctx, ownerID). 319 + Exist(&Package{}) 320 + } 321 + 322 + // CountOwnerPackages counts user/org accessible packages 323 + func CountOwnerPackages(ctx context.Context, ownerID int64) (int64, error) { 324 + return getOwnerPackages(ctx, ownerID). 325 + Distinct("package.id"). 326 + Count(&Package{}) 327 + } 328 + 329 + func getRepositoryPackages(ctx context.Context, repositoryID int64) *xorm.Session { 330 + return getPackages(ctx). 331 + Where("package.repo_id = ?", repositoryID) 306 332 } 307 333 308 334 // HasRepositoryPackages tests if a repository has packages 309 335 func HasRepositoryPackages(ctx context.Context, repositoryID int64) (bool, error) { 310 - return db.GetEngine(ctx).Where("repo_id = ?", repositoryID).Exist(&Package{}) 336 + return getRepositoryPackages(ctx, repositoryID). 337 + Exist(&PackageVersion{}) 338 + } 339 + 340 + // CountRepositoryPackages counts packages of a repository 341 + func CountRepositoryPackages(ctx context.Context, repositoryID int64) (int64, error) { 342 + return getRepositoryPackages(ctx, repositoryID). 343 + Distinct("package.id"). 344 + Count(&Package{}) 311 345 }
+260 -9
models/packages/package_test.go
··· 1 1 // Copyright 2022 The Gitea Authors. All rights reserved. 2 + // Copyright 2024 The Forgejo Authors. All rights reserved. 2 3 // SPDX-License-Identifier: MIT 3 4 4 5 package packages_test ··· 8 9 9 10 "code.gitea.io/gitea/models/db" 10 11 packages_model "code.gitea.io/gitea/models/packages" 12 + repo_model "code.gitea.io/gitea/models/repo" 11 13 "code.gitea.io/gitea/models/unittest" 12 14 user_model "code.gitea.io/gitea/models/user" 13 15 ··· 15 17 _ "code.gitea.io/gitea/models/actions" 16 18 _ "code.gitea.io/gitea/models/activities" 17 19 18 - "github.com/stretchr/testify/assert" 19 20 "github.com/stretchr/testify/require" 20 21 ) 21 22 ··· 23 24 unittest.MainTest(m) 24 25 } 25 26 26 - func TestHasOwnerPackages(t *testing.T) { 27 + func prepareExamplePackage(t *testing.T) *packages_model.Package { 28 + require.NoError(t, unittest.PrepareTestDatabase()) 29 + 30 + owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) 31 + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3}) 32 + 33 + p0 := &packages_model.Package{ 34 + OwnerID: owner.ID, 35 + RepoID: repo.ID, 36 + LowerName: "package", 37 + Type: packages_model.TypeGeneric, 38 + } 39 + 40 + p, err := packages_model.TryInsertPackage(db.DefaultContext, p0) 41 + require.NotNil(t, p) 42 + require.NoError(t, err) 43 + require.Equal(t, *p0, *p) 44 + return p 45 + } 46 + 47 + func deletePackage(t *testing.T, p *packages_model.Package) { 48 + err := packages_model.DeletePackageByID(db.DefaultContext, p.ID) 49 + require.NoError(t, err) 50 + } 51 + 52 + func TestTryInsertPackage(t *testing.T) { 53 + require.NoError(t, unittest.PrepareTestDatabase()) 54 + 55 + owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) 56 + 57 + p0 := &packages_model.Package{ 58 + OwnerID: owner.ID, 59 + LowerName: "package", 60 + } 61 + 62 + // Insert package should return the package and yield no error 63 + p, err := packages_model.TryInsertPackage(db.DefaultContext, p0) 64 + require.NotNil(t, p) 65 + require.NoError(t, err) 66 + require.Equal(t, *p0, *p) 67 + 68 + // Insert same package again should return the same package and yield ErrDuplicatePackage 69 + p, err = packages_model.TryInsertPackage(db.DefaultContext, p0) 70 + require.NotNil(t, p) 71 + require.IsType(t, packages_model.ErrDuplicatePackage, err) 72 + require.Equal(t, *p0, *p) 73 + 74 + err = packages_model.DeletePackageByID(db.DefaultContext, p0.ID) 75 + require.NoError(t, err) 76 + } 77 + 78 + func TestGetPackageByID(t *testing.T) { 79 + p0 := prepareExamplePackage(t) 80 + 81 + // Get package should return package and yield no error 82 + p, err := packages_model.GetPackageByID(db.DefaultContext, p0.ID) 83 + require.NotNil(t, p) 84 + require.Equal(t, *p0, *p) 85 + require.NoError(t, err) 86 + 87 + // Get package with non-existng ID should yield ErrPackageNotExist 88 + p, err = packages_model.GetPackageByID(db.DefaultContext, 999) 89 + require.Nil(t, p) 90 + require.Error(t, err) 91 + require.IsType(t, packages_model.ErrPackageNotExist, err) 92 + 93 + deletePackage(t, p0) 94 + } 95 + 96 + func TestDeletePackageByID(t *testing.T) { 97 + p0 := prepareExamplePackage(t) 98 + 99 + // Delete existing package should yield no error 100 + err := packages_model.DeletePackageByID(db.DefaultContext, p0.ID) 101 + require.NoError(t, err) 102 + 103 + // Delete (now) non-existing package should yield ErrPackageNotExist 104 + err = packages_model.DeletePackageByID(db.DefaultContext, p0.ID) 105 + require.Error(t, err) 106 + require.IsType(t, packages_model.ErrPackageNotExist, err) 107 + } 108 + 109 + func TestSetRepositoryLink(t *testing.T) { 110 + p0 := prepareExamplePackage(t) 111 + 112 + // Set repository link to package should yield no error and package RepoID should be updated 113 + err := packages_model.SetRepositoryLink(db.DefaultContext, p0.ID, 5) 114 + require.NoError(t, err) 115 + 116 + p, err := packages_model.GetPackageByID(db.DefaultContext, p0.ID) 117 + require.NoError(t, err) 118 + require.EqualValues(t, 5, p.RepoID) 119 + 120 + // Set repository link to non-existing package should yied ErrPackageNotExist 121 + err = packages_model.SetRepositoryLink(db.DefaultContext, 999, 5) 122 + require.Error(t, err) 123 + require.IsType(t, packages_model.ErrPackageNotExist, err) 124 + 125 + deletePackage(t, p0) 126 + } 127 + 128 + func TestUnlinkRepositoryFromAllPackages(t *testing.T) { 129 + p0 := prepareExamplePackage(t) 130 + 131 + // Unlink repository from all packages should yield no error and package with p0.ID should have RepoID 0 132 + err := packages_model.UnlinkRepositoryFromAllPackages(db.DefaultContext, p0.RepoID) 133 + require.NoError(t, err) 134 + 135 + p, err := packages_model.GetPackageByID(db.DefaultContext, p0.ID) 136 + require.NoError(t, err) 137 + require.EqualValues(t, 0, p.RepoID) 138 + 139 + // Unlink repository again from all packages should also yield no error 140 + err = packages_model.UnlinkRepositoryFromAllPackages(db.DefaultContext, p0.RepoID) 141 + require.NoError(t, err) 142 + 143 + deletePackage(t, p0) 144 + } 145 + 146 + func TestGetPackageByName(t *testing.T) { 147 + p0 := prepareExamplePackage(t) 148 + 149 + // Get package should return package and yield no error 150 + p, err := packages_model.GetPackageByName(db.DefaultContext, p0.OwnerID, p0.Type, p0.LowerName) 151 + require.NotNil(t, p) 152 + require.Equal(t, *p0, *p) 153 + require.NoError(t, err) 154 + 155 + // Get package with uppercase name should return package and yield no error 156 + p, err = packages_model.GetPackageByName(db.DefaultContext, p0.OwnerID, p0.Type, "Package") 157 + require.NotNil(t, p) 158 + require.Equal(t, *p0, *p) 159 + require.NoError(t, err) 160 + 161 + // Get package with wrong owner ID, type or name should return no package and yield ErrPackageNotExist 162 + p, err = packages_model.GetPackageByName(db.DefaultContext, 999, p0.Type, p0.LowerName) 163 + require.Nil(t, p) 164 + require.Error(t, err) 165 + require.IsType(t, packages_model.ErrPackageNotExist, err) 166 + p, err = packages_model.GetPackageByName(db.DefaultContext, p0.OwnerID, packages_model.TypeDebian, p0.LowerName) 167 + require.Nil(t, p) 168 + require.Error(t, err) 169 + require.IsType(t, packages_model.ErrPackageNotExist, err) 170 + p, err = packages_model.GetPackageByName(db.DefaultContext, p0.OwnerID, p0.Type, "package1") 171 + require.Nil(t, p) 172 + require.Error(t, err) 173 + require.IsType(t, packages_model.ErrPackageNotExist, err) 174 + 175 + deletePackage(t, p0) 176 + } 177 + 178 + func TestHasCountPackages(t *testing.T) { 27 179 require.NoError(t, unittest.PrepareTestDatabase()) 28 180 29 181 owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) 182 + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3}) 30 183 31 184 p, err := packages_model.TryInsertPackage(db.DefaultContext, &packages_model.Package{ 32 185 OwnerID: owner.ID, 186 + RepoID: repo.ID, 33 187 LowerName: "package", 34 188 }) 35 - assert.NotNil(t, p) 189 + require.NotNil(t, p) 36 190 require.NoError(t, err) 37 191 38 - // A package without package versions gets automatically cleaned up and should return false 192 + // A package without package versions gets automatically cleaned up and should return false for owner 39 193 has, err := packages_model.HasOwnerPackages(db.DefaultContext, owner.ID) 40 - assert.False(t, has) 194 + require.False(t, has) 195 + require.NoError(t, err) 196 + count, err := packages_model.CountOwnerPackages(db.DefaultContext, owner.ID) 197 + require.EqualValues(t, 0, count) 198 + require.NoError(t, err) 199 + 200 + // A package without package versions gets automatically cleaned up and should return false for repository 201 + has, err = packages_model.HasRepositoryPackages(db.DefaultContext, repo.ID) 202 + require.False(t, has) 203 + require.NoError(t, err) 204 + count, err = packages_model.CountRepositoryPackages(db.DefaultContext, repo.ID) 205 + require.EqualValues(t, 0, count) 41 206 require.NoError(t, err) 42 207 43 208 pv, err := packages_model.GetOrInsertVersion(db.DefaultContext, &packages_model.PackageVersion{ ··· 45 210 LowerVersion: "internal", 46 211 IsInternal: true, 47 212 }) 48 - assert.NotNil(t, pv) 213 + require.NotNil(t, pv) 49 214 require.NoError(t, err) 50 215 51 216 // A package with an internal package version gets automatically cleaned up and should return false 52 217 has, err = packages_model.HasOwnerPackages(db.DefaultContext, owner.ID) 53 - assert.False(t, has) 218 + require.False(t, has) 219 + require.NoError(t, err) 220 + count, err = packages_model.CountOwnerPackages(db.DefaultContext, owner.ID) 221 + require.EqualValues(t, 0, count) 222 + require.NoError(t, err) 223 + has, err = packages_model.HasRepositoryPackages(db.DefaultContext, repo.ID) 224 + require.False(t, has) 225 + require.NoError(t, err) 226 + count, err = packages_model.CountRepositoryPackages(db.DefaultContext, repo.ID) 227 + require.EqualValues(t, 0, count) 54 228 require.NoError(t, err) 55 229 56 230 pv, err = packages_model.GetOrInsertVersion(db.DefaultContext, &packages_model.PackageVersion{ ··· 58 232 LowerVersion: "normal", 59 233 IsInternal: false, 60 234 }) 61 - assert.NotNil(t, pv) 235 + require.NotNil(t, pv) 62 236 require.NoError(t, err) 63 237 64 238 // A package with a normal package version should return true 65 239 has, err = packages_model.HasOwnerPackages(db.DefaultContext, owner.ID) 66 - assert.True(t, has) 240 + require.True(t, has) 241 + require.NoError(t, err) 242 + count, err = packages_model.CountOwnerPackages(db.DefaultContext, owner.ID) 243 + require.EqualValues(t, 1, count) 244 + require.NoError(t, err) 245 + has, err = packages_model.HasRepositoryPackages(db.DefaultContext, repo.ID) 246 + require.True(t, has) 247 + require.NoError(t, err) 248 + count, err = packages_model.CountRepositoryPackages(db.DefaultContext, repo.ID) 249 + require.EqualValues(t, 1, count) 250 + require.NoError(t, err) 251 + 252 + pv2, err := packages_model.GetOrInsertVersion(db.DefaultContext, &packages_model.PackageVersion{ 253 + PackageID: p.ID, 254 + LowerVersion: "normal2", 255 + IsInternal: false, 256 + }) 257 + require.NotNil(t, pv2) 258 + require.NoError(t, err) 259 + 260 + // A package withmultiple package versions should be counted only once 261 + has, err = packages_model.HasOwnerPackages(db.DefaultContext, owner.ID) 262 + require.True(t, has) 263 + require.NoError(t, err) 264 + count, err = packages_model.CountOwnerPackages(db.DefaultContext, owner.ID) 265 + require.EqualValues(t, 1, count) 266 + require.NoError(t, err) 267 + has, err = packages_model.HasRepositoryPackages(db.DefaultContext, repo.ID) 268 + require.True(t, has) 269 + require.NoError(t, err) 270 + count, err = packages_model.CountRepositoryPackages(db.DefaultContext, repo.ID) 271 + require.EqualValues(t, 1, count) 272 + require.NoError(t, err) 273 + 274 + // For owner ID 0 there should be no packages 275 + has, err = packages_model.HasOwnerPackages(db.DefaultContext, 0) 276 + require.False(t, has) 277 + require.NoError(t, err) 278 + count, err = packages_model.CountOwnerPackages(db.DefaultContext, 0) 279 + require.EqualValues(t, 0, count) 280 + require.NoError(t, err) 281 + 282 + // For repo ID 0 there should be no packages 283 + has, err = packages_model.HasRepositoryPackages(db.DefaultContext, 0) 284 + require.False(t, has) 285 + require.NoError(t, err) 286 + count, err = packages_model.CountRepositoryPackages(db.DefaultContext, 0) 287 + require.EqualValues(t, 0, count) 288 + require.NoError(t, err) 289 + 290 + p1, err := packages_model.TryInsertPackage(db.DefaultContext, &packages_model.Package{ 291 + OwnerID: owner.ID, 292 + LowerName: "package0", 293 + }) 294 + require.NotNil(t, p1) 295 + require.NoError(t, err) 296 + p1v, err := packages_model.GetOrInsertVersion(db.DefaultContext, &packages_model.PackageVersion{ 297 + PackageID: p1.ID, 298 + LowerVersion: "normal", 299 + IsInternal: false, 300 + }) 301 + require.NotNil(t, p1v) 302 + require.NoError(t, err) 303 + 304 + // Owner owner.ID should have two packages now 305 + has, err = packages_model.HasOwnerPackages(db.DefaultContext, owner.ID) 306 + require.True(t, has) 307 + require.NoError(t, err) 308 + count, err = packages_model.CountOwnerPackages(db.DefaultContext, owner.ID) 309 + require.EqualValues(t, 2, count) 310 + require.NoError(t, err) 311 + 312 + // For repo ID 0 there should be now one package, because p1 is not assigned to a repo 313 + has, err = packages_model.HasRepositoryPackages(db.DefaultContext, 0) 314 + require.True(t, has) 315 + require.NoError(t, err) 316 + count, err = packages_model.CountRepositoryPackages(db.DefaultContext, 0) 317 + require.EqualValues(t, 1, count) 67 318 require.NoError(t, err) 68 319 }
+10 -4
routers/web/shared/user/header.go
··· 1 1 // Copyright 2022 The Gitea Authors. All rights reserved. 2 + // Copyright 2024 The Forgejo Authors. All rights reserved. 2 3 // SPDX-License-Identifier: MIT 3 4 4 5 package user ··· 8 9 9 10 "code.gitea.io/gitea/models/db" 10 11 "code.gitea.io/gitea/models/organization" 12 + packages_model "code.gitea.io/gitea/models/packages" 11 13 access_model "code.gitea.io/gitea/models/perm/access" 12 14 project_model "code.gitea.io/gitea/models/project" 13 15 repo_model "code.gitea.io/gitea/models/repo" ··· 125 127 func LoadHeaderCount(ctx *context.Context) error { 126 128 prepareContextForCommonProfile(ctx) 127 129 128 - repoCount, err := repo_model.CountRepository(ctx, &repo_model.SearchRepoOptions{ 130 + var err error 131 + 132 + ctx.Data["RepoCount"], err = repo_model.CountRepository(ctx, &repo_model.SearchRepoOptions{ 129 133 Actor: ctx.Doer, 130 134 OwnerID: ctx.ContextUser.ID, 131 135 Private: ctx.IsSigned, ··· 135 139 if err != nil { 136 140 return err 137 141 } 138 - ctx.Data["RepoCount"] = repoCount 139 142 140 143 var projectType project_model.Type 141 144 if ctx.ContextUser.IsOrganization() { ··· 143 146 } else { 144 147 projectType = project_model.TypeIndividual 145 148 } 146 - projectCount, err := db.Count[project_model.Project](ctx, project_model.SearchOptions{ 149 + ctx.Data["ProjectCount"], err = db.Count[project_model.Project](ctx, project_model.SearchOptions{ 147 150 OwnerID: ctx.ContextUser.ID, 148 151 IsClosed: optional.Some(false), 149 152 Type: projectType, ··· 151 154 if err != nil { 152 155 return err 153 156 } 154 - ctx.Data["ProjectCount"] = projectCount 157 + ctx.Data["PackageCount"], err = packages_model.CountOwnerPackages(ctx, ctx.ContextUser.ID) 158 + if err != nil { 159 + return err 160 + } 155 161 156 162 return nil 157 163 }
+7 -1
services/context/repo.go
··· 1 - // Copyright 2024 The Forgejo Authors. All rights reserved. 2 1 // Copyright 2014 The Gogs Authors. All rights reserved. 3 2 // Copyright 2017 The Gitea Authors. All rights reserved. 3 + // Copyright 2024 The Forgejo Authors. All rights reserved. 4 4 // SPDX-License-Identifier: MIT 5 5 6 6 package context ··· 19 19 "code.gitea.io/gitea/models/db" 20 20 git_model "code.gitea.io/gitea/models/git" 21 21 issues_model "code.gitea.io/gitea/models/issues" 22 + packages_model "code.gitea.io/gitea/models/packages" 22 23 access_model "code.gitea.io/gitea/models/perm/access" 23 24 repo_model "code.gitea.io/gitea/models/repo" 24 25 unit_model "code.gitea.io/gitea/models/unit" ··· 577 578 }) 578 579 if err != nil { 579 580 ctx.ServerError("GetReleaseCountByRepoID", err) 581 + return nil 582 + } 583 + ctx.Data["NumPackages"], err = packages_model.CountRepositoryPackages(ctx, ctx.Repo.Repository.ID) 584 + if err != nil { 585 + ctx.ServerError("GetPackageCountByRepoID", err) 580 586 return nil 581 587 } 582 588
+4
templates/org/menu.tmpl
··· 20 20 {{if and .IsPackageEnabled .CanReadPackages}} 21 21 <a class="{{if .IsPackagesPage}}active {{end}}item" href="{{$.Org.HomeLink}}/-/packages"> 22 22 {{svg "octicon-package"}} {{ctx.Locale.Tr "packages.title"}} 23 + {{if .PackageCount}} 24 + <div class="ui small label">{{.PackageCount}}</div> 25 + {{end}} 26 + <span hidden test-name="package-count">{{.PackageCount}}</span> 23 27 </a> 24 28 {{end}} 25 29 {{if and .IsRepoIndexerEnabled .CanReadCode}}
+3
templates/repo/header.tmpl
··· 135 135 {{if .Permission.CanRead $.UnitTypePackages}} 136 136 <a href="{{.RepoLink}}/packages" class="{{if .IsPackagesPage}}active {{end}}item"> 137 137 {{svg "octicon-package"}} {{ctx.Locale.Tr "packages.title"}} 138 + {{if .NumPackages}} 139 + <span class="ui small label">{{CountFmt .NumPackages}}</span> 140 + {{end}} 138 141 </a> 139 142 {{end}} 140 143
+4
templates/user/overview/header.tmpl
··· 24 24 {{if and .IsPackageEnabled (or .ContextUser.IsIndividual .CanReadPackages)}} 25 25 <a href="{{.ContextUser.HomeLink}}/-/packages" class="{{if .IsPackagesPage}}active {{end}}item"> 26 26 {{svg "octicon-package"}} {{ctx.Locale.Tr "packages.title"}} 27 + {{if .PackageCount}} 28 + <div class="ui small label">{{.PackageCount}}</div> 29 + {{end}} 30 + <span hidden test-name="package-count">{{.PackageCount}}</span> 27 31 </a> 28 32 {{end}} 29 33 {{if and .IsRepoIndexerEnabled (or .ContextUser.IsIndividual .CanReadCode)}}
+9 -1
tests/integration/user_count_test.go
··· 11 11 12 12 "code.gitea.io/gitea/models/db" 13 13 "code.gitea.io/gitea/models/organization" 14 + packages_model "code.gitea.io/gitea/models/packages" 14 15 project_model "code.gitea.io/gitea/models/project" 15 16 repo_model "code.gitea.io/gitea/models/repo" 16 17 "code.gitea.io/gitea/models/unittest" ··· 29 30 session *TestSession 30 31 repoCount int64 31 32 projectCount int64 33 + packageCount int64 32 34 memberCount int64 33 35 teamCount int64 34 36 } ··· 54 56 } else { 55 57 projectType = project_model.TypeIndividual 56 58 } 57 - countTest.projectCount, err = db.Count[project_model.Project](db.DefaultContext, project_model.SearchOptions{ 59 + countTest.projectCount, err = db.Count[project_model.Project](db.DefaultContext, &project_model.SearchOptions{ 58 60 OwnerID: countTest.user.ID, 59 61 IsClosed: optional.Some(false), 60 62 Type: projectType, 61 63 }) 62 64 require.NoError(t, err) 65 + countTest.packageCount, err = packages_model.CountOwnerPackages(db.DefaultContext, countTest.user.ID) 66 + require.NoError(t, err) 63 67 64 68 if !countTest.user.IsOrganization() { 65 69 return ··· 113 117 projectCount, err := countTest.getCount(htmlDoc.doc, "project-count") 114 118 require.NoError(t, err) 115 119 assert.Equal(t, countTest.projectCount, projectCount) 120 + 121 + packageCount, err := countTest.getCount(htmlDoc.doc, "package-count") 122 + require.NoError(t, err) 123 + assert.Equal(t, countTest.packageCount, packageCount) 116 124 117 125 if !countTest.user.IsOrganization() { 118 126 return