2021-06-21 05:12:19 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-06-21 05:12:19 +03:00
package webhook
import (
2024-03-08 01:18:38 +03:00
"context"
2021-06-21 05:12:19 +03:00
"testing"
2024-03-08 01:18:38 +03:00
webhook_model "code.gitea.io/gitea/models/webhook"
"code.gitea.io/gitea/modules/json"
2021-06-21 05:12:19 +03:00
"code.gitea.io/gitea/modules/setting"
api "code.gitea.io/gitea/modules/structs"
2023-01-01 18:23:15 +03:00
webhook_module "code.gitea.io/gitea/modules/webhook"
2021-06-21 05:12:19 +03:00
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestDiscordPayload ( t * testing . T ) {
2024-03-08 01:18:38 +03:00
dc := discordConvertor { }
2021-06-21 05:12:19 +03:00
t . Run ( "Create" , func ( t * testing . T ) {
p := createTestPayload ( )
2024-03-08 01:18:38 +03:00
pl , err := dc . Create ( p )
2021-06-21 05:12:19 +03:00
require . NoError ( t , err )
2024-03-08 01:18:38 +03:00
assert . Len ( t , pl . Embeds , 1 )
assert . Equal ( t , "[test/repo] branch test created" , pl . Embeds [ 0 ] . Title )
assert . Empty ( t , pl . Embeds [ 0 ] . Description )
assert . Equal ( t , "http://localhost:3000/test/repo/src/test" , pl . Embeds [ 0 ] . URL )
assert . Equal ( t , p . Sender . UserName , pl . Embeds [ 0 ] . Author . Name )
assert . Equal ( t , setting . AppURL + p . Sender . UserName , pl . Embeds [ 0 ] . Author . URL )
assert . Equal ( t , p . Sender . AvatarURL , pl . Embeds [ 0 ] . Author . IconURL )
2021-06-21 05:12:19 +03:00
} )
t . Run ( "Delete" , func ( t * testing . T ) {
p := deleteTestPayload ( )
2024-03-08 01:18:38 +03:00
pl , err := dc . Delete ( p )
2021-06-21 05:12:19 +03:00
require . NoError ( t , err )
2024-03-08 01:18:38 +03:00
assert . Len ( t , pl . Embeds , 1 )
assert . Equal ( t , "[test/repo] branch test deleted" , pl . Embeds [ 0 ] . Title )
assert . Empty ( t , pl . Embeds [ 0 ] . Description )
assert . Equal ( t , "http://localhost:3000/test/repo/src/test" , pl . Embeds [ 0 ] . URL )
assert . Equal ( t , p . Sender . UserName , pl . Embeds [ 0 ] . Author . Name )
assert . Equal ( t , setting . AppURL + p . Sender . UserName , pl . Embeds [ 0 ] . Author . URL )
assert . Equal ( t , p . Sender . AvatarURL , pl . Embeds [ 0 ] . Author . IconURL )
2021-06-21 05:12:19 +03:00
} )
t . Run ( "Fork" , func ( t * testing . T ) {
p := forkTestPayload ( )
2024-03-08 01:18:38 +03:00
pl , err := dc . Fork ( p )
2021-06-21 05:12:19 +03:00
require . NoError ( t , err )
2024-03-08 01:18:38 +03:00
assert . Len ( t , pl . Embeds , 1 )
assert . Equal ( t , "test/repo2 is forked to test/repo" , pl . Embeds [ 0 ] . Title )
assert . Empty ( t , pl . Embeds [ 0 ] . Description )
assert . Equal ( t , "http://localhost:3000/test/repo" , pl . Embeds [ 0 ] . URL )
assert . Equal ( t , p . Sender . UserName , pl . Embeds [ 0 ] . Author . Name )
assert . Equal ( t , setting . AppURL + p . Sender . UserName , pl . Embeds [ 0 ] . Author . URL )
assert . Equal ( t , p . Sender . AvatarURL , pl . Embeds [ 0 ] . Author . IconURL )
2021-06-21 05:12:19 +03:00
} )
t . Run ( "Push" , func ( t * testing . T ) {
p := pushTestPayload ( )
2024-03-08 01:18:38 +03:00
pl , err := dc . Push ( p )
2021-06-21 05:12:19 +03:00
require . NoError ( t , err )
2024-03-08 01:18:38 +03:00
assert . Len ( t , pl . Embeds , 1 )
assert . Equal ( t , "[test/repo:test] 2 new commits" , pl . Embeds [ 0 ] . Title )
assert . Equal ( t , "[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1" , pl . Embeds [ 0 ] . Description )
assert . Equal ( t , "http://localhost:3000/test/repo/src/test" , pl . Embeds [ 0 ] . URL )
assert . Equal ( t , p . Sender . UserName , pl . Embeds [ 0 ] . Author . Name )
assert . Equal ( t , setting . AppURL + p . Sender . UserName , pl . Embeds [ 0 ] . Author . URL )
assert . Equal ( t , p . Sender . AvatarURL , pl . Embeds [ 0 ] . Author . IconURL )
2021-06-21 05:12:19 +03:00
} )
2024-09-24 06:38:08 +03:00
t . Run ( "PushWithLongCommitMessage" , func ( t * testing . T ) {
p := pushTestMultilineCommitMessagePayload ( )
pl , err := dc . Push ( p )
require . NoError ( t , err )
assert . Len ( t , pl . Embeds , 1 )
assert . Equal ( t , "[test/repo:test] 2 new commits" , pl . Embeds [ 0 ] . Title )
assert . Equal ( t , "[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) This is a commit summary ⚠️⚠️⚠️⚠️ containing 你好... - user1\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) This is a commit summary ⚠️⚠️⚠️⚠️ containing 你好... - user1" , pl . Embeds [ 0 ] . Description )
assert . Equal ( t , p . Sender . UserName , pl . Embeds [ 0 ] . Author . Name )
assert . Equal ( t , setting . AppURL + p . Sender . UserName , pl . Embeds [ 0 ] . Author . URL )
assert . Equal ( t , p . Sender . AvatarURL , pl . Embeds [ 0 ] . Author . IconURL )
} )
2024-11-19 00:47:11 +03:00
t . Run ( "PushWithMarkdownCharactersInCommitMessage" , func ( t * testing . T ) {
p := pushTestEscapeCommitMessagePayload ( )
pl , err := dc . Push ( p )
require . NoError ( t , err )
assert . Len ( t , pl . Embeds , 1 )
assert . Equal ( t , "[test/repo:test] 2 new commits" , pl . Embeds [ 0 ] . Title )
assert . Equal ( t , "[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) \\# conflicts\n\\# \\- some/conflicting/file.txt - user1\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) \\# conflicts\n\\# \\- some/conflicting/file.txt - user1" , pl . Embeds [ 0 ] . Description )
assert . Equal ( t , p . Sender . UserName , pl . Embeds [ 0 ] . Author . Name )
assert . Equal ( t , setting . AppURL + p . Sender . UserName , pl . Embeds [ 0 ] . Author . URL )
assert . Equal ( t , p . Sender . AvatarURL , pl . Embeds [ 0 ] . Author . IconURL )
} )
2021-06-21 05:12:19 +03:00
t . Run ( "Issue" , func ( t * testing . T ) {
p := issueTestPayload ( )
p . Action = api . HookIssueOpened
2024-03-08 01:18:38 +03:00
pl , err := dc . Issue ( p )
2021-06-21 05:12:19 +03:00
require . NoError ( t , err )
2024-03-08 01:18:38 +03:00
assert . Len ( t , pl . Embeds , 1 )
assert . Equal ( t , "[test/repo] Issue opened: #2 crash" , pl . Embeds [ 0 ] . Title )
assert . Equal ( t , "issue body" , pl . Embeds [ 0 ] . Description )
assert . Equal ( t , "http://localhost:3000/test/repo/issues/2" , pl . Embeds [ 0 ] . URL )
assert . Equal ( t , p . Sender . UserName , pl . Embeds [ 0 ] . Author . Name )
assert . Equal ( t , setting . AppURL + p . Sender . UserName , pl . Embeds [ 0 ] . Author . URL )
assert . Equal ( t , p . Sender . AvatarURL , pl . Embeds [ 0 ] . Author . IconURL )
2021-06-21 05:12:19 +03:00
p . Action = api . HookIssueClosed
2024-03-08 01:18:38 +03:00
pl , err = dc . Issue ( p )
2021-06-21 05:12:19 +03:00
require . NoError ( t , err )
2024-03-08 01:18:38 +03:00
assert . Len ( t , pl . Embeds , 1 )
assert . Equal ( t , "[test/repo] Issue closed: #2 crash" , pl . Embeds [ 0 ] . Title )
assert . Empty ( t , pl . Embeds [ 0 ] . Description )
assert . Equal ( t , "http://localhost:3000/test/repo/issues/2" , pl . Embeds [ 0 ] . URL )
assert . Equal ( t , p . Sender . UserName , pl . Embeds [ 0 ] . Author . Name )
assert . Equal ( t , setting . AppURL + p . Sender . UserName , pl . Embeds [ 0 ] . Author . URL )
assert . Equal ( t , p . Sender . AvatarURL , pl . Embeds [ 0 ] . Author . IconURL )
2024-10-07 23:47:52 +03:00
j , err := json . Marshal ( pl )
require . NoError ( t , err )
unsetFields := struct {
Content * string ` json:"content" `
TTS * bool ` json:"tts" `
Wait * bool ` json:"wait" `
Fields [ ] any ` json:"fields" `
Footer struct {
Text * string ` json:"text" `
} ` json:"footer" `
} { }
err = json . Unmarshal ( j , & unsetFields )
require . NoError ( t , err )
assert . Nil ( t , unsetFields . Content )
assert . Nil ( t , unsetFields . TTS )
assert . Nil ( t , unsetFields . Wait )
assert . Nil ( t , unsetFields . Fields )
assert . Nil ( t , unsetFields . Footer . Text )
} )
t . Run ( "Issue with long title" , func ( t * testing . T ) {
p := issueTestPayloadWithLongTitle ( )
p . Action = api . HookIssueOpened
pl , err := dc . Issue ( p )
require . NoError ( t , err )
assert . Len ( t , pl . Embeds , 1 )
assert . Len ( t , pl . Embeds [ 0 ] . Title , 256 )
} )
t . Run ( "Issue with long body" , func ( t * testing . T ) {
p := issueTestPayloadWithLongBody ( )
p . Action = api . HookIssueOpened
pl , err := dc . Issue ( p )
require . NoError ( t , err )
assert . Len ( t , pl . Embeds , 1 )
assert . Len ( t , pl . Embeds [ 0 ] . Description , 4096 )
2021-06-21 05:12:19 +03:00
} )
t . Run ( "IssueComment" , func ( t * testing . T ) {
p := issueCommentTestPayload ( )
2024-03-08 01:18:38 +03:00
pl , err := dc . IssueComment ( p )
2021-06-21 05:12:19 +03:00
require . NoError ( t , err )
2024-03-08 01:18:38 +03:00
assert . Len ( t , pl . Embeds , 1 )
assert . Equal ( t , "[test/repo] New comment on issue #2 crash" , pl . Embeds [ 0 ] . Title )
assert . Equal ( t , "more info needed" , pl . Embeds [ 0 ] . Description )
assert . Equal ( t , "http://localhost:3000/test/repo/issues/2#issuecomment-4" , pl . Embeds [ 0 ] . URL )
assert . Equal ( t , p . Sender . UserName , pl . Embeds [ 0 ] . Author . Name )
assert . Equal ( t , setting . AppURL + p . Sender . UserName , pl . Embeds [ 0 ] . Author . URL )
assert . Equal ( t , p . Sender . AvatarURL , pl . Embeds [ 0 ] . Author . IconURL )
2021-06-21 05:12:19 +03:00
} )
t . Run ( "PullRequest" , func ( t * testing . T ) {
p := pullRequestTestPayload ( )
2024-03-08 01:18:38 +03:00
pl , err := dc . PullRequest ( p )
2021-06-21 05:12:19 +03:00
require . NoError ( t , err )
2024-03-08 01:18:38 +03:00
assert . Len ( t , pl . Embeds , 1 )
assert . Equal ( t , "[test/repo] Pull request opened: #12 Fix bug" , pl . Embeds [ 0 ] . Title )
assert . Equal ( t , "fixes bug #2" , pl . Embeds [ 0 ] . Description )
assert . Equal ( t , "http://localhost:3000/test/repo/pulls/12" , pl . Embeds [ 0 ] . URL )
assert . Equal ( t , p . Sender . UserName , pl . Embeds [ 0 ] . Author . Name )
assert . Equal ( t , setting . AppURL + p . Sender . UserName , pl . Embeds [ 0 ] . Author . URL )
assert . Equal ( t , p . Sender . AvatarURL , pl . Embeds [ 0 ] . Author . IconURL )
2021-06-21 05:12:19 +03:00
} )
t . Run ( "PullRequestComment" , func ( t * testing . T ) {
p := pullRequestCommentTestPayload ( )
2024-03-08 01:18:38 +03:00
pl , err := dc . IssueComment ( p )
2021-06-21 05:12:19 +03:00
require . NoError ( t , err )
2024-03-08 01:18:38 +03:00
assert . Len ( t , pl . Embeds , 1 )
assert . Equal ( t , "[test/repo] New comment on pull request #12 Fix bug" , pl . Embeds [ 0 ] . Title )
assert . Equal ( t , "changes requested" , pl . Embeds [ 0 ] . Description )
assert . Equal ( t , "http://localhost:3000/test/repo/pulls/12#issuecomment-4" , pl . Embeds [ 0 ] . URL )
assert . Equal ( t , p . Sender . UserName , pl . Embeds [ 0 ] . Author . Name )
assert . Equal ( t , setting . AppURL + p . Sender . UserName , pl . Embeds [ 0 ] . Author . URL )
assert . Equal ( t , p . Sender . AvatarURL , pl . Embeds [ 0 ] . Author . IconURL )
2021-06-21 05:12:19 +03:00
} )
t . Run ( "Review" , func ( t * testing . T ) {
p := pullRequestTestPayload ( )
p . Action = api . HookIssueReviewed
2024-03-08 01:18:38 +03:00
pl , err := dc . Review ( p , webhook_module . HookEventPullRequestReviewApproved )
2021-06-21 05:12:19 +03:00
require . NoError ( t , err )
2024-03-08 01:18:38 +03:00
assert . Len ( t , pl . Embeds , 1 )
assert . Equal ( t , "[test/repo] Pull request review approved: #12 Fix bug" , pl . Embeds [ 0 ] . Title )
assert . Equal ( t , "good job" , pl . Embeds [ 0 ] . Description )
assert . Equal ( t , "http://localhost:3000/test/repo/pulls/12" , pl . Embeds [ 0 ] . URL )
assert . Equal ( t , p . Sender . UserName , pl . Embeds [ 0 ] . Author . Name )
assert . Equal ( t , setting . AppURL + p . Sender . UserName , pl . Embeds [ 0 ] . Author . URL )
assert . Equal ( t , p . Sender . AvatarURL , pl . Embeds [ 0 ] . Author . IconURL )
2021-06-21 05:12:19 +03:00
} )
t . Run ( "Repository" , func ( t * testing . T ) {
p := repositoryTestPayload ( )
2024-03-08 01:18:38 +03:00
pl , err := dc . Repository ( p )
2021-06-21 05:12:19 +03:00
require . NoError ( t , err )
2024-03-08 01:18:38 +03:00
assert . Len ( t , pl . Embeds , 1 )
assert . Equal ( t , "[test/repo] Repository created" , pl . Embeds [ 0 ] . Title )
assert . Empty ( t , pl . Embeds [ 0 ] . Description )
assert . Equal ( t , "http://localhost:3000/test/repo" , pl . Embeds [ 0 ] . URL )
assert . Equal ( t , p . Sender . UserName , pl . Embeds [ 0 ] . Author . Name )
assert . Equal ( t , setting . AppURL + p . Sender . UserName , pl . Embeds [ 0 ] . Author . URL )
assert . Equal ( t , p . Sender . AvatarURL , pl . Embeds [ 0 ] . Author . IconURL )
2021-06-21 05:12:19 +03:00
} )
2023-11-17 14:17:33 +03:00
t . Run ( "Package" , func ( t * testing . T ) {
p := packageTestPayload ( )
2024-03-08 01:18:38 +03:00
pl , err := dc . Package ( p )
2023-11-17 14:17:33 +03:00
require . NoError ( t , err )
2024-03-08 01:18:38 +03:00
assert . Len ( t , pl . Embeds , 1 )
assert . Equal ( t , "Package created: GiteaContainer:latest" , pl . Embeds [ 0 ] . Title )
assert . Empty ( t , pl . Embeds [ 0 ] . Description )
assert . Equal ( t , "http://localhost:3000/user1/-/packages/container/GiteaContainer/latest" , pl . Embeds [ 0 ] . URL )
assert . Equal ( t , p . Sender . UserName , pl . Embeds [ 0 ] . Author . Name )
assert . Equal ( t , setting . AppURL + p . Sender . UserName , pl . Embeds [ 0 ] . Author . URL )
assert . Equal ( t , p . Sender . AvatarURL , pl . Embeds [ 0 ] . Author . IconURL )
2023-11-17 14:17:33 +03:00
} )
2022-09-04 22:54:23 +03:00
t . Run ( "Wiki" , func ( t * testing . T ) {
p := wikiTestPayload ( )
p . Action = api . HookWikiCreated
2024-03-08 01:18:38 +03:00
pl , err := dc . Wiki ( p )
2022-09-04 22:54:23 +03:00
require . NoError ( t , err )
2024-03-08 01:18:38 +03:00
assert . Len ( t , pl . Embeds , 1 )
assert . Equal ( t , "[test/repo] New wiki page 'index' (Wiki change comment)" , pl . Embeds [ 0 ] . Title )
assert . Equal ( t , "Wiki change comment" , pl . Embeds [ 0 ] . Description )
assert . Equal ( t , "http://localhost:3000/test/repo/wiki/index" , pl . Embeds [ 0 ] . URL )
assert . Equal ( t , p . Sender . UserName , pl . Embeds [ 0 ] . Author . Name )
assert . Equal ( t , setting . AppURL + p . Sender . UserName , pl . Embeds [ 0 ] . Author . URL )
assert . Equal ( t , p . Sender . AvatarURL , pl . Embeds [ 0 ] . Author . IconURL )
2022-09-04 22:54:23 +03:00
p . Action = api . HookWikiEdited
2024-03-08 01:18:38 +03:00
pl , err = dc . Wiki ( p )
2022-09-04 22:54:23 +03:00
require . NoError ( t , err )
2024-03-08 01:18:38 +03:00
assert . Len ( t , pl . Embeds , 1 )
assert . Equal ( t , "[test/repo] Wiki page 'index' edited (Wiki change comment)" , pl . Embeds [ 0 ] . Title )
assert . Equal ( t , "Wiki change comment" , pl . Embeds [ 0 ] . Description )
assert . Equal ( t , "http://localhost:3000/test/repo/wiki/index" , pl . Embeds [ 0 ] . URL )
assert . Equal ( t , p . Sender . UserName , pl . Embeds [ 0 ] . Author . Name )
assert . Equal ( t , setting . AppURL + p . Sender . UserName , pl . Embeds [ 0 ] . Author . URL )
assert . Equal ( t , p . Sender . AvatarURL , pl . Embeds [ 0 ] . Author . IconURL )
2022-09-04 22:54:23 +03:00
p . Action = api . HookWikiDeleted
2024-03-08 01:18:38 +03:00
pl , err = dc . Wiki ( p )
2022-09-04 22:54:23 +03:00
require . NoError ( t , err )
2024-03-08 01:18:38 +03:00
assert . Len ( t , pl . Embeds , 1 )
assert . Equal ( t , "[test/repo] Wiki page 'index' deleted" , pl . Embeds [ 0 ] . Title )
assert . Empty ( t , pl . Embeds [ 0 ] . Description )
assert . Equal ( t , "http://localhost:3000/test/repo/wiki/index" , pl . Embeds [ 0 ] . URL )
assert . Equal ( t , p . Sender . UserName , pl . Embeds [ 0 ] . Author . Name )
assert . Equal ( t , setting . AppURL + p . Sender . UserName , pl . Embeds [ 0 ] . Author . URL )
assert . Equal ( t , p . Sender . AvatarURL , pl . Embeds [ 0 ] . Author . IconURL )
2022-09-04 22:54:23 +03:00
} )
2021-06-21 05:12:19 +03:00
t . Run ( "Release" , func ( t * testing . T ) {
p := pullReleaseTestPayload ( )
2024-03-08 01:18:38 +03:00
pl , err := dc . Release ( p )
2021-06-21 05:12:19 +03:00
require . NoError ( t , err )
2024-03-08 01:18:38 +03:00
assert . Len ( t , pl . Embeds , 1 )
assert . Equal ( t , "[test/repo] Release created: v1.0" , pl . Embeds [ 0 ] . Title )
assert . Equal ( t , "Note of first stable release" , pl . Embeds [ 0 ] . Description )
assert . Equal ( t , "http://localhost:3000/test/repo/releases/tag/v1.0" , pl . Embeds [ 0 ] . URL )
assert . Equal ( t , p . Sender . UserName , pl . Embeds [ 0 ] . Author . Name )
assert . Equal ( t , setting . AppURL + p . Sender . UserName , pl . Embeds [ 0 ] . Author . URL )
assert . Equal ( t , p . Sender . AvatarURL , pl . Embeds [ 0 ] . Author . IconURL )
2021-06-21 05:12:19 +03:00
} )
}
func TestDiscordJSONPayload ( t * testing . T ) {
p := pushTestPayload ( )
2024-03-08 01:18:38 +03:00
data , err := p . JSONPayload ( )
2021-06-21 05:12:19 +03:00
require . NoError ( t , err )
2024-03-08 01:18:38 +03:00
hook := & webhook_model . Webhook {
RepoID : 3 ,
IsActive : true ,
Type : webhook_module . DISCORD ,
URL : "https://discord.example.com/" ,
Meta : ` { } ` ,
HTTPMethod : "POST" ,
}
task := & webhook_model . HookTask {
HookID : hook . ID ,
EventType : webhook_module . HookEventPush ,
PayloadContent : string ( data ) ,
PayloadVersion : 2 ,
}
2024-03-20 17:44:01 +03:00
req , reqBody , err := discordHandler { } . NewRequest ( context . Background ( ) , hook , task )
2024-03-08 01:18:38 +03:00
require . NotNil ( t , req )
require . NotNil ( t , reqBody )
2021-06-21 05:12:19 +03:00
require . NoError ( t , err )
2024-03-08 01:18:38 +03:00
assert . Equal ( t , "POST" , req . Method )
assert . Equal ( t , "https://discord.example.com/" , req . URL . String ( ) )
assert . Equal ( t , "sha256=" , req . Header . Get ( "X-Hub-Signature-256" ) )
assert . Equal ( t , "application/json" , req . Header . Get ( "Content-Type" ) )
var body DiscordPayload
err = json . NewDecoder ( req . Body ) . Decode ( & body )
2024-07-30 22:41:10 +03:00
require . NoError ( t , err )
2024-03-08 01:18:38 +03:00
assert . Equal ( t , "[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1" , body . Embeds [ 0 ] . Description )
2021-06-21 05:12:19 +03:00
}
2024-11-19 00:47:11 +03:00
var escapedMarkdownTests = map [ string ] struct {
input string
expected string
} {
"Escape heading level 1" : {
input : "# Heading level 1" ,
expected : "\\# Heading level 1" ,
} ,
"Escape heading level 2" : {
input : "## Heading level 2" ,
expected : "\\#\\# Heading level 2" ,
} ,
"Escape heading level 3" : {
input : "### Heading level 3" ,
expected : "\\#\\#\\# Heading level 3" ,
} ,
"Escape bold text" : {
input : "**bold text**" ,
expected : "\\*\\*bold text\\*\\*" ,
} ,
"Escape italic text" : {
input : "*italic text*" ,
expected : "\\*italic text\\*" ,
} ,
"Escape italic text underline" : {
input : "_italic text_" ,
expected : "\\_italic text\\_" ,
} ,
"Escape strikethrough" : {
input : "~~strikethrough~~" ,
expected : "\\~\\~strikethrough\\~\\~" ,
} ,
"Escape Ordered list item" : {
input : "1. Ordered list item\n2. Second ordered list item\n999999999999. 999999999999 ordered list item" ,
expected : "1\\. Ordered list item\n2\\. Second ordered list item\n999999999999\\. 999999999999 ordered list item" ,
} ,
"Escape Unordered list item" : {
input : "- Unordered list\n + using plus" ,
expected : "\\- Unordered list\n \\+ using plus" ,
} ,
"Escape bullet list item" : {
input : "* Bullet list item" ,
expected : "\\* Bullet list item" ,
} ,
"Escape table" : {
input : "| Table | Example |\n|-|-|\n| Lorem | Ipsum |" ,
expected : "\\| Table \\| Example \\|\n\\|-\\|-\\|\n\\| Lorem \\| Ipsum \\|" ,
} ,
"Escape link" : {
input : "[Link to Forgejo](https://forgejo.org/)" ,
expected : "\\[Link to Forgejo\\]\\(https://forgejo.org/\\)" ,
} ,
"Escape Alt text for an image" : {
input : "![Alt text for an image](https://forgejo.org/_astro/mascot-dark.1omhhgvT_Zm0N2n.webp)" ,
expected : "\\!\\[Alt text for an image\\]\\(https://forgejo.org/\\_astro/mascot-dark.1omhhgvT\\_Zm0N2n.webp\\)" ,
} ,
"Escape URL if it has markdown character" : {
input : "https://forgejo.org/_astro/mascot-dark.1omhhgvT_Zm0N2n.webp" ,
expected : "https://forgejo.org/\\_astro/mascot-dark.1omhhgvT\\_Zm0N2n.webp" ,
} ,
"Escape blockquote text" : {
input : "> Blockquote text." ,
expected : "\\> Blockquote text." ,
} ,
"Escape inline code" : {
input : "`Inline code`" ,
expected : "\\`Inline code\\`" ,
} ,
"Escape multiple code" : {
input : "```\nCode block\nwith multiple lines\n```\n" ,
expected : "\\`\\`\\`\nCode block\nwith multiple lines\n\\`\\`\\`\n" ,
} ,
"Escape horizontal rule" : {
input : "---" ,
expected : "\\---" ,
} ,
}
func TestEscapeMarkdownChar ( t * testing . T ) {
for name , test := range escapedMarkdownTests {
t . Run ( name , func ( t * testing . T ) {
assert . Equal ( t , test . expected , escapeMarkdown ( test . input ) )
} )
}
}