-
Notifications
You must be signed in to change notification settings - Fork 0
/
selector.go
130 lines (108 loc) · 3.26 KB
/
selector.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package selector
import (
"bytes"
"fmt"
"io/ioutil"
"net/http"
"strings"
"github.com/PuerkitoBio/goquery"
)
type selectionMatcher func(i int, selection *goquery.Selection) bool
func DataTestID(value string) string {
return fmt.Sprintf(`[data-test-id="%s"]`, value)
}
func FirstTextValue(selection string, expectedTextValue string) func(*http.Response, *http.Request) error {
return newAssertSelection(selection, func(i int, selection *goquery.Selection) bool {
if i == 0 {
if selection.Text() == expectedTextValue {
return true
}
}
return false
})
}
func NthTextValue(n int, selection string, expectedTextValue string) func(*http.Response, *http.Request) error {
return newAssertSelection(selection, func(i int, selection *goquery.Selection) bool {
if i == n {
if selection.Text() == expectedTextValue {
return true
}
}
return false
})
}
func ContainsTextValue(selection string, expectedTextValue string) func(*http.Response, *http.Request) error {
return newAssertSelection(selection, func(i int, selection *goquery.Selection) bool {
if strings.Contains(selection.Text(), expectedTextValue) {
return true
}
return false
})
}
func Selection(selection string, selectionFunc func(*goquery.Selection) error) func(*http.Response, *http.Request) error {
return func(response *http.Response, request *http.Request) error {
doc, err := goquery.NewDocumentFromReader(response.Body)
if err != nil {
return err
}
return selectionFunc(doc.Find(selection))
}
}
func Exists(selections ...string) func(*http.Response, *http.Request) error {
return expectExists(true, selections...)
}
func NotExists(selections ...string) func(*http.Response, *http.Request) error {
return expectExists(false, selections...)
}
func TextExists(text string) func(*http.Response, *http.Request) error {
return func(response *http.Response, request *http.Request) error {
bodyBytes, err := ioutil.ReadAll(response.Body)
if err != nil {
return err
}
if !strings.Contains(string(bodyBytes), text) {
return fmt.Errorf("document did not contain '%v'", text)
}
return nil
}
}
func expectExists(exists bool, selections ...string) func(*http.Response, *http.Request) error {
return func(response *http.Response, request *http.Request) error {
bodyBytes, err := ioutil.ReadAll(response.Body)
if err != nil {
return err
}
for _, selection := range selections {
doc, err := goquery.NewDocumentFromReader(bytes.NewReader(bodyBytes))
if err != nil {
return err
}
var found bool
doc.Find(selection).Each(func(i int, selection *goquery.Selection) {
found = true
})
if found != exists {
return fmt.Errorf("expected found='%v' for selector '%s'", exists, selection)
}
}
return nil
}
}
func newAssertSelection(selection string, matcher selectionMatcher) func(*http.Response, *http.Request) error {
return func(response *http.Response, request *http.Request) error {
doc, err := goquery.NewDocumentFromReader(response.Body)
if err != nil {
return err
}
var found bool
doc.Find(selection).Each(func(i int, selection *goquery.Selection) {
if matcher(i, selection) {
found = true
}
})
if !found {
return fmt.Errorf("did not find expected value for selector '%s'", selection)
}
return nil
}
}