feat: alive UI wave, galaxy presence, spread and fleet enhancements
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Dashboard ambient layer, comrade presence, Mission Deck and War Room, Emberwake supply chain, spread/docs publishing, fleet policy and modules API, CI docker mining, and refreshed USB pack.
This commit is contained in:
@@ -159,6 +159,102 @@ func TestHandleDashboardWSAuthorizedInit(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func resetWSAuthUsersMulti(t *testing.T, creds map[string]string) {
|
||||
t.Helper()
|
||||
users := make(map[string]string, len(creds))
|
||||
for user, pass := range creds {
|
||||
hashed, err := hashPassword(pass)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
users[user] = hashed
|
||||
}
|
||||
usersMu.Lock()
|
||||
authUsers = users
|
||||
usersMu.Unlock()
|
||||
t.Cleanup(func() {
|
||||
usersMu.Lock()
|
||||
authUsers = map[string]string{}
|
||||
usersMu.Unlock()
|
||||
})
|
||||
}
|
||||
|
||||
func TestHandleDashboardWSPresence(t *testing.T) {
|
||||
resetWSAuthUsersMulti(t, map[string]string{"india": "secret-pass", "comrade": "secret-pass"})
|
||||
database, err := db.New(t.TempDir())
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Cleanup(func() { _ = database.Close() })
|
||||
hub := NewWSHub(database)
|
||||
|
||||
srv := httptest.NewServer(http.HandlerFunc(hub.HandleDashboardWS))
|
||||
t.Cleanup(srv.Close)
|
||||
base := "ws" + strings.TrimPrefix(srv.URL, "http")
|
||||
|
||||
dial := func(user string) *websocket.Conn {
|
||||
t.Helper()
|
||||
conn, _, err := websocket.DefaultDialer.Dial(base+"?token="+wsDashboardToken(user, "secret-pass"), nil)
|
||||
if err != nil {
|
||||
t.Fatalf("dial %s: %v", user, err)
|
||||
}
|
||||
t.Cleanup(func() { _ = conn.Close() })
|
||||
var init Message
|
||||
if err := conn.ReadJSON(&init); err != nil || init.Type != "init" {
|
||||
t.Fatalf("read init for %s: %v type=%q", user, err, init.Type)
|
||||
}
|
||||
var snap Message
|
||||
if err := conn.ReadJSON(&snap); err != nil || snap.Type != "presence_snapshot" {
|
||||
t.Fatalf("read presence_snapshot for %s: %v type=%q", user, err, snap.Type)
|
||||
}
|
||||
return conn
|
||||
}
|
||||
|
||||
connA := dial("india")
|
||||
connB := dial("comrade")
|
||||
|
||||
waitForMessage := func(conn *websocket.Conn, wantType, wantUser string, check func(map[string]interface{}) bool) {
|
||||
t.Helper()
|
||||
deadline := time.Now().Add(3 * time.Second)
|
||||
for time.Now().Before(deadline) {
|
||||
_ = conn.SetReadDeadline(time.Now().Add(250 * time.Millisecond))
|
||||
var msg Message
|
||||
if err := conn.ReadJSON(&msg); err != nil {
|
||||
continue
|
||||
}
|
||||
if msg.Type != wantType {
|
||||
continue
|
||||
}
|
||||
var body map[string]interface{}
|
||||
if err := json.Unmarshal(msg.Payload, &body); err != nil {
|
||||
continue
|
||||
}
|
||||
if wantUser != "" && body["user"] != wantUser {
|
||||
continue
|
||||
}
|
||||
if check != nil && !check(body) {
|
||||
continue
|
||||
}
|
||||
return
|
||||
}
|
||||
t.Fatalf("timed out waiting for %s user=%q", wantType, wantUser)
|
||||
}
|
||||
|
||||
if err := connA.WriteJSON(Message{Type: "presence_page", Payload: mustMarshal(map[string]string{"page": "/crucible"})}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
waitForMessage(connB, "presence_update", "india", func(body map[string]interface{}) bool {
|
||||
return body["page"] == "/crucible" && body["online"] == true
|
||||
})
|
||||
|
||||
if err := connA.WriteJSON(Message{Type: "notes_typing", Payload: mustMarshal(map[string]bool{"active": true})}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
waitForMessage(connB, "notes_typing", "india", func(body map[string]interface{}) bool {
|
||||
return body["active"] == true
|
||||
})
|
||||
}
|
||||
|
||||
func TestHandleAgentWSBadFleetSecret(t *testing.T) {
|
||||
database, err := db.New(t.TempDir())
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user