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
108 lines
2.8 KiB
Go
108 lines
2.8 KiB
Go
// Copyright (c) 2026 Lark Technologies Pte. Ltd.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package events
|
|
|
|
import (
|
|
"encoding/json"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/larksuite/cli/internal/event"
|
|
"github.com/larksuite/cli/internal/event/schemas"
|
|
)
|
|
|
|
func TestAllKeys_FieldOverridePointersResolve(t *testing.T) {
|
|
for _, def := range event.ListAll() {
|
|
if len(def.Schema.FieldOverrides) == 0 {
|
|
continue
|
|
}
|
|
raw := renderDefSchemaForLint(t, def)
|
|
if raw == nil {
|
|
t.Errorf("%s: FieldOverrides set but Schema has no Native/Custom spec", def.Key)
|
|
continue
|
|
}
|
|
var parsed map[string]interface{}
|
|
if err := json.Unmarshal(raw, &parsed); err != nil {
|
|
t.Errorf("%s: parse schema: %v", def.Key, err)
|
|
continue
|
|
}
|
|
orphans := schemas.ApplyFieldOverrides(parsed, def.Schema.FieldOverrides)
|
|
if len(orphans) > 0 {
|
|
t.Errorf("%s: orphan FieldOverrides paths (typo or SDK drift): %v", def.Key, orphans)
|
|
}
|
|
}
|
|
}
|
|
|
|
func renderDefSchemaForLint(t *testing.T, def *event.KeyDefinition) json.RawMessage {
|
|
t.Helper()
|
|
spec, isNative := pickSpec(def.Schema)
|
|
if spec == nil {
|
|
return nil
|
|
}
|
|
raw := renderSpec(t, spec)
|
|
if raw == nil {
|
|
return nil
|
|
}
|
|
if isNative {
|
|
raw = schemas.WrapV2Envelope(raw)
|
|
}
|
|
return raw
|
|
}
|
|
|
|
func pickSpec(s event.SchemaDef) (*event.SchemaSpec, bool) {
|
|
if s.Native != nil {
|
|
return s.Native, true
|
|
}
|
|
if s.Custom != nil {
|
|
return s.Custom, false
|
|
}
|
|
return nil, false
|
|
}
|
|
|
|
func renderSpec(t *testing.T, s *event.SchemaSpec) json.RawMessage {
|
|
t.Helper()
|
|
if s.Type != nil {
|
|
return schemas.FromType(s.Type)
|
|
}
|
|
if len(s.Raw) > 0 {
|
|
return append(json.RawMessage{}, s.Raw...)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Proves the pipeline catches orphan FieldOverrides paths, so TestAllKeys_FieldOverridePointersResolve isn't vacuous.
|
|
func TestOrphanDetectionMechanism(t *testing.T) {
|
|
type synthetic struct {
|
|
ValidField string `json:"valid_field"`
|
|
}
|
|
spec := &event.SchemaSpec{Type: reflect.TypeOf(synthetic{})}
|
|
raw := renderSpec(t, spec)
|
|
if raw == nil {
|
|
t.Fatal("renderSpec returned nil for synthetic type")
|
|
}
|
|
var parsed map[string]interface{}
|
|
if err := json.Unmarshal(raw, &parsed); err != nil {
|
|
t.Fatalf("unmarshal: %v", err)
|
|
}
|
|
overrides := map[string]schemas.FieldMeta{
|
|
"/valid_field": {Kind: "open_id"},
|
|
"/broken_typo": {Kind: "chat_id"},
|
|
"/valid_field/x": {Kind: "email"},
|
|
}
|
|
orphans := schemas.ApplyFieldOverrides(parsed, overrides)
|
|
wantOrphans := map[string]bool{"/broken_typo": true, "/valid_field/x": true}
|
|
if len(orphans) != len(wantOrphans) {
|
|
t.Fatalf("orphans = %v, want exactly %v", orphans, wantOrphans)
|
|
}
|
|
for _, o := range orphans {
|
|
if !wantOrphans[o] {
|
|
t.Errorf("unexpected orphan %q", o)
|
|
}
|
|
}
|
|
vf := parsed["properties"].(map[string]interface{})["valid_field"].(map[string]interface{})
|
|
if vf["format"] != "open_id" {
|
|
t.Errorf("valid path not applied: %v", vf)
|
|
}
|
|
}
|