Files
438c5a5cfa feat: markdown renderer (#10682)
* chore: custom notifiers in alert manager

* chore: lint fixs

* chore: fix email linter

* chore: added tracing to msteamsv2 notifier

* feat: alert manager template to template title and notification body

* chore: updated test name + code for timeout errors

* chore: added utils for using variables with $ notation

* chore: exposed templates for alertmanager types

* feat: added preprocessor for alert templater

* chore: hooked preProcess function in expandTitle and body, added labels and annotations in alertdata

* chore: fix lint issues

* chore: added handling for missing variable used in template

* feat: converted alerttemplater to interface and updated tests

* refactor: added extractCommonKV instead of 2 different functions

* test: fix preprocessor test case

* feat: added support for  and  in templating

* chore: lint fix

* chore: renamed the interface

* chore: added test for missing function

* refactor: test case and sb related changed

* refactor: comments and test improvements

* chore: lint fix

* chore: updated comments

* feat: added basic html markdown templater

* chore: updated newline to markdown format

* feat: slack blockkit renderer using goldmark

* test: added test for html rendering

* feat: integrated slack blockit in markdownrenderer package and removed plaintext format

* chore: updated br with new line in test and logs added

* refactor: review comments

* refactor: lint fixes

* chore: updated licenses for notifiers

* chore: updated email notifier from upstream

* feat: return single templating result from  with flag for template type

* fix: variables with symbols in template

* feat: slack mrkdwn renderer

* feat: custom raw html renderer to escape <no value>

* chore: integrated slack mrkdwn renderer and added NoOp formatter

* chore: removed notifier test files

* fix: concurrent rendering in markdown renderer

* refactor: changes as per internal review

* chore: lint issue

* chore: removed special handling for softline break

* refactor: removed logger as markdown renderer dependency

* refactor: changed markdown renderer from interface to package-level functions

---------

Co-authored-by: Srikanth Chekuri <[email protected]>
2026-04-22 21:22:45 +00:00

48 lines
1.2 KiB
Go

package markdownrenderer
import (
"sync"
"testing"
)
// TestConcurrentRender exercises every render entry point from many
// goroutines. Run with `go test -race` to catch shared-state regressions
// in the HTML, Block Kit or mrkdwn paths.
func TestConcurrentRender(t *testing.T) {
const goroutines = 32
const iterations = 20
markdowns := []string{
"# Heading\n\nparagraph **bold** *em* `code`",
"- item 1\n- item 2\n - nested\n- item 3",
"| a | b |\n| - | - |\n| 1 | 2 |\n| 3 | 4 |",
"> quote\n>> nested quote",
"```go\npackage main\n```",
"[link](https://example.com) and ![img](https://example.com/i.png)",
}
renderers := map[string]func(string) (string, error){
"html": RenderHTML,
"blockkit": RenderSlackBlockKit,
"mrkdwn": RenderSlackMrkdwn,
}
var wg sync.WaitGroup
for name, render := range renderers {
for g := 0; g < goroutines; g++ {
wg.Add(1)
go func(name string, render func(string) (string, error), g int) {
defer wg.Done()
for i := 0; i < iterations; i++ {
md := markdowns[(g+i)%len(markdowns)]
if _, err := render(md); err != nil {
t.Errorf("%s render failed: %v", name, err)
return
}
}
}(name, render, g)
}
}
wg.Wait()
}