forgejo/models/repo/fork_test.go
Antonin Delpeuch 6d1818ffdb feat: allow PRs between common forks of the same base repository (#9045)
Fixes #6185.

## Checklist

### Tests

- I added test coverage for Go changes...
  - [x] in their respective `*_test.go` for unit tests.
  - [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server.

I also tested the changes manually.

### 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.

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9045
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: Antonin Delpeuch <antonin@delpeuch.eu>
Co-committed-by: Antonin Delpeuch <antonin@delpeuch.eu>
2025-10-01 04:58:12 +02:00

111 lines
3.8 KiB
Go

// Copyright 2021 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package repo_test
import (
"testing"
"forgejo.org/models/db"
repo_model "forgejo.org/models/repo"
"forgejo.org/models/unittest"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestGetUserFork(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase())
// User13 has repo 11 forked from repo10
repo, err := repo_model.GetRepositoryByID(db.DefaultContext, 10)
require.NoError(t, err)
assert.NotNil(t, repo)
repo, err = repo_model.GetUserFork(db.DefaultContext, repo.ID, 13)
require.NoError(t, err)
assert.NotNil(t, repo)
repo, err = repo_model.GetRepositoryByID(db.DefaultContext, 9)
require.NoError(t, err)
assert.NotNil(t, repo)
repo, err = repo_model.GetUserFork(db.DefaultContext, repo.ID, 13)
require.NoError(t, err)
assert.Nil(t, repo)
}
func TestGetUserForkLax(t *testing.T) {
defer unittest.OverrideFixtures("models/repo/TestGetUserForkLax")()
require.NoError(t, unittest.PrepareTestDatabase())
// User13 has repo 11 forked from repo10
repo10, err := repo_model.GetRepositoryByID(db.DefaultContext, 10)
require.NoError(t, err)
assert.NotNil(t, repo10)
require.True(t, repo_model.HasForkedRepoLax(db.DefaultContext, 13, repo10))
repo11, err := repo_model.GetUserForkLax(db.DefaultContext, repo10, 13)
require.NoError(t, err)
assert.NotNil(t, repo11)
assert.Equal(t, int64(11), repo11.ID)
assert.Equal(t, int64(10), repo11.ForkID)
// user13 does not have a fork of repo9
repo9, err := repo_model.GetRepositoryByID(db.DefaultContext, 9)
require.NoError(t, err)
assert.NotNil(t, repo9)
require.False(t, repo_model.HasForkedRepoLax(db.DefaultContext, 13, repo9))
fork, err := repo_model.GetUserForkLax(db.DefaultContext, repo9, 13)
require.NoError(t, err)
assert.Nil(t, fork)
// User15 has repo id 64 forked from repo10, which counts as a fork of repo11 since they have a common base
require.False(t, repo_model.HasForkedRepo(db.DefaultContext, 15, repo11.ID))
require.True(t, repo_model.HasForkedRepoLax(db.DefaultContext, 15, repo11))
fork, err = repo_model.GetUserForkLax(db.DefaultContext, repo11, 15)
require.NoError(t, err)
assert.NotNil(t, fork)
assert.Equal(t, int64(64), fork.ID)
assert.Equal(t, int64(10), fork.ForkID)
}
func TestGetUserForkLaxWithTwoChoices(t *testing.T) {
defer unittest.OverrideFixtures("models/repo/TestGetUserForkLaxWithTwoChoices")()
require.NoError(t, unittest.PrepareTestDatabase())
// Test scenario:
//
// - repo10
// - forked by user15 as repo64
// - forked by user13 as repo11
// - forked by user15 as repo65
//
// In this scenario, both repo64 and repo65 can be used as forks of repo11 for user15,
// but we prefer to use repo65 because it's specifically marked as a fork of repo11
repo10, err := repo_model.GetRepositoryByID(db.DefaultContext, 10)
require.NoError(t, err)
assert.NotNil(t, repo10)
// User15 has repo64 forked from repo10
require.True(t, repo_model.HasForkedRepoLax(db.DefaultContext, 15, repo10))
repo64, err := repo_model.GetUserForkLax(db.DefaultContext, repo10, 15)
require.NoError(t, err)
assert.NotNil(t, repo64)
assert.Equal(t, int64(64), repo64.ID)
assert.Equal(t, int64(10), repo64.ForkID)
// User13 has repo11 forked from repo10
require.True(t, repo_model.HasForkedRepoLax(db.DefaultContext, 13, repo10))
repo11, err := repo_model.GetUserForkLax(db.DefaultContext, repo10, 13)
require.NoError(t, err)
assert.NotNil(t, repo11)
assert.Equal(t, int64(11), repo11.ID)
assert.Equal(t, int64(10), repo11.ForkID)
// User15 has repo65 forked from repo11
require.True(t, repo_model.HasForkedRepoLax(db.DefaultContext, 15, repo11))
repo65, err := repo_model.GetUserForkLax(db.DefaultContext, repo11, 15)
require.NoError(t, err)
assert.NotNil(t, repo65)
assert.Equal(t, int64(65), repo65.ID)
assert.Equal(t, int64(11), repo65.ForkID)
}