| 
									
										
										
										
											2024-02-11 13:50:27 -06:00
										 |  |  | 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() { | 
					
						
							| 
									
										
										
										
											2024-03-09 15:38:34 -06:00
										 |  |  | 	defer os.Remove(s.dir + "/test.log") | 
					
						
							| 
									
										
										
										
											2024-02-11 13:50:27 -06:00
										 |  |  | 	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") | 
					
						
							| 
									
										
										
										
											2024-02-11 17:24:50 -06:00
										 |  |  | 	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") | 
					
						
							| 
									
										
										
										
											2024-02-11 13:50:27 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-09 15:38:34 -06:00
										 |  |  | func (s *AppendTestSuite) TestTwoEntries() { | 
					
						
							|  |  |  | 	defer os.Remove(s.dir + "/test.log") | 
					
						
							|  |  |  | 	when := time.Now().Local() | 
					
						
							|  |  |  | 	whens := when.Format(models.DateFormat) | 
					
						
							|  |  |  | 	e := []models.Entry{ | 
					
						
							|  |  |  | 		{Title: "one", Date: when}, | 
					
						
							|  |  |  | 		{Title: "two", Date: when}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	l := models.Log{ | 
					
						
							|  |  |  | 		Name:    "test", | 
					
						
							|  |  |  | 		Entries: e, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	err := Append(l) | 
					
						
							|  |  |  | 	s.Assert().NoError(err) | 
					
						
							|  |  |  | 	s.Require().FileExists(s.dir + "/test.log") | 
					
						
							|  |  |  | 	by, _ := os.ReadFile(s.dir + "/test.log") | 
					
						
							|  |  |  | 	exp := fmt.Sprintf("@begin %s - one @end\n@begin %s - two @end\n", whens, whens) | 
					
						
							|  |  |  | 	s.Assert().Equal(exp, string(by)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (s *AppendTestSuite) TestAddNewLine() { | 
					
						
							|  |  |  | 	defer os.Remove(s.dir + "/test.log") | 
					
						
							|  |  |  | 	os.WriteFile(s.dir+"/test.log", []byte("foo"), 0644) | 
					
						
							|  |  |  | 	when := time.Now().Local() | 
					
						
							|  |  |  | 	whens := when.Format(models.DateFormat) | 
					
						
							|  |  |  | 	e := []models.Entry{ | 
					
						
							|  |  |  | 		{Title: "one", Date: when}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	l := models.Log{ | 
					
						
							|  |  |  | 		Name:    "test", | 
					
						
							|  |  |  | 		Entries: e, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	err := Append(l) | 
					
						
							|  |  |  | 	s.Assert().NoError(err) | 
					
						
							|  |  |  | 	s.Require().FileExists(s.dir + "/test.log") | 
					
						
							|  |  |  | 	by, _ := os.ReadFile(s.dir + "/test.log") | 
					
						
							|  |  |  | 	exp := fmt.Sprintf("foo\n@begin %s - one @end\n", whens) | 
					
						
							|  |  |  | 	s.Assert().Equal(exp, string(by)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (s *AppendTestSuite) TestDontAddNewLine() { | 
					
						
							|  |  |  | 	defer os.Remove(s.dir + "/test.log") | 
					
						
							|  |  |  | 	os.WriteFile(s.dir+"/test.log", []byte("foo\n"), 0644) | 
					
						
							|  |  |  | 	when := time.Now().Local() | 
					
						
							|  |  |  | 	whens := when.Format(models.DateFormat) | 
					
						
							|  |  |  | 	e := []models.Entry{ | 
					
						
							|  |  |  | 		{Title: "one", Date: when}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	l := models.Log{ | 
					
						
							|  |  |  | 		Name:    "test", | 
					
						
							|  |  |  | 		Entries: e, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	err := Append(l) | 
					
						
							|  |  |  | 	s.Assert().NoError(err) | 
					
						
							|  |  |  | 	s.Require().FileExists(s.dir + "/test.log") | 
					
						
							|  |  |  | 	by, _ := os.ReadFile(s.dir + "/test.log") | 
					
						
							|  |  |  | 	exp := fmt.Sprintf("foo\n@begin %s - one @end\n", whens) | 
					
						
							|  |  |  | 	s.Assert().Equal(exp, string(by)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-07 21:50:51 -06:00
										 |  |  | func (s *AppendTestSuite) TestFailEntry() { | 
					
						
							| 
									
										
										
										
											2024-03-09 15:38:34 -06:00
										 |  |  | 	defer os.Remove(s.dir + "/test.log") | 
					
						
							| 
									
										
										
										
											2024-03-07 21:50:51 -06:00
										 |  |  | 	e := models.Entry{ | 
					
						
							|  |  |  | 		Title: "Jimmy", | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	l := models.Log{ | 
					
						
							|  |  |  | 		Name:    "test", | 
					
						
							|  |  |  | 		Entries: []models.Entry{e}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	err := Append(l) | 
					
						
							|  |  |  | 	s.Assert().NoError(err) | 
					
						
							|  |  |  | 	s.Require().FileExists(s.dir + "/test.log") | 
					
						
							|  |  |  | 	by, _ := os.ReadFile(s.dir + "/test.log") | 
					
						
							|  |  |  | 	s.Assert().Equal([]byte{}, by) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-26 19:30:32 -06:00
										 |  |  | 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") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-11 13:50:27 -06:00
										 |  |  | 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") | 
					
						
							|  |  |  | } |