Files
VoCat/internal/server/device_discovery_api_test.go
T

73 lines
2.0 KiB
Go

package server
import (
"context"
"net/http"
"net/http/httptest"
"strings"
"testing"
"vocat/internal/device"
"vocat/internal/modem"
"vocat/internal/store"
)
type discoverySnapshotController struct {
fakeDeviceController
entries []device.Device
discoverCalls int
}
func (controller *discoverySnapshotController) Discover(context.Context) ([]device.Device, error) {
controller.discoverCalls++
return append([]device.Device(nil), controller.entries...), nil
}
func TestDiscoveredDevicesPerformsFreshScanAndOmitsAbsentEntries(t *testing.T) {
database, err := store.Open(context.Background(), ":memory:")
if err != nil {
t.Fatalf("store.Open: %v", err)
}
t.Cleanup(func() { _ = database.Close() })
controller := &discoverySnapshotController{
fakeDeviceController: fakeDeviceController{entry: device.Device{
ID: "stale-device", Discovered: false,
Candidate: modem.Candidate{ID: "stale-device", USBPath: "1-1"},
}},
entries: []device.Device{
{
ID: "current-device", Discovered: true,
Candidate: modem.Candidate{ID: "current-device", USBPath: "2-1"},
},
{
ID: "absent-device", Discovered: false,
Candidate: modem.Candidate{ID: "absent-device", USBPath: "3-1"},
},
},
}
server := &Server{
store: database, logger: regionTestLogger(),
maxRequestBodyBytes: 4096, devices: controller,
}
request := httptest.NewRequest(http.MethodGet, "/api/devices/discovered", nil)
recorder := httptest.NewRecorder()
if !server.handleDiscoveredDevices(recorder, request) {
t.Fatal("handleDiscoveredDevices returned false")
}
if recorder.Code != http.StatusOK {
t.Fatalf("status = %d, body = %s", recorder.Code, recorder.Body.String())
}
if controller.discoverCalls != 1 {
t.Fatalf("Discover calls = %d, want 1", controller.discoverCalls)
}
body := recorder.Body.String()
if !strings.Contains(body, "current-device") {
t.Fatalf("response omits current device: %s", body)
}
if strings.Contains(body, "stale-device") || strings.Contains(body, "absent-device") {
t.Fatalf("response contains an absent device: %s", body)
}
}