diff --git a/approval_name.go b/approval_name.go index e3d2ab8..a012507 100644 --- a/approval_name.go +++ b/approval_name.go @@ -1,10 +1,7 @@ package approvals import ( - "bytes" "fmt" - "io" - "os" "path" "runtime" "strings" @@ -87,55 +84,6 @@ func isTestRunner(f *runtime.Frame) bool { return f != nil && f.Function == "testing.tRunner" || f.Function == "testing.runExample" } -func (s *ApprovalName) Compare(approvalFile, receivedFile string, reader io.Reader) error { - - GetApprovedFileLoggerInstance().Log(approvalFile) - - received, err := io.ReadAll(reader) - if err != nil { - return err - } - - // Ideally, this should only be written if - // 1. the approval file does not exist - // 2. the results differ - err = s.dumpReceivedTestResult(received, receivedFile) - if err != nil { - return err - } - - fh, err := os.Open(approvalFile) - if err != nil { - return err - } - defer fh.Close() - - approved, err := io.ReadAll(fh) - if err != nil { - return err - } - - received = s.normalizeLineEndings(received) - approved = s.normalizeLineEndings(approved) - - // The two sides are identical, nothing more to do. - if bytes.Equal(received, approved) { - return nil - } - - return fmt.Errorf("failed to approved %s", s.name) -} - -func (s *ApprovalName) normalizeLineEndings(bs []byte) []byte { - return bytes.Replace(bs, []byte("\r\n"), []byte("\n"), -1) -} - -func (s *ApprovalName) dumpReceivedTestResult(bs []byte, receivedFile string) error { - err := os.WriteFile(receivedFile, bs, 0644) - - return err -} - func (s *ApprovalName) getFileName(extWithDot string, suffix string) string { if !strings.HasPrefix(extWithDot, ".") { extWithDot = fmt.Sprintf(".%s", extWithDot) @@ -149,6 +97,10 @@ func (s *ApprovalName) getFileName(extWithDot string, suffix string) string { return path.Join(defaultFolder, filename) } +func (s *ApprovalName) GetName() string { + return s.name +} + func (s *ApprovalName) GetReceivedFile(extWithDot string) string { return s.getFileName(extWithDot, "received") } diff --git a/approvals.go b/approvals.go index ec17381..3c64b73 100644 --- a/approvals.go +++ b/approvals.go @@ -58,7 +58,7 @@ func Verify(t core.Failable, reader io.Reader, opts ...verifyOptions) { receivedFile := namer.GetReceivedFile(extWithDot) reporter := getReporter() - err = namer.Compare(approvalFile, receivedFile, reader) + err = core.Compare(namer.GetName(), approvalFile, receivedFile, reader) if err != nil { reporter.Report(approvalFile, receivedFile) t.Log("Failed Approval: received does not match approved.") diff --git a/core/comparer.go b/core/comparer.go new file mode 100644 index 0000000..86b3516 --- /dev/null +++ b/core/comparer.go @@ -0,0 +1,58 @@ +package core + +import ( + "bytes" + "fmt" + "io" + "os" + + "github.com/approvals/go-approval-tests/internal/log" +) + +func Compare(name, approvalFile, receivedFile string, reader io.Reader) error { + log.GetApprovedFileLoggerInstance().Log(approvalFile) + + received, err := io.ReadAll(reader) + if err != nil { + return err + } + + // Ideally, this should only be written if + // 1. the approval file does not exist + // 2. the results differ + err = dumpReceivedTestResult(received, receivedFile) + if err != nil { + return err + } + + fh, err := os.Open(approvalFile) + if err != nil { + return err + } + defer fh.Close() + + approved, err := io.ReadAll(fh) + if err != nil { + return err + } + + received = normalizeLineEndings(received) + approved = normalizeLineEndings(approved) + + // The two sides are identical, nothing more to do. + if bytes.Equal(received, approved) { + return nil + } + + return fmt.Errorf("failed to approved %s", name) +} + +func normalizeLineEndings(bs []byte) []byte { + return bytes.Replace(bs, []byte("\r\n"), []byte("\n"), -1) +} + +func dumpReceivedTestResult(bs []byte, receivedFile string) error { + err := os.WriteFile(receivedFile, bs, 0644) + + return err +} diff --git a/core/namer.go b/core/namer.go index 6a26ebb..f2f91ee 100644 --- a/core/namer.go +++ b/core/namer.go @@ -1,9 +1,7 @@ package core -import "io" - type ApprovalNamer interface { - Compare(approvalFile, receivedFile string, reader io.Reader) error + GetName() string GetReceivedFile(extWithDot string) string GetApprovalFile(extWithDot string) string } diff --git a/approved_file_log.go b/internal/log/approved_file_log.go similarity index 98% rename from approved_file_log.go rename to internal/log/approved_file_log.go index f4025f0..23aec62 100644 --- a/approved_file_log.go +++ b/internal/log/approved_file_log.go @@ -1,4 +1,4 @@ -package approvals +package log import ( "fmt" diff --git a/namer.go b/namer.go index 199a270..8fbdab9 100644 --- a/namer.go +++ b/namer.go @@ -1,5 +1,96 @@ package approvals -// func NewTemplatedCustomNamer(template string) *Tem { -// return nil +// import ( +// "bytes" +// "fmt" +// "io" +// "os" +// "path" +// "strings" + +// "github.com/approvals/go-approval-tests/core" +// ) + +// type TemplatedCustomNamer struct { +// template string +// name string +// fileName string +// } + +// func NewTemplatedCustomNamer(template string) core.ApprovalNamerCreator { +// return func(t core.Failable) core.ApprovalNamer { +// &TemplatedCustomNamer{ +// template: template, +// } +// } +// } + +// func (s *TemplatedCustomNamer) Compare(approvalFile, receivedFile string, reader io.Reader) error { + +// GetApprovedFileLoggerInstance().Log(approvalFile) + +// received, err := io.ReadAll(reader) +// if err != nil { +// return err +// } + +// // Ideally, this should only be written if +// // 1. the approval file does not exist +// // 2. the results differ +// err = s.dumpReceivedTestResult(received, receivedFile) +// if err != nil { +// return err +// } + +// fh, err := os.Open(approvalFile) +// if err != nil { +// return err +// } +// defer fh.Close() + +// approved, err := io.ReadAll(fh) +// if err != nil { +// return err +// } + +// received = s.normalizeLineEndings(received) +// approved = s.normalizeLineEndings(approved) + +// // The two sides are identical, nothing more to do. +// if bytes.Equal(received, approved) { +// return nil +// } + +// return fmt.Errorf("failed to approved %s", s.name) +// } + +// func (s *TemplatedCustomNamer) normalizeLineEndings(bs []byte) []byte { +// return bytes.Replace(bs, []byte("\r\n"), []byte("\n"), -1) +// } + +// func (s *TemplatedCustomNamer) dumpReceivedTestResult(bs []byte, receivedFile string) error { +// err := os.WriteFile(receivedFile, bs, 0644) + +// return err +// } + +// func (s *TemplatedCustomNamer) getFileName(extWithDot string, suffix string) string { +// if !strings.HasPrefix(extWithDot, ".") { +// extWithDot = fmt.Sprintf(".%s", extWithDot) +// } + +// _, baseName := path.Split(s.fileName) +// baseWithoutExt := baseName[:len(baseName)-len(path.Ext(s.fileName))] + +// filename := fmt.Sprintf("%s.%s.%s%s", baseWithoutExt, s.name, suffix, extWithDot) + +// return path.Join(defaultFolder, filename) +// } + +// func (s *TemplatedCustomNamer) GetReceivedFile(extWithDot string) string { +// return s.getFileName(extWithDot, "received") +// } + +// func (s *TemplatedCustomNamer) GetApprovalFile(extWithDot string) string { +// return s.getFileName(extWithDot, "approved") // }