fuzzyworld

template / files / internal / core / file_test.go

file_test.go

3.3 KB · history · blame

1package core
2
3import (
4 "bufio"
5 "fmt"
6 "os"
7 "strings"
8 "testing"
9
10 "github.com/stretchr/testify/assert"
11)
12
13func TestCreateFile(t *testing.T) {
14 // settings
15 path := "~/test/out/test.txt"
16 prePatternData := testPrePatternData()
17 expectedText := "test-project-2022-04-20-16-20-69-value1"
18 var createdFileName = ""
19
20 // monkey patch
21 applyTestMonkeyPatch(t, monkeyPatch{
22 OSCreate: func(filename string) (*os.File, error) {
23 assert.Equal(t, path, filename)
24 file, err := os.CreateTemp("./test", "test")
25 assert.Nil(t, err, "error creating temp file")
26 assert.True(t, createdFileName == "", "createFileName should be empty")
27 createdFileName = file.Name()
28 return file, nil
29 },
30 OSWriteFile: func(filename string, data []byte, perm os.FileMode) error {
31 assert.Equal(t, path, filename)
32 assert.Equal(t, perm, os.ModePerm)
33 assert.Equal(t, string(data), expectedText)
34 return nil
35 },
36 })
37
38 // test error path
39 err := createFile(prePatternData, "{{.ProjectName", path, nil)
40 assert.NotNil(t, err)
41
42 // test happy path with file template
43 err = createFile(prePatternData, "{{.ProjectName}}-{{.Year}}-{{.Month}}-{{.Day}}-{{.Hour}}-{{.Minute}}-{{.Second}}-{{.Extras.key1}}", path, nil)
44 assert.Nil(t, err)
45
46 // test happy path with pipe input
47 inputText := `line1
48line2
49line3
50`
51 expectedText = inputText
52 reader := strings.NewReader(inputText)
53 pipeInputScanner := bufio.NewScanner(reader)
54 err = createFile(prePatternData, "{{.ProjectName}}-{{.Year}}-{{.Month}}-{{.Day}}-{{.Hour}}-{{.Minute}}-{{.Second}}-{{.Extras.key1}}", path, pipeInputScanner)
55 assert.Nil(t, err)
56 assert.NotNil(t, createdFileName)
57 bytes, err := os.ReadFile(createdFileName)
58 assert.Nil(t, err, "error reading file "+createdFileName)
59 outputText := string(bytes)
60 assert.Equal(t, inputText, outputText)
61
62 // test empty template
63 expectedText = ""
64 err = createFile(prePatternData, "", path, nil)
65 assert.Nil(t, err)
66}
67
68func TestCreateFileErrors(t *testing.T) {
69 prePatternData := testPrePatternData()
70 path := "~/test/out/test.txt"
71
72 // OSCreate failure when using pipe input
73 applyTestMonkeyPatch(t, monkeyPatch{
74 OSCreate: func(filename string) (*os.File, error) {
75 return nil, fmt.Errorf("create failed")
76 },
77 })
78 reader := strings.NewReader("some input")
79 scanner := bufio.NewScanner(reader)
80 err := createFile(prePatternData, "", path, scanner)
81 assert.NotNil(t, err)
82 assert.Contains(t, err.Error(), "error creating file")
83
84 // OSWriteFile failure in template path
85 applyTestMonkeyPatch(t, monkeyPatch{
86 OSWriteFile: func(filename string, data []byte, perm os.FileMode) error {
87 return fmt.Errorf("write failed")
88 },
89 })
90 err = createFile(prePatternData, "{{.ProjectName}}", path, nil)
91 assert.NotNil(t, err)
92 assert.Contains(t, err.Error(), "error writing file")
93
94 // OSWriteFile failure in empty-template path
95 err = createFile(prePatternData, "", path, nil)
96 assert.NotNil(t, err)
97 assert.Contains(t, err.Error(), "error writing file")
98}
99
100func TestReadFile(t *testing.T) {
101 f, err := os.CreateTemp("./test", "readfile-*.txt")
102 assert.Nil(t, err)
103 defer func() { _ = os.Remove(f.Name()) }()
104
105 content := "hello world"
106 _, err = f.WriteString(content)
107 assert.Nil(t, err)
108 assert.NoError(t, f.Close())
109
110 got, err := readFile(f.Name())
111 assert.Nil(t, err)
112 assert.Equal(t, content, got)
113
114 _, err = readFile("nonexistent-file-that-does-not-exist.txt")
115 assert.NotNil(t, err)
116}