func TestQueryBuilder(t *testing.T) { const expected = `select * from event where key in ($1, $2) and origin = $3 and entities @> ARRAY[$4, $5]::text[] order by created desc;` expectedArgs := []interface{}{"foo.bar", "bar.foo", "mysystem", "c/1", "c/2"} q := straumur.Query{} q.Origin = "mysystem" q.Entities = []string{"c/1", "c/2"} q.Key = "foo.bar OR bar.foo" s, args := buildSelectQuery(q) if s != expected { t.Fatalf("Expected %s, got %s", expected, s) } if len(args) != len(expectedArgs) { t.Fatalf("Expected %+v, got %+v", expectedArgs, args) } }
func TestAggregateBuilder(t *testing.T) { const expected = `select i as name, count(*) as count from (select unnest(actors) as i from (select * from event where key in ($1, $2) and origin = $3 and entities @> ARRAY[$4, $5]::text[] order by created desc) x order by actors) t group by i order by i;` expectedArgs := []interface{}{"foo.bar", "bar.foo", "mysystem", "c/1", "c/2"} q := straumur.Query{} q.Origin = "mysystem" q.Entities = []string{"c/1", "c/2"} q.Key = "foo.bar OR bar.foo" s, args := buildAggregateQuery(q, "actors") if s != expected { t.Fatalf("Expected %s, got %s", expected, s) } if len(args) != len(expectedArgs) { t.Fatalf("Expected %+v, got %+v", expectedArgs, args) } }
func TestWebSocketBroadcaster(t *testing.T) { url := fmt.Sprintf("ws://%s%s", serverAddr, "/ws") conn, err := websocket.Dial(url, "", "http://localhost/") if err != nil { t.Errorf("WebSocket handshake error: %v", err) return } q := straumur.Query{} q.Entities = []string{"ns/moo"} t.Logf("Query filter: %+v", q) websocket.JSON.Send(conn, q) time.Sleep(300 * time.Millisecond) e := straumur.NewEvent( "myapp.user.login", nil, nil, "User foobar logged in", 3, "myapp", []string{"ns/foo", "ns/moo"}, nil, nil, nil) broadcaster.Broadcast(e) var event straumur.Event if err := websocket.JSON.Receive(conn, &event); err != nil { t.Errorf("Read: %v", err) } incoming := make(chan straumur.Event) go readEvents(conn, incoming) filtered := straumur.NewEvent( "Should filter", nil, nil, "This event should be filtered", 3, "myapp", []string{"ns/foo", "ns/boo"}, nil, nil, nil) if q.Match(*filtered) == true { t.Errorf("Query %+v should not pass %+v", q, filtered) } broadcaster.Broadcast(filtered) broadcaster.Broadcast(straumur.NewEvent( "foo.bar", nil, nil, "This event should pass", 3, "myapp", []string{"ns/foo", "ns/moo"}, nil, nil, nil)) ev := <-incoming if ev.Key != "foo.bar" { t.Errorf("Unexpected %s", ev) } }