meta_test.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package meta
  2. import (
  3. "bytes"
  4. "strings"
  5. "testing"
  6. "github.com/yuin/goldmark"
  7. "github.com/yuin/goldmark/parser"
  8. )
  9. var testMetaFormats = []string{"yaml", "json", "toml"}
  10. var validSource = map[string]string{
  11. "yaml": `<!--:
  12. Title: mmd
  13. Summary: Add YAML metadata to the document
  14. Tags:
  15. - markdown
  16. - goldmark
  17. :-->
  18. Markdown with metadata
  19. `,
  20. "json": `<!--{ "Title": "mmd", "Summary": "Add JSON metadata to the document", "Tags": [ "markdown", "goldmark" ] }-->
  21. Markdown with metadata`,
  22. "toml": `<!--# Title = "mmd"
  23. Summary = "Add TOML metadata to the document"
  24. Tags = [ "markdown", "goldmark" ] #-->
  25. Markdown with metadata
  26. `,
  27. }
  28. var invalidSource = map[string]string{
  29. "yaml": `<!--:
  30. Title: mmd
  31. Summary: Add YAML metadata to the document
  32. Tags:
  33. - : {
  34. }
  35. - markdown
  36. - goldmark
  37. :-->
  38. Markdown with metadata`,
  39. "json": `<!--{ "Title:" "mmd", "Summary": "Add JSON metadata to the document", "Tags": [ "markdown", "goldmark" ] }-->
  40. Markdown with metadata`,
  41. "toml": `<!--# Title = "mmd"
  42. Summary = "Add TOML metadata to the document
  43. Tags == [ markdown", "goldmark ] #-->
  44. Markdown with metadata
  45. `,
  46. }
  47. func TestMeta(t *testing.T) {
  48. markdown := goldmark.New(goldmark.WithExtensions(MetaMarkdown))
  49. context := parser.NewContext()
  50. for _, format := range testMetaFormats {
  51. var buf bytes.Buffer
  52. if err := markdown.Convert([]byte(validSource[format]), &buf, parser.WithContext(context)); err != nil {
  53. t.Fatal(err)
  54. }
  55. metaData := Get(context)
  56. title := metaData["Title"]
  57. if s, ok := title.(string); !ok {
  58. t.Errorf("%s: Title not found in meta data or is not a string", format)
  59. } else if s != "mmd" {
  60. t.Errorf("%s: Title must be 'mmd', but got %v", format, s)
  61. }
  62. if buf.String() != "<p>Markdown with metadata</p>\n" {
  63. t.Errorf("%s: should render '<p>Markdown with metadata</p>', but '%s'", format, buf.String())
  64. }
  65. if tags, ok := metaData["Tags"].([]interface{}); !ok {
  66. t.Errorf("%s: Tags not found in meta data or is not a slice", format)
  67. } else if len(tags) != 2 {
  68. t.Errorf("%s: Tags must be a slice that has 2 elements", format)
  69. } else if tags[0] != "markdown" {
  70. t.Errorf("%s: Tag#1 must be 'markdown', but got %s", format, tags[0])
  71. } else if tags[1] != "goldmark" {
  72. t.Errorf("%s: Tag#2 must be 'goldmark', but got %s", format, tags[1])
  73. }
  74. }
  75. }
  76. func TestMeta_Error(t *testing.T) {
  77. markdown := goldmark.New(goldmark.WithExtensions(MetaMarkdown))
  78. context := parser.NewContext()
  79. var buf bytes.Buffer
  80. var str string
  81. for _, format := range testMetaFormats {
  82. if err := markdown.Convert([]byte(invalidSource[format]), &buf, parser.WithContext(context)); err != nil {
  83. t.Fatal(err)
  84. }
  85. str = buf.String()
  86. if !strings.Contains(str, `<!-- meta error, `) {
  87. t.Errorf("%s: invalid error output '%s'", format, str)
  88. }
  89. buf.Reset()
  90. }
  91. }