From 6edbafa5f690fc76e27e2acf870bdc24a760adef Mon Sep 17 00:00:00 2001 From: "L. de Kimpe" Date: Thu, 9 Oct 2025 10:42:29 +0200 Subject: [PATCH 1/7] Test; Added tests to SumSlice and StringContains --- util/util.go | 2 +- util/util_test.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 util/util_test.go diff --git a/util/util.go b/util/util.go index 80d4184..6888df0 100644 --- a/util/util.go +++ b/util/util.go @@ -44,7 +44,7 @@ func ConvertSlice[E any](in []any) (out []E) { return } -// Sums all entries of a list together. +// Sums all entries of a list together. Will return -1 if no slice is given. func SumSlice[T ~int](slice []T) T { if slice == nil { return -1 diff --git a/util/util_test.go b/util/util_test.go new file mode 100644 index 0000000..33ad7a3 --- /dev/null +++ b/util/util_test.go @@ -0,0 +1,44 @@ +package util_test + +import ( + "strings" + "testing" + + "github.com/electrenator/tabbly/util" +) + +func TestStringContains(test *testing.T) { + const TEST_STRING = "Bean salad 190213" + const NOT_IN_STRING = "Zero" + stringParts := strings.SplitSeq(TEST_STRING, "") + + for part := range stringParts { + if !(util.StringContains(TEST_STRING, strings.ToUpper(part)) && + util.StringContains(TEST_STRING, strings.ToLower(part))) { + test.Errorf("%s is marked not to be in %s but should be!", part, TEST_STRING) + test.FailNow() + } + } + if util.StringContains(TEST_STRING, strings.ToUpper(NOT_IN_STRING)) && + util.StringContains(TEST_STRING, strings.ToLower(NOT_IN_STRING)) { + test.Errorf("%s should not be marked to be in %s", NOT_IN_STRING, TEST_STRING) + test.FailNow() + } +} + +func TestSumSlice(test *testing.T) { + const SUM = 7654321 + array := []int{1, 20, 300, 4000, 50000, 600000, 7000000} + sliceSum := util.SumSlice(array) + + if sliceSum != SUM { + test.Errorf("Sum slice was %d and should be %d", sliceSum, SUM) + } +} + +func TestSumSliceNegative(test *testing.T) { + if util.SumSlice[int](nil) != -1 { + test.Error("Empty slice should give -1 result") + test.Fail() + } +} From 0bb3d4b14941fe45fe17ca06b6d0eebbf7414868 Mon Sep 17 00:00:00 2001 From: "L. de Kimpe" Date: Thu, 9 Oct 2025 19:41:38 +0200 Subject: [PATCH 2/7] Simplified and added tests to util.ExpandUserDirectory --- util/util.go | 21 +++++++++++---------- util/util_test.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 10 deletions(-) diff --git a/util/util.go b/util/util.go index 6888df0..5295b9e 100644 --- a/util/util.go +++ b/util/util.go @@ -19,18 +19,19 @@ func StringContains(haystack string, needle string) bool { // expanded might start with "~" or "%APPDATA%". func ExpandUserDirectory(path string) (string, error) { usr, err := user.Current() - if err == nil { - if strings.HasPrefix(path, "~/") { - path = filepath.Join(usr.HomeDir, path[2:]) - } else if strings.HasPrefix(path, "%APPDATA%") { - appDataPath, err := os.UserConfigDir() - if err != nil { - return path, err - } - path = strings.Replace(path, "%APPDATA%", appDataPath, 1) + if err != nil { + return path, err + } + if strings.HasPrefix(path, "~/") { + path = filepath.Join(usr.HomeDir, path[2:]) + } else if strings.HasPrefix(path, "%APPDATA%") { + appDataPath, err := os.UserConfigDir() + if err != nil { + return path, err } + path = strings.Replace(path, "%APPDATA%", appDataPath, 1) } - return path, err + return path, nil } // Converts a list of any into a list of the given type. diff --git a/util/util_test.go b/util/util_test.go index 33ad7a3..f8d80e2 100644 --- a/util/util_test.go +++ b/util/util_test.go @@ -1,6 +1,9 @@ package util_test import ( + "os/user" + "path/filepath" + "runtime" "strings" "testing" @@ -42,3 +45,44 @@ func TestSumSliceNegative(test *testing.T) { test.Fail() } } + +func pathExpansionConfigDir() string { + switch runtime.GOOS { + case "windows": + return "" + case "darwin", "ios": + return "Library/Application Support" + case "plan9": + return "lib" + default: + return ".config" + } +} + +func TestExpandUserDirectory(test *testing.T) { + configDir := pathExpansionConfigDir() + usr, err := user.Current() + if err != nil { + test.Error(err) + } + + test.Setenv("AppData", usr.HomeDir) + cases := map[string]string{ + "~/directory": filepath.Join(usr.HomeDir, "directory"), + "some/weird/~/directory": "some/weird/~/directory", + "%APPDATA%/directory": filepath.Join(usr.HomeDir, configDir, "directory"), + "some/weird/%APPDATA%/directory": "some/weird/%APPDATA%/directory", + } + + for caseInput, caseOutput := range cases { + path, err := util.ExpandUserDirectory(caseInput) + if err != nil { + test.Error(err) + } + + if strings.Compare(caseOutput, path) != 0 { + test.Errorf("Path expansion of '%s' should be '%s' but expanded to: %s", + caseInput, caseOutput, path) + } + } +} From c12bb07840458a2cad9d8a869369ad3da07ac133 Mon Sep 17 00:00:00 2001 From: "L. de Kimpe" Date: Thu, 9 Oct 2025 20:12:16 +0200 Subject: [PATCH 3/7] Added util.SameSlice test --- go.mod | 4 ++++ go.sum | 18 ++++-------------- util/util.go | 12 +----------- util/util_test.go | 28 ++++++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 25 deletions(-) diff --git a/go.mod b/go.mod index 738d6ce..4b69671 100644 --- a/go.mod +++ b/go.mod @@ -7,17 +7,21 @@ require ( github.com/mattn/go-sqlite3 v1.14.32 github.com/shirou/gopsutil/v4 v4.25.8 github.com/spf13/pflag v1.0.10 + github.com/stretchr/testify v1.11.1 gitlab.com/electrenator/mozilla-lz4-decoder v1.0.0 ) require ( + github.com/davecgh/go-spew v1.1.1 // indirect github.com/ebitengine/purego v0.8.4 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/lufia/plan9stats v0.0.0-20250827001030-24949be3fa54 // indirect github.com/pierrec/lz4/v4 v4.1.22 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/tklauser/go-sysconf v0.3.15 // indirect github.com/tklauser/numcpus v0.10.0 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect golang.org/x/sys v0.35.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index d4c9393..a7f56ef 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,6 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/ebitengine/purego v0.8.2 h1:jPPGWs2sZ1UgOSgD2bClL0MJIqu58nOmIcBuXr62z1I= -github.com/ebitengine/purego v0.8.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -11,12 +9,8 @@ github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= -github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= github.com/lufia/plan9stats v0.0.0-20250827001030-24949be3fa54 h1:mFWunSatvkQQDhpdyuFAYwyAan3hzCuma+Pz8sqvOfg= github.com/lufia/plan9stats v0.0.0-20250827001030-24949be3fa54/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= -github.com/mattn/go-sqlite3 v1.14.27 h1:drZCnuvf37yPfs95E5jd9s3XhdVWLal+6BOK6qrv6IU= -github.com/mattn/go-sqlite3 v1.14.27/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuErjs= github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= @@ -25,16 +19,12 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/shirou/gopsutil/v4 v4.25.3 h1:SeA68lsu8gLggyMbmCn8cmp97V1TI9ld9sVzAUcKcKE= -github.com/shirou/gopsutil/v4 v4.25.3/go.mod h1:xbuxyoZj+UsgnZrENu3lQivsngRR5BdjbJwf2fv4szA= github.com/shirou/gopsutil/v4 v4.25.8 h1:NnAsw9lN7587WHxjJA9ryDnqhJpFH6A+wagYWTOH970= github.com/shirou/gopsutil/v4 v4.25.8/go.mod h1:q9QdMmfAOVIw7a+eF86P7ISEU6ka+NLgkUxlopV4RwI= -github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= @@ -46,9 +36,9 @@ gitlab.com/electrenator/mozilla-lz4-decoder v1.0.0/go.mod h1:3KcErumQETJyGeUEXoc golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/util/util.go b/util/util.go index 5295b9e..4257a07 100644 --- a/util/util.go +++ b/util/util.go @@ -34,17 +34,6 @@ func ExpandUserDirectory(path string) (string, error) { return path, nil } -// Converts a list of any into a list of the given type. -// -// From https://stackoverflow.com/a/24454401/13042236 -func ConvertSlice[E any](in []any) (out []E) { - out = make([]E, 0, len(in)) - for _, v := range in { - out = append(out, v.(E)) - } - return -} - // Sums all entries of a list together. Will return -1 if no slice is given. func SumSlice[T ~int](slice []T) T { if slice == nil { @@ -62,6 +51,7 @@ func SumSlice[T ~int](slice []T) T { // // Note: this isn't tested on slices with slices in them and likely isn't // accurate for that case. +// Should be replaced with std function (slices.Compare) func SameSlice[T comparable](a, b []T) bool { if a == nil { return b == nil diff --git a/util/util_test.go b/util/util_test.go index f8d80e2..2857344 100644 --- a/util/util_test.go +++ b/util/util_test.go @@ -4,10 +4,12 @@ import ( "os/user" "path/filepath" "runtime" + "slices" "strings" "testing" "github.com/electrenator/tabbly/util" + "github.com/stretchr/testify/assert" ) func TestStringContains(test *testing.T) { @@ -86,3 +88,29 @@ func TestExpandUserDirectory(test *testing.T) { } } } + +func TestSameSlice(test *testing.T) { + var longValue []int = []int{98, 76, 54} + var shortValue []int = []int{12, 34} + assert := assert.New(test) + + assert.False(util.SameSlice(longValue, shortValue)) + assert.False(util.SameSlice(shortValue, longValue)) + assert.True(util.SameSlice(shortValue, shortValue)) + assert.True(util.SameSlice(longValue, longValue)) + + // And the inverse + inverseValue := slices.Clone(longValue) + slices.Reverse(inverseValue) + assert.False(util.SameSlice(longValue, inverseValue)) +} + +func TestSameSliceNill(test *testing.T) { + var value []int = []int{12, 34} + var noValue []int = nil + assert := assert.New(test) + + assert.False(util.SameSlice(value, noValue)) + assert.False(util.SameSlice(noValue, value)) + assert.True(util.SameSlice(noValue, noValue)) +} From 60308910dd1cf1deb04545759ab74ce87223be50 Mon Sep 17 00:00:00 2001 From: "L. de Kimpe" Date: Thu, 9 Oct 2025 21:45:38 +0200 Subject: [PATCH 4/7] Commented in another test idea for ExpandUserDirectory --- util/util.go | 3 ++- util/util_test.go | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/util/util.go b/util/util.go index 4257a07..7733d03 100644 --- a/util/util.go +++ b/util/util.go @@ -16,7 +16,8 @@ func StringContains(haystack string, needle string) bool { } // Expands user specific properties of a directory path. Paths which will be -// expanded might start with "~" or "%APPDATA%". +// expanded might start with "~" or "%APPDATA%". Returns an unaltered path +// when unsuccessful with error set. func ExpandUserDirectory(path string) (string, error) { usr, err := user.Current() if err != nil { diff --git a/util/util_test.go b/util/util_test.go index 2857344..0107c71 100644 --- a/util/util_test.go +++ b/util/util_test.go @@ -89,6 +89,14 @@ func TestExpandUserDirectory(test *testing.T) { } } +func TestExpandUserDirectoryErrorPaths(test *testing.T) { + // unset all enviroment variables + // test.Setenv() + + // then run path extention with a %APPDATA% prefix + // should return a unaltered path +} + func TestSameSlice(test *testing.T) { var longValue []int = []int{98, 76, 54} var shortValue []int = []int{12, 34} From 5a663eee2daf17dc2815c1643dddf80835fbc92e Mon Sep 17 00:00:00 2001 From: "L. de Kimpe" Date: Fri, 10 Oct 2025 09:04:28 +0200 Subject: [PATCH 5/7] Negative test for ExpandUserDirectory --- util/util.go | 1 - util/util_test.go | 12 +++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/util/util.go b/util/util.go index 7733d03..763b501 100644 --- a/util/util.go +++ b/util/util.go @@ -52,7 +52,6 @@ func SumSlice[T ~int](slice []T) T { // // Note: this isn't tested on slices with slices in them and likely isn't // accurate for that case. -// Should be replaced with std function (slices.Compare) func SameSlice[T comparable](a, b []T) bool { if a == nil { return b == nil diff --git a/util/util_test.go b/util/util_test.go index 0107c71..43a8e32 100644 --- a/util/util_test.go +++ b/util/util_test.go @@ -1,6 +1,7 @@ package util_test import ( + "os" "os/user" "path/filepath" "runtime" @@ -90,11 +91,16 @@ func TestExpandUserDirectory(test *testing.T) { } func TestExpandUserDirectoryErrorPaths(test *testing.T) { - // unset all enviroment variables - // test.Setenv() + const INPUT_PATH = "%APPDATA%/directory" - // then run path extention with a %APPDATA% prefix + // unset all environment variables + os.Clearenv() + + // then run path extension with a %APPDATA% prefix // should return a unaltered path + path, err := util.ExpandUserDirectory(INPUT_PATH) + assert.Equal(test, INPUT_PATH, path) + assert.Error(test, err) } func TestSameSlice(test *testing.T) { From bb2ddc00310466f8c9d785464ad5d08aab96dbad Mon Sep 17 00:00:00 2001 From: "L. de Kimpe" Date: Wed, 15 Oct 2025 22:10:23 +0200 Subject: [PATCH 6/7] Testing; Added for file.go --- internal/storage/file_test.go | 94 ++++++++++++++++++++++++++++++++ internal/storage/storage_test.go | 5 ++ 2 files changed, 99 insertions(+) create mode 100644 internal/storage/file_test.go create mode 100644 internal/storage/storage_test.go diff --git a/internal/storage/file_test.go b/internal/storage/file_test.go new file mode 100644 index 0000000..407e00d --- /dev/null +++ b/internal/storage/file_test.go @@ -0,0 +1,94 @@ +package internal_storage_test + +import ( + "os" + "testing" + "time" + + internal_setting "github.com/electrenator/tabbly/internal/setting" + internal_storage "github.com/electrenator/tabbly/internal/storage" + "github.com/stretchr/testify/assert" +) + +func TestAsciiHostnameToCamelCase(test *testing.T) { + cases := map[string]string{ + "hostname": "hostname", + "HOSTNAME": "hostname", + "Hostname": "hostname", + "hostname-with-separator": "hostnameWithSeparator", + "HOSNAME_MORE_SCREEEEEMINGGG-SEPRATOR": "hosnameMoreScreeeeemingggSeprator", + "Some-Intr_hostWITH,inValIdSEpERaToRS": "someIntrHostwith,invalidseperators", + } + + for caseInput, caseExpectedOutput := range cases { + output := internal_storage.AsciiHostnameToCamelCase(caseInput) + assert.Equal(test, caseExpectedOutput, output) + } +} + +func TestCloseFile(test *testing.T) { + const FILE_PATH = "/tmp/tabblyTestFile" + test.Cleanup(cleanFile(test, FILE_PATH)) + + file, err := os.OpenFile(FILE_PATH, os.O_CREATE|os.O_RDWR, internal_setting.DefaultFilePerms) + if err != nil { + test.Error(err) + test.FailNow() + } + internal_storage.CloseFile(file) + + _, err = file.Write([]byte(":3")) + assert.ErrorIs(test, err, os.ErrClosed) +} + +func TestCopyFile(test *testing.T) { + const FROM_FILE = "/tmp/tabblyFromFile" + const TO_FILE = "/tmp/tabblyToFile" + var content = "Cheese\n\t" + time.Now().String() + + test.Cleanup(cleanFile(test, FROM_FILE)) + test.Cleanup(cleanFile(test, TO_FILE)) + + err := prepareFile(FROM_FILE, content) + if err != nil { + test.Error(err) + test.FailNow() + } + + err = internal_storage.CopyFile(FROM_FILE, TO_FILE) + if err != nil { + test.Error(err) + } + + fileData, err := os.ReadFile(TO_FILE) + if err != nil { + test.Error(err) + } + + assert.EqualValues(test, content, fileData) +} + +func prepareFile(fileName string, contents string) error { + file, err := os.OpenFile(fileName, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, internal_setting.DefaultFilePerms) + if err != nil { + return err + } + _, err = file.Write([]byte(contents)) + if err == nil { + err = file.Sync() + if err == nil { + err = file.Close() + } + } + return err +} + +func cleanFile(test *testing.T, filepath string) func() { + cleanupFunction := func() { + err := os.Remove(filepath) + if err != nil { + test.Error(err) + } + } + return cleanupFunction +} diff --git a/internal/storage/storage_test.go b/internal/storage/storage_test.go new file mode 100644 index 0000000..c5a150c --- /dev/null +++ b/internal/storage/storage_test.go @@ -0,0 +1,5 @@ +package internal_storage + +var AsciiHostnameToCamelCase = asciiHostnameToCamelCase +var CloseFile = closeFile +var CopyFile = copyFile From ddffd12a40b0198e8ec2829c03e9f1c986faa197 Mon Sep 17 00:00:00 2001 From: "L. de Kimpe" Date: Wed, 15 Oct 2025 22:53:53 +0200 Subject: [PATCH 7/7] Test; Added for some db versioning checks funcs --- .gitignore | 1 + internal/storage/database.go | 3 +- internal/storage/database_test.go | 49 ++++++++++++++++++++++++++++ internal/storage/file.go | 2 -- internal/storage/storage_test.go | 5 +++ internal/storage/testData/v0.sqlite | Bin 0 -> 28672 bytes 6 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 internal/storage/database_test.go create mode 100644 internal/storage/testData/v0.sqlite diff --git a/.gitignore b/.gitignore index 051bcba..8dc052d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ log/ **/*.sqlite **/*.bck tabbly* +!**/testData/**/* # IDE files **/.vscode/ diff --git a/internal/storage/database.go b/internal/storage/database.go index a86c0c0..896a6d4 100644 --- a/internal/storage/database.go +++ b/internal/storage/database.go @@ -18,6 +18,7 @@ import ( ) const dbStructureDirectory = "database" +const developmentFileAddition = "-dev" var Databasefiles embed.FS @@ -255,7 +256,7 @@ func getVersionFromFile(filename string) int { nameParts := strings.Split(filename, "-") if len(nameParts) <= 0 { - return -1 + return -1 // Likely will never arrive here } version, err := strconv.Atoi(nameParts[0]) if err != nil { diff --git a/internal/storage/database_test.go b/internal/storage/database_test.go new file mode 100644 index 0000000..296bf67 --- /dev/null +++ b/internal/storage/database_test.go @@ -0,0 +1,49 @@ +package internal_storage_test + +import ( + "database/sql" + "testing" + + internal_storage "github.com/electrenator/tabbly/internal/storage" + "github.com/stretchr/testify/assert" +) + +func TestGetCurrentDbSchemaVersion(test *testing.T) { + db, err := sql.Open("sqlite3", "file:testData/v0.sqlite") + if err != nil { + test.Error(err) + } + version := internal_storage.GetCurrentDbSchemaVersion(db) + + assert.Equal(test, 0, version) +} + +func TestGetCurrentDbSchemaVersionUninitialized(test *testing.T) { + db, err := sql.Open("sqlite3", ":memory:") + if err != nil { + test.Error(err) + } + version := internal_storage.GetCurrentDbSchemaVersion(db) + + assert.Equal(test, -1, version) +} + +func TestGetVersionFromFile(test *testing.T) { + cases := map[string]int{ + "000-something.sql": 0, + "010-newStuff!": 10, + ".901-invalid": -1, + "": -1, + "901-aaa-4444": 901, + "9-2-391-call": 9, + "123456": 123456, + "123456.sql": -1, + "nan-123456": -1, + "123456-solution": 123456, + } + + for caseInput, caseExpectedOutput := range cases { + output := internal_storage.GetVersionFromFile(caseInput) + assert.Equal(test, caseExpectedOutput, output, "With input \"%s\"", caseInput) + } +} diff --git a/internal/storage/file.go b/internal/storage/file.go index 56c111c..05dd9ae 100644 --- a/internal/storage/file.go +++ b/internal/storage/file.go @@ -10,8 +10,6 @@ import ( internal_setting "github.com/electrenator/tabbly/internal/setting" ) -const developmentFileAddition = "-dev" - // Copies file from targetFileName path to copyFileName path. func copyFile(targetFileName string, copyFileName string) error { targetFile, err := os.Open(targetFileName) diff --git a/internal/storage/storage_test.go b/internal/storage/storage_test.go index c5a150c..ac0340a 100644 --- a/internal/storage/storage_test.go +++ b/internal/storage/storage_test.go @@ -1,5 +1,10 @@ package internal_storage +// File var AsciiHostnameToCamelCase = asciiHostnameToCamelCase var CloseFile = closeFile var CopyFile = copyFile + +// Database +var GetCurrentDbSchemaVersion = getCurrentDbSchemaVersion +var GetVersionFromFile = getVersionFromFile diff --git a/internal/storage/testData/v0.sqlite b/internal/storage/testData/v0.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..b96ea0b06d878b7b1376a159cec28b7289a3c54f GIT binary patch literal 28672 zcmeI%(N5D)7{KwK0UIp9yfA49Avx*Q8qjEX0n2tEjiZCEi*h3=Qj;ZYg|&!Y4!tlw zftNms58|_U;c2^RhBJiQ<$toa>uL7&`+og)anjCltCvRdT|DfEsoXUl8A2E@q%;ge z=&ho+$yn51vTZW5>-P;|JpKB3t@h0*ul_J<-`9WEdh1`-KI;<(0tg_000IagfB*sr zAn+i8QKMWjH#Wp=n1*K;(W~CzJiaORm4>gJK*_+_Ybj|Jla{PkSFC7|4nMl*){5%| z>OlF@YX{Qnwpu&-Vtg45g77Svd3C?-EBC;YFV#u?PZ(SJYG3)vYp9O2R2JN-TfKA3 zmTgaVkD6H;4X4v^nkt)Vs+Q6-zUlocyMxmW+ODUQI8Yn`e3{|1{D*eh=G zFoUDTvbnu2PV(oNTwUlz>1h&OT}Okr(Vf$!DU~}H>w~Z#?dV_Hqt#Ny+}sqSIFC8b zYJ6CjieXJsp4iUpj4ZOX5~$a@S;h?`yPkX8Ra)jAyQ=+Up=>&v!q6=meHbSlUZ-(> zemYLz^!fNpw$5J8{t9nI#oXEwqgq}>GwYBri6+O=bQzQBqRrn&!=x7v{_OPk95I_I{1Q0*~0R#|0009IL Hn16xacEtP< literal 0 HcmV?d00001