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}