2019-02-06 11:19:26 -07:00
|
|
|
// Copyright 2019 The Gitea Authors. All rights reserved.
|
2022-11-27 13:20:29 -05:00
|
|
|
// SPDX-License-Identifier: MIT
|
2019-02-06 11:19:26 -07:00
|
|
|
|
2021-11-24 15:56:24 +08:00
|
|
|
package files
|
2019-02-06 11:19:26 -07:00
|
|
|
|
|
|
|
|
import (
|
2025-04-07 03:35:08 +08:00
|
|
|
"html/template"
|
2019-02-06 11:19:26 -07:00
|
|
|
"testing"
|
|
|
|
|
|
2021-11-12 22:36:47 +08:00
|
|
|
"code.gitea.io/gitea/models/unittest"
|
2025-04-07 03:35:08 +08:00
|
|
|
"code.gitea.io/gitea/modules/fileicon"
|
2025-03-15 16:26:49 +08:00
|
|
|
"code.gitea.io/gitea/modules/git"
|
2019-05-11 18:21:34 +08:00
|
|
|
api "code.gitea.io/gitea/modules/structs"
|
2024-02-27 15:12:22 +08:00
|
|
|
"code.gitea.io/gitea/services/contexttest"
|
2019-04-17 10:06:35 -06:00
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
2019-02-06 11:19:26 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestGetTreeBySHA(t *testing.T) {
|
2021-11-12 22:36:47 +08:00
|
|
|
unittest.PrepareTestEnv(t)
|
2023-09-01 19:26:07 +08:00
|
|
|
ctx, _ := contexttest.MockContext(t, "user2/repo1")
|
|
|
|
|
contexttest.LoadRepo(t, ctx, 1)
|
|
|
|
|
contexttest.LoadRepoCommit(t, ctx)
|
|
|
|
|
contexttest.LoadUser(t, ctx, 2)
|
|
|
|
|
contexttest.LoadGitRepo(t, ctx)
|
2019-11-13 07:01:19 +00:00
|
|
|
defer ctx.Repo.GitRepo.Close()
|
|
|
|
|
|
2019-04-17 10:06:35 -06:00
|
|
|
sha := ctx.Repo.Repository.DefaultBranch
|
|
|
|
|
page := 1
|
|
|
|
|
perPage := 10
|
2024-12-24 21:47:45 +08:00
|
|
|
ctx.SetPathParam("id", "1")
|
|
|
|
|
ctx.SetPathParam("sha", sha)
|
2019-02-06 11:19:26 -07:00
|
|
|
|
2024-12-24 21:47:45 +08:00
|
|
|
tree, err := GetTreeBySHA(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, ctx.PathParam("sha"), page, perPage, true)
|
2020-07-19 05:53:40 -04:00
|
|
|
assert.NoError(t, err)
|
2019-04-17 10:06:35 -06:00
|
|
|
expectedTree := &api.GitTreeResponse{
|
2019-02-06 11:19:26 -07:00
|
|
|
SHA: "65f1bf27bc3bf70f64657658635e66094edbcb4d",
|
|
|
|
|
URL: "https://try.gitea.io/api/v1/repos/user2/repo1/git/trees/65f1bf27bc3bf70f64657658635e66094edbcb4d",
|
2019-04-17 10:06:35 -06:00
|
|
|
Entries: []api.GitEntry{
|
2019-02-06 11:19:26 -07:00
|
|
|
{
|
|
|
|
|
Path: "README.md",
|
|
|
|
|
Mode: "100644",
|
|
|
|
|
Type: "blob",
|
|
|
|
|
Size: 30,
|
|
|
|
|
SHA: "4b4851ad51df6a7d9f25c979345979eaeb5b349f",
|
|
|
|
|
URL: "https://try.gitea.io/api/v1/repos/user2/repo1/git/blobs/4b4851ad51df6a7d9f25c979345979eaeb5b349f",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Truncated: false,
|
|
|
|
|
Page: 1,
|
|
|
|
|
TotalCount: 1,
|
|
|
|
|
}
|
2019-04-19 14:17:27 +02:00
|
|
|
|
2025-03-31 07:53:48 +02:00
|
|
|
assert.Equal(t, expectedTree, tree)
|
2019-02-06 11:19:26 -07:00
|
|
|
}
|
2025-03-15 16:26:49 +08:00
|
|
|
|
|
|
|
|
func TestGetTreeViewNodes(t *testing.T) {
|
|
|
|
|
unittest.PrepareTestEnv(t)
|
2026-01-30 20:48:56 +00:00
|
|
|
|
2025-03-15 16:26:49 +08:00
|
|
|
ctx, _ := contexttest.MockContext(t, "user2/repo1")
|
|
|
|
|
ctx.Repo.RefFullName = git.RefNameFromBranch("sub-home-md-img-check")
|
|
|
|
|
contexttest.LoadRepo(t, ctx, 1)
|
|
|
|
|
contexttest.LoadRepoCommit(t, ctx)
|
|
|
|
|
contexttest.LoadUser(t, ctx, 2)
|
|
|
|
|
contexttest.LoadGitRepo(t, ctx)
|
|
|
|
|
defer ctx.Repo.GitRepo.Close()
|
|
|
|
|
|
2025-07-14 23:28:34 +08:00
|
|
|
curRepoLink := "/any/repo-link"
|
2025-04-07 03:35:08 +08:00
|
|
|
renderedIconPool := fileicon.NewRenderedIconPool()
|
|
|
|
|
mockIconForFile := func(id string) template.HTML {
|
2025-12-05 02:47:23 +08:00
|
|
|
return template.HTML(`<svg class="svg git-entry-icon octicon-file" width="16" height="16" aria-hidden="true"><use href="#` + id + `"></use></svg>`)
|
2025-04-07 03:35:08 +08:00
|
|
|
}
|
2026-01-30 20:48:56 +00:00
|
|
|
mockIconForFolder := func() template.HTML {
|
|
|
|
|
// With basic theme (default for folders), we get octicon icons without IDs
|
|
|
|
|
return template.HTML(`<span>octicon-file-directory-fill(16/)</span>`)
|
2025-04-07 03:35:08 +08:00
|
|
|
}
|
2026-01-30 20:48:56 +00:00
|
|
|
mockOpenIconForFolder := func() template.HTML {
|
|
|
|
|
// With basic theme (default for folders), we get octicon icons without IDs
|
|
|
|
|
return template.HTML(`<span>octicon-file-directory-open-fill(16/)</span>`)
|
2025-04-29 10:51:32 +08:00
|
|
|
}
|
2025-07-14 23:28:34 +08:00
|
|
|
treeNodes, err := GetTreeViewNodes(ctx, curRepoLink, renderedIconPool, ctx.Repo.Commit, "", "")
|
2025-03-15 16:26:49 +08:00
|
|
|
assert.NoError(t, err)
|
|
|
|
|
assert.Equal(t, []*TreeViewNode{
|
|
|
|
|
{
|
2025-04-29 10:51:32 +08:00
|
|
|
EntryName: "docs",
|
|
|
|
|
EntryMode: "tree",
|
|
|
|
|
FullPath: "docs",
|
2026-01-30 20:48:56 +00:00
|
|
|
EntryIcon: mockIconForFolder(),
|
|
|
|
|
EntryIconOpen: mockOpenIconForFolder(),
|
2025-03-15 16:26:49 +08:00
|
|
|
},
|
|
|
|
|
}, treeNodes)
|
|
|
|
|
|
2025-07-14 23:28:34 +08:00
|
|
|
treeNodes, err = GetTreeViewNodes(ctx, curRepoLink, renderedIconPool, ctx.Repo.Commit, "", "docs/README.md")
|
2025-03-15 16:26:49 +08:00
|
|
|
assert.NoError(t, err)
|
|
|
|
|
assert.Equal(t, []*TreeViewNode{
|
|
|
|
|
{
|
2025-04-29 10:51:32 +08:00
|
|
|
EntryName: "docs",
|
|
|
|
|
EntryMode: "tree",
|
|
|
|
|
FullPath: "docs",
|
2026-01-30 20:48:56 +00:00
|
|
|
EntryIcon: mockIconForFolder(),
|
|
|
|
|
EntryIconOpen: mockOpenIconForFolder(),
|
2025-03-15 16:26:49 +08:00
|
|
|
Children: []*TreeViewNode{
|
|
|
|
|
{
|
|
|
|
|
EntryName: "README.md",
|
|
|
|
|
EntryMode: "blob",
|
|
|
|
|
FullPath: "docs/README.md",
|
2025-04-07 03:35:08 +08:00
|
|
|
EntryIcon: mockIconForFile(`svg-mfi-readme`),
|
2025-03-15 16:26:49 +08:00
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}, treeNodes)
|
|
|
|
|
|
2025-07-14 23:28:34 +08:00
|
|
|
treeNodes, err = GetTreeViewNodes(ctx, curRepoLink, renderedIconPool, ctx.Repo.Commit, "docs", "README.md")
|
2025-03-15 16:26:49 +08:00
|
|
|
assert.NoError(t, err)
|
|
|
|
|
assert.Equal(t, []*TreeViewNode{
|
|
|
|
|
{
|
|
|
|
|
EntryName: "README.md",
|
|
|
|
|
EntryMode: "blob",
|
|
|
|
|
FullPath: "docs/README.md",
|
2025-04-07 03:35:08 +08:00
|
|
|
EntryIcon: mockIconForFile(`svg-mfi-readme`),
|
2025-03-15 16:26:49 +08:00
|
|
|
},
|
|
|
|
|
}, treeNodes)
|
|
|
|
|
}
|