Skip to content

Commit 23e0da9

Browse files
committed
tests: add tests for resources controller
1 parent 39beed7 commit 23e0da9

3 files changed

Lines changed: 87 additions & 38 deletions

File tree

internal/controller/oidc_controller_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"encoding/json"
55
"net/http/httptest"
66
"net/url"
7+
"os"
78
"strings"
89
"testing"
910

@@ -457,4 +458,16 @@ func TestOIDCController(t *testing.T) {
457458
test.run(t, router, recorder)
458459
})
459460
}
461+
462+
err = db.Close()
463+
assert.NoError(t, err)
464+
465+
err = os.Remove("/tmp/tinyauth_test.db")
466+
assert.NoError(t, err)
467+
468+
err = os.Remove(oidcServiceCfg.PrivateKeyPath)
469+
assert.NoError(t, err)
470+
471+
err = os.Remove(oidcServiceCfg.PublicKeyPath)
472+
assert.NoError(t, err)
460473
}

internal/controller/resources_controller_test.go

Lines changed: 67 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -5,55 +5,84 @@ import (
55
"os"
66
"testing"
77

8-
"github.com/steveiliop56/tinyauth/internal/controller"
9-
108
"github.com/gin-gonic/gin"
11-
"gotest.tools/v3/assert"
9+
"github.com/steveiliop56/tinyauth/internal/controller"
10+
"github.com/stretchr/testify/assert"
1211
)
1312

14-
func TestResourcesHandler(t *testing.T) {
15-
// Setup
16-
gin.SetMode(gin.TestMode)
17-
router := gin.New()
18-
group := router.Group("/")
19-
20-
ctrl := controller.NewResourcesController(controller.ResourcesControllerConfig{
21-
Path: "/tmp/tinyauth",
13+
func TestResourcesController(t *testing.T) {
14+
resourcesControllerCfg := controller.ResourcesControllerConfig{
15+
Path: "/tmp/testfiles",
2216
Enabled: true,
23-
}, group)
24-
ctrl.SetupRoutes()
17+
}
18+
19+
type testCase struct {
20+
description string
21+
run func(t *testing.T, router *gin.Engine, recorder *httptest.ResponseRecorder)
22+
}
23+
24+
tests := []testCase{
25+
{
26+
description: "Ensure resources endpoint returns 200 OK for existing file",
27+
run: func(t *testing.T, router *gin.Engine, recorder *httptest.ResponseRecorder) {
28+
req := httptest.NewRequest("GET", "/resources/testfile.txt", nil)
29+
router.ServeHTTP(recorder, req)
30+
31+
assert.Equal(t, 200, recorder.Code)
32+
assert.Equal(t, "This is a test file.", recorder.Body.String())
33+
},
34+
},
35+
{
36+
description: "Ensure resources endpoint returns 404 Not Found for non-existing file",
37+
run: func(t *testing.T, router *gin.Engine, recorder *httptest.ResponseRecorder) {
38+
req := httptest.NewRequest("GET", "/resources/nonexistent.txt", nil)
39+
router.ServeHTTP(recorder, req)
40+
41+
assert.Equal(t, 404, recorder.Code)
42+
},
43+
},
44+
{
45+
description: "Ensure resources controller denies path traversal",
46+
run: func(t *testing.T, router *gin.Engine, recorder *httptest.ResponseRecorder) {
47+
req := httptest.NewRequest("GET", "/resources/../somefile.txt", nil)
48+
router.ServeHTTP(recorder, req)
49+
50+
assert.Equal(t, 404, recorder.Code)
51+
},
52+
},
53+
}
2554

26-
// Create test data
27-
err := os.Mkdir("/tmp/tinyauth", 0755)
28-
assert.NilError(t, err)
29-
defer os.RemoveAll("/tmp/tinyauth")
55+
err := os.MkdirAll(resourcesControllerCfg.Path, 0777)
56+
assert.NoError(t, err)
3057

31-
file, err := os.Create("/tmp/tinyauth/test.txt")
32-
assert.NilError(t, err)
58+
testFilePath := resourcesControllerCfg.Path + "/testfile.txt"
59+
err = os.WriteFile(testFilePath, []byte("This is a test file."), 0777)
60+
assert.NoError(t, err)
3361

34-
_, err = file.WriteString("This is a test file.")
35-
assert.NilError(t, err)
36-
file.Close()
62+
testFilePathParent := resourcesControllerCfg.Path + "/../somefile.txt"
63+
err = os.WriteFile(testFilePathParent, []byte("This file should not be accessible."), 0777)
64+
assert.NoError(t, err)
3765

38-
// Test existing file
39-
req := httptest.NewRequest("GET", "/resources/test.txt", nil)
40-
recorder := httptest.NewRecorder()
41-
router.ServeHTTP(recorder, req)
66+
for _, test := range tests {
67+
t.Run(test.description, func(t *testing.T) {
68+
router := gin.Default()
69+
group := router.Group("/")
70+
gin.SetMode(gin.TestMode)
4271

43-
assert.Equal(t, 200, recorder.Code)
44-
assert.Equal(t, "This is a test file.", recorder.Body.String())
72+
resourcesController := controller.NewResourcesController(resourcesControllerCfg, group)
73+
resourcesController.SetupRoutes()
4574

46-
// Test non-existing file
47-
req = httptest.NewRequest("GET", "/resources/nonexistent.txt", nil)
48-
recorder = httptest.NewRecorder()
49-
router.ServeHTTP(recorder, req)
75+
recorder := httptest.NewRecorder()
76+
test.run(t, router, recorder)
77+
})
78+
}
5079

51-
assert.Equal(t, 404, recorder.Code)
80+
err = os.Remove(testFilePath)
81+
assert.NoError(t, err)
5282

53-
// Test directory traversal attack
54-
req = httptest.NewRequest("GET", "/resources/../etc/passwd", nil)
55-
recorder = httptest.NewRecorder()
56-
router.ServeHTTP(recorder, req)
83+
err = os.Remove(testFilePathParent)
84+
assert.NoError(t, err)
5785

58-
assert.Equal(t, 404, recorder.Code)
86+
err = os.Remove(resourcesControllerCfg.Path)
87+
assert.NoError(t, err)
5988
}

internal/controller/user_controller_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package controller_test
33
import (
44
"encoding/json"
55
"net/http/httptest"
6+
"os"
67
"slices"
78
"strings"
89
"testing"
@@ -344,4 +345,10 @@ func TestUserController(t *testing.T) {
344345
test.run(t, router, recorder)
345346
})
346347
}
348+
349+
err = db.Close()
350+
assert.NoError(t, err)
351+
352+
err = os.Remove("/tmp/tinyauth_test.db")
353+
assert.NoError(t, err)
347354
}

0 commit comments

Comments
 (0)