code.gitea.io/gitea@v1.21.7/routers/web/repo/wiki_test.go (about)

     1  // Copyright 2017 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package repo
     5  
     6  import (
     7  	"io"
     8  	"net/http"
     9  	"net/url"
    10  	"testing"
    11  
    12  	repo_model "code.gitea.io/gitea/models/repo"
    13  	"code.gitea.io/gitea/models/unittest"
    14  	"code.gitea.io/gitea/modules/contexttest"
    15  	"code.gitea.io/gitea/modules/git"
    16  	"code.gitea.io/gitea/modules/web"
    17  	"code.gitea.io/gitea/services/forms"
    18  	wiki_service "code.gitea.io/gitea/services/wiki"
    19  
    20  	"github.com/stretchr/testify/assert"
    21  )
    22  
    23  const (
    24  	content = "Wiki contents for unit tests"
    25  	message = "Wiki commit message for unit tests"
    26  )
    27  
    28  func wikiEntry(t *testing.T, repo *repo_model.Repository, wikiName wiki_service.WebPath) *git.TreeEntry {
    29  	wikiRepo, err := git.OpenRepository(git.DefaultContext, repo.WikiPath())
    30  	assert.NoError(t, err)
    31  	defer wikiRepo.Close()
    32  	commit, err := wikiRepo.GetBranchCommit("master")
    33  	assert.NoError(t, err)
    34  	entries, err := commit.ListEntries()
    35  	assert.NoError(t, err)
    36  	for _, entry := range entries {
    37  		if entry.Name() == wiki_service.WebPathToGitPath(wikiName) {
    38  			return entry
    39  		}
    40  	}
    41  	return nil
    42  }
    43  
    44  func wikiContent(t *testing.T, repo *repo_model.Repository, wikiName wiki_service.WebPath) string {
    45  	entry := wikiEntry(t, repo, wikiName)
    46  	if !assert.NotNil(t, entry) {
    47  		return ""
    48  	}
    49  	reader, err := entry.Blob().DataAsync()
    50  	assert.NoError(t, err)
    51  	defer reader.Close()
    52  	bytes, err := io.ReadAll(reader)
    53  	assert.NoError(t, err)
    54  	return string(bytes)
    55  }
    56  
    57  func assertWikiExists(t *testing.T, repo *repo_model.Repository, wikiName wiki_service.WebPath) {
    58  	assert.NotNil(t, wikiEntry(t, repo, wikiName))
    59  }
    60  
    61  func assertWikiNotExists(t *testing.T, repo *repo_model.Repository, wikiName wiki_service.WebPath) {
    62  	assert.Nil(t, wikiEntry(t, repo, wikiName))
    63  }
    64  
    65  func assertPagesMetas(t *testing.T, expectedNames []string, metas any) {
    66  	pageMetas, ok := metas.([]PageMeta)
    67  	if !assert.True(t, ok) {
    68  		return
    69  	}
    70  	if !assert.Len(t, pageMetas, len(expectedNames)) {
    71  		return
    72  	}
    73  	for i, pageMeta := range pageMetas {
    74  		assert.EqualValues(t, expectedNames[i], pageMeta.Name)
    75  	}
    76  }
    77  
    78  func TestWiki(t *testing.T) {
    79  	unittest.PrepareTestEnv(t)
    80  
    81  	ctx, _ := contexttest.MockContext(t, "user2/repo1/wiki/?action=_pages")
    82  	ctx.SetParams("*", "Home")
    83  	contexttest.LoadRepo(t, ctx, 1)
    84  	Wiki(ctx)
    85  	assert.EqualValues(t, http.StatusOK, ctx.Resp.Status())
    86  	assert.EqualValues(t, "Home", ctx.Data["Title"])
    87  	assertPagesMetas(t, []string{"Home", "Page With Image", "Page With Spaced Name", "Unescaped File"}, ctx.Data["Pages"])
    88  }
    89  
    90  func TestWikiPages(t *testing.T) {
    91  	unittest.PrepareTestEnv(t)
    92  
    93  	ctx, _ := contexttest.MockContext(t, "user2/repo1/wiki/?action=_pages")
    94  	contexttest.LoadRepo(t, ctx, 1)
    95  	WikiPages(ctx)
    96  	assert.EqualValues(t, http.StatusOK, ctx.Resp.Status())
    97  	assertPagesMetas(t, []string{"Home", "Page With Image", "Page With Spaced Name", "Unescaped File"}, ctx.Data["Pages"])
    98  }
    99  
   100  func TestNewWiki(t *testing.T) {
   101  	unittest.PrepareTestEnv(t)
   102  
   103  	ctx, _ := contexttest.MockContext(t, "user2/repo1/wiki/?action=_new")
   104  	contexttest.LoadUser(t, ctx, 2)
   105  	contexttest.LoadRepo(t, ctx, 1)
   106  	NewWiki(ctx)
   107  	assert.EqualValues(t, http.StatusOK, ctx.Resp.Status())
   108  	assert.EqualValues(t, ctx.Tr("repo.wiki.new_page"), ctx.Data["Title"])
   109  }
   110  
   111  func TestNewWikiPost(t *testing.T) {
   112  	for _, title := range []string{
   113  		"New page",
   114  		"&&&&",
   115  	} {
   116  		unittest.PrepareTestEnv(t)
   117  
   118  		ctx, _ := contexttest.MockContext(t, "user2/repo1/wiki/?action=_new")
   119  		contexttest.LoadUser(t, ctx, 2)
   120  		contexttest.LoadRepo(t, ctx, 1)
   121  		web.SetForm(ctx, &forms.NewWikiForm{
   122  			Title:   title,
   123  			Content: content,
   124  			Message: message,
   125  		})
   126  		NewWikiPost(ctx)
   127  		assert.EqualValues(t, http.StatusSeeOther, ctx.Resp.Status())
   128  		assertWikiExists(t, ctx.Repo.Repository, wiki_service.UserTitleToWebPath("", title))
   129  		assert.Equal(t, wikiContent(t, ctx.Repo.Repository, wiki_service.UserTitleToWebPath("", title)), content)
   130  	}
   131  }
   132  
   133  func TestNewWikiPost_ReservedName(t *testing.T) {
   134  	unittest.PrepareTestEnv(t)
   135  
   136  	ctx, _ := contexttest.MockContext(t, "user2/repo1/wiki/?action=_new")
   137  	contexttest.LoadUser(t, ctx, 2)
   138  	contexttest.LoadRepo(t, ctx, 1)
   139  	web.SetForm(ctx, &forms.NewWikiForm{
   140  		Title:   "_edit",
   141  		Content: content,
   142  		Message: message,
   143  	})
   144  	NewWikiPost(ctx)
   145  	assert.EqualValues(t, http.StatusOK, ctx.Resp.Status())
   146  	assert.EqualValues(t, ctx.Tr("repo.wiki.reserved_page"), ctx.Flash.ErrorMsg)
   147  	assertWikiNotExists(t, ctx.Repo.Repository, "_edit")
   148  }
   149  
   150  func TestEditWiki(t *testing.T) {
   151  	unittest.PrepareTestEnv(t)
   152  
   153  	ctx, _ := contexttest.MockContext(t, "user2/repo1/wiki/Home?action=_edit")
   154  	ctx.SetParams("*", "Home")
   155  	contexttest.LoadUser(t, ctx, 2)
   156  	contexttest.LoadRepo(t, ctx, 1)
   157  	EditWiki(ctx)
   158  	assert.EqualValues(t, http.StatusOK, ctx.Resp.Status())
   159  	assert.EqualValues(t, "Home", ctx.Data["Title"])
   160  	assert.Equal(t, wikiContent(t, ctx.Repo.Repository, "Home"), ctx.Data["content"])
   161  }
   162  
   163  func TestEditWikiPost(t *testing.T) {
   164  	for _, title := range []string{
   165  		"Home",
   166  		"New/<page>",
   167  	} {
   168  		unittest.PrepareTestEnv(t)
   169  		ctx, _ := contexttest.MockContext(t, "user2/repo1/wiki/Home?action=_new")
   170  		ctx.SetParams("*", "Home")
   171  		contexttest.LoadUser(t, ctx, 2)
   172  		contexttest.LoadRepo(t, ctx, 1)
   173  		web.SetForm(ctx, &forms.NewWikiForm{
   174  			Title:   title,
   175  			Content: content,
   176  			Message: message,
   177  		})
   178  		EditWikiPost(ctx)
   179  		assert.EqualValues(t, http.StatusSeeOther, ctx.Resp.Status())
   180  		assertWikiExists(t, ctx.Repo.Repository, wiki_service.UserTitleToWebPath("", title))
   181  		assert.Equal(t, wikiContent(t, ctx.Repo.Repository, wiki_service.UserTitleToWebPath("", title)), content)
   182  		if title != "Home" {
   183  			assertWikiNotExists(t, ctx.Repo.Repository, "Home")
   184  		}
   185  	}
   186  }
   187  
   188  func TestDeleteWikiPagePost(t *testing.T) {
   189  	unittest.PrepareTestEnv(t)
   190  
   191  	ctx, _ := contexttest.MockContext(t, "user2/repo1/wiki/Home?action=_delete")
   192  	contexttest.LoadUser(t, ctx, 2)
   193  	contexttest.LoadRepo(t, ctx, 1)
   194  	DeleteWikiPagePost(ctx)
   195  	assert.EqualValues(t, http.StatusOK, ctx.Resp.Status())
   196  	assertWikiNotExists(t, ctx.Repo.Repository, "Home")
   197  }
   198  
   199  func TestWikiRaw(t *testing.T) {
   200  	for filepath, filetype := range map[string]string{
   201  		"jpeg.jpg":                 "image/jpeg",
   202  		"images/jpeg.jpg":          "image/jpeg",
   203  		"Page With Spaced Name":    "text/plain; charset=utf-8",
   204  		"Page-With-Spaced-Name":    "text/plain; charset=utf-8",
   205  		"Page With Spaced Name.md": "", // there is no "Page With Spaced Name.md" in repo
   206  		"Page-With-Spaced-Name.md": "text/plain; charset=utf-8",
   207  	} {
   208  		unittest.PrepareTestEnv(t)
   209  
   210  		ctx, _ := contexttest.MockContext(t, "user2/repo1/wiki/raw/"+url.PathEscape(filepath))
   211  		ctx.SetParams("*", filepath)
   212  		contexttest.LoadUser(t, ctx, 2)
   213  		contexttest.LoadRepo(t, ctx, 1)
   214  		WikiRaw(ctx)
   215  		if filetype == "" {
   216  			assert.EqualValues(t, http.StatusNotFound, ctx.Resp.Status(), "filepath: %s", filepath)
   217  		} else {
   218  			assert.EqualValues(t, http.StatusOK, ctx.Resp.Status(), "filepath: %s", filepath)
   219  			assert.EqualValues(t, filetype, ctx.Resp.Header().Get("Content-Type"), "filepath: %s", filepath)
   220  		}
   221  	}
   222  }