2024-02-27 22:12:20 +01:00
// Copyright 2024 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package integration
import (
"context"
"fmt"
"net/url"
"os"
"path"
"strings"
"testing"
"time"
issues_model "code.gitea.io/gitea/models/issues"
2024-03-01 23:19:18 +01:00
repo_model "code.gitea.io/gitea/models/repo"
2024-02-27 22:12:20 +01:00
unit_model "code.gitea.io/gitea/models/unit"
"code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/git"
files_service "code.gitea.io/gitea/services/repository/files"
"code.gitea.io/gitea/tests"
2024-03-14 10:38:58 +00:00
2024-02-27 22:12:20 +01:00
"github.com/stretchr/testify/assert"
)
func TestCodeOwner ( t * testing . T ) {
onGiteaRun ( t , func ( t * testing . T , u * url . URL ) {
user2 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
// Create the repo.
repo , _ , f := CreateDeclarativeRepo ( t , user2 , "" ,
[ ] unit_model . Type { unit_model . TypePullRequests } , nil ,
[ ] * files_service . ChangeRepoFile {
{
Operation : "create" ,
TreePath : "CODEOWNERS" ,
ContentReader : strings . NewReader ( "README.md @user5\ntest-file @user4" ) ,
} ,
} ,
)
defer f ( )
dstPath := t . TempDir ( )
r := fmt . Sprintf ( "%suser2/%s.git" , u . String ( ) , repo . Name )
2024-03-01 23:19:18 +01:00
cloneURL , _ := url . Parse ( r )
cloneURL . User = url . UserPassword ( "user2" , userPassword )
assert . NoError ( t , git . CloneWithArgs ( context . Background ( ) , nil , cloneURL . String ( ) , dstPath , git . CloneRepoOptions { } ) )
2024-02-27 22:12:20 +01:00
t . Run ( "Normal" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
err := os . WriteFile ( path . Join ( dstPath , "README.md" ) , [ ] byte ( "## test content" ) , 0 o666 )
assert . NoError ( t , err )
err = git . AddChanges ( dstPath , true )
assert . NoError ( t , err )
err = git . CommitChanges ( dstPath , git . CommitChangesOptions {
Committer : & git . Signature {
Email : "user2@example.com" ,
Name : "user2" ,
When : time . Now ( ) ,
} ,
Author : & git . Signature {
Email : "user2@example.com" ,
Name : "user2" ,
When : time . Now ( ) ,
} ,
Message : "Add README." ,
} )
assert . NoError ( t , err )
err = git . NewCommand ( git . DefaultContext , "push" , "origin" , "HEAD:refs/for/main" , "-o" , "topic=codeowner-normal" ) . Run ( & git . RunOpts { Dir : dstPath } )
assert . NoError ( t , err )
pr := unittest . AssertExistsAndLoadBean ( t , & issues_model . PullRequest { BaseRepoID : repo . ID , HeadBranch : "user2/codeowner-normal" } )
unittest . AssertExistsIf ( t , true , & issues_model . Review { IssueID : pr . IssueID , Type : issues_model . ReviewTypeRequest , ReviewerID : 5 } )
} )
2024-03-01 23:19:18 +01:00
t . Run ( "Forked repository" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
session := loginUser ( t , "user1" )
testRepoFork ( t , session , user2 . Name , repo . Name , "user1" , "repo1" )
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { OwnerName : "user1" , Name : "repo1" } )
r := fmt . Sprintf ( "%suser1/repo1.git" , u . String ( ) )
remoteURL , _ := url . Parse ( r )
remoteURL . User = url . UserPassword ( "user2" , userPassword )
doGitAddRemote ( dstPath , "forked" , remoteURL ) ( t )
err := git . NewCommand ( git . DefaultContext , "push" , "forked" , "HEAD:refs/for/main" , "-o" , "topic=codeowner-forked" ) . Run ( & git . RunOpts { Dir : dstPath } )
assert . NoError ( t , err )
pr := unittest . AssertExistsAndLoadBean ( t , & issues_model . PullRequest { BaseRepoID : repo . ID , HeadBranch : "user2/codeowner-forked" } )
unittest . AssertExistsIf ( t , false , & issues_model . Review { IssueID : pr . IssueID , Type : issues_model . ReviewTypeRequest , ReviewerID : 5 } )
} )
2024-02-27 22:12:20 +01:00
t . Run ( "Out of date" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
// Push the changes made from the previous subtest.
assert . NoError ( t , git . NewCommand ( git . DefaultContext , "push" , "origin" ) . Run ( & git . RunOpts { Dir : dstPath } ) )
// Reset the tree to the previous commit.
assert . NoError ( t , git . NewCommand ( git . DefaultContext , "reset" , "--hard" , "HEAD~1" ) . Run ( & git . RunOpts { Dir : dstPath } ) )
err := os . WriteFile ( path . Join ( dstPath , "test-file" ) , [ ] byte ( "## test content" ) , 0 o666 )
assert . NoError ( t , err )
err = git . AddChanges ( dstPath , true )
assert . NoError ( t , err )
err = git . CommitChanges ( dstPath , git . CommitChangesOptions {
Committer : & git . Signature {
Email : "user2@example.com" ,
Name : "user2" ,
When : time . Now ( ) ,
} ,
Author : & git . Signature {
Email : "user2@example.com" ,
Name : "user2" ,
When : time . Now ( ) ,
} ,
Message : "Add test-file." ,
} )
assert . NoError ( t , err )
err = git . NewCommand ( git . DefaultContext , "push" , "origin" , "HEAD:refs/for/main" , "-o" , "topic=codeowner-out-of-date" ) . Run ( & git . RunOpts { Dir : dstPath } )
assert . NoError ( t , err )
pr := unittest . AssertExistsAndLoadBean ( t , & issues_model . PullRequest { BaseRepoID : repo . ID , HeadBranch : "user2/codeowner-out-of-date" } )
unittest . AssertExistsIf ( t , true , & issues_model . Review { IssueID : pr . IssueID , Type : issues_model . ReviewTypeRequest , ReviewerID : 4 } )
unittest . AssertExistsIf ( t , false , & issues_model . Review { IssueID : pr . IssueID , Type : issues_model . ReviewTypeRequest , ReviewerID : 5 } )
} )
} )
}