10 "github.com/stretchr/testify/require"
15 func TestConnectionBaselineAndInputEvents(t *testing.T) {
16 synctest.Test(t, func(t *testing.T) {
17 c, client, transport := testConnection(t)
18 require.Empty(t, transport.ofKind(protocol.Event))
20 client.inputs[0], client.inputs[15] = true, true
21 client.inputDelay = time.Millisecond
22 observedAt := time.Now().Add(time.Millisecond).UTC()
24 require.NoError(t, c.poll(t.Context()))
26 events := transport.ofKind(protocol.Event)
27 require.Len(t, events, 2)
29 for _, event := range events {
30 require.Equal(t, &observedAt, event.Metadata.SentAt)
31 require.JSONEq(t, `{"action":"pressed","value":true}`, eventJSON(t, event.Payload))
34 require.NoError(t, c.poll(t.Context()))
35 require.Len(t, transport.ofKind(protocol.Event), 2)
37 client.inputs[0] = false
39 require.NoError(t, c.poll(t.Context()))
41 events = transport.ofKind(protocol.Event)
42 require.Len(t, events, 3)
43 require.JSONEq(t, `{"action":"released","value":false}`, eventJSON(t, events[2].Payload))
45 client.coils[2] = true
46 transport.messages = nil
48 require.NoError(t, c.poll(t.Context()))
49 require.Empty(t, transport.messages)
53 func TestConnectionRejectsConfigurationAndReadFailuresBeforeOnline(t *testing.T) {
54 testCases := []struct {
56 change func(*fakeClient)
58 {name: "rejects pulse register write failure", change: func(c *fakeClient) {
59 c.registerErr = errors.New("configuration failed")
61 {name: "rejects configuration mismatch", change: func(c *fakeClient) {
64 {name: "rejects input read failure", change: func(c *fakeClient) {
65 c.inputErr = errors.New("input read failed")
67 {name: "rejects coil read failure", change: func(c *fakeClient) {
68 c.readErr = errors.New("coil read failed")
70 {name: "rejects incomplete read", change: func(c *fakeClient) {
73 {name: "rejects unsafe voltage", change: func(c *fakeClient) {
78 for _, tc := range testCases {
79 t.Run(tc.name, func(t *testing.T) {
80 d, client, transport := testAssembly(t)
83 c := &connection{owner: d}
84 err := c.start(t.Context())
86 var failure *deviceError
88 require.ErrorAs(t, err, &failure)
89 require.Empty(t, transport.messages)
94 func TestConnectionReturnsPublicationFailures(t *testing.T) {
95 testCases := []struct {
98 change func(*fakeClient)
100 {name: "returns input report failure", kind: protocol.Reported, change: func(c *fakeClient) {
103 {name: "returns transition failure", kind: protocol.Event, change: func(c *fakeClient) {
106 {name: "returns output report failure", kind: protocol.Reported, change: func(c *fakeClient) {
109 {name: "returns voltage report failure", kind: protocol.Reported, change: func(c *fakeClient) {
114 for _, tc := range testCases {
115 t.Run(tc.name, func(t *testing.T) {
116 c, client, transport := testConnection(t)
117 failure := errors.New("publish failed")
118 transport.failKind, transport.err = tc.kind, failure
120 require.ErrorIs(t, c.poll(t.Context()), failure)
125 func eventJSON(t *testing.T, value any) string {
128 data, err := json.Marshal(value)
129 require.NoError(t, err)