jojo/modules/git/repo_blame_test.go
BtbN 6298ee4d3a fix: pull request review comment position (#9914)
## Checklist

This PR contains both #9889 and #9912, since it depends on the one, and the other provides a test for it.
The exact reasoning behind its logic is described here: https://codeberg.org/forgejo/forgejo/issues/9473#issuecomment-7976186

This PR should return the behaviour back to how it was before a PR to Gitea changed it.
Only the resulting Database-Entry will reference the line blamed commit, now also with the correct adjusted line.
While the context diff view is pulled from the commit the commenter actually commented on.

### Tests

- I added test coverage for Go changes...
  - [ ] in their respective `*_test.go` for unit tests.
  - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
  - [ ] in `web_src/js/*.test.js` if it can be unit tested.
  - [x] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).

### Documentation

- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [x] I did not document these changes and I do not expect someone else to do it.

### Release notes

- [ ] I do not want this change to show in the release notes.
- [x] I want the title to show in the release notes with a link to this pull request.
- [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title.

Co-authored-by: Gusted <postmaster@gusted.xyz>
Co-authored-by: Mathieu Fenniak <mathieu@fenniak.net>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9914
Reviewed-by: Mathieu Fenniak <mfenniak@noreply.codeberg.org>
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: BtbN <btbn@btbn.de>
Co-committed-by: BtbN <btbn@btbn.de>
2025-10-31 16:17:23 +01:00

110 lines
3.4 KiB
Go

// Copyright 2025 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: GPL-3.0-or-later
package git
import (
"bytes"
"os"
"path"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestLineBlame(t *testing.T) {
t.Run("SHA1", func(t *testing.T) {
repo, err := OpenRepository(t.Context(), filepath.Join(testReposDir, "repo1_bare"))
require.NoError(t, err)
defer repo.Close()
commit, lineno, err := repo.LineBlame("HEAD", "foo/link_short", 1)
require.NoError(t, err)
assert.Equal(t, "37991dec2c8e592043f47155ce4808d4580f9123", commit.ID.String())
assert.EqualValues(t, 1, lineno)
commit, lineno, err = repo.LineBlame("HEAD", "foo/link_short", 512)
require.ErrorIs(t, err, ErrBlameFileNotEnoughLines)
assert.Nil(t, commit)
assert.Zero(t, lineno)
commit, lineno, err = repo.LineBlame("HEAD", "non-existent/path", 512)
require.ErrorIs(t, err, ErrBlameFileDoesNotExist)
assert.Nil(t, commit)
assert.Zero(t, lineno)
})
t.Run("SHA256", func(t *testing.T) {
skipIfSHA256NotSupported(t)
repo, err := OpenRepository(t.Context(), filepath.Join(testReposDir, "repo1_bare_sha256"))
require.NoError(t, err)
defer repo.Close()
commit, lineno, err := repo.LineBlame("HEAD", "foo/link_short", 1)
require.NoError(t, err)
assert.Equal(t, "6aae864a3d1d0d6a5be0cc64028c1e7021e2632b031fd8eb82afc5a283d1c3d1", commit.ID.String())
assert.EqualValues(t, 1, lineno)
commit, lineno, err = repo.LineBlame("HEAD", "foo/link_short", 512)
require.ErrorIs(t, err, ErrBlameFileNotEnoughLines)
assert.Nil(t, commit)
assert.Zero(t, lineno)
commit, lineno, err = repo.LineBlame("HEAD", "non-existent/path", 512)
require.ErrorIs(t, err, ErrBlameFileDoesNotExist)
assert.Nil(t, commit)
assert.Zero(t, lineno)
})
t.Run("Moved line", func(t *testing.T) {
test := func(t *testing.T, objectFormatName string) {
t.Helper()
tmpDir := t.TempDir()
require.NoError(t, InitRepository(t.Context(), tmpDir, false, objectFormatName))
gitRepo, err := OpenRepository(t.Context(), tmpDir)
require.NoError(t, err)
defer gitRepo.Close()
require.NoError(t, os.WriteFile(path.Join(tmpDir, "ANSWER"), []byte("abba\n"), 0o666))
require.NoError(t, AddChanges(tmpDir, true))
require.NoError(t, CommitChanges(tmpDir, CommitChangesOptions{Message: "Favourite singer of everyone who follows a automata course"}))
firstCommit, err := gitRepo.GetRefCommitID("HEAD")
require.NoError(t, err)
require.NoError(t, os.WriteFile(path.Join(tmpDir, "ANSWER"), append(bytes.Repeat([]byte("baba\n"), 9), []byte("abba\n")...), 0o666))
require.NoError(t, AddChanges(tmpDir, true))
require.NoError(t, CommitChanges(tmpDir, CommitChangesOptions{Message: "Now there's several of them"}))
secondCommit, err := gitRepo.GetRefCommitID("HEAD")
require.NoError(t, err)
commit, lineno, err := gitRepo.LineBlame("HEAD", "ANSWER", 10)
require.NoError(t, err)
assert.Equal(t, firstCommit, commit.ID.String())
assert.EqualValues(t, 1, lineno)
for i := range uint64(9) {
commit, lineno, err = gitRepo.LineBlame("HEAD", "ANSWER", i+1)
require.NoError(t, err)
assert.Equal(t, secondCommit, commit.ID.String())
assert.Equal(t, i+1, lineno)
}
}
t.Run("SHA1", func(t *testing.T) {
test(t, Sha1ObjectFormat.Name())
})
t.Run("SHA256", func(t *testing.T) {
skipIfSHA256NotSupported(t)
test(t, Sha256ObjectFormat.Name())
})
})
}