Skip to content

Commit b09064a

Browse files
FEATURE (storages): Add tests for storages controller
1 parent bcff023 commit b09064a

File tree

5 files changed

+502
-23
lines changed

5 files changed

+502
-23
lines changed

backend/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ To run:
1616

1717
> go run /cmd/main.go
1818
19+
To run tests:
20+
21+
> go test ./internal/...
22+
1923
Before commit (make sure `golangci-lint` is installed):
2024

2125
> golangci-lint fmt
Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
package storages
2+
3+
import (
4+
"net/http"
5+
local_storage "postgresus-backend/internal/features/storages/storages/local"
6+
"postgresus-backend/internal/features/users"
7+
test_utils "postgresus-backend/internal/util/testing"
8+
"testing"
9+
10+
"github.com/gin-gonic/gin"
11+
"github.com/google/uuid"
12+
"github.com/stretchr/testify/assert"
13+
)
14+
15+
func Test_SaveNewStorage_StorageReturnedViaGet(t *testing.T) {
16+
user := users.GetUser()
17+
router := createRouter()
18+
storage := createTestStorage(user.UserID)
19+
20+
var savedStorage Storage
21+
test_utils.MakePostRequestAndUnmarshal(
22+
t, router, "/api/v1/storages", user.Token, storage, http.StatusOK, &savedStorage,
23+
)
24+
25+
verifyStorageData(t, storage, &savedStorage)
26+
assert.NotEmpty(t, savedStorage.ID)
27+
28+
// Verify storage is returned via GET
29+
var retrievedStorage Storage
30+
test_utils.MakeGetRequestAndUnmarshal(
31+
t,
32+
router,
33+
"/api/v1/storages/"+savedStorage.ID.String(),
34+
user.Token,
35+
http.StatusOK,
36+
&retrievedStorage,
37+
)
38+
39+
verifyStorageData(t, &savedStorage, &retrievedStorage)
40+
41+
// Verify storage is returned via GET all storages
42+
var storages []Storage
43+
test_utils.MakeGetRequestAndUnmarshal(
44+
t, router, "/api/v1/storages", user.Token, http.StatusOK, &storages,
45+
)
46+
47+
assert.Contains(t, storages, savedStorage)
48+
}
49+
50+
func Test_UpdateExistingStorage_UpdatedStorageReturnedViaGet(t *testing.T) {
51+
user := users.GetUser()
52+
router := createRouter()
53+
storage := createTestStorage(user.UserID)
54+
55+
// Save initial storage
56+
var savedStorage Storage
57+
test_utils.MakePostRequestAndUnmarshal(
58+
t, router, "/api/v1/storages", user.Token, storage, http.StatusOK, &savedStorage,
59+
)
60+
61+
// Modify storage name
62+
updatedName := "Updated Storage " + uuid.New().String()
63+
savedStorage.Name = updatedName
64+
65+
// Update storage
66+
var updatedStorage Storage
67+
test_utils.MakePostRequestAndUnmarshal(
68+
t, router, "/api/v1/storages", user.Token, savedStorage, http.StatusOK, &updatedStorage,
69+
)
70+
71+
// Verify updated data
72+
assert.Equal(t, updatedName, updatedStorage.Name)
73+
assert.Equal(t, savedStorage.ID, updatedStorage.ID)
74+
75+
// Verify through GET
76+
var retrievedStorage Storage
77+
test_utils.MakeGetRequestAndUnmarshal(
78+
t,
79+
router,
80+
"/api/v1/storages/"+updatedStorage.ID.String(),
81+
user.Token,
82+
http.StatusOK,
83+
&retrievedStorage,
84+
)
85+
86+
verifyStorageData(t, &updatedStorage, &retrievedStorage)
87+
88+
// Verify storage is returned via GET all storages
89+
var storages []Storage
90+
test_utils.MakeGetRequestAndUnmarshal(
91+
t, router, "/api/v1/storages", user.Token, http.StatusOK, &storages,
92+
)
93+
94+
assert.Contains(t, storages, updatedStorage)
95+
}
96+
97+
func Test_DeleteStorage_StorageNotReturnedViaGet(t *testing.T) {
98+
user := users.GetUser()
99+
router := createRouter()
100+
storage := createTestStorage(user.UserID)
101+
102+
// Save initial storage
103+
var savedStorage Storage
104+
test_utils.MakePostRequestAndUnmarshal(
105+
t, router, "/api/v1/storages", user.Token, storage, http.StatusOK, &savedStorage,
106+
)
107+
108+
// Delete storage
109+
test_utils.MakeDeleteRequest(
110+
t, router, "/api/v1/storages/"+savedStorage.ID.String(), user.Token, http.StatusOK,
111+
)
112+
113+
// Try to get deleted storage, should return error
114+
response := test_utils.MakeGetRequest(
115+
t, router, "/api/v1/storages/"+savedStorage.ID.String(), user.Token, http.StatusBadRequest,
116+
)
117+
118+
assert.Contains(t, string(response.Body), "error")
119+
120+
// Verify storage is not returned via GET all storages
121+
var storages []Storage
122+
test_utils.MakeGetRequestAndUnmarshal(
123+
t, router, "/api/v1/storages", user.Token, http.StatusOK, &storages,
124+
)
125+
126+
assert.NotContains(t, storages, savedStorage)
127+
}
128+
129+
func Test_TestDirectStorageConnection_ConnectionEstablished(t *testing.T) {
130+
user := users.GetUser()
131+
router := createRouter()
132+
storage := createTestStorage(user.UserID)
133+
134+
response := test_utils.MakePostRequest(
135+
t, router, "/api/v1/storages/direct-test", user.Token, storage, http.StatusOK,
136+
)
137+
138+
assert.Contains(t, string(response.Body), "successful")
139+
}
140+
141+
func Test_TestExistingStorageConnection_ConnectionEstablished(t *testing.T) {
142+
user := users.GetUser()
143+
router := createRouter()
144+
storage := createTestStorage(user.UserID)
145+
146+
var savedStorage Storage
147+
test_utils.MakePostRequestAndUnmarshal(
148+
t, router, "/api/v1/storages", user.Token, storage, http.StatusOK, &savedStorage,
149+
)
150+
151+
// Test connection to existing storage
152+
response := test_utils.MakePostRequest(
153+
t,
154+
router,
155+
"/api/v1/storages/"+savedStorage.ID.String()+"/test",
156+
user.Token,
157+
nil,
158+
http.StatusOK,
159+
)
160+
161+
assert.Contains(t, string(response.Body), "successful")
162+
}
163+
164+
func Test_CallAllMethodsWithoutAuth_UnauthorizedErrorReturned(t *testing.T) {
165+
router := createRouter()
166+
storage := createTestStorage(uuid.New())
167+
168+
// Test endpoints without auth
169+
endpoints := []struct {
170+
method string
171+
url string
172+
body interface{}
173+
}{
174+
{"GET", "/api/v1/storages", nil},
175+
{"GET", "/api/v1/storages/" + uuid.New().String(), nil},
176+
{"POST", "/api/v1/storages", storage},
177+
{"DELETE", "/api/v1/storages/" + uuid.New().String(), nil},
178+
{"POST", "/api/v1/storages/" + uuid.New().String() + "/test", nil},
179+
{"POST", "/api/v1/storages/direct-test", storage},
180+
}
181+
182+
for _, endpoint := range endpoints {
183+
testUnauthorizedEndpoint(t, router, endpoint.method, endpoint.url, endpoint.body)
184+
}
185+
}
186+
187+
func testUnauthorizedEndpoint(
188+
t *testing.T,
189+
router *gin.Engine,
190+
method, url string,
191+
body interface{},
192+
) {
193+
test_utils.MakeRequest(t, router, test_utils.RequestOptions{
194+
Method: method,
195+
URL: url,
196+
Body: body,
197+
ExpectedStatus: http.StatusUnauthorized,
198+
})
199+
}
200+
201+
func createRouter() *gin.Engine {
202+
gin.SetMode(gin.TestMode)
203+
router := gin.New()
204+
controller := GetStorageController()
205+
v1 := router.Group("/api/v1")
206+
controller.RegisterRoutes(v1)
207+
return router
208+
}
209+
210+
func createTestStorage(userID uuid.UUID) *Storage {
211+
return &Storage{
212+
UserID: userID,
213+
Type: StorageTypeLocal,
214+
Name: "Test Storage " + uuid.New().String(),
215+
LocalStorage: &local_storage.LocalStorage{},
216+
}
217+
}
218+
219+
func verifyStorageData(t *testing.T, expected *Storage, actual *Storage) {
220+
assert.Equal(t, expected.Name, actual.Name)
221+
assert.Equal(t, expected.Type, actual.Type)
222+
assert.Equal(t, expected.UserID, actual.UserID)
223+
}

