feat: update ingest, registry, and UI flows
This commit is contained in:
@@ -2,6 +2,7 @@ package api
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"database/sql"
|
||||
"encoding/json"
|
||||
"io"
|
||||
"net/http"
|
||||
@@ -87,7 +88,7 @@ func TestIngestHardwareIdempotent(t *testing.T) {
|
||||
assertCount(t, db, "log_bundles", 1)
|
||||
assertCount(t, db, "observations", 1)
|
||||
assertCount(t, db, "installations", 1)
|
||||
assertCount(t, db, "components", 1)
|
||||
assertCount(t, db, "parts", 1)
|
||||
}
|
||||
|
||||
func TestIngestHardwareStatusEvents(t *testing.T) {
|
||||
@@ -219,8 +220,8 @@ func TestIngestHardwareFirmwareChange(t *testing.T) {
|
||||
var version string
|
||||
row := db.QueryRow(`
|
||||
SELECT firmware_version
|
||||
FROM asset_firmware_states
|
||||
WHERE asset_id = (SELECT id FROM assets WHERE vendor_serial = ? LIMIT 1) AND device_name = ?
|
||||
FROM machine_firmware_states
|
||||
WHERE machine_id = (SELECT id FROM machines WHERE vendor_serial = ? LIMIT 1) AND device_name = ?
|
||||
`, boardSerial, "BIOS")
|
||||
if err := row.Scan(&version); err != nil {
|
||||
t.Fatalf("firmware state query: %v", err)
|
||||
@@ -231,3 +232,58 @@ func TestIngestHardwareFirmwareChange(t *testing.T) {
|
||||
|
||||
assertCountQuery(t, db, "SELECT COUNT(*) FROM timeline_events WHERE subject_type = 'asset' AND event_type = 'FIRMWARE_CHANGED'", 2)
|
||||
}
|
||||
|
||||
func TestIngestHardwareCreatesMachineInStock(t *testing.T) {
|
||||
dsn := os.Getenv("DATABASE_DSN")
|
||||
if dsn == "" {
|
||||
t.Skip("DATABASE_DSN not set")
|
||||
}
|
||||
|
||||
db, err := repository.Open(dsn)
|
||||
if err != nil {
|
||||
t.Fatalf("open db: %v", err)
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
if err := applyMigrations(db); err != nil {
|
||||
t.Fatalf("apply migrations: %v", err)
|
||||
}
|
||||
if err := cleanupRegistry(db); err != nil {
|
||||
t.Fatalf("cleanup: %v", err)
|
||||
}
|
||||
|
||||
mux := http.NewServeMux()
|
||||
RegisterIngestRoutes(mux, IngestDependencies{Service: ingest.NewService(db)})
|
||||
server := httptest.NewServer(mux)
|
||||
defer server.Close()
|
||||
|
||||
payload := map[string]any{
|
||||
"target_host": "stock-server",
|
||||
"collected_at": time.Now().UTC().Format(time.RFC3339),
|
||||
"hardware": map[string]any{
|
||||
"board": map[string]any{"serial_number": "STOCK-001"},
|
||||
},
|
||||
}
|
||||
body, err := json.Marshal(payload)
|
||||
if err != nil {
|
||||
t.Fatalf("marshal payload: %v", err)
|
||||
}
|
||||
|
||||
resp, err := http.Post(server.URL+"/ingest/hardware", "application/json", bytes.NewReader(body))
|
||||
if err != nil {
|
||||
t.Fatalf("post: %v", err)
|
||||
}
|
||||
resp.Body.Close()
|
||||
if resp.StatusCode != http.StatusCreated {
|
||||
t.Fatalf("expected 201, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
var customerID, locationID, projectID sql.NullString
|
||||
if err := db.QueryRow(`SELECT customer_id, location_id, project_id FROM machines WHERE vendor_serial = ?`, "STOCK-001").
|
||||
Scan(&customerID, &locationID, &projectID); err != nil {
|
||||
t.Fatalf("query machine ownership: %v", err)
|
||||
}
|
||||
if customerID.Valid || locationID.Valid || projectID.Valid {
|
||||
t.Fatalf("expected stock machine with null ownership/project, got customer=%v location=%v project=%v", customerID.String, locationID.String, projectID.String)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user