// Copyright 2024 Matthew Rich . All rights reserved. package client import ( "github.com/stretchr/testify/assert" "testing" "fmt" "context" "decl/internal/folio" "decl/internal/resource" "decl/internal/codec" "log/slog" "os" "io" "strings" ) var containerDoc string = ` imports: - %s resources: - type: container transition: create attributes: image: rosskeenhouse/build-golang:1.22.6-alpine name: jx-client-resources-test hostconfig: autoremove: false mounts: - type: "bind" source: "%s" target: "/src" - type: "bind" source: "%s" target: "%s" workingdir: "/src" entrypoint: - "/src/jx" cmd: - apply - %s wait: true --- resources: - type: container transition: delete attributes: name: jx-client-resources-test ` // create a container // run a test inside the container func TestUserResource(t *testing.T) { ctx := context.Background() c := NewClient() assert.NotNil(t, c) TempDir.Mkdir("testresources", 0700) tmpresourcespath := TempDir.FilePath("testresources") configurations := fmt.Sprintf(` configurations: - name: tmpdir values: prefix: %s `, tmpresourcespath) assert.Nil(t, TempDir.CreateFile("config.jx.yaml", configurations)) configURI := TempDir.URIPath("config.jx.yaml") //assert.Nil(t, c.Import([]string{configURI})) testUserFile := fmt.Sprintf(` imports: - %s resources: - type: file config: tmpdir transition: update attributes: path: testdir mode: 0600 state: present - type: group transition: update attributes: name: testuser - type: group transition: update attributes: name: testgroup - type: user transition: update attributes: name: testuser gecos: "my test account" home: "/home/testuser" createhome: true group: testuser groups: - testgroup - testuser appendgroups: true state: present `, configURI) assert.Nil(t, TempDir.CreateFile("test_userfile.jx.yaml", testUserFile)) for _, resourceTestDoc := range []string{ TempDir.FilePath("test_userfile.jx.yaml"), } { content := fmt.Sprintf(containerDoc, configURI, os.Getenv("WORKSPACE_PATH"), TempDir, TempDir, resourceTestDoc) assert.Nil(t, TempDir.CreateFile("run-tests.jx.yaml", content)) runTestsDocument := TempDir.URIPath("run-tests.jx.yaml") assert.Nil(t, c.Import([]string{runTestsDocument})) assert.Nil(t, c.LoadDocumentImports()) assert.Nil(t, c.Apply(ctx, false)) applied, ok := folio.DocumentRegistry.GetDocument(folio.URI(runTestsDocument)) assert.True(t, ok) cont := applied.ResourceDeclarations[0].Resource().(*resource.Container) slog.Info("TestUserResources", "stdout", cont.Stdout, "stderr", cont.Stderr) slog.Info("TestUserResources", "doc", applied, "container", applied.ResourceDeclarations[0]) assert.Equal(t, 0, len(applied.Errors)) assert.Greater(t, len(cont.Stdout), 0) resultReader := io.NopCloser(strings.NewReader(cont.Stdout)) decoder := codec.NewDecoder(resultReader, codec.FormatYaml) result := folio.NewDocument(nil) assert.Nil(t, decoder.Decode(folio.NewDocument(nil))) assert.Nil(t, decoder.Decode(result)) uri := fmt.Sprintf("file://%s", resourceTestDoc) //testDoc := folio.DocumentRegistry.NewDocument(folio.URI(uri)) docs, loadErr := folio.DocumentRegistry.Load(folio.URI(uri)) assert.Nil(t, loadErr) testDoc := docs[0] var added int = 0 diffs, diffsErr := testDoc.(*folio.Document).Diff(result, nil) assert.Nil(t, diffsErr) assert.Greater(t, len(diffs), 1) for _, line := range strings.Split(diffs, "\n") { if len(line) > 0 { switch line[0] { case '+': slog.Info("TestUserResources Diff", "line", line, "added", added) added++ case '-': assert.Fail(t, "resource attribute missing", line) } } } assert.Equal(t, 4, added) } }