backend/internal/features/users/service.go

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -70,29 +70,7 @@ func (s *UserService) SignIn(request *SignInRequest) (*SignInResponse, error) {
7070
return nil, errors.New("password is incorrect")
7171
}
7272

73-
secretKey, err := s.secretKeyRepository.GetSecretKey()
74-
if err != nil {
75-
return nil, fmt.Errorf("failed to get secret key: %w", err)
76-
}
77-
78-
tenYearsExpiration := time.Now().UTC().Add(time.Hour * 24 * 365 * 10)
79-
80-
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
81-
"sub": user.ID,
82-
"exp": tenYearsExpiration.Unix(),
83-
"iat": time.Now().UTC().Unix(),
84-
"role": string(user.Role),
85-
})
86-
87-
tokenString, err := token.SignedString([]byte(secretKey))
88-
if err != nil {
89-
return nil, fmt.Errorf("failed to generate token: %w", err)
90-
}
91-
92-
return &SignInResponse{
93-
UserID: user.ID,
94-
Token: tokenString,
95-
}, nil
73+
return s.GenerateAccessToken(user)
9674
}
9775

9876
func (s *UserService) GetUserFromToken(token string) (*user_models.User, error) {
@@ -151,3 +129,33 @@ func (s *UserService) ChangePassword(newPassword string) error {
151129

152130
return nil
153131
}
132+
133+
func (s *UserService) GetFirstUser() (*user_models.User, error) {
134+
return s.userRepository.GetFirstUser()
135+
}
136+
137+
func (s *UserService) GenerateAccessToken(user *user_models.User) (*SignInResponse, error) {
138+
secretKey, err := s.secretKeyRepository.GetSecretKey()
139+
if err != nil {
140+
return nil, fmt.Errorf("failed to get secret key: %w", err)
141+
}
142+
143+
tenYearsExpiration := time.Now().UTC().Add(time.Hour * 24 * 365 * 10)
144+
145+
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
146+
"sub": user.ID,
147+
"exp": tenYearsExpiration.Unix(),
148+
"iat": time.Now().UTC().Unix(),
149+
"role": string(user.Role),
150+
})
151+
152+
tokenString, err := token.SignedString([]byte(secretKey))
153+
if err != nil {
154+
return nil, fmt.Errorf("failed to generate token: %w", err)
155+
}
156+
157+
return &SignInResponse{
158+
UserID: user.ID,
159+
Token: tokenString,
160+
}, nil
161+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package users
2+
3+
func GetUser() *SignInResponse {
4+
isAnyUserExists, err := userService.IsAnyUserExist()
5+
if err != nil {
6+
panic(err)
7+
}
8+
9+
if !isAnyUserExists {
10+
err = userService.SignUp(&SignUpRequest{
11+
12+
Password: "test",
13+
})
14+
15+
if err != nil {
16+
panic(err)
17+
}
18+
}
19+
20+
user, err := userService.GetFirstUser()
21+
if err != nil {
22+
panic(err)
23+
}
24+
25+
signInResponse, err := userService.GenerateAccessToken(user)
26+
if err != nil {
27+
panic(err)
28+
}
29+
30+
return signInResponse
31+
}

0 commit comments

Comments
 (0)