72 lines
1.6 KiB
Go
72 lines
1.6 KiB
Go
|
package watch
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"net/http"
|
||
|
"net/http/httptest"
|
||
|
"testing"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
var actions = []string{
|
||
|
`{"type": "create", "object":{"foo": "bar"}}`,
|
||
|
`{"type": "delete", INVALID}`,
|
||
|
`{"type": "update", "object":{"foo": {"foo": "bar"}}}`,
|
||
|
`{"type": "delete", "object":null}`,
|
||
|
}
|
||
|
|
||
|
func TestBodyWatcher(t *testing.T) {
|
||
|
// set up server with handler to flush strings from ch.
|
||
|
ch := make(chan string)
|
||
|
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
flusher, ok := w.(http.Flusher)
|
||
|
if !ok {
|
||
|
t.Fatal("expected ResponseWriter to be a flusher")
|
||
|
}
|
||
|
|
||
|
fmt.Fprintf(w, "\n")
|
||
|
flusher.Flush()
|
||
|
|
||
|
for v := range ch {
|
||
|
fmt.Fprintf(w, "%s\n", v)
|
||
|
flusher.Flush()
|
||
|
time.Sleep(10 * time.Millisecond)
|
||
|
}
|
||
|
}))
|
||
|
defer ts.Close()
|
||
|
|
||
|
req, err := http.NewRequest("GET", ts.URL, nil)
|
||
|
if err != nil {
|
||
|
t.Fatalf("did not expect NewRequest to return err: %v", err)
|
||
|
}
|
||
|
|
||
|
// setup body watcher
|
||
|
w, err := NewBodyWatcher(req, http.DefaultClient)
|
||
|
if err != nil {
|
||
|
t.Fatalf("did not expect NewBodyWatcher to return %v", err)
|
||
|
}
|
||
|
|
||
|
<-time.After(time.Second)
|
||
|
|
||
|
// send action strings in, and expect result back
|
||
|
ch <- actions[0]
|
||
|
if r := <-w.ResultChan(); r.Type != "create" {
|
||
|
t.Fatalf("expected result to be create")
|
||
|
}
|
||
|
|
||
|
ch <- actions[1] // should be ignored as its invalid json
|
||
|
ch <- actions[2]
|
||
|
if r := <-w.ResultChan(); r.Type != "update" {
|
||
|
t.Fatalf("expected result to be update")
|
||
|
}
|
||
|
|
||
|
ch <- actions[3]
|
||
|
if r := <-w.ResultChan(); r.Type != "delete" {
|
||
|
t.Fatalf("expected result to be delete")
|
||
|
}
|
||
|
|
||
|
// stop should clean up all channels.
|
||
|
w.Stop()
|
||
|
close(ch)
|
||
|
}
|