mirror of
https://github.com/larksuite/cli.git
synced 2026-09-14 18:42:53 +08:00
f0b6f35fee
* fix(schema): fall back to runtime catalog when no embedded metadata Binaries built from the bare Go module (plugin builds) embed only the empty meta_data_default.json stub because meta_data.json is gitignored and fetched at build time. The schema command, its completion, and the affordance command-form resolver read the embedded-only catalog, so every schema lookup failed with "Unknown service" even though the runtime registry had already sync-fetched full metadata. Add registry.SchemaCatalog(): embedded when compiled in (official builds unchanged, still deterministic), otherwise the merged runtime catalog seeded from cache or remote fetch. When neither source has data (offline plugin build with a cold cache), schema now returns a failed_precondition error with an actionable hint instead of "Unknown service" with an empty candidate list. * fix(registry): gate cached meta overlay on version newer than embedded The cached remote meta was overlaid onto the embedded meta_data.json unconditionally, so after a CLI upgrade an equal- or older-version cache kept shadowing the freshly shipped embedded definitions until a later refresh happened to rewrite it. Only overlay when the cache version is strictly newer than the embedded baseline. The bare-module stub baseline is "0.0.0", so plugin builds without compiled metadata still take any real cached version (TestOverlayGate_StubEmbedded_OverlaysRealCache) and the schema runtime fallback keeps working offline from a warm cache. Ports #1376 onto the typed meta model. --------- Co-authored-by: liangshuo-1 <266696938+liangshuo-1@users.noreply.github.com>
68 lines
1.9 KiB
Go
68 lines
1.9 KiB
Go
// Copyright (c) 2026 Lark Technologies Pte. Ltd.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package registry
|
|
|
|
import (
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/larksuite/cli/internal/apicatalog"
|
|
)
|
|
|
|
// swapEmbeddedMeta replaces the compiled-in metadata bytes for one test and
|
|
// restores them (with a full state reset) on cleanup.
|
|
func swapEmbeddedMeta(t *testing.T, data []byte) {
|
|
t.Helper()
|
|
resetInit()
|
|
orig := embeddedMetaJSON
|
|
embeddedMetaJSON = data
|
|
t.Cleanup(func() {
|
|
waitBackgroundRefresh()
|
|
embeddedMetaJSON = orig
|
|
resetInit()
|
|
})
|
|
}
|
|
|
|
func TestSchemaCatalog_EmbeddedWhenCompiledIn(t *testing.T) {
|
|
swapEmbeddedMeta(t, testCacheJSON("embedded_svc"))
|
|
t.Setenv("LARKSUITE_CLI_CONFIG_DIR", t.TempDir())
|
|
t.Setenv("LARKSUITE_CLI_REMOTE_META", "off")
|
|
|
|
c := SchemaCatalog()
|
|
|
|
if c.Source() != apicatalog.SourceEmbedded {
|
|
t.Fatalf("Source = %q, want %q", c.Source(), apicatalog.SourceEmbedded)
|
|
}
|
|
if _, ok := c.Service("embedded_svc"); !ok {
|
|
t.Fatal("expected embedded_svc from embedded metadata")
|
|
}
|
|
}
|
|
|
|
// TestSchemaCatalog_FallsBackToRuntimeWhenNoEmbedded simulates a binary built
|
|
// from the bare Go module (plugin builds): only the empty meta_data_default.json
|
|
// stub is compiled in, so SchemaCatalog must serve the merged runtime view that
|
|
// Init seeds via sync fetch.
|
|
func TestSchemaCatalog_FallsBackToRuntimeWhenNoEmbedded(t *testing.T) {
|
|
swapEmbeddedMeta(t, embeddedMetaDataDefaultJSON)
|
|
t.Setenv("LARKSUITE_CLI_CONFIG_DIR", t.TempDir())
|
|
t.Setenv("LARKSUITE_CLI_REMOTE_META", "on")
|
|
|
|
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
w.WriteHeader(200)
|
|
w.Write(testEnvelopeJSON("remote_svc"))
|
|
}))
|
|
defer ts.Close()
|
|
testMetaURL = ts.URL
|
|
|
|
c := SchemaCatalog()
|
|
|
|
if c.Source() != apicatalog.SourceRuntime {
|
|
t.Fatalf("Source = %q, want %q", c.Source(), apicatalog.SourceRuntime)
|
|
}
|
|
if _, ok := c.Service("remote_svc"); !ok {
|
|
t.Fatal("expected remote_svc from runtime fallback")
|
|
}
|
|
}
|