code.oscarkilo.com/okg/chat/chat_test.go

..
chat.go
chat_test.go
package chat

import "encoding/json"
import "net/http"
import "net/http/httptest"
import "testing"
import "time"

func TestSend(t *testing.T) {
  var seen SendRequest
  srv := httptest.NewServer(http.HandlerFunc(
    func(w http.ResponseWriter, r *http.Request) {
      if r.URL.Path != "/chat/send" {
        t.Errorf(
          "path: got %q, want /chat/send", r.URL.Path)
      }
      json.NewDecoder(r.Body).Decode(&seen)
      json.NewEncoder(w).Encode(Message{
        From:      "alice",
        To:        seen.To,
        Text:      seen.Text,
        CreatedAt: time.Now(),
      })
    }))
  defer srv.Close()

  c := NewHTTPClient(srv.URL, "test-key")
  msg, err := c.Send(SendRequest{
    To: "team", Text: "hello",
  })
  if err != nil {
    t.Fatal(err)
  }
  if msg.To != "team" || msg.Text != "hello" {
    t.Errorf("msg: %+v", msg)
  }
  if seen.To != "team" {
    t.Errorf("seen.To: got %q", seen.To)
  }
}

func TestSetPermissions(t *testing.T) {
  var seen SetPermissionsRequest
  srv := httptest.NewServer(http.HandlerFunc(
    func(w http.ResponseWriter, r *http.Request) {
      if r.URL.Path != "/chat/permissions/set" {
        t.Errorf(
          "path: got %q, want /chat/permissions/set",
          r.URL.Path)
      }
      json.NewDecoder(r.Body).Decode(&seen)
      w.WriteHeader(200)
    }))
  defer srv.Close()

  c := NewHTTPClient(srv.URL, "test-key")
  err := c.SetPermissions(SetPermissionsRequest{
    Group:      "team",
    Permission: "post",
    Owner:      "alice",
    Reader:     "team",
  })
  if err != nil {
    t.Fatal(err)
  }
  if seen.Group != "team" || seen.Permission != "post" {
    t.Errorf(
      "got %+v, want team/post", seen)
  }
}

func TestSearch(t *testing.T) {
  srv := httptest.NewServer(http.HandlerFunc(
    func(w http.ResponseWriter, r *http.Request) {
      if r.URL.Path != "/chat/search" {
        t.Errorf(
          "path: got %q, want /chat/search", r.URL.Path)
      }
      json.NewEncoder(w).Encode(SearchResponse{
        Messages: []*Message{
          {From: "alice", To: "team", Text: "hello"},
          {From: "bob", To: "team", Text: "world"},
        },
      })
    }))
  defer srv.Close()

  c := NewHTTPClient(srv.URL, "test-key")
  msgs, err := c.Search(SearchRequest{To: "team"})
  if err != nil {
    t.Fatal(err)
  }
  if len(msgs) != 2 {
    t.Fatalf("len: got %d, want 2", len(msgs))
  }
  if msgs[0].Text != "hello" {
    t.Errorf("msgs[0].Text: got %q", msgs[0].Text)
  }
}