utilities_test.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package goquery
  2. import (
  3. "reflect"
  4. "sort"
  5. "strings"
  6. "testing"
  7. "golang.org/x/net/html"
  8. )
  9. var allNodes = `<!doctype html>
  10. <html>
  11. <head>
  12. <meta a="b">
  13. </head>
  14. <body>
  15. <p><!-- this is a comment -->
  16. This is some text.
  17. </p>
  18. <div></div>
  19. <h1 class="header"></h1>
  20. <h2 class="header"></h2>
  21. </body>
  22. </html>`
  23. func TestNodeName(t *testing.T) {
  24. doc, err := NewDocumentFromReader(strings.NewReader(allNodes))
  25. if err != nil {
  26. t.Fatal(err)
  27. }
  28. n0 := doc.Nodes[0]
  29. nDT := n0.FirstChild
  30. sMeta := doc.Find("meta")
  31. nMeta := sMeta.Get(0)
  32. sP := doc.Find("p")
  33. nP := sP.Get(0)
  34. nComment := nP.FirstChild
  35. nText := nComment.NextSibling
  36. cases := []struct {
  37. node *html.Node
  38. typ html.NodeType
  39. want string
  40. }{
  41. {n0, html.DocumentNode, nodeNames[html.DocumentNode]},
  42. {nDT, html.DoctypeNode, "html"},
  43. {nMeta, html.ElementNode, "meta"},
  44. {nP, html.ElementNode, "p"},
  45. {nComment, html.CommentNode, nodeNames[html.CommentNode]},
  46. {nText, html.TextNode, nodeNames[html.TextNode]},
  47. }
  48. for i, c := range cases {
  49. got := NodeName(newSingleSelection(c.node, doc))
  50. if c.node.Type != c.typ {
  51. t.Errorf("%d: want type %v, got %v", i, c.typ, c.node.Type)
  52. }
  53. if got != c.want {
  54. t.Errorf("%d: want %q, got %q", i, c.want, got)
  55. }
  56. }
  57. }
  58. func TestNodeNameMultiSel(t *testing.T) {
  59. doc, err := NewDocumentFromReader(strings.NewReader(allNodes))
  60. if err != nil {
  61. t.Fatal(err)
  62. }
  63. in := []string{"p", "h1", "div"}
  64. var out []string
  65. doc.Find(strings.Join(in, ", ")).Each(func(i int, s *Selection) {
  66. got := NodeName(s)
  67. out = append(out, got)
  68. })
  69. sort.Strings(in)
  70. sort.Strings(out)
  71. if !reflect.DeepEqual(in, out) {
  72. t.Errorf("want %v, got %v", in, out)
  73. }
  74. }
  75. func TestOuterHtml(t *testing.T) {
  76. doc, err := NewDocumentFromReader(strings.NewReader(allNodes))
  77. if err != nil {
  78. t.Fatal(err)
  79. }
  80. n0 := doc.Nodes[0]
  81. nDT := n0.FirstChild
  82. sMeta := doc.Find("meta")
  83. sP := doc.Find("p")
  84. nP := sP.Get(0)
  85. nComment := nP.FirstChild
  86. nText := nComment.NextSibling
  87. sHeaders := doc.Find(".header")
  88. cases := []struct {
  89. node *html.Node
  90. sel *Selection
  91. want string
  92. }{
  93. {nDT, nil, "<!DOCTYPE html>"}, // render makes DOCTYPE all caps
  94. {nil, sMeta, `<meta a="b"/>`}, // and auto-closes the meta
  95. {nil, sP, `<p><!-- this is a comment -->
  96. This is some text.
  97. </p>`},
  98. {nComment, nil, "<!-- this is a comment -->"},
  99. {nText, nil, `
  100. This is some text.
  101. `},
  102. {nil, sHeaders, `<h1 class="header"></h1>`},
  103. }
  104. for i, c := range cases {
  105. if c.sel == nil {
  106. c.sel = newSingleSelection(c.node, doc)
  107. }
  108. got, err := OuterHtml(c.sel)
  109. if err != nil {
  110. t.Fatal(err)
  111. }
  112. if got != c.want {
  113. t.Errorf("%d: want %q, got %q", i, c.want, got)
  114. }
  115. }
  116. }