// Copyright 2017 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. package markdown_test import ( "strings" "testing" "code.gitea.io/gitea/modules/markup" . "code.gitea.io/gitea/modules/markup/markdown" "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/assert" ) const AppURL = "http://localhost:3000/" const Repo = "gogits/gogs" const AppSubURL = AppURL + Repo + "/" func TestRender_StandardLinks(t *testing.T) { setting.AppURL = AppURL setting.AppSubURL = AppSubURL test := func(input, expected, expectedWiki string) { buffer := RenderString(input, setting.AppSubURL, nil) assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(string(buffer))) bufferWiki := RenderWiki([]byte(input), setting.AppSubURL, nil) assert.Equal(t, strings.TrimSpace(expectedWiki), strings.TrimSpace(bufferWiki)) } googleRendered := `

https://google.com/

` test("", googleRendered, googleRendered) lnk := markup.URLJoin(AppSubURL, "WikiPage") lnkWiki := markup.URLJoin(AppSubURL, "wiki", "WikiPage") test("[WikiPage](WikiPage)", `

WikiPage

`, `

WikiPage

`) } func TestRender_ShortLinks(t *testing.T) { setting.AppURL = AppURL setting.AppSubURL = AppSubURL tree := markup.URLJoin(AppSubURL, "src", "master") test := func(input, expected, expectedWiki string) { buffer := RenderString(input, tree, nil) assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(string(buffer))) buffer = RenderWiki([]byte(input), setting.AppSubURL, nil) assert.Equal(t, strings.TrimSpace(expectedWiki), strings.TrimSpace(string(buffer))) } rawtree := markup.URLJoin(AppSubURL, "raw", "master") url := markup.URLJoin(tree, "Link") otherUrl := markup.URLJoin(tree, "OtherLink") imgurl := markup.URLJoin(rawtree, "Link.jpg") urlWiki := markup.URLJoin(AppSubURL, "wiki", "Link") otherUrlWiki := markup.URLJoin(AppSubURL, "wiki", "OtherLink") imgurlWiki := markup.URLJoin(AppSubURL, "wiki", "raw", "Link.jpg") favicon := "http://google.com/favicon.ico" test( "[[Link]]", `

Link

`, `

Link

`) test( "[[Link.jpg]]", `

Link.jpg

`, `

Link.jpg

`) test( "[["+favicon+"]]", `

`, `

`) test( "[[Name|Link]]", `

Name

`, `

Name

`) test( "[[Name|Link.jpg]]", `

Name

`, `

Name

`) test( "[[Name|Link.jpg|alt=AltName]]", `

AltName

`, `

AltName

`) test( "[[Name|Link.jpg|title=Title]]", `

Title

`, `

Title

`) test( "[[Name|Link.jpg|alt=AltName|title=Title]]", `

AltName

`, `

AltName

`) test( "[[Name|Link.jpg|alt=\"AltName\"|title='Title']]", `

AltName

`, `

AltName

`) test( "[[Link]] [[OtherLink]]", `

Link OtherLink

`, `

Link OtherLink

`) } func TestMisc_IsMarkdownFile(t *testing.T) { setting.Markdown.FileExtensions = []string{".md", ".markdown", ".mdown", ".mkd"} trueTestCases := []string{ "test.md", "wow.MARKDOWN", "LOL.mDoWn", } falseTestCases := []string{ "test", "abcdefg", "abcdefghijklmnopqrstuvwxyz", "test.md.test", } for _, testCase := range trueTestCases { assert.True(t, IsMarkdownFile(testCase)) } for _, testCase := range falseTestCases { assert.False(t, IsMarkdownFile(testCase)) } } func TestRender_Images(t *testing.T) { setting.AppURL = AppURL setting.AppSubURL = AppSubURL test := func(input, expected string) { buffer := RenderString(input, setting.AppSubURL, nil) assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(string(buffer))) } url := "../../.images/src/02/train.jpg" title := "Train" result := markup.URLJoin(AppSubURL, url) test( "!["+title+"]("+url+")", `

