@@ -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}
0 commit comments