github.com/kyleu/dbaudit@v0.0.2-0.20240321155047-ff2f2c940496/app/lib/filesystem/fs_test.go (about)

     1  // Package filesystem - Content managed by Project Forge, see [projectforge.md] for details.
     2  package filesystem_test
     3  
     4  import (
     5  	"os"
     6  	"path"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/pkg/errors"
    11  
    12  	"github.com/kyleu/dbaudit/app/lib/filesystem"
    13  	"github.com/kyleu/dbaudit/app/lib/log"
    14  )
    15  
    16  const testFile = "foo.txt"
    17  
    18  func TestFileSystem(t *testing.T) {
    19  	t.Parallel()
    20  	fixWD()
    21  	fs, err := filesystem.NewFileSystem("tmp", false, "")
    22  	if err != nil {
    23  		t.Errorf("error starting filesystem [tmp]: %+v", err)
    24  	}
    25  	err = testFS("test-filesystem", fs, true)
    26  	if err != nil {
    27  		t.Errorf("error testing filesystem [%s]: %+v", fs.String(), err)
    28  	}
    29  }
    30  
    31  func testFS(testDir string, fs filesystem.FileLoader, removeWhenDone bool) error {
    32  	fixWD()
    33  	logger, _ := log.CreateTestLogger()
    34  	content := "Hello, test world!"
    35  	if fs.Exists(testDir) {
    36  		err := fs.RemoveRecursive(testDir, logger)
    37  		if err != nil {
    38  			return errors.Wrapf(err, "error removing test directory [%s] before starting", testDir)
    39  		}
    40  	}
    41  
    42  	if err := fs.CreateDirectory(testDir); err != nil {
    43  		return err
    44  	}
    45  
    46  	if err := fs.WriteFile(path.Join(testDir, testFile), []byte(content), filesystem.DefaultMode, false); err != nil {
    47  		return err
    48  	}
    49  
    50  	if b, err := fs.ReadFile(path.Join(testDir, testFile)); err != nil || string(b) != content {
    51  		if err != nil {
    52  			return err
    53  		}
    54  		return errors.Errorf("content [%s] didn't match [%s]", string(b), content)
    55  	}
    56  
    57  	files := fs.ListFiles(testDir, nil, logger)
    58  	if len(files) != 1 {
    59  		return errors.Errorf("expected [%d] files, observed [%d]", 1, len(files))
    60  	}
    61  	if files[0].Name != testFile {
    62  		return errors.Errorf("expected [%s] filename, observed [%s]", testFile, files[0].Name)
    63  	}
    64  	if files[0].Size != 18 {
    65  		return errors.Errorf("expected [%d] file size, observed [%d]", 18, files[0].Size)
    66  	}
    67  
    68  	if err := fs.Remove(path.Join(testDir, testFile), logger); err != nil {
    69  		return err
    70  	}
    71  
    72  	files = fs.ListFiles(testDir, nil, logger)
    73  	if len(files) != 0 {
    74  		return errors.Errorf("expected [%d] files, observed [%d]", 0, len(files))
    75  	}
    76  
    77  	if removeWhenDone {
    78  		if err := fs.RemoveRecursive(testDir, logger); err != nil {
    79  			return errors.Wrapf(err, "error removing test directory [%s] after completion", testDir)
    80  		}
    81  	}
    82  
    83  	return nil
    84  }
    85  
    86  func fixWD() {
    87  	wd, _ := os.Getwd()
    88  	origwd := wd
    89  	wd = strings.TrimSuffix(wd, "/filesystem")
    90  	wd = strings.TrimSuffix(wd, "/lib")
    91  	wd = strings.TrimSuffix(wd, "/app")
    92  	if wd != origwd {
    93  		_ = os.Chdir(wd)
    94  	}
    95  }