diff --git a/shortcuts/vc/vc_meeting_events.go b/shortcuts/vc/vc_meeting_events.go index 796ad008d..b8d2eec65 100644 --- a/shortcuts/vc/vc_meeting_events.go +++ b/shortcuts/vc/vc_meeting_events.go @@ -1163,7 +1163,10 @@ func meetingEventUserWithID(user map[string]interface{}) string { } func meetingEventType(event map[string]interface{}) string { - return common.GetString(event, "event_type") + if eventType := common.GetString(event, "event_type"); eventType != "" { + return eventType + } + return common.GetString(common.GetMap(event, "payload"), "activity_event_type") } func meetingEventSummary(event map[string]interface{}) string { diff --git a/shortcuts/vc/vc_meeting_events_test.go b/shortcuts/vc/vc_meeting_events_test.go index b9bd8d7ff..65edfa23e 100644 --- a/shortcuts/vc/vc_meeting_events_test.go +++ b/shortcuts/vc/vc_meeting_events_test.go @@ -1400,6 +1400,22 @@ func TestMeetingEventSummary(t *testing.T) { } } +func TestMeetingEventsEventFromPayloadUsesActivityEventTypeFallback(t *testing.T) { + event := participantJoinedEvent() + delete(event, "event_type") + + got := meetingEventsEventFromPayload(event, meetingEventsIdentity{}) + if got.EventType != "participant_joined" { + t.Fatalf("EventType = %q, want participant_joined", got.EventType) + } + if len(got.Actors) != 1 { + t.Fatalf("actors len = %d, want 1: %#v", len(got.Actors), got.Actors) + } + if got.Actors[0].ID != "bot_001" { + t.Fatalf("actor id = %q, want bot_001", got.Actors[0].ID) + } +} + func TestEscapePrettyText(t *testing.T) { got := escapePrettyText("line1\nline2\t\r" + string(rune(0x07))) want := `line1\nline2\t\r\u0007` diff --git a/tests/cli_e2e/vc/vc_meeting_events_dryrun_test.go b/tests/cli_e2e/vc/vc_meeting_events_dryrun_test.go new file mode 100644 index 000000000..8f01e31ed --- /dev/null +++ b/tests/cli_e2e/vc/vc_meeting_events_dryrun_test.go @@ -0,0 +1,46 @@ +// Copyright (c) 2026 Lark Technologies Pte. Ltd. +// SPDX-License-Identifier: MIT + +package vc + +import ( + "context" + "testing" + "time" + + clie2e "github.com/larksuite/cli/tests/cli_e2e" + "github.com/stretchr/testify/require" + "github.com/tidwall/gjson" +) + +func TestVCMeetingEventsDryRun(t *testing.T) { + setVCDryRunEnv(t) + + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + t.Cleanup(cancel) + + result, err := clie2e.RunCmd(ctx, clie2e.Request{ + Args: []string{ + "vc", "+meeting-events", + "--meeting-id", "7628568141510692381", + "--page-token", "1710000000000000000", + "--page-size", "40", + "--start", "1710000000", + "--end", "1710003600", + "--dry-run", + }, + DefaultAs: "bot", + }) + require.NoError(t, err) + result.AssertExitCode(t, 0) + + out := result.Stdout + require.Equal(t, int64(1), gjson.Get(out, "api.#").Int(), "stdout:\n%s", out) + require.Equal(t, "GET", gjson.Get(out, "api.0.method").String(), "stdout:\n%s", out) + require.Equal(t, "/open-apis/vc/v1/bots/events", gjson.Get(out, "api.0.url").String(), "stdout:\n%s", out) + require.Equal(t, "7628568141510692381", gjson.Get(out, "api.0.params.meeting_id").String(), "stdout:\n%s", out) + require.Equal(t, "1710000000000000000", gjson.Get(out, "api.0.params.page_token").String(), "stdout:\n%s", out) + require.Equal(t, "40", gjson.Get(out, "api.0.params.page_size").String(), "stdout:\n%s", out) + require.Equal(t, "1710000000", gjson.Get(out, "api.0.params.start_time").String(), "stdout:\n%s", out) + require.Equal(t, "1710003600", gjson.Get(out, "api.0.params.end_time").String(), "stdout:\n%s", out) +} diff --git a/tests/cli_e2e/vc/vc_meeting_message_send_dryrun_test.go b/tests/cli_e2e/vc/vc_meeting_message_send_dryrun_test.go index 9bd1a23d9..87bd79c74 100644 --- a/tests/cli_e2e/vc/vc_meeting_message_send_dryrun_test.go +++ b/tests/cli_e2e/vc/vc_meeting_message_send_dryrun_test.go @@ -15,7 +15,7 @@ import ( ) func TestVCMeetingMessageSendDryRun(t *testing.T) { - setVCMeetingMessageSendDryRunEnv(t) + setVCDryRunEnv(t) tests := []struct { name string @@ -81,7 +81,7 @@ func TestVCMeetingMessageSendDryRun(t *testing.T) { } func TestVCMeetingMessageSendDryRunRejectsLongUUID(t *testing.T) { - setVCMeetingMessageSendDryRunEnv(t) + setVCDryRunEnv(t) ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) t.Cleanup(cancel) @@ -104,10 +104,10 @@ func TestVCMeetingMessageSendDryRunRejectsLongUUID(t *testing.T) { require.Empty(t, result.Stdout) } -func setVCMeetingMessageSendDryRunEnv(t *testing.T) { +func setVCDryRunEnv(t *testing.T) { t.Helper() t.Setenv("LARKSUITE_CLI_CONFIG_DIR", t.TempDir()) - t.Setenv("LARKSUITE_CLI_APP_ID", "vc_meeting_message_send_dryrun_test") - t.Setenv("LARKSUITE_CLI_APP_SECRET", "vc_meeting_message_send_dryrun_secret") + t.Setenv("LARKSUITE_CLI_APP_ID", "vc_dryrun_test") + t.Setenv("LARKSUITE_CLI_APP_SECRET", "vc_dryrun_secret") t.Setenv("LARKSUITE_CLI_BRAND", "feishu") }