LocalAI/core/cli/completion_test.go

75 lines
2 KiB
Go
Raw Normal View History

package cli
import (
"github.com/alecthomas/kong"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)
func getTestApp() *kong.Application {
var testCLI struct {
feat: add distributed mode (#9124) * feat: add distributed mode (experimental) Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * fix data races, mutexes, transactions Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * refactorings Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * fixups Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * fix events and tool stream in agent chat Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * use ginkgo Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * refactoring and consolidation Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * refactoring and consolidation Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * refactoring and consolidation Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * refactoring and consolidation Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * refactoring and consolidation Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * refactoring and consolidation Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * refactoring and consolidation Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * refactoring and consolidation Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * fix(cron): compute correctly time boundaries avoiding re-triggering Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * enhancements, refactorings Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * do not flood of healthy checks Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * do not list obvious backends as text backends Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * tests fixups Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * refactoring and consolidation Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * Drop redundant healthcheck Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * enhancements, refactorings Signed-off-by: Ettore Di Giacinto <mudler@localai.io> --------- Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-03-29 22:47:27 +00:00
Run struct{} `cmd:"" help:"Run the server"`
Models struct {
List struct{} `cmd:"" help:"List models"`
Install struct{} `cmd:"" help:"Install a model"`
} `cmd:"" help:"Manage models"`
Completion CompletionCMD `cmd:"" help:"Generate shell completions"`
}
k := kong.Must(&testCLI)
return k.Model
}
var _ = Describe("Shell completions", func() {
var app *kong.Application
BeforeEach(func() {
app = getTestApp()
})
Describe("generateBashCompletion", func() {
It("generates valid bash completion script", func() {
script := generateBashCompletion(app)
Expect(script).To(ContainSubstring("complete -F _local_ai_completions local-ai"))
Expect(script).To(ContainSubstring("run"))
Expect(script).To(ContainSubstring("models"))
Expect(script).To(ContainSubstring("completion"))
})
})
Describe("generateZshCompletion", func() {
It("generates valid zsh completion script", func() {
script := generateZshCompletion(app)
Expect(script).To(ContainSubstring("#compdef local-ai"))
Expect(script).To(ContainSubstring("run"))
Expect(script).To(ContainSubstring("models"))
})
})
Describe("generateFishCompletion", func() {
It("generates valid fish completion script", func() {
script := generateFishCompletion(app)
Expect(script).To(ContainSubstring("complete -c local-ai"))
Expect(script).To(ContainSubstring("__fish_use_subcommand"))
Expect(script).To(ContainSubstring("run"))
Expect(script).To(ContainSubstring("models"))
})
})
Describe("collectCommands", func() {
It("collects all commands and subcommands", func() {
cmds := collectCommands(app.Node, "")
names := make(map[string]bool)
for _, cmd := range cmds {
names[cmd.fullName] = true
}
Expect(names).To(HaveKey("run"))
Expect(names).To(HaveKey("models"))
Expect(names).To(HaveKey("models list"))
Expect(names).To(HaveKey("models install"))
})
})
})