2021-05-08 00:10:05 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-05-08 00:10:05 +03:00
2022-09-02 22:18:23 +03:00
package integration
2021-05-08 00:10:05 +03:00
import (
2023-02-20 06:56:07 +03:00
"fmt"
2021-05-08 00:10:05 +03:00
"net/http"
2024-05-20 08:57:57 +03:00
"net/url"
2021-09-30 22:31:02 +03:00
"strings"
2021-05-08 00:10:05 +03:00
"testing"
2024-05-20 08:57:57 +03:00
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
2024-06-23 20:45:21 +03:00
"code.gitea.io/gitea/modules/test"
2024-05-20 08:57:57 +03:00
repo_service "code.gitea.io/gitea/services/repository"
2022-09-02 22:18:23 +03:00
"code.gitea.io/gitea/tests"
2022-09-05 09:04:18 +03:00
2021-05-08 00:10:05 +03:00
"github.com/stretchr/testify/assert"
)
func TestCompareTag ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
2021-05-08 00:10:05 +03:00
session := loginUser ( t , "user2" )
req := NewRequest ( t , "GET" , "/user2/repo1/compare/v1.1...master" )
resp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
selection := htmlDoc . doc . Find ( ".choose.branch .filter.dropdown" )
// A dropdown for both base and head.
assert . Lenf ( t , selection . Nodes , 2 , "The template has changed" )
2021-09-30 22:31:02 +03:00
2024-06-23 20:45:21 +03:00
req = NewRequest ( t , "GET" , "/user2/repo1/compare/invalid" ) . SetHeader ( "Accept" , "text/html" )
2021-09-30 22:31:02 +03:00
resp = session . MakeRequest ( t , req , http . StatusNotFound )
2024-06-23 20:45:21 +03:00
assert . True ( t , test . IsNormalPageCompleted ( resp . Body . String ( ) ) , "expect 404 page not 500" )
2021-05-08 00:10:05 +03:00
}
2021-12-06 20:04:07 +03:00
// Compare with inferred default branch (master)
func TestCompareDefault ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
2021-12-06 20:04:07 +03:00
session := loginUser ( t , "user2" )
req := NewRequest ( t , "GET" , "/user2/repo1/compare/v1.1" )
resp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
selection := htmlDoc . doc . Find ( ".choose.branch .filter.dropdown" )
assert . Lenf ( t , selection . Nodes , 2 , "The template has changed" )
}
2023-02-20 06:56:07 +03:00
// Ensure the comparison matches what we expect
func inspectCompare ( t * testing . T , htmlDoc * HTMLDoc , diffCount int , diffChanges [ ] string ) {
selection := htmlDoc . doc . Find ( "#diff-file-boxes" ) . Children ( )
assert . Lenf ( t , selection . Nodes , diffCount , "Expected %v diffed files, found: %v" , diffCount , len ( selection . Nodes ) )
for _ , diffChange := range diffChanges {
selection = htmlDoc . doc . Find ( fmt . Sprintf ( "[data-new-filename=\"%s\"]" , diffChange ) )
assert . Lenf ( t , selection . Nodes , 1 , "Expected 1 match for [data-new-filename=\"%s\"], found: %v" , diffChange , len ( selection . Nodes ) )
}
}
// Git commit graph for repo20
// * 8babce9 (origin/remove-files-b) Add a dummy file
// * b67e43a Delete test.csv and link_hi
// | * cfe3b3c (origin/remove-files-a) Delete test.csv and link_hi
// |/
// * c8e31bc (origin/add-csv) Add test csv file
// * 808038d (HEAD -> master, origin/master, origin/HEAD) Added test links
func TestCompareBranches ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
session := loginUser ( t , "user2" )
2024-04-27 11:03:49 +03:00
// Indirect compare remove-files-b (head) with add-csv (base) branch
2023-02-20 06:56:07 +03:00
//
// 'link_hi' and 'test.csv' are deleted, 'test.txt' is added
req := NewRequest ( t , "GET" , "/user2/repo20/compare/add-csv...remove-files-b" )
resp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
diffCount := 3
diffChanges := [ ] string { "link_hi" , "test.csv" , "test.txt" }
inspectCompare ( t , htmlDoc , diffCount , diffChanges )
2024-04-27 11:03:49 +03:00
// Indirect compare remove-files-b (head) with remove-files-a (base) branch
2023-02-20 06:56:07 +03:00
//
// 'link_hi' and 'test.csv' are deleted, 'test.txt' is added
req = NewRequest ( t , "GET" , "/user2/repo20/compare/remove-files-a...remove-files-b" )
resp = session . MakeRequest ( t , req , http . StatusOK )
htmlDoc = NewHTMLParser ( t , resp . Body )
diffCount = 3
diffChanges = [ ] string { "link_hi" , "test.csv" , "test.txt" }
inspectCompare ( t , htmlDoc , diffCount , diffChanges )
2024-04-27 11:03:49 +03:00
// Indirect compare remove-files-a (head) with remove-files-b (base) branch
2023-02-20 06:56:07 +03:00
//
// 'link_hi' and 'test.csv' are deleted
req = NewRequest ( t , "GET" , "/user2/repo20/compare/remove-files-b...remove-files-a" )
resp = session . MakeRequest ( t , req , http . StatusOK )
htmlDoc = NewHTMLParser ( t , resp . Body )
diffCount = 2
diffChanges = [ ] string { "link_hi" , "test.csv" }
inspectCompare ( t , htmlDoc , diffCount , diffChanges )
// Direct compare remove-files-b (head) with remove-files-a (base) branch
//
// 'test.txt' is deleted
req = NewRequest ( t , "GET" , "/user2/repo20/compare/remove-files-b..remove-files-a" )
resp = session . MakeRequest ( t , req , http . StatusOK )
htmlDoc = NewHTMLParser ( t , resp . Body )
diffCount = 1
diffChanges = [ ] string { "test.txt" }
inspectCompare ( t , htmlDoc , diffCount , diffChanges )
}
2024-05-20 08:57:57 +03:00
func TestCompareCodeExpand ( t * testing . T ) {
onGiteaRun ( t , func ( t * testing . T , u * url . URL ) {
user1 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 1 } )
repo , err := repo_service . CreateRepositoryDirectly ( db . DefaultContext , user1 , user1 , repo_service . CreateRepoOptions {
Name : "test_blob_excerpt" ,
Readme : "Default" ,
AutoInit : true ,
DefaultBranch : "main" ,
} )
assert . NoError ( t , err )
session := loginUser ( t , user1 . Name )
testEditFile ( t , session , user1 . Name , repo . Name , "main" , "README.md" , strings . Repeat ( "a\n" , 30 ) )
user2 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
session = loginUser ( t , user2 . Name )
2024-05-21 20:00:35 +03:00
testRepoFork ( t , session , user1 . Name , repo . Name , user2 . Name , "test_blob_excerpt-fork" , "" )
2024-05-20 08:57:57 +03:00
testCreateBranch ( t , session , user2 . Name , "test_blob_excerpt-fork" , "branch/main" , "forked-branch" , http . StatusSeeOther )
testEditFile ( t , session , user2 . Name , "test_blob_excerpt-fork" , "forked-branch" , "README.md" , strings . Repeat ( "a\n" , 15 ) + "CHANGED\n" + strings . Repeat ( "a\n" , 15 ) )
req := NewRequest ( t , "GET" , "/user1/test_blob_excerpt/compare/main...user2/test_blob_excerpt-fork:forked-branch" )
resp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
els := htmlDoc . Find ( ` button.code-expander-button[hx-get] ` )
// all the links in the comparison should be to the forked repo&branch
assert . NotZero ( t , els . Length ( ) )
for i := 0 ; i < els . Length ( ) ; i ++ {
link := els . Eq ( i ) . AttrOr ( "hx-get" , "" )
assert . True ( t , strings . HasPrefix ( link , "/user2/test_blob_excerpt-fork/blob_excerpt/" ) )
}
} )
}