From 69b0fcb79d146f2e0538a8c980f20f51f97369e6 Mon Sep 17 00:00:00 2001 From: Kegan Dougal Date: Thu, 1 Dec 2016 17:32:16 +0000 Subject: [PATCH] Add LeaveRoom(roomID) with test --- client.go | 16 +++++++++++++++- client_test.go | 44 +++++++++++++++++++++++++++++++++++++++++++- responses.go | 3 +++ 3 files changed, 61 insertions(+), 2 deletions(-) diff --git a/client.go b/client.go index d061e3c..4d93e1c 100644 --- a/client.go +++ b/client.go @@ -185,7 +185,7 @@ func (cli *Client) SendJSON(method string, httpURL string, contentJSON interface if res.StatusCode >= 300 || res.StatusCode < 200 { var wrap error var respErr RespError - if _ = json.Unmarshal(contents, respErr); respErr.ErrCode != "" { + if _ = json.Unmarshal(contents, &respErr); respErr.ErrCode != "" { wrap = respErr } @@ -315,6 +315,20 @@ func (cli *Client) SendText(roomID, text string) (*RespSendEvent, error) { TextMessage{"m.text", text}) } +// LeaveRoom leaves the given room. See http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-rooms-roomid-leave +func (cli *Client) LeaveRoom(roomID string) (*RespLeaveRoom, error) { + u := cli.BuildURL("rooms", roomID, "leave") + resBytes, err := cli.SendJSON("POST", u, struct{}{}) + if err != nil { + return nil, err + } + var resp RespLeaveRoom + if err = json.Unmarshal(resBytes, &resp); err != nil { + return nil, err + } + return &resp, nil +} + // UploadLink uploads an HTTP URL and then returns an MXC URI. func (cli *Client) UploadLink(link string) (*RespMediaUpload, error) { res, err := cli.Client.Get(link) diff --git a/client_test.go b/client_test.go index 6a12a9a..081dc12 100644 --- a/client_test.go +++ b/client_test.go @@ -1,6 +1,12 @@ package gomatrix -import "fmt" +import ( + "bytes" + "fmt" + "io/ioutil" + "net/http" + "testing" +) func ExampleClient_BuildURLWithQuery() { cli, _ := NewClient("https://matrix.org", "@example:matrix.org", "abcdef123456") @@ -26,3 +32,39 @@ func ExampleClient_BuildBaseURL() { fmt.Println(out) // Output: https://matrix.org/_matrix/client/r0/directory/room/%23matrix:matrix.org?access_token=abcdef123456 } + +func TestClient_LeaveRoom(t *testing.T) { + cli := mockClient(func(req *http.Request) (*http.Response, error) { + if req.Method == "POST" && req.URL.Path == "/_matrix/client/r0/rooms/!foo:bar/leave" { + return &http.Response{ + StatusCode: 200, + Body: ioutil.NopCloser(bytes.NewBufferString(`{}`)), + }, nil + } + return nil, fmt.Errorf("unhandled URL: %s", req.URL.Path) + }) + + if _, err := cli.LeaveRoom("!foo:bar"); err != nil { + t.Fatalf("LeaveRoom: error, got %s", err.Error()) + } +} + +func mockClient(fn func(*http.Request) (*http.Response, error)) *Client { + mrt := MockRoundTripper{ + RT: fn, + } + + cli, _ := NewClient("https://test.gomatrix.org", "@user:test.gomatrix.org", "abcdef") + cli.Client = &http.Client{ + Transport: mrt, + } + return cli +} + +type MockRoundTripper struct { + RT func(*http.Request) (*http.Response, error) +} + +func (t MockRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + return t.RT(req) +} diff --git a/responses.go b/responses.go index 76bfbe2..1528f97 100644 --- a/responses.go +++ b/responses.go @@ -22,6 +22,9 @@ type RespJoinRoom struct { RoomID string `json:"room_id"` } +// RespLeaveRoom is the JSON response for http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-rooms-roomid-leave +type RespLeaveRoom struct{} + // RespSendEvent is the JSON response for http://matrix.org/docs/spec/client_server/r0.2.0.html#put-matrix-client-r0-rooms-roomid-send-eventtype-txnid type RespSendEvent struct { EventID string `json:"event_id"`