Skip to content

Commit 28e86db

Browse files
fix(go1.25): remove the golangci-lint from tools as it is not supported for go above 1.24
Signed-off-by: Dusan Malusev <dusan@dusanmalusev.dev>
1 parent 7884f41 commit 28e86db

8 files changed

Lines changed: 80 additions & 3022 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ coverage.out
66
*.html
77
*.log
88
.env
9+
.idea/

.run/go test utils.run.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<component name="ProjectRunConfigurationManager">
2+
<configuration default="false" name="go test utils" type="GoTestRunConfiguration" factoryName="Go Test" nameIsGenerated="true">
3+
<module name="utils" />
4+
<working_directory value="$PROJECT_DIR$" />
5+
<go_parameters value="-tags testing -timeout 2m" />
6+
<kind value="DIRECTORY" />
7+
<package value="github.com/CodeLieutenant/utils" />
8+
<directory value="$PROJECT_DIR$" />
9+
<filePath value="$PROJECT_DIR$" />
10+
<framework value="gotest" />
11+
<method v="2" />
12+
</configuration>
13+
</component>

env_test.go

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -282,9 +282,9 @@ func TestGetAllIntTypesOverflow(t *testing.T) {
282282
p := simpleTestEnv()
283283

284284
// Set environment variables directly
285-
_ = os.Setenv("INT8_OVER_TEST", "128") // > 127
286-
_ = os.Setenv("INT16_OVER_TEST", "40000") // > 32767
287-
_ = os.Setenv("INT32_OVER_TEST", "2147483648") // > int32 max
285+
_ = os.Setenv("INT8_OVER_TEST", "128") // > 127
286+
_ = os.Setenv("INT16_OVER_TEST", "40000") // > 32767
287+
_ = os.Setenv("INT32_OVER_TEST", "2147483648") // > int32 max
288288
_ = os.Setenv("INT64_OVER_TEST", "9223372036854775808") // > int64 max
289289
_ = os.Setenv("INT_STD_OVER_TEST", "9223372036854775808")
290290

@@ -429,6 +429,7 @@ func TestGetKeyEnv(t *testing.T) {
429429
// Test with valid hex key (32 bytes when decoded)
430430
validHexKey := "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" // 32 bytes hex
431431
p.Set("CRYPTO_KEY_HEX", validHexKey)
432+
432433
defaultKey := []byte("defaultkey")
433434
result := utils.GetKeyEnv(p, "CRYPTO_KEY_HEX", defaultKey)
434435
require.NotEqual(t, defaultKey, result)
@@ -478,6 +479,7 @@ func TestNewEnv(t *testing.T) {
478479
require.Contains(t, r.(string), "dotenv file not found")
479480
}
480481
}()
482+
481483
env = utils.NewEnv(false)
482484
require.NotNil(t, env.EnvProvider)
483485
}
@@ -486,17 +488,12 @@ func TestLoadDotEnv_LoadError(t *testing.T) {
486488
t.Parallel()
487489

488490
// Create a temporary directory for this test to avoid interfering with other tests
489-
tmpDir, err := os.MkdirTemp("", "env-test-*")
490-
require.NoError(t, err)
491-
defer func() {
492-
_ = os.RemoveAll(tmpDir)
493-
}()
491+
tmpDir := t.TempDir()
494492

495493
// Create an invalid .env file that will cause godotenv.Load to fail
496494
invalidEnvContent := "INVALID_LINE_WITHOUT_EQUALS\n"
497495
envFile := filepath.Join(tmpDir, ".env")
498-
err = os.WriteFile(envFile, []byte(invalidEnvContent), 0o644)
499-
require.NoError(t, err)
496+
require.NoError(t, os.WriteFile(envFile, []byte(invalidEnvContent), 0o644))
500497

501498
// This should not panic but should log an error and return
502499
require.NotPanics(t, func() {
@@ -514,13 +511,14 @@ func TestOsEnvProvider(t *testing.T) {
514511

515512
// Clean up any existing value
516513
originalValue := os.Getenv(testKey)
517-
defer func() {
514+
515+
t.Cleanup(func() {
518516
if originalValue != "" {
519517
t.Setenv(testKey, originalValue)
520518
} else {
521519
t.Setenv(testKey, "")
522520
}
523-
}()
521+
})
524522

525523
// Test Set
526524
provider.Set(testKey, testValue)

go.mod

Lines changed: 10 additions & 340 deletions
Large diffs are not rendered by default.

go.sum

Lines changed: 20 additions & 2553 deletions
Large diffs are not rendered by default.

httputils/httphelpers_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -828,7 +828,6 @@ func TestReadFrom(t *testing.T) {
828828
response := NewResponse(rr)
829829
reader := strings.NewReader("test content")
830830

831-
require.Panics(t, func() {
832-
_, _ = response.ReadFrom(reader)
833-
})
831+
_, err := response.ReadFrom(reader)
832+
require.ErrorIs(t, err, ErrNotReaderFrom)
834833
}

httputils/response.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package httputils
22

33
import (
44
"encoding/json"
5+
"errors"
56
"io"
67
"log/slog"
78
"net/http"
@@ -10,6 +11,8 @@ import (
1011
"github.com/Oudwins/zog"
1112
)
1213

14+
var ErrNotReaderFrom = errors.New("reader does not implement io.ReaderFrom interface")
15+
1316
type ResponseEncoder interface {
1417
Encode(http.ResponseWriter, int, ...any)
1518
}
@@ -91,10 +94,10 @@ func (r Response) BadRequest() {
9194
r.Error(http.StatusBadRequest, "bad request")
9295
}
9396

94-
func (r Response) ValidationError(err zog.ZogIssueMap) {
97+
func (r Response) ValidationError(err zog.ZogIssueList) {
9598
r.encoder.Encode(r.w, http.StatusUnprocessableEntity, map[string]any{
9699
"message": "validation error",
97-
"errors": zog.Issues.SanitizeMapAndCollect(err),
100+
"errors": zog.Issues.FlattenAndCollect(err),
98101
})
99102
}
100103

@@ -120,7 +123,12 @@ func (r Response) SetHeader(key, value string) Response {
120123
}
121124

122125
func (r Response) ReadFrom(src io.Reader) (int64, error) {
123-
return r.w.(io.ReaderFrom).ReadFrom(src) //nolint:forcetypeassert
126+
readerFrom, ok := r.w.(io.ReaderFrom)
127+
if !ok {
128+
return 0, ErrNotReaderFrom
129+
}
130+
131+
return readerFrom.ReadFrom(src)
124132
}
125133

126134
func (r Response) SetCookie(cookie *http.Cookie) Response {

utils_test.go

Lines changed: 13 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,8 @@ import (
88
"regexp"
99
"testing"
1010

11-
"github.com/stretchr/testify/require"
12-
1311
"github.com/CodeLieutenant/utils"
12+
"github.com/stretchr/testify/require"
1413
)
1514

1615
func TestCreateLogFile(t *testing.T) {
@@ -19,14 +18,14 @@ func TestCreateLogFile(t *testing.T) {
1918

2019
path := "./test-logs/log.json"
2120

22-
t.Cleanup(func() { _ = os.RemoveAll("./test-logs") })
23-
2421
file, err := utils.CreateLogFile(path)
25-
defer func() {
22+
t.Cleanup(func() {
2623
if file != nil {
2724
_ = file.Close()
2825
}
29-
}()
26+
27+
_ = os.RemoveAll("./test-logs")
28+
})
3029

3130
req.NoError(err)
3231
req.NotNil(file)
@@ -39,13 +38,11 @@ func TestFileExistsSuccess(t *testing.T) {
3938
req := require.New(t)
4039
path := "./log.json"
4140
file, err := utils.CreateLogFile(path)
42-
defer func() {
41+
t.Cleanup(func() {
4342
if file != nil {
4443
_ = file.Close()
4544
}
46-
}()
4745

48-
t.Cleanup(func() {
4946
_ = os.Remove(path)
5047
})
5148

@@ -75,12 +72,7 @@ func TestCreateDirectory(t *testing.T) {
7572
t.Parallel()
7673
req := require.New(t)
7774

78-
// Use a temporary directory to avoid conflicts
79-
tmp, err := os.MkdirTemp("", "test-create-dir-*")
80-
req.NoError(err)
81-
defer func() { _ = os.RemoveAll(tmp) }()
82-
83-
testDir := filepath.Join(tmp, "test-dir")
75+
testDir := filepath.Join(t.TempDir(), "test-dir")
8476
path, err := utils.CreateDirectory(testDir, 0o744)
8577

8678
req.NoError(err)
@@ -94,14 +86,11 @@ func TestGetAbsolutePath_RelativeAbsoluteAndError(t *testing.T) {
9486

9587
origWD, err := os.Getwd()
9688
req.NoError(err)
97-
defer func() { _ = os.Chdir(origWD) }()
89+
t.Cleanup(func() { t.Chdir(origWD) })
9890

99-
tmp, err := os.MkdirTemp("", "abs-test-*")
100-
req.NoError(err)
101-
defer func() { _ = os.RemoveAll(tmp) }()
91+
tmp := t.TempDir()
92+
t.Chdir(tmp)
10293

103-
// Change into tmp and test relative path success
104-
req.NoError(os.Chdir(tmp))
10594
rel := "sub/dir/file.txt"
10695
got, err := utils.GetAbsolutePath(rel)
10796
req.NoError(err)
@@ -113,14 +102,10 @@ func TestGetAbsolutePath_RelativeAbsoluteAndError(t *testing.T) {
113102
req.NoError(err)
114103
req.Equal(tmp, got2)
115104

116-
// Induce error by removing the current directory before calling
117-
req.NoError(os.Chdir(tmp))
105+
t.Chdir(tmp)
118106
req.NoError(os.RemoveAll(tmp))
119107
_, err = utils.GetAbsolutePath("anything")
120108
req.Error(err)
121-
122-
// Restore WD
123-
req.NoError(os.Chdir(origWD))
124109
}
125110

126111
func TestCreateDirectoryFromFile_SuccessAndError(t *testing.T) {
@@ -179,6 +164,7 @@ func TestCreateFile_CreateReopenAndError(t *testing.T) {
179164
b, err := io.ReadAll(f2)
180165
req.NoError(err)
181166
req.Equal("hello", string(b))
167+
req.NoError(f2.Close())
182168

183169
// Error path via invalid CWD so CreateDirectoryFromFile fails
184170
req.NoError(os.Chdir(tmp))
@@ -187,7 +173,7 @@ func TestCreateFile_CreateReopenAndError(t *testing.T) {
187173
req.Error(err)
188174

189175
// Restore
190-
req.NoError(os.Chdir(origWD))
176+
req.NoError(os.Chdir(origWD)) //nolint:usetesting
191177
}
192178

193179
func TestGenerateRandomPassword(t *testing.T) {
@@ -406,71 +392,6 @@ func TestWorkingDir_ErrorHandling(t *testing.T) {
406392
req.Equal(tmp, wd)
407393
}
408394

409-
func TestProjectRootDir_ErrorCases(t *testing.T) {
410-
// This test manipulates the working directory, so it can't be parallel
411-
req := require.New(t)
412-
413-
// Save original working directory
414-
origWD, err := os.Getwd()
415-
req.NoError(err)
416-
defer func() { _ = os.Chdir(origWD) }()
417-
418-
// Test normal operation first - should work and populate cache
419-
root := utils.ProjectRootDir(t)
420-
req.NotEmpty(root)
421-
req.True(filepath.IsAbs(root))
422-
423-
// Test cache hit by calling again
424-
root2 := utils.ProjectRootDir(t)
425-
req.Equal(root, root2)
426-
427-
// Test from a subdirectory of the project
428-
tmp, err := os.MkdirTemp(root, "test-subdir-*")
429-
req.NoError(err)
430-
defer func() { _ = os.RemoveAll(tmp) }()
431-
432-
// Change to subdirectory
433-
req.NoError(os.Chdir(tmp))
434-
435-
// Should still find the project root
436-
root3 := utils.ProjectRootDir(t)
437-
req.Equal(root, root3)
438-
}
439-
440-
func TestFindFile_ErrorCases(t *testing.T) {
441-
// This test manipulates the working directory
442-
req := require.New(t)
443-
444-
// Save original working directory
445-
origWD, err := os.Getwd()
446-
req.NoError(err)
447-
defer func() { _ = os.Chdir(origWD) }()
448-
449-
// Test normal case - finding go.mod should work
450-
dir := utils.FindFile(t, "go.mod")
451-
req.NotEmpty(dir)
452-
req.True(filepath.IsAbs(dir))
453-
454-
// Test finding a file in current directory
455-
projectRoot := utils.ProjectRootDir(t)
456-
testFile := filepath.Join(projectRoot, "test-find-file.tmp")
457-
f, err := os.Create(testFile)
458-
req.NoError(err)
459-
_ = f.Close()
460-
defer func() { _ = os.Remove(testFile) }()
461-
462-
// Change to a subdirectory
463-
tmp, err := os.MkdirTemp(projectRoot, "test-find-subdir-*")
464-
req.NoError(err)
465-
defer func() { _ = os.RemoveAll(tmp) }()
466-
467-
req.NoError(os.Chdir(tmp))
468-
469-
// Should find the file by walking up
470-
foundDir := utils.FindFile(t, "test-find-file.tmp")
471-
req.Equal(projectRoot, foundDir)
472-
}
473-
474395
// Test that demonstrates the GetLocalIP and GetLocalIPs error handling
475396
func TestGetLocalIP_ErrorPath(t *testing.T) {
476397
t.Parallel()
@@ -576,25 +497,6 @@ func TestFindFile_ReadDirError(t *testing.T) {
576497
req.Equal(projectRoot, found)
577498
}
578499

579-
func TestProjectRootDir_CacheEdgeCases(t *testing.T) {
580-
t.Parallel()
581-
req := require.New(t)
582-
583-
// Test multiple calls to ensure cache works properly
584-
root1 := utils.ProjectRootDir(t)
585-
root2 := utils.ProjectRootDir(t)
586-
root3 := utils.ProjectRootDir(t)
587-
588-
req.Equal(root1, root2)
589-
req.Equal(root2, root3)
590-
req.NotEmpty(root1)
591-
req.True(filepath.IsAbs(root1))
592-
593-
// Verify go.mod exists in the root
594-
goModPath := filepath.Join(root1, "go.mod")
595-
req.FileExists(goModPath)
596-
}
597-
598500
func TestWorkingDir_Success(t *testing.T) {
599501
t.Parallel()
600502
req := require.New(t)

0 commit comments

Comments
 (0)