Skip to content

Commit 0316f11

Browse files
author
khanh.nguyen
committed
Use reference test data for signature unit tests
1 parent a694b12 commit 0316f11

File tree

3 files changed

+598
-92
lines changed

3 files changed

+598
-92
lines changed

signature/claims.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,26 +42,28 @@ func (c Claims) Valid() error {
4242
}
4343

4444
if iat := time.Unix(c.IssuedAt, int64(c.receivedTime.Nanosecond())).Add(-maxSkew); c.receivedTime.Before(iat) {
45-
errs = append(errs, "iat is in the future")
45+
errs = append(errs, "claim iat is in the future")
4646
}
4747

4848
if exp := time.Unix(c.ExpirationTime, int64(c.receivedTime.Nanosecond())).Add(maxSkew); c.receivedTime.After(exp) {
49-
errs = append(errs, "exp is in the past")
49+
errs = append(errs, "claim exp is in the past")
5050
}
5151

5252
if c.JWTID == "" {
53-
errs = append(errs, "jti is empty or missing")
53+
errs = append(errs, "claim jti is empty or missing")
5454
}
5555

5656
if c.correctURLHash != c.URLHash {
57-
errs = append(errs, "url_hash is invalid")
57+
errs = append(errs, "claim url_hash is invalid")
5858
}
5959

6060
switch {
6161
case c.correctPayloadHash == "" && c.PayloadHash != "":
62-
errs = append(errs, "payload_hash was set; expected no payload value")
63-
case c.correctPayloadHash != "" && c.correctPayloadHash != c.PayloadHash:
64-
errs = append(errs, "payload_hash is invalid")
62+
errs = append(errs, "claim payload_hash is set but actual payload is missing")
63+
case c.correctPayloadHash != "" && c.PayloadHash == "":
64+
errs = append(errs, "claim payload_hash is not set but payload is present")
65+
case c.correctPayloadHash != c.PayloadHash:
66+
errs = append(errs, "claim payload_hash is invalid")
6567
}
6668

