bf9395e022
CI / license-header (push) Has been skipped
CI / e2e-dry-run (push) Has been skipped
CI / fast-gate (push) Failing after 0s
Test PR Label Logic / test-pr-labels (push) Failing after 1s
Skill Format Check / check-format (push) Failing after 2s
CI / security (push) Failing after 5s
CI / unit-test (push) Has been skipped
CI / lint (push) Has been skipped
CI / script-test (push) Has been skipped
CI / deterministic-gate (push) Has been skipped
CI / coverage (push) Has been skipped
CI / results (push) Has been cancelled
CI / deadcode (push) Has been cancelled
CI / e2e-live (push) Has been cancelled
139 lines
4.2 KiB
Go
139 lines
4.2 KiB
Go
// Copyright (c) 2026 Lark Technologies Pte. Ltd.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package appmeta
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/larksuite/cli/internal/event/testutil"
|
|
)
|
|
|
|
const respFourVersions = `{
|
|
"code": 0,
|
|
"data": {
|
|
"has_more": false,
|
|
"items": [
|
|
{"version_id": "oav_draft", "version": "1.0.3", "status": 4, "publish_time": null,
|
|
"event_infos": [{"event_type": "im.message.receive_v1"}, {"event_type": "mail.user_mailbox.event.message_received_v1"}],
|
|
"scopes": [{"scope": "draft:only", "token_types": ["tenant"]}]
|
|
},
|
|
{"version_id": "oav_latest", "version": "1.0.2", "status": 1, "publish_time": "1776684746",
|
|
"event_infos": [
|
|
{"event_type": "im.message.receive_v1"},
|
|
{"event_type": "im.message.message_read_v1"}
|
|
],
|
|
"scopes": [
|
|
{"scope": "im:message", "token_types": ["tenant", "user"]},
|
|
{"scope": "im:message.group_at_msg", "token_types": ["tenant"]},
|
|
{"scope": "contact:user:readonly", "token_types": ["user"]}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}`
|
|
|
|
func TestFetchCurrentPublished_SelectsLatestPublished(t *testing.T) {
|
|
c := &testutil.StubAPIClient{Body: respFourVersions}
|
|
|
|
v, err := FetchCurrentPublished(context.Background(), c, "cli_test")
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
if v == nil {
|
|
t.Fatal("expected a version, got nil")
|
|
}
|
|
if v.VersionID != "oav_latest" {
|
|
t.Errorf("VersionID = %q, want oav_latest", v.VersionID)
|
|
}
|
|
if v.Version != "1.0.2" {
|
|
t.Errorf("Version = %q, want 1.0.2", v.Version)
|
|
}
|
|
|
|
wantEvents := map[string]bool{"im.message.receive_v1": true, "im.message.message_read_v1": true}
|
|
if len(v.EventTypes) != len(wantEvents) {
|
|
t.Fatalf("EventTypes = %v, want %v", v.EventTypes, wantEvents)
|
|
}
|
|
for _, e := range v.EventTypes {
|
|
if !wantEvents[e] {
|
|
t.Errorf("unexpected event type %q in %v", e, v.EventTypes)
|
|
}
|
|
}
|
|
|
|
wantTenant := map[string]bool{"im:message": true, "im:message.group_at_msg": true}
|
|
if len(v.TenantScopes) != len(wantTenant) {
|
|
t.Fatalf("TenantScopes = %v, want %v", v.TenantScopes, wantTenant)
|
|
}
|
|
for _, s := range v.TenantScopes {
|
|
if !wantTenant[s] {
|
|
t.Errorf("unexpected tenant scope %q in %v", s, v.TenantScopes)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestFetchCurrentPublished_PathContainsQuery(t *testing.T) {
|
|
c := &testutil.StubAPIClient{Body: respFourVersions}
|
|
_, _ = FetchCurrentPublished(context.Background(), c, "cli_x")
|
|
for _, want := range []string{
|
|
"/open-apis/application/v6/applications/cli_x/app_versions",
|
|
"lang=zh_cn",
|
|
"page_size=2",
|
|
} {
|
|
if !strings.Contains(c.GotPath, want) {
|
|
t.Errorf("path %q missing %q", c.GotPath, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestFetchCurrentPublished_NoPublishedYet(t *testing.T) {
|
|
c := &testutil.StubAPIClient{Body: `{"code":0,"data":{"items":[
|
|
{"version_id":"oav_draft","status":4,"publish_time":null,"event_infos":[],"scopes":[]}
|
|
]}}`}
|
|
v, err := FetchCurrentPublished(context.Background(), c, "cli_x")
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
if v != nil {
|
|
t.Errorf("want nil (app never published), got %+v", v)
|
|
}
|
|
}
|
|
|
|
func TestFetchCurrentPublished_EmptyItems(t *testing.T) {
|
|
c := &testutil.StubAPIClient{Body: `{"code":0,"data":{"items":[]}}`}
|
|
v, err := FetchCurrentPublished(context.Background(), c, "cli_x")
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
if v != nil {
|
|
t.Errorf("want nil for empty items, got %+v", v)
|
|
}
|
|
}
|
|
|
|
func TestFetchCurrentPublished_APIErrorPropagated(t *testing.T) {
|
|
want := errors.New("insufficient permission level")
|
|
c := &testutil.StubAPIClient{Err: want}
|
|
v, err := FetchCurrentPublished(context.Background(), c, "cli_x")
|
|
if !errors.Is(err, want) {
|
|
t.Errorf("err = %v, want wrapping %v", err, want)
|
|
}
|
|
if v != nil {
|
|
t.Errorf("want nil version on error, got %+v", v)
|
|
}
|
|
}
|
|
|
|
func TestFetchCurrentPublished_PublishTimeEmptyStringTreatedAsUnpublished(t *testing.T) {
|
|
c := &testutil.StubAPIClient{Body: `{"code":0,"data":{"items":[
|
|
{"version_id":"oav_x","status":1,"publish_time":"","event_infos":[],"scopes":[]}
|
|
]}}`}
|
|
v, err := FetchCurrentPublished(context.Background(), c, "cli_x")
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
if v != nil {
|
|
t.Errorf("want nil (empty publish_time), got %+v", v)
|
|
}
|
|
}
|