package dispatch import ( "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestNewChannelEvent(t *testing.T) { evt := NewChannelEvent("test.event", map[string]interface{}{"key": "value"}) assert.Equal(t, "test.event", string(evt.Type)) assert.Equal(t, "value", evt.Data["key"]) assert.NotZero(t, evt.Timestamp) } func TestNewChannelEvent_NilData(t *testing.T) { evt := NewChannelEvent("test.event", nil) assert.NotNil(t, evt.Data) assert.Equal(t, "test.event", string(evt.Type)) } func TestNewDispatchEvent(t *testing.T) { evt := NewDispatchEvent(DispatchEventAutoAssign, map[string]interface{}{"conversation_id": uint(1)}) assert.Equal(t, "auto_assignment.assign", string(evt.Type)) assert.Equal(t, uint(1), evt.Data["conversation_id"]) } func TestEventDataWithConversation(t *testing.T) { data := EventDataWithConversation(1, 2, 3) assert.Equal(t, uint(1), data["conversation_id"]) assert.Equal(t, uint(2), data["account_id"]) assert.Equal(t, uint(3), data["inbox_id"]) } func TestEventDataWithAssignment(t *testing.T) { data := EventDataWithAssignment(1, 2, 3, 4) assert.Equal(t, uint(1), data["conversation_id"]) assert.Equal(t, uint(2), data["account_id"]) assert.Equal(t, uint(3), data["inbox_id"]) assert.Equal(t, uint(4), data["assignee_id"]) } func TestExtractConversationID(t *testing.T) { tests := []struct { name string data map[string]interface{} want uint wantErr bool }{ {"uint", map[string]interface{}{"conversation_id": uint(42)}, 42, false}, {"int", map[string]interface{}{"conversation_id": int(42)}, 42, false}, {"float64", map[string]interface{}{"conversation_id": float64(42)}, 42, false}, {"missing", map[string]interface{}{}, 0, true}, {"invalid_type", map[string]interface{}{"conversation_id": "abc"}, 0, true}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := ExtractConversationID(tt.data) if tt.wantErr { require.Error(t, err) } else { require.NoError(t, err) assert.Equal(t, tt.want, got) } }) } } func TestExtractAccountID(t *testing.T) { tests := []struct { name string data map[string]interface{} want uint wantErr bool }{ {"uint", map[string]interface{}{"account_id": uint(7)}, 7, false}, {"int", map[string]interface{}{"account_id": int(7)}, 7, false}, {"float64", map[string]interface{}{"account_id": float64(7)}, 7, false}, {"missing", map[string]interface{}{}, 0, true}, {"invalid_type", map[string]interface{}{"account_id": true}, 0, true}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := ExtractAccountID(tt.data) if tt.wantErr { require.Error(t, err) } else { require.NoError(t, err) assert.Equal(t, tt.want, got) } }) } } func TestExtractInboxID(t *testing.T) { got, err := ExtractInboxID(map[string]interface{}{"inbox_id": uint(99)}) require.NoError(t, err) assert.Equal(t, uint(99), got) _, err = ExtractInboxID(map[string]interface{}{}) require.Error(t, err) } func TestExtractAssigneeID(t *testing.T) { got, err := ExtractAssigneeID(map[string]interface{}{"assignee_id": uint(5)}) require.NoError(t, err) assert.Equal(t, uint(5), got) _, err = ExtractAssigneeID(map[string]interface{}{}) require.Error(t, err) }