diff --git a/client/ym/types.go b/client/ym/types.go index 0f962f8..091533b 100644 --- a/client/ym/types.go +++ b/client/ym/types.go @@ -110,7 +110,7 @@ type Update struct { // ToMessage converts an Update to a Message by promoting its fields. // This is useful for code that expects a Message struct. func (u *Update) ToMessage() *Message { - if u == nil { + if u == nil || u.Chat == nil || u.From == nil { return nil } diff --git a/client/ym/types_test.go b/client/ym/types_test.go new file mode 100644 index 0000000..98575e3 --- /dev/null +++ b/client/ym/types_test.go @@ -0,0 +1,46 @@ +package ym + +import "testing" + +func TestUpdateToMessageReturnsNilWhenRequiredFieldsMissing(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + update *Update + }{ + {name: "nil update", update: nil}, + {name: "nil chat", update: &Update{From: &Sender{Login: "bot"}}}, + {name: "nil from", update: &Update{Chat: &Chat{ID: "chat-1"}}}, + } + + for _, tc := range tests { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + if got := tc.update.ToMessage(); got != nil { + t.Fatalf("expected nil message, got %#v", got) + } + }) + } +} + +func TestUpdateToMessageConvertsWhenRequiredFieldsPresent(t *testing.T) { + t.Parallel() + + update := &Update{ + MessageID: 42, + Chat: &Chat{ID: "chat-1"}, + From: &Sender{Login: "bot"}, + Text: "hello", + Timestamp: 100, + } + + message := update.ToMessage() + if message == nil { + t.Fatal("expected message, got nil") + } + if message.ID != update.MessageID || message.Chat.ID != update.Chat.ID || message.From.Login != update.From.Login { + t.Fatalf("unexpected conversion result: %#v", message) + } +}