protocol_test.go

  1package daemonrpc
  2
  3import (
  4	"encoding/json"
  5	"testing"
  6)
  7
  8func TestDecodeMessage_Request(t *testing.T) {
  9	raw := json.RawMessage(`{"id":1,"method":"Ping"}`)
 10	msg, err := DecodeMessage(raw)
 11	if err != nil {
 12		t.Fatal(err)
 13	}
 14	if msg.Request == nil {
 15		t.Fatal("expected Request, got nil")
 16	}
 17	if msg.Request.Method != "Ping" {
 18		t.Errorf("method = %q, want Ping", msg.Request.Method)
 19	}
 20	if msg.Request.ID != 1 {
 21		t.Errorf("id = %d, want 1", msg.Request.ID)
 22	}
 23	if msg.Response != nil || msg.Event != nil {
 24		t.Error("expected only Request to be set")
 25	}
 26}
 27
 28func TestDecodeMessage_Response(t *testing.T) {
 29	raw := json.RawMessage(`{"id":1,"result":{"pong":true}}`)
 30	msg, err := DecodeMessage(raw)
 31	if err != nil {
 32		t.Fatal(err)
 33	}
 34	if msg.Response == nil {
 35		t.Fatal("expected Response, got nil")
 36	}
 37	if msg.Response.ID != 1 {
 38		t.Errorf("id = %d, want 1", msg.Response.ID)
 39	}
 40	if msg.Response.Error != nil {
 41		t.Error("expected no error")
 42	}
 43}
 44
 45func TestDecodeMessage_ResponseError(t *testing.T) {
 46	raw := json.RawMessage(`{"id":2,"error":{"code":-32601,"message":"not found"}}`)
 47	msg, err := DecodeMessage(raw)
 48	if err != nil {
 49		t.Fatal(err)
 50	}
 51	if msg.Response == nil {
 52		t.Fatal("expected Response")
 53	}
 54	if msg.Response.Error == nil {
 55		t.Fatal("expected error in response")
 56	}
 57	if msg.Response.Error.Code != ErrCodeNotFound {
 58		t.Errorf("code = %d, want %d", msg.Response.Error.Code, ErrCodeNotFound)
 59	}
 60	if msg.Response.Error.Message != "not found" {
 61		t.Errorf("message = %q, want 'not found'", msg.Response.Error.Message)
 62	}
 63}
 64
 65func TestDecodeMessage_Event(t *testing.T) {
 66	raw := json.RawMessage(`{"type":"NewMail","data":{"account_id":"abc","folder":"INBOX"}}`)
 67	msg, err := DecodeMessage(raw)
 68	if err != nil {
 69		t.Fatal(err)
 70	}
 71	if msg.Event == nil {
 72		t.Fatal("expected Event, got nil")
 73	}
 74	if msg.Event.Type != EventNewMail {
 75		t.Errorf("type = %q, want NewMail", msg.Event.Type)
 76	}
 77
 78	var ev NewMailEvent
 79	if err := json.Unmarshal(msg.Event.Data, &ev); err != nil {
 80		t.Fatal(err)
 81	}
 82	if ev.AccountID != "abc" {
 83		t.Errorf("account_id = %q, want abc", ev.AccountID)
 84	}
 85}
 86
 87func TestDecodeMessage_Invalid(t *testing.T) {
 88	raw := json.RawMessage(`{invalid}`)
 89	_, err := DecodeMessage(raw)
 90	if err == nil {
 91		t.Error("expected error for invalid JSON")
 92	}
 93}
 94
 95func TestError_ErrorInterface(t *testing.T) {
 96	e := &Error{Code: ErrCodeInternal, Message: "something broke"}
 97	if e.Error() != "something broke" {
 98		t.Errorf("Error() = %q, want 'something broke'", e.Error())
 99	}
100}
101
102func TestRequestRoundTrip(t *testing.T) {
103	params, _ := json.Marshal(FetchEmailsParams{
104		AccountID: "acc1",
105		Folder:    "INBOX",
106		Limit:     50,
107		Offset:    0,
108	})
109	req := Request{
110		ID:     42,
111		Method: MethodFetchEmails,
112		Params: params,
113	}
114
115	data, err := json.Marshal(req)
116	if err != nil {
117		t.Fatal(err)
118	}
119
120	msg, err := DecodeMessage(data)
121	if err != nil {
122		t.Fatal(err)
123	}
124	if msg.Request == nil {
125		t.Fatal("expected Request")
126	}
127	if msg.Request.ID != 42 {
128		t.Errorf("id = %d, want 42", msg.Request.ID)
129	}
130
131	var p FetchEmailsParams
132	if err := json.Unmarshal(msg.Request.Params, &p); err != nil {
133		t.Fatal(err)
134	}
135	if p.AccountID != "acc1" || p.Folder != "INBOX" || p.Limit != 50 {
136		t.Errorf("params mismatch: %+v", p)
137	}
138}