my-log/files/append_test.go
Dan Jones a61af1b4b3 Use dot as folder separator
Also don't add dot if no extension
2024-02-26 19:30:32 -06:00

156 lines
3.5 KiB
Go

package files
import (
"fmt"
"os"
"testing"
"time"
"codeberg.org/danjones000/my-log/config"
"codeberg.org/danjones000/my-log/models"
"github.com/stretchr/testify/suite"
)
func TestAppend(t *testing.T) {
suite.Run(t, new(AppendTestSuite))
}
type AppendTestSuite struct {
suite.Suite
dir string
}
func (s *AppendTestSuite) SetupSuite() {
s.dir, _ = os.MkdirTemp("", "append-test")
config.Overrides["input.path"] = s.dir
config.Overrides["input.ext"] = "log"
}
func (s *AppendTestSuite) TearDownSuite() {
os.RemoveAll(s.dir)
delete(config.Overrides, "input.path")
delete(config.Overrides, "input.ext")
}
func (s *AppendTestSuite) TestSuccess() {
when := time.Now().Local()
e := models.Entry{
Title: "Jimmy",
Date: when,
Fields: []models.Meta{
{"foo", 42},
{"bar", true},
},
}
l := models.Log{
Name: "test",
Entries: []models.Entry{e},
}
err := Append(l)
s.Require().NoError(err)
s.Require().FileExists(s.dir + "/test.log")
by, err := os.ReadFile(s.dir + "/test.log")
st := string(by)
s.Require().NoError(err)
s.Assert().Contains(st, "Jimmy\n")
s.Assert().Contains(st, "\n@foo 42")
s.Assert().Contains(st, "\n@bar true")
}
func (s *AppendTestSuite) TestDotFolder() {
config.Overrides["input.dotFolder"] = "true"
e := models.Entry{
Title: "something",
Date: time.Now(),
}
l := models.Log{
Name: "sub.test",
Entries: []models.Entry{e},
}
err := Append(l)
s.Require().NoError(err)
s.Require().FileExists(s.dir + "/sub/test.log")
by, err := os.ReadFile(s.dir + "/sub/test.log")
st := string(by)
s.Require().NoError(err)
s.Assert().Contains(st, "something @end")
}
func (s *AppendTestSuite) TestDotFolderNo() {
config.Overrides["input.dotFolder"] = "false"
e := models.Entry{
Title: "another",
Date: time.Now(),
}
l := models.Log{
Name: "sub.test",
Entries: []models.Entry{e},
}
err := Append(l)
s.Require().NoError(err)
s.Require().FileExists(s.dir + "/sub.test.log")
by, err := os.ReadFile(s.dir + "/sub.test.log")
st := string(by)
s.Require().NoError(err)
s.Assert().Contains(st, "another @end")
}
func (s *AppendTestSuite) TestNoExt() {
config.Overrides["input.ext"] = ""
defer func() {
config.Overrides["input.ext"] = "log"
}()
e := models.Entry{
Title: "baz",
Date: time.Now(),
}
l := models.Log{
Name: "foobar",
Entries: []models.Entry{e},
}
err := Append(l)
s.Require().NoError(err)
s.Require().FileExists(s.dir + "/foobar")
by, err := os.ReadFile(s.dir + "/foobar")
st := string(by)
s.Require().NoError(err)
s.Assert().Contains(st, "baz @end")
}
func (s *AppendTestSuite) TestConfLoadErr() {
currConf := config.ConfigPath
tmp, _ := os.CreateTemp("", "app-conf-*.toml")
fname := tmp.Name()
defer tmp.Close()
defer os.Remove(fname)
fmt.Fprintln(tmp, `{"not":"toml"}`)
config.ConfigPath = fname
defer func(path string) {
config.ConfigPath = path
}(currConf)
err := Append(models.Log{})
s.Assert().ErrorContains(err, "toml")
}
func (s *AppendTestSuite) TestMkdirErr() {
// Don't run this test as root
config.Overrides["input.path"] = "/root/my-logs-test"
defer func(path string) {
config.Overrides["input.path"] = path
}(s.dir)
err := Append(models.Log{})
s.Assert().ErrorContains(err, "permission denied")
}
func (s *AppendTestSuite) TestOpenErr() {
l := models.Log{
Name: "test-open-err",
}
fname := s.dir + "/test-open-err.log"
os.MkdirAll(s.dir, 0750)
f, _ := os.Create(fname)
f.Close()
os.Chmod(fname, 0400) // read only
err := Append(l)
s.Assert().ErrorContains(err, "permission denied")
}