docs: add integration test run instructions to README.md

- Added section 8 'Тестирование' with run instructions, structure, features, and diagnostics
- Also includes test file route path adjustments and import reordering
This commit is contained in:
valitovgaziz
2026-06-12 08:46:20 +05:00
parent 01e8226c2b
commit 75198ed00f
8 changed files with 934 additions and 973 deletions
@@ -1,16 +1,14 @@
package integration
import (
"api_yal/tests/testutils"
"fmt"
"testing"
"api_yal/tests/testutils"
)
// TestObjectEndpoints тестирует все эндпоинты для работы с объектами (местами, заведениями)
// Включает создание, получение, обновление, удаление объектов, поиск и геопоиск
func TestObjectEndpoints(t *testing.T) {
config := testutils.NewTestConfig()
// CreateObject тестирует создание нового объекта пользователем
t.Run("CreateObject", func(t *testing.T) {
user := config.CreateTestUser(t)
defer config.CleanupTestUser(t, user)
@@ -55,14 +53,13 @@ func TestObjectEndpoints(t *testing.T) {
}
})
// GetObjectByID тестирует получение объекта по ID
t.Run("GetObjectByID", func(t *testing.T) {
user := config.CreateTestUser(t)
defer config.CleanupTestUser(t, user)
objectID := config.CreateTestObject(t, user.Token)
resp, err := config.Request("GET", "/objects/"+string(rune(objectID)), nil, "")
resp, err := config.Request("GET", "/objects/"+fmt.Sprintf("%d", objectID), nil, "")
if err != nil {
t.Fatalf("Failed to get object: %v", err)
}
@@ -82,7 +79,6 @@ func TestObjectEndpoints(t *testing.T) {
}
})
// GetNonExistentObject тестирует получение несуществующего объекта
t.Run("GetNonExistentObject", func(t *testing.T) {
resp, err := config.Request("GET", "/objects/999999", nil, "")
if err != nil {
@@ -95,7 +91,6 @@ func TestObjectEndpoints(t *testing.T) {
}
})
// UpdateObject тестирует обновление объекта его владельцем
t.Run("UpdateObject", func(t *testing.T) {
user := config.CreateTestUser(t)
defer config.CleanupTestUser(t, user)
@@ -108,7 +103,7 @@ func TestObjectEndpoints(t *testing.T) {
"short_description": "Updated short desc",
}
resp, err := config.Request("PUT", "/objects/"+string(rune(objectID)), updateData, user.Token)
resp, err := config.Request("PUT", "/objects/"+fmt.Sprintf("%d", objectID), updateData, user.Token)
if err != nil {
t.Fatalf("Failed to update object: %v", err)
}
@@ -128,7 +123,6 @@ func TestObjectEndpoints(t *testing.T) {
}
})
// UpdateObjectUnauthorized тестирует попытку обновления чужого объекта
t.Run("UpdateObjectUnauthorized", func(t *testing.T) {
user1 := config.CreateTestUser(t)
defer config.CleanupTestUser(t, user1)
@@ -138,8 +132,7 @@ func TestObjectEndpoints(t *testing.T) {
objectID := config.CreateTestObject(t, user1.Token)
// Пользователь user2 пытается обновить объект user1
resp, err := config.Request("PUT", "/objects/"+string(rune(objectID)), map[string]interface{}{
resp, err := config.Request("PUT", "/objects/"+fmt.Sprintf("%d", objectID), map[string]interface{}{
"short_name": "Hacked Name",
}, user2.Token)
if err != nil {
@@ -147,18 +140,15 @@ func TestObjectEndpoints(t *testing.T) {
}
defer resp.Body.Close()
// Ожидаем ошибку 403 Forbidden
if resp.StatusCode != 403 {
t.Errorf("Expected status 403, got %d", resp.StatusCode)
}
})
// ListObjects тестирует получение списка объектов с пагинацией
t.Run("ListObjects", func(t *testing.T) {
user := config.CreateTestUser(t)
defer config.CleanupTestUser(t, user)
// Создаем несколько объектов
for i := 0; i < 3; i++ {
config.CreateTestObject(t, user.Token)
}
@@ -183,12 +173,11 @@ func TestObjectEndpoints(t *testing.T) {
}
})
// SearchObjects тестирует поиск объектов по тексту
t.Run("SearchObjects", func(t *testing.T) {
user := config.CreateTestUser(t)
defer config.CleanupTestUser(t, user)
objectID := config.CreateTestObject(t, user.Token)
config.CreateTestObject(t, user.Token)
resp, err := config.Request("GET", "/objects/search?q=Test", nil, "")
if err != nil {
@@ -206,10 +195,8 @@ func TestObjectEndpoints(t *testing.T) {
}
t.Logf("Search results: %+v", searchResults)
_ = objectID // Используем переменную для избежания предупреждения
})
// NearbyObjects тестирует поиск объектов рядом с заданными координатами
t.Run("NearbyObjects", func(t *testing.T) {
user := config.CreateTestUser(t)
defer config.CleanupTestUser(t, user)
@@ -225,14 +212,13 @@ func TestObjectEndpoints(t *testing.T) {
}
})
// DeleteObject тестирует удаление объекта
t.Run("DeleteObject", func(t *testing.T) {
user := config.CreateTestUser(t)
defer config.CleanupTestUser(t, user)
objectID := config.CreateTestObject(t, user.Token)
resp, err := config.Request("DELETE", "/objects/"+string(rune(objectID)), nil, user.Token)
resp, err := config.Request("DELETE", "/objects/"+fmt.Sprintf("%d", objectID), nil, user.Token)
if err != nil {
t.Fatalf("Failed to delete object: %v", err)
}
@@ -242,8 +228,7 @@ func TestObjectEndpoints(t *testing.T) {
t.Errorf("Expected status 204, got %d", resp.StatusCode)
}
// Проверяем, что объект удален - должен вернуть 404
getResp, err := config.Request("GET", "/objects/"+string(rune(objectID)), nil, "")
getResp, err := config.Request("GET", "/objects/"+fmt.Sprintf("%d", objectID), nil, "")
if err != nil {
t.Fatalf("Failed to get object: %v", err)
}
@@ -253,4 +238,4 @@ func TestObjectEndpoints(t *testing.T) {
t.Errorf("Expected status 404 for deleted object, got %d", getResp.StatusCode)
}
})
}
}