mirror of
https://github.com/hanzoai/forge.git
synced 2026-10-30 15:00:39 +00:00
Source files keep their SPDX-License-Identifier and Hanzo copyright line; the Gitea, Gogs and LFS Test Server copyrights they used to repeat now live once in NOTICE, alongside LICENSE. The header lint accepts any copyright line above the SPDX line, so it no longer demands an upstream one. Co-authored-by: Hanzo Dev <[email protected]>
167 lines
5.9 KiB
Go
167 lines
5.9 KiB
Go
// Copyright 2026 Hanzo AI, Inc. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package integration
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/hanzoai/git/models/db"
|
|
"github.com/hanzoai/git/models/git"
|
|
repo_model "github.com/hanzoai/git/models/repo"
|
|
"github.com/hanzoai/git/models/unittest"
|
|
user_model "github.com/hanzoai/git/models/user"
|
|
"github.com/hanzoai/git/modules/lfs"
|
|
api "github.com/hanzoai/git/modules/structs"
|
|
"github.com/hanzoai/git/tests"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// check that files stored in LFS render properly in the web UI
|
|
func TestLFSRender(t *testing.T) {
|
|
defer tests.PrepareTestEnv(t)()
|
|
|
|
session := loginUser(t, "user2")
|
|
|
|
// check that a markup file is flagged with "Stored in Git LFS" and shows its text
|
|
t.Run("Markup", func(t *testing.T) {
|
|
defer tests.PrintCurrentTest(t)()
|
|
|
|
req := NewRequest(t, "GET", "/user2/lfs/src/branch/master/CONTRIBUTING.md")
|
|
resp := session.MakeRequest(t, req, http.StatusOK)
|
|
|
|
doc := NewHTMLParser(t, resp.Body).doc
|
|
|
|
fileInfo := doc.Find("div.file-info-entry").First().Text()
|
|
assert.Contains(t, fileInfo, "LFS")
|
|
|
|
content := doc.Find("div.file-view").Text()
|
|
assert.Contains(t, content, "Testing documents in LFS")
|
|
})
|
|
|
|
// check that an image is flagged with "Stored in Git LFS" and renders inline
|
|
t.Run("Image", func(t *testing.T) {
|
|
defer tests.PrintCurrentTest(t)()
|
|
|
|
req := NewRequest(t, "GET", "/user2/lfs/src/branch/master/jpeg.jpg")
|
|
resp := session.MakeRequest(t, req, http.StatusOK)
|
|
|
|
doc := NewHTMLParser(t, resp.Body).doc
|
|
|
|
fileInfo := doc.Find("div.file-info-entry").First().Text()
|
|
assert.Contains(t, fileInfo, "LFS")
|
|
|
|
src, exists := doc.Find(".file-view img").Attr("src")
|
|
assert.True(t, exists, "The image should be in an <img> tag")
|
|
assert.Equal(t, "/user2/lfs/media/branch/master/jpeg.jpg", src, "The image should use the /media link because it's in LFS")
|
|
})
|
|
|
|
// check that a binary file is flagged with "Stored in Git LFS" and renders a /media/ link instead of a /raw/ link
|
|
t.Run("Binary", func(t *testing.T) {
|
|
defer tests.PrintCurrentTest(t)()
|
|
|
|
req := NewRequest(t, "GET", "/user2/lfs/src/branch/master/crypt.bin")
|
|
resp := session.MakeRequest(t, req, http.StatusOK)
|
|
|
|
doc := NewHTMLParser(t, resp.Body)
|
|
|
|
fileInfo := doc.Find("div.file-info-entry").First().Text()
|
|
assert.Contains(t, fileInfo, "LFS")
|
|
fileSize := doc.Find("div.file-info-entry > .file-info-size").Text()
|
|
assert.Equal(t, "2.0 KiB", fileSize)
|
|
|
|
// find new file view container
|
|
fileViewContainer := doc.Find("[data-global-init=initRepoFileView]")
|
|
assert.Equal(t, "/user2/lfs/media/branch/master/crypt.bin", fileViewContainer.AttrOr("data-raw-file-link", ""))
|
|
AssertHTMLElement(t, doc, ".view-raw > .file-view-render-container > .file-view-raw-prompt", 1)
|
|
})
|
|
|
|
// check that a directory with a README file shows its text
|
|
t.Run("Readme", func(t *testing.T) {
|
|
defer tests.PrintCurrentTest(t)()
|
|
|
|
req := NewRequest(t, "GET", "/user2/lfs/src/branch/master/subdir")
|
|
resp := session.MakeRequest(t, req, http.StatusOK)
|
|
|
|
doc := NewHTMLParser(t, resp.Body).doc
|
|
|
|
content := doc.Find("div.file-view").Text()
|
|
assert.Contains(t, content, "Testing READMEs in LFS")
|
|
})
|
|
|
|
// check that an invalid lfs entry defaults to plaintext
|
|
t.Run("Invalid", func(t *testing.T) {
|
|
defer tests.PrintCurrentTest(t)()
|
|
|
|
// the LFS exists
|
|
req := NewRequest(t, "GET", "/user2/lfs/src/branch/master/CONTRIBUTING.md")
|
|
resp := session.MakeRequest(t, req, http.StatusOK)
|
|
content := NewHTMLParser(t, resp.Body).Find("div.file-view").Text()
|
|
assert.Contains(t, content, "Testing documents in LFS")
|
|
|
|
// then make it disappear
|
|
assert.NoError(t, db.TruncateBeans(t.Context(), &git.LFSMetaObject{}))
|
|
req = NewRequest(t, "GET", "/user2/lfs/src/branch/master/CONTRIBUTING.md")
|
|
resp = session.MakeRequest(t, req, http.StatusOK)
|
|
content = NewHTMLParser(t, resp.Body).Find("div.file-view").Text()
|
|
assert.Contains(t, content, "oid sha256:7b6b2c88dba9f760a1a58469b67fee2b698ef7e9399c4ca4f34a14ccbe39f623")
|
|
})
|
|
}
|
|
|
|
// TestLFSLockView tests the LFS lock view on settings page of repositories
|
|
func TestLFSLockView(t *testing.T) {
|
|
defer tests.PrepareTestEnv(t)()
|
|
|
|
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // in org 3
|
|
repo3 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3}) // own by org 3
|
|
session := loginUser(t, user2.Name)
|
|
|
|
// create a lock
|
|
lockPath := "test_lfs_lock_view.zip"
|
|
lockID := ""
|
|
{
|
|
req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/%s.git/info/lfs/locks", repo3.FullName()), map[string]string{"path": lockPath})
|
|
req.Header.Set("Accept", lfs.AcceptHeader)
|
|
req.Header.Set("Content-Type", lfs.MediaType)
|
|
resp := session.MakeRequest(t, req, http.StatusCreated)
|
|
lockResp := DecodeJSON(t, resp, &api.LFSLockResponse{})
|
|
lockID = lockResp.Lock.ID
|
|
}
|
|
defer func() {
|
|
// release the lock
|
|
req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/%s.git/info/lfs/locks/%s/unlock", repo3.FullName(), lockID), map[string]string{})
|
|
req.Header.Set("Accept", lfs.AcceptHeader)
|
|
req.Header.Set("Content-Type", lfs.MediaType)
|
|
session.MakeRequest(t, req, http.StatusOK)
|
|
}()
|
|
|
|
t.Run("owner name", func(t *testing.T) {
|
|
defer tests.PrintCurrentTest(t)()
|
|
|
|
// make sure the display names are different, or the test is meaningless
|
|
require.NoError(t, repo3.LoadOwner(t.Context()))
|
|
require.NotEqual(t, user2.DisplayName(), repo3.Owner.DisplayName())
|
|
|
|
req := NewRequest(t, "GET", fmt.Sprintf("/%s/settings/lfs/locks", repo3.FullName()))
|
|
resp := session.MakeRequest(t, req, http.StatusOK)
|
|
|
|
doc := NewHTMLParser(t, resp.Body).doc
|
|
|
|
tr := doc.Find("table#lfs-files-locks-table tbody tr")
|
|
require.Equal(t, 1, tr.Length())
|
|
|
|
td := tr.First().Find("td")
|
|
require.Equal(t, 4, td.Length())
|
|
|
|
// path
|
|
assert.Equal(t, lockPath, strings.TrimSpace(td.Eq(0).Text()))
|
|
// owner name
|
|
assert.Equal(t, user2.DisplayName(), strings.TrimSpace(td.Eq(1).Text()))
|
|
})
|
|
}
|