// Copyright 2024 Matthew Rich . All rights reserved. package client import ( "github.com/stretchr/testify/assert" "os" "os/user" "os/exec" "testing" "decl/internal/tempdir" "log" "decl/internal/folio" _ "decl/internal/fan" "decl/internal/codec" "decl/internal/data" "context" "fmt" "log/slog" ) var programLevel = new(slog.LevelVar) var TempDir tempdir.Path = "jx_client" var ProcessTestUserName string var ProcessTestGroupName string func TestMain(m *testing.M) { LoggerConfig() var err error err = TempDir.Create() if err != nil || TempDir == "" { log.Fatal(err) } ProcessTestUserName, ProcessTestGroupName = ProcessUserName() rc := m.Run() TempDir.Remove() os.Exit(rc) } func LoggerConfig() { logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: programLevel})) slog.SetDefault(logger) programLevel.Set(slog.LevelDebug) } func ProcessUserName() (string, string) { processUser, userErr := user.Current() if userErr != nil { panic(userErr) } processGroup, groupErr := user.LookupGroupId(processUser.Gid) if groupErr != nil { panic(groupErr) } return processUser.Username, processGroup.Name } func ExitError(e error) string { if e != nil { switch v := e.(type) { case *exec.ExitError: return string(v.Stderr) default: return e.Error() } } return "" } // jx import ... func TestClientImport(t *testing.T) { c := NewClient() assert.NotNil(t, c) importDocuments := []string{ "file://../../examples/file.jx.yaml", "file://../../examples/user.jx.yaml", } assert.Nil(t, c.Import(importDocuments)) for index, uri := range importDocuments { u := folio.URI(uri) r, readerErr := u.ContentReaderStream() assert.Nil(t, readerErr) assert.NotNil(t, r) doc := folio.DocumentRegistry.NewDocument(folio.URI(uri)) assert.Nil(t, doc.LoadReader(r, codec.FormatYaml)) imported := c.Documents[index] assert.NotNil(t, imported) assert.Equal(t, uri, imported.GetURI()) assert.Equal(t, doc.Len(), imported.Len()) } } // jx import --resource func TestClientImportResource(t *testing.T) { ctx := context.Background() c := NewClient() assert.NotNil(t, c) importResources := []string{ "file://../../COPYRIGHT", } for _, uri := range importResources { assert.Nil(t, c.ImportResource(ctx, uri)) } imported := c.Documents[0] assert.NotNil(t, imported) for _, uri := range importResources { assert.NotNil(t, imported.(*folio.Document).GetResource(uri)) } } func TestClientEmit(t *testing.T) { //ctx := context.Background() c := NewClient() assert.NotNil(t, c) importDocuments := []string{ "file://../../examples/file.jx.yaml", "file://../../examples/user.jx.yaml", } assert.Nil(t, c.Import(importDocuments)) targetFile := TempDir.FilePath("jx_emit_output.jx.yaml") targetFileURI := fmt.Sprintf("file://%s", targetFile) assert.Nil(t, c.SetOutput(targetFile)) assert.Nil(t, c.Emit()) assert.FileExists(t, targetFile) u := folio.URI(targetFileURI) r, readerErr := u.ContentReaderStream() assert.Nil(t, readerErr) assert.NotNil(t, r) extractor, err := folio.DocumentRegistry.ConverterTypes.New(targetFileURI) assert.Nil(t, err) assert.NotNil(t, extractor) targetResource, resErr := u.NewResource(nil) assert.Nil(t, resErr) docs, exErr := extractor.(data.ManyExtractor).ExtractMany(targetResource, nil) assert.Nil(t, exErr) assert.Equal(t, 2, len(docs)) assert.Equal(t, 1, docs[1].Len()) } func BenchmarkClientSystemConfigurations(b *testing.B) { assert.Nil(b, TempDir.Mkdir("benchconfig", 0700)) ConfDir := tempdir.Path(TempDir.FilePath("benchconfig")) ConfDir.CreateFile("cfg.jx.yaml", ` configurations: - name: files values: prefix: /usr `) configDirURI := fmt.Sprintf("file://%s", ConfDir) programLevel.Set(slog.LevelError) b.Run("systemconfiguration", func(b *testing.B) { for i := 0; i < b.N; i++ { c := NewClient() c.SystemConfiguration(configDirURI) } }) programLevel.Set(slog.LevelDebug) } func TestClientSystemConfiguration(t *testing.T) { c := NewClient() assert.NotNil(t, c) assert.Nil(t, TempDir.Mkdir("config", 0700)) ConfDir := tempdir.Path(TempDir.FilePath("config")) ConfDir.CreateFile("cfg.jx.yaml", ` configurations: - name: files values: prefix: /usr `) //configDirURI := fmt.Sprintf("file://%s", ConfDir) configErr := c.SystemConfiguration(string(ConfDir)) assert.Nil(t, configErr) assert.NotNil(t, c.Config) slog.Info("TestClientSystemConfiguration", "config", c.Config) cfg := c.Config.GetConfig("files") assert.NotNil(t, cfg) value, valueErr := cfg.GetValue("prefix") assert.Nil(t, valueErr) assert.Equal(t, "/usr", value.(string)) return }