File: airbrake_test.go

package info (click to toggle)
golang-airbrake-go 0.0~git20150109-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, sid, trixie
  • size: 76 kB
  • sloc: makefile: 3
file content (125 lines) | stat: -rw-r--r-- 2,700 bytes parent folder | download | duplicates (3)
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
package airbrake

import (
	"bytes"
	"errors"
	"net/http"
	"regexp"
	"testing"
	"time"
)

const API_KEY = ""

func TestError(t *testing.T) {
	Verbose = true
	ApiKey = API_KEY
	Endpoint = "https://api.airbrake.io/notifier_api/v2/notices"

	err := Error(errors.New("Test Error"), nil)
	if err != nil {

		t.Error(err)
	}

	time.Sleep(1e9)
}

func TestRequest(t *testing.T) {
	Verbose = true
	ApiKey = API_KEY
	Endpoint = "https://api.airbrake.io/notifier_api/v2/notices"

	request, _ := http.NewRequest("GET", "/some/path?a=1", bytes.NewBufferString(""))

	err := Error(errors.New("Test Error"), request)

	if err != nil {
		t.Error(err)
	}

	time.Sleep(1e9)
}

func TestNotify(t *testing.T) {
	Verbose = true
	ApiKey = API_KEY
	Endpoint = "https://api.airbrake.io/notifier_api/v2/notices"

	err := Notify(errors.New("Test Error"))

	if err != nil {
		t.Error(err)
	}

	time.Sleep(1e9)
}

// Make sure we match https://help.airbrake.io/kb/api-2/notifier-api-version-23
func TestTemplateV2(t *testing.T) {
	var p map[string]interface{}
	request, _ := http.NewRequest("GET", "/query?t=xxx&q=SHOW+x+BY+y+FROM+z&key=sesame&timezone=", nil)
	request.Header.Set("Host", "Zulu")
	request.Header.Set("Keep_Secret", "Sesame")
	PrettyParams = true
	defer func() { PrettyParams = false }()

	// Trigger and recover a panic, so that we have something to render.
	func() {
		defer func() {
			if r := recover(); r != nil {
				p = params(r.(error), request)
			}
		}()
		panic(errors.New("Boom!"))
	}()

	// Did that work?
	if p == nil {
		t.Fail()
	}

	// Crude backtrace check.
	if len(p["Backtrace"].([]Line)) < 3 {
		t.Fail()
	}

	// It's messy to generically test rendered backtrace, drop it.
	delete(p, "Backtrace")

	// Render the params.
	var b bytes.Buffer
	if err := tmpl.Execute(&b, p); err != nil {
		t.Fatalf("Template error: %s", err)
	}

	// Validate the <error> node.
	chunk := regexp.MustCompile(`(?s)<error>.*<backtrace>`).FindString(b.String())
	if chunk != `<error>
    <class>*errors.errorString</class>
    <message>Boom!</message>
    <backtrace>` {
		t.Fatal(chunk)
	}

	// Validate the <request> node.
	chunk = regexp.MustCompile(`(?s)<request>.*</request>`).FindString(b.String())
	if chunk != `<request>
    <url>/query?t=xxx&amp;q=SHOW+x+BY+y+FROM+z&amp;key=sesame&amp;timezone=</url>
    <component></component>
    <action></action>
    <params>
      <var key="q">SHOW x BY y FROM z</var>
      <var key="t">xxx</var>
    </params>
    <cgi-data>
      <var key="?q">SHOW x BY y FROM z</var>
      <var key="?t">xxx</var>
      <var key="Host">Zulu</var>
      <var key="Method">GET</var>
      <var key="Protocol">HTTP/1.1</var>
    </cgi-data>
  </request>` {
		t.Fatal(chunk)
	}
}