/* GoToSocial Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package text_test import ( "context" "testing" "github.com/stretchr/testify/suite" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" ) var withCodeBlock = `# Title Below is some JSON. ` + "```" + `json { "key": "value", "another_key": [ "value1", "value2" ] } ` + "```" + ` that was some JSON :) ` const ( simpleMarkdown = "# Title\n\nHere's a simple text in markdown.\n\nHere's a [link](https://example.org)." simpleMarkdownExpected = "

Title

Here's a simple text in markdown.

Here's a link.

" withCodeBlockExpected = "

Title

Below is some JSON.

{\n  "key": "value",\n  "another_key": [\n    "value1",\n    "value2"\n  ]\n}\n

that was some JSON :)

" withInlineCode = "`Nobody tells you about the SECRET CODE, do they?`" withInlineCodeExpected = "

Nobody tells you about the <code><del>SECRET CODE</del></code>, do they?

" withInlineCode2 = "`Nobody tells you about the SECRET CODE, do they?`" withInlineCode2Expected = "

Nobody tells you about the </code><del>SECRET CODE</del><code>, do they?

" withHashtag = "# Title\n\nhere's a simple status that uses hashtag #Hashtag!" withHashtagExpected = "

Title

here's a simple status that uses hashtag #Hashtag!

" mdWithHTML = "# Title\n\nHere's a simple text in markdown.\n\nHere's a link.\n\nHere's an image: \"The" mdWithHTMLExpected = "

Title

Here's a simple text in markdown.

Here's a link.

Here's an image: \"The

" mdWithCheekyHTML = "# Title\n\nHere's a simple text in markdown.\n\nHere's a cheeky little script: " mdWithCheekyHTMLExpected = "

Title

Here's a simple text in markdown.

Here's a cheeky little script:

" mdWithHashtagInitial = "#welcome #Hashtag" mdWithHashtagInitialExpected = "

#welcome #Hashtag

" mdCodeBlockWithNewlines = "some code coming up\n\n```\n\n\n\n```\nthat was some code" mdCodeBlockWithNewlinesExpected = "

some code coming up

\n\n\n

that was some code

" mdWithFootnote = "fox mulder,fbi.[^1]\n\n[^1]: federated bureau of investigation" mdWithFootnoteExpected = "

fox mulder,fbi.[^1]

[^1]: federated bureau of investigation

" mdWithBlockQuote = "get ready, there's a block quote coming:\n\n>line1\n>line2\n>\n>line3\n\n" mdWithBlockQuoteExpected = "

get ready, there's a block quote coming:

line1
line2

line3

" mdHashtagAndCodeBlock = "#Hashtag\n\n```\n#Hashtag\n```" mdHashtagAndCodeBlockExpected = "

#Hashtag

#Hashtag\n
" mdMentionAndCodeBlock = "@the_mighty_zork\n\n```\n@the_mighty_zork\n```" mdMentionAndCodeBlockExpected = "

@the_mighty_zork

@the_mighty_zork\n
" mdWithSmartypants = "\"you have to quargle the bleepflorp\" they said with 1/2 of nominal speed and 1/3 of the usual glumping" mdWithSmartypantsExpected = "

\"you have to quargle the bleepflorp\" they said with 1/2 of nominal speed and 1/3 of the usual glumping

" mdWithAsciiHeart = "hello <3 old friend <3 i loved u hello <3 old friend <3 i loved u </3 :(( you stole my heart

" mdWithStrikethrough = "I have ~~mdae~~ made an error" mdWithStrikethroughExpected = "

I have mdae made an error

" mdWithLink = "Check out this code, i heard it was written by a sloth https://github.com/superseriousbusiness/gotosocial" mdWithLinkExpected = "

Check out this code, i heard it was written by a sloth https://github.com/superseriousbusiness/gotosocial

" ) type MarkdownTestSuite struct { TextStandardTestSuite } func (suite *MarkdownTestSuite) TestParseSimple() { s := suite.formatter.FromMarkdown(context.Background(), simpleMarkdown, nil, nil, nil) suite.Equal(simpleMarkdownExpected, s) } func (suite *MarkdownTestSuite) TestParseWithCodeBlock() { s := suite.formatter.FromMarkdown(context.Background(), withCodeBlock, nil, nil, nil) suite.Equal(withCodeBlockExpected, s) } func (suite *MarkdownTestSuite) TestParseWithInlineCode() { s := suite.formatter.FromMarkdown(context.Background(), withInlineCode, nil, nil, nil) suite.Equal(withInlineCodeExpected, s) } func (suite *MarkdownTestSuite) TestParseWithInlineCode2() { s := suite.formatter.FromMarkdown(context.Background(), withInlineCode2, nil, nil, nil) suite.Equal(withInlineCode2Expected, s) } func (suite *MarkdownTestSuite) TestParseWithHashtag() { foundTags := []*gtsmodel.Tag{ suite.testTags["Hashtag"], } s := suite.formatter.FromMarkdown(context.Background(), withHashtag, nil, foundTags, nil) suite.Equal(withHashtagExpected, s) } func (suite *MarkdownTestSuite) TestParseWithHTML() { s := suite.formatter.FromMarkdown(context.Background(), mdWithHTML, nil, nil, nil) suite.Equal(mdWithHTMLExpected, s) } func (suite *MarkdownTestSuite) TestParseWithCheekyHTML() { s := suite.formatter.FromMarkdown(context.Background(), mdWithCheekyHTML, nil, nil, nil) suite.Equal(mdWithCheekyHTMLExpected, s) } func (suite *MarkdownTestSuite) TestParseWithHashtagInitial() { s := suite.formatter.FromMarkdown(context.Background(), mdWithHashtagInitial, nil, []*gtsmodel.Tag{ suite.testTags["Hashtag"], suite.testTags["welcome"], }, nil) suite.Equal(mdWithHashtagInitialExpected, s) } func (suite *MarkdownTestSuite) TestParseCodeBlockWithNewlines() { s := suite.formatter.FromMarkdown(context.Background(), mdCodeBlockWithNewlines, nil, nil, nil) suite.Equal(mdCodeBlockWithNewlinesExpected, s) } func (suite *MarkdownTestSuite) TestParseWithFootnote() { s := suite.formatter.FromMarkdown(context.Background(), mdWithFootnote, nil, nil, nil) suite.Equal(mdWithFootnoteExpected, s) } func (suite *MarkdownTestSuite) TestParseWithBlockquote() { s := suite.formatter.FromMarkdown(context.Background(), mdWithBlockQuote, nil, nil, nil) suite.Equal(mdWithBlockQuoteExpected, s) } func (suite *MarkdownTestSuite) TestParseHashtagWithCodeBlock() { s := suite.formatter.FromMarkdown(context.Background(), mdHashtagAndCodeBlock, nil, []*gtsmodel.Tag{ suite.testTags["Hashtag"], }, nil) suite.Equal(mdHashtagAndCodeBlockExpected, s) } func (suite *MarkdownTestSuite) TestParseMentionWithCodeBlock() { s := suite.formatter.FromMarkdown(context.Background(), mdMentionAndCodeBlock, []*gtsmodel.Mention{ suite.testMentions["local_user_2_mention_zork"], }, nil, nil) suite.Equal(mdMentionAndCodeBlockExpected, s) } func (suite *MarkdownTestSuite) TestParseSmartypants() { s := suite.formatter.FromMarkdown(context.Background(), mdWithSmartypants, []*gtsmodel.Mention{ suite.testMentions["local_user_2_mention_zork"], }, nil, nil) suite.Equal(mdWithSmartypantsExpected, s) } func (suite *MarkdownTestSuite) TestParseAsciiHeart() { s := suite.formatter.FromMarkdown(context.Background(), mdWithAsciiHeart, nil, nil, nil) suite.Equal(mdWithAsciiHeartExpected, s) } func (suite *MarkdownTestSuite) TestParseStrikethrough() { s := suite.formatter.FromMarkdown(context.Background(), mdWithStrikethrough, nil, nil, nil) suite.Equal(mdWithStrikethroughExpected, s) } func (suite *MarkdownTestSuite) TestParseLink() { s := suite.formatter.FromMarkdown(context.Background(), mdWithLink, nil, nil, nil) suite.Equal(mdWithLinkExpected, s) } func TestMarkdownTestSuite(t *testing.T) { suite.Run(t, new(MarkdownTestSuite)) }