forgejo/tests/integration/markup_external_test.go
Matthias Riße 04dd8ae525 feat: match on compound filename extensions (#11439)
Instead of going with a single extension, extracted by `filepath.Ext()`,
all possible extensions are now generated for a given filename, by
splitting the filename using a "." separator, starting with the
longest candidate. Moreover, each extension candidate is matched
against the actual set of known renderers (`extRenderers`), and
only the longest matching extension is used.

Resolves https://codeberg.org/forgejo/forgejo/issues/5190.

Co-authored-by: Michael Hanke <michael.hanke@gmail.com>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/11439
Reviewed-by: Ellen Εμιλία Άννα Zscheile <fogti@noreply.codeberg.org>
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: Matthias Riße <matrss@0px.xyz>
Co-committed-by: Matthias Riße <matrss@0px.xyz>
2026-03-19 01:25:51 +01:00

116 lines
3.3 KiB
Go

// Copyright 2022 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package integration
import (
"bytes"
"io"
"net/http"
"net/url"
"strings"
"testing"
"time"
"forgejo.org/models/unit"
"forgejo.org/models/unittest"
user_model "forgejo.org/models/user"
"forgejo.org/modules/git"
"forgejo.org/modules/setting"
files_service "forgejo.org/services/repository/files"
"forgejo.org/tests"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestExternalMarkupRenderer(t *testing.T) {
defer tests.PrepareTestEnv(t)()
if !setting.Database.Type.IsSQLite3() {
t.Skip()
return
}
const repoURL = "user30/renderer"
req := NewRequest(t, "GET", repoURL+"/src/branch/master/README.html")
resp := MakeRequest(t, req, http.StatusOK)
assert.Equal(t, "text/html; charset=utf-8", resp.Header()["Content-Type"][0])
bs, err := io.ReadAll(resp.Body)
require.NoError(t, err)
doc := NewHTMLParser(t, bytes.NewBuffer(bs))
div := doc.Find("div.file-view")
data, err := div.Html()
require.NoError(t, err)
assert.Equal(t, "<div>\n\ttest external renderer\n</div>", strings.TrimSpace(data))
}
func TestExternalMarkupRendererWithCompoundFileExtensions(t *testing.T) {
onApplicationRun(t, func(t *testing.T, u *url.URL) {
testCases := []struct {
path string
shouldUseExternalRenderer bool
expectedRenderedContent string
}{
{"foo.abc.def.ghi.jkl.md", true, ".def.ghi.jkl.md renderer used"},
{"foo.def.ghi.jkl.md", true, ".def.ghi.jkl.md renderer used"},
{"foo.ghi.jkl.md", true, ".ghi.jkl.md renderer used"},
{"foo.jkl.md", false, "foo"},
{"foo.md", false, "foo"},
}
changeRepoFiles := []*files_service.ChangeRepoFile{}
for _, testCase := range testCases {
changeRepoFiles = append(changeRepoFiles,
&files_service.ChangeRepoFile{
Operation: "create",
TreePath: testCase.path,
ContentReader: strings.NewReader("foo"),
},
)
}
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
repo, _, f := tests.CreateDeclarativeRepo(t, user, "", []unit.Type{unit.TypeCode}, nil, nil)
defer f()
_, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, user, &files_service.ChangeRepoFilesOptions{
Files: changeRepoFiles,
Message: "add files",
Author: &files_service.IdentityOptions{
Name: user.Name,
Email: user.Email,
},
Committer: &files_service.IdentityOptions{
Name: user.Name,
Email: user.Email,
},
Dates: &files_service.CommitDateOptions{
Author: time.Now(),
Committer: time.Now(),
},
})
require.NoError(t, err)
for _, testCase := range testCases {
t.Run(testCase.path, func(t *testing.T) {
req := NewRequestf(t, "GET", "%s/src/branch/%s/%s", repo.HTMLURL(), repo.DefaultBranch, testCase.path)
resp := MakeRequest(t, req, http.StatusOK)
require.Equal(t, "text/html; charset=utf-8", resp.Header()["Content-Type"][0])
doc := NewHTMLParser(t, resp.Body)
var query string
if testCase.shouldUseExternalRenderer {
query = "div.file-view"
} else {
query = "div.file-view p"
}
p := doc.Find(query)
data, err := p.Html()
require.NoError(t, err)
assert.Equal(t, testCase.expectedRenderedContent, strings.TrimSpace(data))
})
}
})
}