0
0
mirror of https://github.com/go-gitea/gitea.git synced 2025-11-06 12:20:45 +01:00

Add test for refreshAccesses update path and fix db.Find syntax

- Fix db.Find syntax error by using db.GetEngine().Where().Find()
  instead of db.Find() with builder.Eq directly
- Add TestRepository_RecalculateAccesses_UpdateMode to test the
  update optimization path when user access mode changes
- Improves test coverage for refreshAccesses from 69.4% to 75.0%
- Validates that access mode updates use UPDATE instead of DELETE+INSERT
This commit is contained in:
Ross Golder 2025-10-19 14:00:20 +07:00
parent 250b266bb2
commit 292198ca3d
No known key found for this signature in database
GPG Key ID: 253A7E508D2D59CD
2 changed files with 37 additions and 2 deletions

View File

@ -97,8 +97,8 @@ func refreshAccesses(ctx context.Context, repo *repo_model.Repository, accessMap
}
// Query existing accesses for cross-comparison
existingAccesses, err := db.Find[Access](ctx, builder.Eq{"repo_id": repo.ID})
if err != nil {
var existingAccesses []Access
if err := db.GetEngine(ctx).Where(builder.Eq{"repo_id": repo.ID}).Find(&existingAccesses); err != nil {
return fmt.Errorf("find existing accesses: %w", err)
}
existingMap := make(map[int64]perm.AccessMode, len(existingAccesses))

View File

@ -124,3 +124,38 @@ func TestRepository_RecalculateAccesses2(t *testing.T) {
assert.NoError(t, err)
assert.False(t, has)
}
func TestRepository_RecalculateAccesses_UpdateMode(t *testing.T) {
// Test the update path in refreshAccesses optimization
// Scenario: User's access mode changes from Read to Write
assert.NoError(t, unittest.PrepareTestDatabase())
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4})
assert.NoError(t, repo.LoadOwner(t.Context()))
// Verify initial access mode
initialAccess := &access_model.Access{UserID: 4, RepoID: 4}
has, err := db.GetEngine(t.Context()).Get(initialAccess)
assert.NoError(t, err)
assert.True(t, has)
initialMode := initialAccess.Mode
// Change collaboration mode to trigger update path
newMode := perm_model.AccessModeAdmin
assert.NotEqual(t, initialMode, newMode, "New mode should differ from initial mode")
_, err = db.GetEngine(t.Context()).
Where("user_id = ? AND repo_id = ?", 4, 4).
Cols("mode").
Update(&repo_model.Collaboration{Mode: newMode})
assert.NoError(t, err)
// Recalculate accesses - should UPDATE existing access, not delete+insert
assert.NoError(t, access_model.RecalculateAccesses(t.Context(), repo))
// Verify access was updated, not deleted and re-inserted
updatedAccess := &access_model.Access{UserID: 4, RepoID: 4}
has, err = db.GetEngine(t.Context()).Get(updatedAccess)
assert.NoError(t, err)
assert.True(t, has, "Access should still exist")
assert.Equal(t, newMode, updatedAccess.Mode, "Access mode should be updated to new collaboration mode")
}