6769
if len(errs) == 0 {

signature/signature_test.go

Lines changed: 22 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package signature
22

33
import (
4+
"encoding/json"
45
"net/http"
56
"net/http/httptest"
67
"testing"
78
"time"
89

10+
"github.com/messagebird/go-rest-api/v7/internal/mbtest"
911
"github.com/stretchr/testify/assert"
1012
)
1113

@@ -84,101 +86,36 @@ func TestValidate(t *testing.T) {
8486
}
8587

8688
func TestValidSignature(t *testing.T) {
87-
var cases = []struct {
88-
name string
89-
requestParams string
90-
requestPayload string
91-
receivedAt string
92-
signature string
93-
wantErr string
94-
}{
95-
{
96-
name: "valid with no params/body",
97-
receivedAt: "2021-07-05T12:00:00+02:00",
98-
signature: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJNZXNzYWdlQmlyZCIsImlhdCI6MTYyNTQ3OTIwMCwiZXhwIjoxNjI1NDc5MjYwLCJqdGkiOiI1OWEyNDRkYy1lOWFkLTRlMjMtOTc3OC0zNzFmYWEyMzhmNzIiLCJ1cmxfaGFzaCI6IjBmMTE1ZGIwNjJiN2MwZGQwMzBiMTY4NzhjOTlkZWE1YzM1NGI0OWRjMzdiMzhlYjg4NDYxNzljNzc4M2U5ZDcifQ.SrhlKJ-ES4Dg8BBXKtop3u92Z_k4L4VjHKsyHWpweGE",
99-
},
100-
{
101-
name: "valid with params and without body",
102-
requestParams: "/path?bar=1&foo=2",
103-
receivedAt: "2021-07-05T12:00:00+02:00",
104-
signature: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJNZXNzYWdlQmlyZCIsImlhdCI6MTYyNTQ3OTIwMCwiZXhwIjoxNjI1NDc5MjYwLCJqdGkiOiJjOTQ2YWY3Ny1lMTgyLTRlYWEtYjJmZi0xYTU0NWI1ZTk5MWEiLCJ1cmxfaGFzaCI6IjQxZjA1ZjBkZGQwYTIyYWIyMDlhYzQ2ZjQ3YzQ1NzJkOWNlZmEyNTdlZDc0YjI0MDA0YmFlNzUzZWNlNmMyNjAifQ.wUeGukU50HcPIr8d-zcCpttlGnPE-W57ujVb36AbAYw",
105-
},
106-
{
107-
name: "valid with params and body",
108-
requestParams: "/path?bar=1&foo=2",
109-
requestPayload: "Hello, World!",
110-
receivedAt: "2021-07-05T12:00:00+02:00",
111-
signature: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJNZXNzYWdlQmlyZCIsImlhdCI6MTYyNTQ3OTIwMCwiZXhwIjoxNjI1NDc5MjYwLCJqdGkiOiI5M2U1NTAwNi1hMGU4LTQ1MjYtYTE5MC1mYTVmZjAwZWExMTYiLCJ1cmxfaGFzaCI6IjQxZjA1ZjBkZGQwYTIyYWIyMDlhYzQ2ZjQ3YzQ1NzJkOWNlZmEyNTdlZDc0YjI0MDA0YmFlNzUzZWNlNmMyNjAiLCJwYXlsb2FkX2hhc2giOiJkZmZkNjAyMWJiMmJkNWIwYWY2NzYyOTA4MDllYzNhNTMxOTFkZDgxYzdmNzBhNGIyODY4OGEzNjIxODI5ODZmIn0.K6HyLDRdYgQBKN2tBcu0dOSxsfb_lOLaWby3un4rxIc",
112-
},
113-
{
114-
name: "invalid token received before it is issued",
115-
receivedAt: "2021-07-05T12:00:00+02:00",
116-
signature: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJNZXNzYWdlQmlyZCIsImlhdCI6MTYyNTQ4MjgwMCwiZXhwIjoxNjI1NDgyODYwLCJqdGkiOiJmOWY4YzM4Mi0yNDQ5LTQzMTEtYjcyYi0xZGY3MTY4NzkzMWUiLCJ1cmxfaGFzaCI6IjBmMTE1ZGIwNjJiN2MwZGQwMzBiMTY4NzhjOTlkZWE1YzM1NGI0OWRjMzdiMzhlYjg4NDYxNzljNzc4M2U5ZDcifQ._59NNTg0j5YVXCRHgyeJAj8n6rTg1gwTh_I_coe7RDQ",
117-
wantErr: "invalid jwt: iat is in the future",
118-
},
119-
{
120-
name: "invalid token received after it is expired",
121-
receivedAt: "2021-07-05T12:00:00+02:00",
122-
signature: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJNZXNzYWdlQmlyZCIsImlhdCI6MTYyNTQ3NTYwMCwiZXhwIjoxNjI1NDc1NjYwLCJqdGkiOiI1ZjAyZjUyMi02MDMwLTQ2YzgtYjVhMy0wMTI0NjQ3OGQ4YmMiLCJ1cmxfaGFzaCI6IjBmMTE1ZGIwNjJiN2MwZGQwMzBiMTY4NzhjOTlkZWE1YzM1NGI0OWRjMzdiMzhlYjg4NDYxNzljNzc4M2U5ZDcifQ.iGUCLsYVQG4iYWe2MkRoLQBBMzq7p_bLy4u0mhC3Jfc",
123-
wantErr: "invalid jwt: exp is in the past",
124-
},
125-
{
126-
name: "invalid token received on different URL",
127-
requestParams: "/path?bar=1&foo=2",
128-
receivedAt: "2021-07-05T12:00:00+02:00",
129-
signature: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJNZXNzYWdlQmlyZCIsImlhdCI6MTYyNTQ3OTIwMCwiZXhwIjoxNjI1NDc5MjYwLCJqdGkiOiJhNzVjOTA5Ni1lODIzLTQ0MmItODVmMi03ZDNjOWQ5YjcyNmIiLCJ1cmxfaGFzaCI6IjlmZGExZmNkYzc0YjEwMzUzNjhlNWY2NjhmNTdjOTFlOTk0MTJmZjU5Y2YwM2E0NmNlYjk1YWVhNWU2YjU4ZmQifQ.G4lpxrDOxZs75G1vIJ6J1jVbYS19tx2yq-lkIE-oETY",
130-
wantErr: "invalid jwt: url_hash is invalid",
131-
},
132-
133-
{
134-
name: "invalid payload not match",
135-
requestPayload: "Hello, World!",
136-
receivedAt: "2021-07-05T12:00:00+02:00",
137-
signature: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJNZXNzYWdlQmlyZCIsImlhdCI6MTYyNTQ3OTIwMCwiZXhwIjoxNjI1NDc5MjYwLCJqdGkiOiIxNDUwMTUzMi05NmYyLTQ2ODQtOTgzMi02OGYwOTUxYWUzNDIiLCJ1cmxfaGFzaCI6IjBmMTE1ZGIwNjJiN2MwZGQwMzBiMTY4NzhjOTlkZWE1YzM1NGI0OWRjMzdiMzhlYjg4NDYxNzljNzc4M2U5ZDciLCJwYXlsb2FkX2hhc2giOiIzMjRjYzA2N2IyNTdlZGEwYmNiZDljOGQ4MTgwNzdhMDlhOTU2OGMwZDRjYTA2MDM4ZGVkOGZhZGRmODEzZmQ2In0.rQqiANogDOMafgg_B6p362PuhInAro9lMm2j_vruBA0",
138-
wantErr: "invalid jwt: payload_hash is invalid",
139-
},
140-
141-
{
142-
name: "invalid signature key",
143-
receivedAt: "2021-07-05T12:00:00+02:00",
144-
signature: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJNZXNzYWdlQmlyZCIsImlhdCI6MTYyNTQ3OTIwMCwiZXhwIjoxNjI1NDc5MjYwLCJqdGkiOiIyNDNjMjdhZS0yZjAyLTQ2YTAtODg1Mi1jNjZmMzdlYTlmNDYiLCJ1cmxfaGFzaCI6IjBmMTE1ZGIwNjJiN2MwZGQwMzBiMTY4NzhjOTlkZWE1YzM1NGI0OWRjMzdiMzhlYjg4NDYxNzljNzc4M2U5ZDcifQ._Uwf4HMtfAT6jvbBbh85Q9TunX0QlsXoaLGKX0I4VDg",
145-
wantErr: "invalid jwt: signature is invalid",
146-
},
147-
148-
{
149-
name: "invalid missing payload",
150-
receivedAt: "2021-07-05T12:00:00+02:00",
151-
signature: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJNZXNzYWdlQmlyZCIsImlhdCI6MTYyNTQ3OTIwMCwiZXhwIjoxNjI1NDc5MjYwLCJqdGkiOiIxNDUwMTUzMi05NmYyLTQ2ODQtOTgzMi02OGYwOTUxYWUzNDIiLCJ1cmxfaGFzaCI6IjBmMTE1ZGIwNjJiN2MwZGQwMzBiMTY4NzhjOTlkZWE1YzM1NGI0OWRjMzdiMzhlYjg4NDYxNzljNzc4M2U5ZDciLCJwYXlsb2FkX2hhc2giOiIzMjRjYzA2N2IyNTdlZGEwYmNiZDljOGQ4MTgwNzdhMDlhOTU2OGMwZDRjYTA2MDM4ZGVkOGZhZGRmODEzZmQ2In0.rQqiANogDOMafgg_B6p362PuhInAro9lMm2j_vruBA0",
152-
wantErr: "invalid jwt: payload_hash was set; expected no payload value",
153-
},
154-
155-
{
156-
name: "invalid unexpected payload",
157-
requestPayload: "Hello, World!",
158-
receivedAt: "2021-07-05T12:00:00+02:00",
159-
signature: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJNZXNzYWdlQmlyZCIsImlhdCI6MTYyNTQ3OTIwMCwiZXhwIjoxNjI1NDc5MjYwLCJqdGkiOiI1OWEyNDRkYy1lOWFkLTRlMjMtOTc3OC0zNzFmYWEyMzhmNzIiLCJ1cmxfaGFzaCI6IjBmMTE1ZGIwNjJiN2MwZGQwMzBiMTY4NzhjOTlkZWE1YzM1NGI0OWRjMzdiMzhlYjg4NDYxNzljNzc4M2U5ZDcifQ.SrhlKJ-ES4Dg8BBXKtop3u92Z_k4L4VjHKsyHWpweGE",
160-
wantErr: "invalid jwt: payload_hash is invalid",
161-
},
89+
testData := mbtest.Testdata(t, "reference.json")
90+
91+
var tcs []struct {
92+
Name string `json:"name"`
93+
Method string `json:"method"`
94+
Secret string `json:"secret"`
95+
Url string `json:"url"`
96+
Payload string `json:"payload"`
97+
Timestamp string `json:"timestamp"`
98+
Token string `json:"token"`
99+
Outcome string `json:"outcome"`
100+
}
101+
if err := json.Unmarshal(testData, &tcs); err != nil {
102+
assert.NoError(t, err)
162103
}
163104

164-
for _, test := range cases {
165-
t.Run(test.name, func(t *testing.T) {
105+
for _, tc := range tcs {
106+
t.Run(tc.Name, func(t *testing.T) {
166107
TimeFunc = func() time.Time {
167-
r, _ := time.Parse(time.RFC3339, test.receivedAt)
108+
r, _ := time.Parse(time.RFC3339, tc.Timestamp)
168109
return r
169110
}
170111

171112
v := NewValidator(testSecret)
172-
reqUrl := testBaseUrl + test.requestParams
173-
if test.requestParams == "" {
174-
reqUrl += "/"
175-
}
176-
err := v.ValidSignature(test.signature, reqUrl, []byte(test.requestPayload))
177-
if test.wantErr == "" {
113+
err := v.ValidSignature(tc.Token, tc.Url, []byte(tc.Payload))
114+
if tc.Outcome == "valid" {
178115
assert.NoError(t, err)
179116
return
180117
}
181-
assert.EqualError(t, err, test.wantErr)
118+
assert.EqualError(t, err, tc.Outcome)
182119
})
183120
}
184121
}

0 commit comments

Comments
 (0)