Files
dingtalk-workspace-cli/internal/skillstate/state_test.go
T

98 lines
3.2 KiB
Go

package skillstate
import (
"errors"
"os"
"path/filepath"
"reflect"
"strings"
"testing"
"github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/skillprovenance"
"github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/testseam"
)
func TestCrossPlatformCoverageSkillStateReadWriteRemoveAndErrors(t *testing.T) {
t.Setenv("DWS_CONFIG_DIR", "")
home := t.TempDir()
if state, readable, err := Read(home); err != nil || readable || state != nil {
t.Fatalf("missing = %#v, %v, %v", state, readable, err)
}
want := State{
Version: "1.2.3",
OfficialSkills: []string{"dingtalk-b", "dingtalk-a", "dingtalk-a"},
UpdatedSkills: []string{"dingtalk-a"},
ManagedSkills: []skillprovenance.Record{
{Name: "dingtalk-b", Version: "old"},
{Name: "dingtalk-a", Version: "1"},
{Name: "dingtalk-b", Version: "2"},
},
}
if err := Write(home, want); err != nil {
t.Fatal(err)
}
got, readable, err := Read(home)
if err != nil || !readable || !reflect.DeepEqual(got.OfficialSkills, []string{"dingtalk-a", "dingtalk-b"}) {
t.Fatalf("round trip = %#v, %v, %v", got, readable, err)
}
if !reflect.DeepEqual(got.ManagedSkills, []skillprovenance.Record{{Name: "dingtalk-a", Version: "1"}, {Name: "dingtalk-b", Version: "2"}}) {
t.Fatalf("managed skills = %#v", got.ManagedSkills)
}
if names := ManagedSkillNames(got); !reflect.DeepEqual(names, map[string]bool{"dingtalk-a": true, "dingtalk-b": true}) {
t.Fatalf("managed names = %#v", names)
}
if names := ManagedSkillNames(nil); len(names) != 0 {
t.Fatalf("nil managed names = %#v", names)
}
if err := Remove(home); err != nil {
t.Fatal(err)
}
if err := Remove(home); err != nil {
t.Fatal(err)
}
badHome := t.TempDir()
if err := os.MkdirAll(filepath.Dir(Path(badHome)), 0o755); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(Path(badHome), []byte("{"), 0o600); err != nil {
t.Fatal(err)
}
if _, _, err := Read(badHome); err == nil || !strings.Contains(err.Error(), "不可读") {
t.Fatalf("malformed = %v", err)
}
blocked := filepath.Join(t.TempDir(), "home-file")
if err := os.WriteFile(blocked, []byte("x"), 0o600); err != nil {
t.Fatal(err)
}
if err := Write(blocked, State{}); err == nil {
t.Fatal("blocked write succeeded")
}
failure := errors.New("denied")
testseam.Swap(t, &skillStateReadFile, func(string) ([]byte, error) { return nil, failure })
if _, _, err := Read(blocked); !errors.Is(err, failure) {
t.Fatal("blocked read succeeded")
}
testseam.Swap(t, &skillStateRemove, func(string) error { return failure })
if err := Remove(blocked); !errors.Is(err, failure) {
t.Fatal("blocked remove succeeded")
}
configured := t.TempDir()
t.Setenv("DWS_CONFIG_DIR", " "+configured+" ")
if Path("ignored") != filepath.Join(configured, stateFile) {
t.Fatal("configured path ignored")
}
}
func TestCrossPlatformCoverageIsLegacyOfficialSkillName(t *testing.T) {
for _, name := range []string{"dingtalk-aitable", "dingtalk-devdoc", "dws-shared"} {
if !IsLegacyOfficialSkillName(name) {
t.Fatalf("historical official Skill %q not recognized", name)
}
}
for _, name := range []string{"dingtalk-custom", "other-skill", ""} {
if IsLegacyOfficialSkillName(name) {
t.Fatalf("user Skill %q must not be treated as historical official", name)
}
}
}