# HG changeset patch
# User Axel Prel <axel.prel@xcg-consulting.fr>
# Date 1718197615 -7200
#      Wed Jun 12 15:06:55 2024 +0200
# Node ID 93875fe45953a0c26a91bf3965967d32c85b8fc6
# Parent  2f2261ad2e7bc910b49e03ab5713de767ea27818
# EXP-Topic golangCI
gCI: activate tParallel linter

enfores the use of t.Parallel() in the tests

diff --git a/.golangci.yml b/.golangci.yml
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -92,7 +92,7 @@
     - nolintlint  # Reports ill-formed or insufficient nolint directives	style		v1.26.0
     - nonamedreturns # Reports all named returns.	style		v1.46.0
     - nosprintfhostport # Checks for misuse of Sprintf to construct a host with port in a URL.	style		v1.46.0
-    # - paralleltest  # paralleltest detects missing usage of t.Parallel() method in your Go test	style, test		v1.33.0
+    - paralleltest  # paralleltest detects missing usage of t.Parallel() method in your Go test	style, test		v1.33.0
     - perfsprint # Checks that fmt.Sprintf can be replaced with a faster alternative.	performance		v1.55.0
     - prealloc  # Finds slice declarations that could potentially be preallocated	performance		v1.19.0
     - predeclared  # find code that shadows one of Go's predeclared identifiers	style		v1.35.0
@@ -144,6 +144,8 @@
     enable-all: true
     disable:
       - require-error
+  paralleltest:
+    ignore-loop-var: true
 issues:
   # Maximum issues count per one linter. Set to 0 to disable. Default is 50.
   max-issues-per-linter: 0
@@ -165,6 +167,10 @@
     - path: 'cmd/|auth/|restapi/'
       linters:
         - lll
+    - path: 'utils/log-console-writer_test.go|tests'
+      linters:
+        - tparallel
+        - paralleltest
   exclude-dirs:
     - dependencies
     - restapi/operations
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -10,6 +10,7 @@
 
 GOLANGCI_LINT_VERSION = v1.64.6
 GOLANGCI_LINT_BIN = tools/bin/golangci-lint-$(GOLANGCI_LINT_VERSION)
+GOLANGCI_LINT_ARGS =
 
 BASEVERSION = $(shell grep version: swagger.yaml| cut -f2 -d: |xargs)
 VERSION = $(BASEVERSION)