`+title+`

`) test( "[["+title+"|"+url+"]]", `

`+title+`

`) } func TestRegExp_ShortLinkPattern(t *testing.T) { trueTestCases := []string{ "[[stuff]]", "[[]]", "[[stuff|title=Difficult name with spaces*!]]", } falseTestCases := []string{ "test", "abcdefg", "[[]", "[[", "[]", "]]", "abcdefghijklmnopqrstuvwxyz", } for _, testCase := range trueTestCases { assert.True(t, markup.ShortLinkPattern.MatchString(testCase)) } for _, testCase := range falseTestCases { assert.False(t, markup.ShortLinkPattern.MatchString(testCase)) } } func testAnswers(baseURLContent, baseURLImages string) []string { return []string{ `

Wiki! Enjoy :)

Ideas and codes

`, `

What is Wine Staging?

Wine Staging on website wine-staging.com.

Quick Links

Here are some links to the most important topics. You can find the full list of pages at the sidebar.

images/icon-install.png Installation
images/icon-usage.png Usage
`, `

Excelsior JET allows you to create native executables for Windows, Linux and Mac OS X.

  1. Package your libGDX application images/1.png
  2. Perform a test run by hitting the Run! button. images/2.png
`, } } // Test cases without ambiguous links var sameCases = []string{ // dear imgui wiki markdown extract: special wiki syntax `Wiki! Enjoy :) - [[Links, Language bindings, Engine bindings|Links]] - [[Tips]] Ideas and codes - Bezier widget (by @r-lyeh) ` + AppURL + `ocornut/imgui/issues/786 - Node graph editors https://github.com/ocornut/imgui/issues/306 - [[Memory Editor|memory_editor_example]] - [[Plot var helper|plot_var_example]]`, // wine-staging wiki home extract: tables, special wiki syntax, images `## What is Wine Staging? **Wine Staging** on website [wine-staging.com](http://wine-staging.com). ## Quick Links Here are some links to the most important topics. You can find the full list of pages at the sidebar. | [[images/icon-install.png]] | [[Installation]] | |--------------------------------|----------------------------------------------------------| | [[images/icon-usage.png]] | [[Usage]] | `, // libgdx wiki page: inline images with special syntax `[Excelsior JET](http://www.excelsiorjet.com/) allows you to create native executables for Windows, Linux and Mac OS X. 1. [Package your libGDX application](https://github.com/libgdx/libgdx/wiki/Gradle-on-the-Commandline#packaging-for-the-desktop) [[images/1.png]] 2. Perform a test run by hitting the Run! button. [[images/2.png]]`, } func TestTotal_RenderWiki(t *testing.T) { answers := testAnswers(markup.URLJoin(AppSubURL, "wiki/"), markup.URLJoin(AppSubURL, "wiki", "raw/")) for i := 0; i < len(sameCases); i++ { line := RenderWiki([]byte(sameCases[i]), AppSubURL, nil) assert.Equal(t, answers[i], line) } testCases := []string{ // Guard wiki sidebar: special syntax `[[Guardfile-DSL / Configuring-Guard|Guardfile-DSL---Configuring-Guard]]`, // rendered `

Guardfile-DSL / Configuring-Guard

`, // special syntax `[[Name|Link]]`, // rendered `

Name

`, } for i := 0; i < len(testCases); i += 2 { line := RenderWiki([]byte(testCases[i]), AppSubURL, nil) assert.Equal(t, testCases[i+1], line) } } func TestTotal_RenderString(t *testing.T) { answers := testAnswers(markup.URLJoin(AppSubURL, "src", "master/"), markup.URLJoin(AppSubURL, "raw", "master/")) for i := 0; i < len(sameCases); i++ { line := RenderString(sameCases[i], markup.URLJoin(AppSubURL, "src", "master/"), nil) assert.Equal(t, answers[i], line) } testCases := []string{} for i := 0; i < len(testCases); i += 2 { line := RenderString(testCases[i], AppSubURL, nil) assert.Equal(t, testCases[i+1], line) } }