...

Source file src/github.com/PuerkitoBio/goquery/utilities_test.go

Documentation: github.com/PuerkitoBio/goquery

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

View as plain text