// Copyright 2024 Matthew Rich . All rights reserved. package resource import ( "context" _ "encoding/json" "fmt" "github.com/stretchr/testify/assert" "gopkg.in/yaml.v3" _ "io" _ "log" _ "net/http" _ "net/http/httptest" _ "net/url" "os" "path/filepath" _ "strings" "syscall" "testing" "time" ) func TestNewFileResource(t *testing.T) { f := NewFile() assert.NotEqual(t, nil, f) } func TestApplyResourceTransformation(t *testing.T) { f := NewFile() assert.NotEqual(t, nil, f) //e := f.Apply() //assert.Equal(t, nil, e) } func TestReadFile(t *testing.T) { ctx := context.Background() file, _ := filepath.Abs(filepath.Join(TempDir, "fooread.txt")) declarationAttributes := ` path: "%s" owner: "nobody" group: "nobody" mode: "0600" atime: 2001-12-15T01:01:01.000000001Z ctime: %s mtime: 2001-12-15T01:01:01.000000001Z content: |- test line 1 test line 2 filetype: "regular" state: present ` decl := fmt.Sprintf(declarationAttributes, file, "2001-12-15T01:01:01.000000001Z") testFile := NewFile() e := testFile.LoadDecl(decl) assert.Equal(t, nil, e) testFile.Apply() f := NewFile() assert.NotEqual(t, nil, f) f.Path = file r, e := f.Read(ctx) assert.Equal(t, nil, e) assert.Equal(t, "nobody", f.Owner) info, statErr := os.Stat(file) assert.Nil(t, statErr) stat, ok := info.Sys().(*syscall.Stat_t) assert.True(t, ok) cTime := time.Unix(int64(stat.Ctim.Sec), int64(stat.Ctim.Nsec)) expected := fmt.Sprintf(declarationAttributes, file, cTime.Format(time.RFC3339Nano)) assert.YAMLEq(t, expected, string(r)) } func TestReadFileError(t *testing.T) { ctx := context.Background() file, _ := filepath.Abs(filepath.Join(TempDir, "missingfile.txt")) f := NewFile() assert.NotEqual(t, nil, f) f.Path = file _, e := f.Read(ctx) assert.True(t, os.IsNotExist(e)) assert.Equal(t, "absent", f.State) } func TestCreateFile(t *testing.T) { file, _ := filepath.Abs(filepath.Join(TempDir, "foo.txt")) decl := fmt.Sprintf(` path: "%s" owner: "nobody" group: "nobody" mode: "0600" content: |- test line 1 test line 2 state: present `, file) f := NewFile() e := f.LoadDecl(decl) assert.Equal(t, nil, e) assert.Equal(t, "nobody", f.Owner) applyErr := f.Apply() assert.Equal(t, nil, applyErr) assert.FileExists(t, file, nil) s, e := os.Stat(file) assert.Equal(t, nil, e) assert.Greater(t, s.Size(), int64(0)) f.State = "absent" assert.Equal(t, nil, f.Apply()) assert.NoFileExists(t, file, nil) } func TestFileType(t *testing.T) { fileType := []byte(` filetype: "directory" `) var testFile File err := yaml.Unmarshal(fileType, &testFile) assert.Nil(t, err) } func TestFileDirectory(t *testing.T) { file, _ := filepath.Abs(filepath.Join(TempDir, "testdir")) decl := fmt.Sprintf(` path: "%s" owner: "nobody" group: "nobody" mode: "0700" filetype: "directory" state: present `, file) f := NewFile() e := f.LoadDecl(decl) assert.Equal(t, nil, e) assert.Equal(t, "nobody", f.Owner) applyErr := f.Apply() assert.Equal(t, nil, applyErr) assert.DirExists(t, file) f.State = "absent" deleteErr := f.Apply() assert.Nil(t, deleteErr) assert.NoDirExists(t, file) } func TestFileTimes(t *testing.T) { file, _ := filepath.Abs(filepath.Join(TempDir, "testtimes.txt")) decl := fmt.Sprintf(` path: "%s" owner: "nobody" group: "nobody" mtime: 2001-12-15T01:01:01.1Z mode: "0600" filtetype: "regular" state: "present" `, file) expectedTime, timeErr := time.Parse(time.RFC3339, "2001-12-15T01:01:01.1Z") assert.Nil(t, timeErr) f := NewFile() e := f.LoadDecl(decl) assert.Nil(t, e) assert.Equal(t, "nobody", f.Owner) assert.True(t, f.Mtime.Equal(expectedTime)) } func TestFileSetURI(t *testing.T) { file, _ := filepath.Abs(filepath.Join(TempDir, "testuri.txt")) f := NewFile() assert.NotNil(t, f) f.SetURI("file://" + file) assert.Equal(t, "file", f.Type()) assert.Equal(t, file, f.Path) }