diff --git a/engines/mjml/mjml_test.go b/engines/mjml/mjml_test.go
--- a/engines/mjml/mjml_test.go
+++ b/engines/mjml/mjml_test.go
@@ -59,7 +59,9 @@
 }
 
 func TestDukType(t *testing.T) {
+	t.Parallel()
 	t.Run("Simple", func(t *testing.T) {
+		t.Parallel()
 		ctx, err := initDukTapeCtx()
 		require.NoError(t, err)
 
@@ -70,6 +72,7 @@
 		}))
 	})
 	t.Run("WithError", func(t *testing.T) {
+		t.Parallel()
 		ctx, err := initDukTapeCtx()
 		require.NoError(t, err)
 
@@ -82,6 +85,7 @@
 		t.Log(r)
 	})
 	t.Run("Invalid-mjml", func(t *testing.T) {
+		t.Parallel()
 		ctx, err := initDukTapeCtx()
 		require.NoError(t, err)
 
diff --git a/engines/mustache/engine_test.go b/engines/mustache/engine_test.go
--- a/engines/mustache/engine_test.go
+++ b/engines/mustache/engine_test.go
@@ -11,6 +11,7 @@
 )
 
 func TestVarlist(t *testing.T) {
+	t.Parallel()
 	mt, err := mustache.ParseString(`
 	{{#outsection}}
 		{{#section1}}
diff --git a/engines/wpd/process_test.go b/engines/wpd/process_test.go
--- a/engines/wpd/process_test.go
+++ b/engines/wpd/process_test.go
@@ -11,6 +11,7 @@
 )
 
 func TestProcess(t *testing.T) {
+	t.Parallel()
 	log := testutils.GetLogger(t)
 	p, err := NewRealProcess()
 	require.NoError(t, err)
diff --git a/engines/wpd/wpd_test.go b/engines/wpd/wpd_test.go
--- a/engines/wpd/wpd_test.go
+++ b/engines/wpd/wpd_test.go
@@ -14,13 +14,14 @@
 )
 
 func TestRealWpd(t *testing.T) {
+	t.Parallel()
 	log := testutils.GetLogger(t)
 	p, err := wpd.NewRealProcess()
 
 	require.NoError(t, err)
 
 	ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
-	defer cancel()
+	t.Cleanup(cancel)
 
 	wpd, err := wpd.NewProcessWPD(p, log)
 	require.NoError(t, err)
diff --git a/lib/condchan_test.go b/lib/condchan_test.go
--- a/lib/condchan_test.go
+++ b/lib/condchan_test.go
@@ -26,6 +26,7 @@
 }
 
 func TestCondChan(t *testing.T) {
+	t.Parallel()
 	needStop := false
 	ch, hit := redner.NewCondChan(func() bool { return needStop })
 
diff --git a/models/template_db_test.go b/models/template_db_test.go
--- a/models/template_db_test.go
+++ b/models/template_db_test.go
@@ -15,6 +15,7 @@
 )
 
 func TestTemplateDB(t *testing.T) {
+	t.Parallel()
 	log := testutils.GetLogger(t)
 	ctx, cancel := testutils.GetContext(t)
 	ctx = log.WithContext(ctx)
@@ -22,7 +23,7 @@
 	defer cancel()
 
 	db := database.GetTestDB(ctx, t, migration.Source)
-	defer db.Close()
+	t.Cleanup(db.Close)
 
 	_, err := database.Exec(db, database.SQLInsert(models.AccountDB{Name: "account"}), &log)
 	require.NoError(t, err)
diff --git a/restapi/handlers/account-template-update_test.go b/restapi/handlers/account-template-update_test.go
--- a/restapi/handlers/account-template-update_test.go
+++ b/restapi/handlers/account-template-update_test.go
@@ -7,14 +7,15 @@
 
 	"github.com/Masterminds/squirrel"
 	"github.com/stretchr/testify/assert"
+
 	"orus.io/orus-io/go-orusapi/database"
-
 	"orus.io/orus-io/rednerd/models"
 	"orus.io/orus-io/rednerd/testutils"
 	"orus.io/orus-io/rednerd/testutils/apitester"
 )
 
 func TestAccountTemplateUpdate(t *testing.T) {
+	t.Parallel()
 	log := testutils.GetLogger(t)
 	ctx, cancel := testutils.GetContext(t)
 	ctx = log.WithContext(ctx)
@@ -22,25 +23,39 @@
 	defer cancel()
 
 	tester := apitester.NewAPITester(ctx, t, nil)
-	tmpl := models.Template{
-		Account:    "janedoe",
-		Name:       "hello",
-		Language:   "mustache",
-		Produces:   "text/plain",
-		BodyFormat: "text",
-		Body:       "Hello {{name}}!",
+	tmpls := []models.Template{
+		{
+			Account:    "janedoe",
+			Name:       "1",
+			Language:   "mustache",
+			Produces:   "text/plain",
+			BodyFormat: "text",
+			Body:       "Hello {{name}}!",
+		},
+		{
+			Account:    "janedoe",
+			Name:       "2",
+			Language:   "mustache",
+			Produces:   "text/plain",
+			BodyFormat: "text",
+			Body:       "Hello {{name}}!",
+		},
 	}
 
-	defer tester.Close()
-	defer tester.Logout()
+	t.Cleanup(func() {
+		tester.Close()
+		tester.Logout()
+	})
 	tester.Login("admin", "admin")
 
 	tester.CreateUser("janedoe", "janedoe")
+	tester.Logout()
 	tester.Login("janedoe", "janedoe")
 
 	t.Run("Update non-existent template", func(t *testing.T) {
+		t.Parallel()
 		r := tester.APITest("template_update").
-			Put("/api/v1/template/janedoe/hello").
+			Put("/api/v1/template/janedoe/unknown").
 			JSON(&models.Template{}).
 			Expect(t).
 			Status(http.StatusNotFound).
@@ -53,21 +68,23 @@
 	})
 
 	t.Run("Update body", func(t *testing.T) {
-		defer func() {
+		t.Parallel()
+
+		t.Cleanup(func() {
 			_, _ = database.Exec(tester.DB, squirrel.Delete(models.TemplateDBTable), &log)
-		}()
+		}())
 
 		var responseTemplate models.Template
 
 		tester.CreateTemplate(
 			"janedoe",
-			&tmpl,
+			&tmpls[0],
 			&responseTemplate,
 		)
 
 		responseTemplate.Body = "Hi {{name}}!"
 		r := tester.APITest("template_update").
-			Put("/api/v1/template/janedoe/hello").
+			Put("/api/v1/template/janedoe/" + tmpls[0].Name).
 			JSON(&responseTemplate).
 			Expect(t).
 			Status(http.StatusOK).
@@ -78,21 +95,23 @@
 	})
 
 	t.Run("Rename", func(t *testing.T) {
-		defer func() {
+		t.Parallel()
+
+		t.Cleanup(func() {
 			_, _ = database.Exec(tester.DB, squirrel.Delete(models.TemplateDBTable), &log)
-		}()
+		}())
 
 		var responseTemplate models.Template
 
 		tester.CreateTemplate(
 			"janedoe",
-			&tmpl,
+			&tmpls[1],
 			&responseTemplate,
 		)
 
 		responseTemplate.Name = "hi"
 		r := tester.APITest("template_update").
-			Put("/api/v1/template/janedoe/hello").
+			Put("/api/v1/template/janedoe/" + tmpls[1].Name).
 			JSON(&responseTemplate).
 			Expect(t).
 			Status(http.StatusOK).
diff --git a/restapi/handlers/renderlogs_test.go b/restapi/handlers/renderlogs_test.go
--- a/restapi/handlers/renderlogs_test.go
+++ b/restapi/handlers/renderlogs_test.go
@@ -15,12 +15,14 @@
 )
 
 func TestRenderLogs(t *testing.T) {
+	t.Parallel()
 	ctx, cancel := testutils.GetContext(t)
-	defer cancel()
-
 	tester := apitester.NewAPITester(ctx, t, nil)
-	defer tester.Close()
-
+	t.Cleanup(func() {
+		tester.Close()
+		tester.Logout()
+		cancel()
+	})
 	now := time.Now()
 	tester.SetNow(now)
 	// db := database.NewSQLHelper(ctx, tester.DB, tester.Logger)
@@ -77,8 +79,6 @@
 
 	tester.Logout()
 	tester.Login("admin", "admin")
-
-	defer tester.Logout()
 	csvFilename := strconv.Itoa(tester.Now().Year()) +
 		"-" +
 		fmt.Sprintf("%02d", int(tester.Now().Month())) +
diff --git a/restapi/handlers/user-get_test.go b/restapi/handlers/user-get_test.go
--- a/restapi/handlers/user-get_test.go
+++ b/restapi/handlers/user-get_test.go
@@ -44,6 +44,7 @@
 }
 
 func TestUserGet(t *testing.T) {
+	t.Parallel()
 	log := testutils.GetLogger(t)
 	ctx, cancel := testutils.GetContext(t)
 	ctx = log.WithContext(ctx)
@@ -51,7 +52,7 @@
 	defer cancel()
 
 	tester := apitester.NewAPITester(ctx, t, nil)
-	defer tester.Close()
+	t.Cleanup(tester.Close)
 
 	// login as admin and create a user
 	tester.Login("admin", "admin")
@@ -66,6 +67,7 @@
 	tester.Logout()
 
 	t.Run("unauthorized", func(t *testing.T) {
+		t.Parallel()
 		// try and get the list as johndoe_1
 		tester.Login("johndoe", "johndoe")
 		defer tester.Logout()
@@ -76,6 +78,7 @@
 			End()
 	})
 	t.Run("basic", func(t *testing.T) {
+		t.Parallel()
 		tester.Login("admin", "admin")
 		defer tester.Logout()
 		r := tester.APITest("user_get").
diff --git a/restapi/handlers/user-list_test.go b/restapi/handlers/user-list_test.go
--- a/restapi/handlers/user-list_test.go
+++ b/restapi/handlers/user-list_test.go
@@ -13,6 +13,7 @@
 )
 
 func TestUserList(t *testing.T) {
+	t.Parallel()
 	log := testutils.GetLogger(t)
 	ctx, cancel := testutils.GetContext(t)
 	ctx = log.WithContext(ctx)
@@ -20,7 +21,7 @@
 	defer cancel()
 
 	tester := apitester.NewAPITester(ctx, t, nil)
-	defer tester.Close()
+	t.Cleanup(tester.Close)
 
 	// login as admin and create 10 users
 	tester.Login("admin", "admin")
@@ -34,6 +35,7 @@
 
 	tester.Logout()
 	t.Run("unauthorized", func(t *testing.T) {
+		t.Parallel()
 		// try and get the list as johndoe_1
 		tester.Login("johndoe_1", "password1")
 		defer tester.Logout()
@@ -44,6 +46,7 @@
 			End()
 	})
 	t.Run("basic", func(t *testing.T) {
+		t.Parallel()
 		tester.Login("admin", "admin")
 		defer tester.Logout()
 		r := tester.APITest("user_list").
diff --git a/restapi/handlers/user-update_test.go b/restapi/handlers/user-update_test.go
--- a/restapi/handlers/user-update_test.go
+++ b/restapi/handlers/user-update_test.go
@@ -12,6 +12,7 @@
 )
 
 func TestUserUpdate(t *testing.T) {
+	t.Parallel()
 	log := testutils.GetLogger(t)
 	ctx, cancel := testutils.GetContext(t)
 	ctx = log.WithContext(ctx)
@@ -19,7 +20,7 @@
 	defer cancel()
 
 	tester := apitester.NewAPITester(ctx, t, nil)
-	defer tester.Close()
+	t.Cleanup(tester.Close)
 
 	// login as admin and create a user
 	tester.Login("admin", "admin")
@@ -52,6 +53,7 @@
 	tester.Logout()
 
 	t.Run("unauthorized", func(t *testing.T) {
+		t.Parallel()
 		tester.Login("janedoe", "janedoe")
 		defer tester.Logout()
 		_ = tester.APITest("user_update").
@@ -62,6 +64,7 @@
 			End()
 	})
 	t.Run("basic", func(t *testing.T) {
+		t.Parallel()
 		tester.Login("johndoe", "johndoe")
 		defer tester.Logout()
 		r := tester.APITest("user_update").
diff --git a/utils/parse_period_test.go b/utils/parse_period_test.go
--- a/utils/parse_period_test.go
+++ b/utils/parse_period_test.go
@@ -9,6 +9,7 @@
 )
 
 func TestParsePeriod(t *testing.T) {
+	t.Parallel()
 	for _, tt := range []struct {
 		period         string
 		expectedError  string
@@ -36,6 +37,7 @@
 		},
 	} {
 		t.Run(tt.period, func(t *testing.T) {
+			t.Parallel()
 			p, err := utils.ParsePeriod(tt.period)
 			if err != nil {
 				require.EqualError(t, err, tt.expectedError)