On branch main
new file: main_dc/yalarba/api_yal/cmd/testrunner/README.md new file: main_dc/yalarba/api_yal/cmd/testrunner/main.go new file: main_dc/yalarba/api_yal/cmd/testrunner/runner.go deleted: main_dc/yalarba/api_yal/test/intergration/auth_integration_test.go deleted: main_dc/yalarba/api_yal/test/intergration/objects_integration_test.go deleted: main_dc/yalarba/api_yal/test/intergration/setup_test.go deleted: main_dc/yalarba/api_yal/test/setup_test.go new file: main_dc/yalarba/api_yal/tests/integration/account_test.go new file: main_dc/yalarba/api_yal/tests/integration/appeal_test.go new file: main_dc/yalarba/api_yal/tests/integration/auth_test.go new file: main_dc/yalarba/api_yal/tests/integration/comment_test.go new file: main_dc/yalarba/api_yal/tests/integration/feedback_test.go new file: main_dc/yalarba/api_yal/tests/integration/object_test.go new file: main_dc/yalarba/api_yal/tests/integration/rating_test.go new file: main_dc/yalarba/api_yal/tests/testutils/client.go new file: main_dc/yalarba/api_yal/tests/testutils/fixtures.go new file: main_dc/yalarba/api_yal/tests/testutils/setup.go write tests
This commit is contained in:
@@ -0,0 +1,159 @@
|
||||
package integration
|
||||
|
||||
import (
|
||||
"api_yal/tests/testutils"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestAccountEndpoints(t *testing.T) {
|
||||
config := testutils.NewTestConfig()
|
||||
|
||||
t.Run("GetProfile", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
resp, err := config.Request("GET", "/account/profile", nil, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get profile: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
var profile map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &profile); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
expectedFields := []string{"id", "email", "full_name", "first_name", "last_name", "role", "stats"}
|
||||
for _, field := range expectedFields {
|
||||
if _, ok := profile[field]; !ok {
|
||||
t.Errorf("Expected field %s not found", field)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("GetOwnAccount", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
resp, err := config.Request("GET", "/account", nil, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get account: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("UpdateAccount", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
updateData := map[string]interface{}{
|
||||
"phone": "+79998887766",
|
||||
"city": "Moscow",
|
||||
}
|
||||
|
||||
resp, err := config.Request("PUT", "/account", updateData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to update account: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
var updatedAccount map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &updatedAccount); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
if phone, ok := updatedAccount["phone"].(string); !ok || phone != "+79998887766" {
|
||||
t.Error("Phone number not updated correctly")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("ChangePassword", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
newPassword := "newpass123"
|
||||
resp, err := config.Request("POST", "/account/change-password", map[string]interface{}{
|
||||
"current_password": user.Password,
|
||||
"new_password": newPassword,
|
||||
}, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to change password: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
// Проверяем, что можно войти с новым паролем
|
||||
newToken, err := config.GetAuthToken(user.Email, newPassword)
|
||||
if err != nil {
|
||||
t.Errorf("Failed to login with new password: %v", err)
|
||||
}
|
||||
if newToken == "" {
|
||||
t.Error("Failed to get token with new password")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("ChangePasswordWrongCurrent", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
resp, err := config.Request("POST", "/account/change-password", map[string]interface{}{
|
||||
"current_password": "wrongpassword",
|
||||
"new_password": "newpass123",
|
||||
}, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to change password: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 400 && resp.StatusCode != 401 {
|
||||
t.Errorf("Expected status 400 or 401, got %d", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("DeleteAccount", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
|
||||
resp, err := config.Request("DELETE", "/account", nil, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to delete account: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
// Проверяем, что больше нельзя войти
|
||||
_, err = config.GetAuthToken(user.Email, user.Password)
|
||||
if err == nil {
|
||||
t.Error("Should not be able to login after account deletion")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("UnauthorizedAccess", func(t *testing.T) {
|
||||
resp, err := config.Request("GET", "/account/profile", nil, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to make request: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 401 {
|
||||
t.Errorf("Expected status 401, got %d", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,192 @@
|
||||
package integration
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"api_yal/tests/testutils"
|
||||
)
|
||||
|
||||
func TestAppealEndpoints(t *testing.T) {
|
||||
config := testutils.NewTestConfig()
|
||||
|
||||
t.Run("CreateAppeal", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
appealData := map[string]interface{}{
|
||||
"type": "complaint",
|
||||
"title": "Test Appeal",
|
||||
"message": "This is a test appeal message for testing purposes",
|
||||
"priority": "high",
|
||||
"contact_name": "Test User",
|
||||
"contact_email": user.Email,
|
||||
}
|
||||
|
||||
resp, err := config.Request("POST", "/appeals", appealData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create appeal: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 201 {
|
||||
t.Errorf("Expected status 201, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
var createdAppeal map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &createdAppeal); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
if _, ok := createdAppeal["id"]; !ok {
|
||||
t.Error("Appeal ID not found")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("GetAppealByID", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
// Создаем обращение
|
||||
appealData := map[string]interface{}{
|
||||
"type": "question",
|
||||
"title": "Test Question",
|
||||
"message": "This is a test question",
|
||||
"contact_email": user.Email,
|
||||
}
|
||||
resp, err := config.Request("POST", "/appeals", appealData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create appeal: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
var createdAppeal map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &createdAppeal); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
appealID := createdAppeal["id"].(float64)
|
||||
|
||||
getResp, err := config.Request("GET", "/appeals/"+string(rune(appealID)), nil, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get appeal: %v", err)
|
||||
}
|
||||
defer getResp.Body.Close()
|
||||
|
||||
if getResp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", getResp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("UpdateAppeal", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
// Создаем обращение
|
||||
appealData := map[string]interface{}{
|
||||
"type": "suggestion",
|
||||
"title": "Original Title",
|
||||
"message": "Original message for testing",
|
||||
"contact_email": user.Email,
|
||||
}
|
||||
resp, err := config.Request("POST", "/appeals", appealData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create appeal: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
var createdAppeal map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &createdAppeal); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
appealID := createdAppeal["id"].(float64)
|
||||
|
||||
updateData := map[string]interface{}{
|
||||
"title": "Updated Title",
|
||||
"message": "Updated message content",
|
||||
"priority": "critical",
|
||||
}
|
||||
|
||||
updateResp, err := config.Request("PUT", "/appeals/"+string(rune(appealID)), updateData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to update appeal: %v", err)
|
||||
}
|
||||
defer updateResp.Body.Close()
|
||||
|
||||
if updateResp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", updateResp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("MyAppeals", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
// Создаем несколько обращений
|
||||
for i := 0; i < 3; i++ {
|
||||
appealData := map[string]interface{}{
|
||||
"type": "other",
|
||||
"title": "Test Appeal",
|
||||
"message": "Test message content",
|
||||
}
|
||||
_, err := config.Request("POST", "/appeals", appealData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create appeal: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
resp, err := config.Request("GET", "/appeals/me", nil, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get my appeals: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("DeleteAppeal", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
// Создаем обращение
|
||||
appealData := map[string]interface{}{
|
||||
"type": "question",
|
||||
"title": "To Delete",
|
||||
"message": "This appeal will be deleted",
|
||||
}
|
||||
resp, err := config.Request("POST", "/appeals", appealData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create appeal: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
var createdAppeal map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &createdAppeal); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
appealID := createdAppeal["id"].(float64)
|
||||
|
||||
deleteResp, err := config.Request("DELETE", "/appeals/"+string(rune(appealID)), nil, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to delete appeal: %v", err)
|
||||
}
|
||||
defer deleteResp.Body.Close()
|
||||
|
||||
if deleteResp.StatusCode != 204 {
|
||||
t.Errorf("Expected status 204, got %d", deleteResp.StatusCode)
|
||||
}
|
||||
|
||||
// Проверяем, что обращение удалено
|
||||
getResp, err := config.Request("GET", "/appeals/"+string(rune(appealID)), nil, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get appeal: %v", err)
|
||||
}
|
||||
defer getResp.Body.Close()
|
||||
|
||||
if getResp.StatusCode != 404 {
|
||||
t.Errorf("Expected status 404 for deleted appeal, got %d", getResp.StatusCode)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,215 @@
|
||||
package integration
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"api_yal/tests/testutils"
|
||||
)
|
||||
|
||||
func TestAuthFlow(t *testing.T) {
|
||||
config := testutils.NewTestConfig()
|
||||
|
||||
t.Run("Register", func(t *testing.T) {
|
||||
testData := map[string]interface{}{
|
||||
"email": "testflow@example.com",
|
||||
"password": "test123456",
|
||||
"first_name": "Flow",
|
||||
"last_name": "Test",
|
||||
}
|
||||
|
||||
resp, err := config.Request("POST", "/auth/register", testData, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to register: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 201 {
|
||||
t.Errorf("Expected status 201, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
var result map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &result); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
if _, ok := result["token"]; !ok {
|
||||
t.Error("Token not found in response")
|
||||
}
|
||||
|
||||
if _, ok := result["user"]; !ok {
|
||||
t.Error("User data not found in response")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("Login", func(t *testing.T) {
|
||||
// Сначала создаем пользователя
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
// Тестируем логин
|
||||
resp, err := config.Request("POST", "/auth/login", map[string]interface{}{
|
||||
"email": user.Email,
|
||||
"password": user.Password,
|
||||
}, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to login: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
var result map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &result); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
if _, ok := result["token"]; !ok {
|
||||
t.Error("Token not found in response")
|
||||
}
|
||||
|
||||
// Проверяем, что refresh token установлен в cookie
|
||||
cookies := resp.Cookies()
|
||||
foundRefreshToken := false
|
||||
for _, cookie := range cookies {
|
||||
if cookie.Name == "refresh_token" {
|
||||
foundRefreshToken = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !foundRefreshToken {
|
||||
t.Error("Refresh token cookie not set")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("RefreshToken", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
// Логинимся для получения refresh token в cookie
|
||||
_, err := config.Request("POST", "/auth/login", map[string]interface{}{
|
||||
"email": user.Email,
|
||||
"password": user.Password,
|
||||
}, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to login: %v", err)
|
||||
}
|
||||
|
||||
// Обновляем токен
|
||||
resp, err := config.Request("POST", "/auth/refresh", nil, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to refresh token: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("Logout", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
resp, err := config.Request("POST", "/auth/logout", nil, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to logout: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
var result map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &result); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
if msg, ok := result["message"]; !ok || msg != "Successfully logged out" {
|
||||
t.Error("Logout message not as expected")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("PasswordReset", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
// Запрос сброса пароля
|
||||
resp, err := config.Request("POST", "/auth/password-reset/request", map[string]interface{}{
|
||||
"email": user.Email,
|
||||
}, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to request password reset: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
var result map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &result); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
resetToken, ok := result["token"].(string)
|
||||
if !ok {
|
||||
t.Fatal("Reset token not found in response")
|
||||
}
|
||||
|
||||
// Подтверждение сброса пароля
|
||||
newPassword := "newpassword789"
|
||||
resp, err = config.Request("POST", "/auth/password-reset/confirm", map[string]interface{}{
|
||||
"token": resetToken,
|
||||
"new_password": newPassword,
|
||||
}, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to confirm password reset: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
// Проверяем, что можно войти с новым паролем
|
||||
newToken, err := config.GetAuthToken(user.Email, newPassword)
|
||||
if err != nil {
|
||||
t.Errorf("Failed to login with new password: %v", err)
|
||||
}
|
||||
if newToken == "" {
|
||||
t.Error("Failed to get token with new password")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("MobileLogin", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
resp, err := config.Request("POST", "/auth/mobile/login", map[string]interface{}{
|
||||
"email": user.Email,
|
||||
"password": user.Password,
|
||||
}, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to mobile login: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
var result map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &result); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
requiredFields := []string{"access_token", "refresh_token", "expires_at", "user"}
|
||||
for _, field := range requiredFields {
|
||||
if _, ok := result[field]; !ok {
|
||||
t.Errorf("Required field %s not found in response", field)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,223 @@
|
||||
package integration
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"api_yal/tests/testutils"
|
||||
)
|
||||
|
||||
func TestCommentEndpoints(t *testing.T) {
|
||||
config := testutils.NewTestConfig()
|
||||
|
||||
t.Run("CreateComment", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
objectID := config.CreateTestObject(t, user.Token)
|
||||
feedbackID := config.CreateTestFeedback(t, user.Token, objectID)
|
||||
|
||||
commentData := testutils.CreateCommentRequest{
|
||||
FeedbackID: feedbackID,
|
||||
Text: "Great review! I agree completely.",
|
||||
}
|
||||
|
||||
resp, err := config.Request("POST", "/comments", commentData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create comment: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 201 {
|
||||
t.Errorf("Expected status 201, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
var createdComment map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &createdComment); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
if _, ok := createdComment["id"]; !ok {
|
||||
t.Error("Comment ID not found")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("GetCommentByID", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
objectID := config.CreateTestObject(t, user.Token)
|
||||
feedbackID := config.CreateTestFeedback(t, user.Token, objectID)
|
||||
|
||||
// Создаем комментарий
|
||||
commentData := testutils.CreateCommentRequest{
|
||||
FeedbackID: feedbackID,
|
||||
Text: "Test comment",
|
||||
}
|
||||
resp, err := config.Request("POST", "/comments", commentData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create comment: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
var createdComment map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &createdComment); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
commentID := createdComment["id"].(float64)
|
||||
|
||||
getResp, err := config.Request("GET", "/comments/"+string(rune(commentID)), nil, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get comment: %v", err)
|
||||
}
|
||||
defer getResp.Body.Close()
|
||||
|
||||
if getResp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", getResp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("UpdateComment", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
objectID := config.CreateTestObject(t, user.Token)
|
||||
feedbackID := config.CreateTestFeedback(t, user.Token, objectID)
|
||||
|
||||
// Создаем комментарий
|
||||
commentData := testutils.CreateCommentRequest{
|
||||
FeedbackID: feedbackID,
|
||||
Text: "Original comment",
|
||||
}
|
||||
resp, err := config.Request("POST", "/comments", commentData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create comment: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
var createdComment map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &createdComment); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
commentID := createdComment["id"].(float64)
|
||||
|
||||
updateData := map[string]interface{}{
|
||||
"text": "Updated comment text",
|
||||
}
|
||||
|
||||
updateResp, err := config.Request("PUT", "/comments/"+string(rune(commentID)), updateData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to update comment: %v", err)
|
||||
}
|
||||
defer updateResp.Body.Close()
|
||||
|
||||
if updateResp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", updateResp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("ListComments", func(t *testing.T) {
|
||||
resp, err := config.Request("GET", "/comments?page=1&page_size=20", nil, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to list comments: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("MyComments", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
resp, err := config.Request("GET", "/comments/my", nil, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get my comments: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("CommentsByFeedback", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
objectID := config.CreateTestObject(t, user.Token)
|
||||
feedbackID := config.CreateTestFeedback(t, user.Token, objectID)
|
||||
|
||||
resp, err := config.Request("GET", "/comments/feedback/"+string(rune(feedbackID)), nil, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get comments by feedback: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("CommentStats", func(t *testing.T) {
|
||||
resp, err := config.Request("GET", "/comments/stats", nil, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get comment stats: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
var stats map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &stats); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
expectedFields := []string{"total_comments", "verified_comments", "unverified_comments"}
|
||||
for _, field := range expectedFields {
|
||||
if _, ok := stats[field]; !ok {
|
||||
t.Errorf("Expected field %s not found", field)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("DeleteComment", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
objectID := config.CreateTestObject(t, user.Token)
|
||||
feedbackID := config.CreateTestFeedback(t, user.Token, objectID)
|
||||
|
||||
// Создаем комментарий
|
||||
commentData := testutils.CreateCommentRequest{
|
||||
FeedbackID: feedbackID,
|
||||
Text: "Comment to delete",
|
||||
}
|
||||
resp, err := config.Request("POST", "/comments", commentData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create comment: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
var createdComment map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &createdComment); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
commentID := createdComment["id"].(float64)
|
||||
|
||||
deleteResp, err := config.Request("DELETE", "/comments/"+string(rune(commentID)), nil, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to delete comment: %v", err)
|
||||
}
|
||||
defer deleteResp.Body.Close()
|
||||
|
||||
if deleteResp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", deleteResp.StatusCode)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,217 @@
|
||||
package integration
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"api_yal/tests/testutils"
|
||||
)
|
||||
|
||||
func TestFeedbackEndpoints(t *testing.T) {
|
||||
config := testutils.NewTestConfig()
|
||||
|
||||
t.Run("CreateFeedback", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
objectID := config.CreateTestObject(t, user.Token)
|
||||
|
||||
feedbackData := testutils.CreateFeedbackRequest{
|
||||
ObjectID: objectID,
|
||||
Rating: 5,
|
||||
Text: "Excellent place! Very recommended.",
|
||||
Platform: "tourist",
|
||||
}
|
||||
|
||||
resp, err := config.Request("POST", "/feedbacks", feedbackData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create feedback: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 201 {
|
||||
t.Errorf("Expected status 201, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
var createdFeedback map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &createdFeedback); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
if _, ok := createdFeedback["id"]; !ok {
|
||||
t.Error("Feedback ID not found")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("GetFeedbackByID", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
objectID := config.CreateTestObject(t, user.Token)
|
||||
feedbackID := config.CreateTestFeedback(t, user.Token, objectID)
|
||||
|
||||
resp, err := config.Request("GET", "/feedbacks/"+string(rune(feedbackID)), nil, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get feedback: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("UpdateFeedback", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
objectID := config.CreateTestObject(t, user.Token)
|
||||
feedbackID := config.CreateTestFeedback(t, user.Token, objectID)
|
||||
|
||||
updateData := map[string]interface{}{
|
||||
"rating": 4,
|
||||
"text": "Updated feedback text",
|
||||
}
|
||||
|
||||
resp, err := config.Request("PUT", "/feedbacks/"+string(rune(feedbackID)), updateData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to update feedback: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
var updatedFeedback map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &updatedFeedback); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
if text, ok := updatedFeedback["text"].(string); !ok || text != "Updated feedback text" {
|
||||
t.Error("Feedback text not updated")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("ListFeedbacks", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
resp, err := config.Request("GET", "/feedbacks?offset=0&limit=20", nil, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to list feedbacks: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("MyFeedbacks", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
resp, err := config.Request("GET", "/feedbacks/my", nil, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get my feedbacks: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("FeedbacksByObject", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
objectID := config.CreateTestObject(t, user.Token)
|
||||
|
||||
resp, err := config.Request("GET", "/feedbacks/object/"+string(rune(objectID)), nil, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get object feedbacks: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("FeedbacksByPlatform", func(t *testing.T) {
|
||||
resp, err := config.Request("GET", "/feedbacks/platform/tourist", nil, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get platform feedbacks: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("SearchFeedbacks", func(t *testing.T) {
|
||||
resp, err := config.Request("GET", "/feedbacks/search?q=excellent", nil, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to search feedbacks: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("FeedbackStats", func(t *testing.T) {
|
||||
resp, err := config.Request("GET", "/feedbacks/stats", nil, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get feedback stats: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
var stats map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &stats); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
expectedFields := []string{"total_feedbacks", "average_rating", "rating_distribution", "platform_stats"}
|
||||
for _, field := range expectedFields {
|
||||
if _, ok := stats[field]; !ok {
|
||||
t.Errorf("Expected field %s not found", field)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("DeleteFeedback", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
objectID := config.CreateTestObject(t, user.Token)
|
||||
feedbackID := config.CreateTestFeedback(t, user.Token, objectID)
|
||||
|
||||
resp, err := config.Request("DELETE", "/feedbacks/"+string(rune(feedbackID)), nil, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to delete feedback: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 204 {
|
||||
t.Errorf("Expected status 204, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
// Проверяем, что отзыв удален
|
||||
getResp, err := config.Request("GET", "/feedbacks/"+string(rune(feedbackID)), nil, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get feedback: %v", err)
|
||||
}
|
||||
defer getResp.Body.Close()
|
||||
|
||||
if getResp.StatusCode != 404 {
|
||||
t.Errorf("Expected status 404 for deleted feedback, got %d", getResp.StatusCode)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,243 @@
|
||||
package integration
|
||||
|
||||
import (
|
||||
"api_yal/tests/testutils"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestObjectEndpoints(t *testing.T) {
|
||||
config := testutils.NewTestConfig()
|
||||
|
||||
t.Run("CreateObject", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
objectData := testutils.CreateObjectRequest{
|
||||
ShortName: "Test Cafe",
|
||||
LongName: "Test Cafe on Main Street",
|
||||
Type: "cafe",
|
||||
Phone: "+71234567890",
|
||||
Email: "cafe@test.com",
|
||||
Site: "https://cafe.test.com",
|
||||
ShortDescription: "A test cafe",
|
||||
Description: "This is a test cafe for API testing",
|
||||
Address: "123 Test Street",
|
||||
Latitude: 55.751244,
|
||||
Longitude: 37.618423,
|
||||
IsActive: true,
|
||||
IsVerified: false,
|
||||
}
|
||||
|
||||
resp, err := config.Request("POST", "/objects", objectData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create object: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 201 {
|
||||
t.Errorf("Expected status 201, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
var createdObject map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &createdObject); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
if _, ok := createdObject["id"]; !ok {
|
||||
t.Error("Object ID not found in response")
|
||||
}
|
||||
|
||||
if name, ok := createdObject["short_name"].(string); !ok || name != "Test Cafe" {
|
||||
t.Error("Object name mismatch")
|
||||
}
|
||||
})
|
||||
|
||||
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, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get object: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
var object map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &object); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
if id, ok := object["id"].(float64); !ok || uint(id) != objectID {
|
||||
t.Errorf("Object ID mismatch: expected %d, got %v", objectID, id)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("GetNonExistentObject", func(t *testing.T) {
|
||||
resp, err := config.Request("GET", "/objects/999999", nil, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get object: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 404 {
|
||||
t.Errorf("Expected status 404, got %d", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("UpdateObject", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
objectID := config.CreateTestObject(t, user.Token)
|
||||
|
||||
updateData := map[string]interface{}{
|
||||
"short_name": "Updated Cafe Name",
|
||||
"description": "Updated description",
|
||||
"short_description": "Updated short desc",
|
||||
}
|
||||
|
||||
resp, err := config.Request("PUT", "/objects/"+string(rune(objectID)), updateData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to update object: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
var updatedObject map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &updatedObject); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
if name, ok := updatedObject["short_name"].(string); !ok || name != "Updated Cafe Name" {
|
||||
t.Error("Object name not updated")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("UpdateObjectUnauthorized", func(t *testing.T) {
|
||||
user1 := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user1)
|
||||
|
||||
user2 := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user2)
|
||||
|
||||
objectID := config.CreateTestObject(t, user1.Token)
|
||||
|
||||
resp, err := config.Request("PUT", "/objects/"+string(rune(objectID)), map[string]interface{}{
|
||||
"short_name": "Hacked Name",
|
||||
}, user2.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to update object: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 403 {
|
||||
t.Errorf("Expected status 403, got %d", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
resp, err := config.Request("GET", "/objects?page=1&page_size=10", nil, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to list objects: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
var listResponse map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &listResponse); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
if _, ok := listResponse["items"]; !ok {
|
||||
t.Error("Items field not found in response")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("SearchObjects", 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/search?q=Test", nil, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to search objects: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
var searchResults map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &searchResults); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
t.Logf("Search results: %+v", searchResults)
|
||||
_ = objectID
|
||||
})
|
||||
|
||||
t.Run("NearbyObjects", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
resp, err := config.Request("GET", "/objects/nearby?lat=55.751244&lng=37.618423&radius=1000", nil, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get nearby objects: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
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)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to delete object: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 204 {
|
||||
t.Errorf("Expected status 204, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
// Проверяем, что объект удален
|
||||
getResp, err := config.Request("GET", "/objects/"+string(rune(objectID)), nil, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get object: %v", err)
|
||||
}
|
||||
defer getResp.Body.Close()
|
||||
|
||||
if getResp.StatusCode != 404 {
|
||||
t.Errorf("Expected status 404 for deleted object, got %d", getResp.StatusCode)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,240 @@
|
||||
package integration
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"api_yal/tests/testutils"
|
||||
)
|
||||
|
||||
func TestRatingEndpoints(t *testing.T) {
|
||||
config := testutils.NewTestConfig()
|
||||
|
||||
t.Run("CreateRating", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
objectID := config.CreateTestObject(t, user.Token)
|
||||
|
||||
ratingData := map[string]interface{}{
|
||||
"object_id": objectID,
|
||||
"platform": "tourist",
|
||||
}
|
||||
|
||||
resp, err := config.Request("POST", "/ratings", ratingData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create rating: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 201 {
|
||||
t.Errorf("Expected status 201, got %d", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("CastVote", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
objectID := config.CreateTestObject(t, user.Token)
|
||||
|
||||
// Сначала создаем рейтинг
|
||||
ratingData := map[string]interface{}{
|
||||
"object_id": objectID,
|
||||
"platform": "tourist",
|
||||
}
|
||||
resp, err := config.Request("POST", "/ratings", ratingData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create rating: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
var createdRating map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &createdRating); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
ratingID := createdRating["id"].(float64)
|
||||
|
||||
// Голосуем
|
||||
voteData := map[string]interface{}{
|
||||
"score": 5,
|
||||
}
|
||||
|
||||
voteResp, err := config.Request("POST", "/ratings/"+string(rune(ratingID))+"/vote/tourist", voteData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to cast vote: %v", err)
|
||||
}
|
||||
defer voteResp.Body.Close()
|
||||
|
||||
if voteResp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", voteResp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("GetMyVote", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
objectID := config.CreateTestObject(t, user.Token)
|
||||
|
||||
// Создаем рейтинг и голосуем
|
||||
ratingData := map[string]interface{}{
|
||||
"object_id": objectID,
|
||||
"platform": "tourist",
|
||||
}
|
||||
resp, err := config.Request("POST", "/ratings", ratingData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create rating: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
var createdRating map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &createdRating); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
ratingID := createdRating["id"].(float64)
|
||||
|
||||
voteData := map[string]interface{}{
|
||||
"score": 5,
|
||||
}
|
||||
_, err = config.Request("POST", "/ratings/"+string(rune(ratingID))+"/vote/tourist", voteData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to cast vote: %v", err)
|
||||
}
|
||||
|
||||
// Получаем мой голос
|
||||
myVoteResp, err := config.Request("GET", "/ratings/"+string(rune(ratingID))+"/my-vote/tourist", nil, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get my vote: %v", err)
|
||||
}
|
||||
defer myVoteResp.Body.Close()
|
||||
|
||||
if myVoteResp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", myVoteResp.StatusCode)
|
||||
}
|
||||
|
||||
var voteInfo map[string]interface{}
|
||||
if err := config.ParseResponse(myVoteResp, &voteInfo); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
if hasVoted, ok := voteInfo["has_voted"].(bool); !ok || !hasVoted {
|
||||
t.Error("has_voted should be true")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("UpdateMyVote", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
objectID := config.CreateTestObject(t, user.Token)
|
||||
|
||||
ratingData := map[string]interface{}{
|
||||
"object_id": objectID,
|
||||
"platform": "tourist",
|
||||
}
|
||||
resp, err := config.Request("POST", "/ratings", ratingData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create rating: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
var createdRating map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &createdRating); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
ratingID := createdRating["id"].(float64)
|
||||
|
||||
// Голосуем
|
||||
voteData := map[string]interface{}{
|
||||
"score": 5,
|
||||
}
|
||||
_, err = config.Request("POST", "/ratings/"+string(rune(ratingID))+"/vote/tourist", voteData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to cast vote: %v", err)
|
||||
}
|
||||
|
||||
// Обновляем голос
|
||||
updateData := map[string]interface{}{
|
||||
"score": 4,
|
||||
}
|
||||
updateResp, err := config.Request("PUT", "/ratings/"+string(rune(ratingID))+"/my-vote/tourist", updateData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to update vote: %v", err)
|
||||
}
|
||||
defer updateResp.Body.Close()
|
||||
|
||||
if updateResp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", updateResp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("GetRatingStats", func(t *testing.T) {
|
||||
resp, err := config.Request("GET", "/ratings/stats", nil, "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get rating stats: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
t.Errorf("Expected status 200, got %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
var stats map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &stats); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
expectedFields := []string{"total_ratings", "total_votes", "platform_distribution"}
|
||||
for _, field := range expectedFields {
|
||||
if _, ok := stats[field]; !ok {
|
||||
t.Errorf("Expected field %s not found", field)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("DeleteMyVote", func(t *testing.T) {
|
||||
user := config.CreateTestUser(t)
|
||||
defer config.CleanupTestUser(t, user)
|
||||
|
||||
objectID := config.CreateTestObject(t, user.Token)
|
||||
|
||||
ratingData := map[string]interface{}{
|
||||
"object_id": objectID,
|
||||
"platform": "tourist",
|
||||
}
|
||||
resp, err := config.Request("POST", "/ratings", ratingData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create rating: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
var createdRating map[string]interface{}
|
||||
if err := config.ParseResponse(resp, &createdRating); err != nil {
|
||||
t.Fatalf("Failed to parse response: %v", err)
|
||||
}
|
||||
|
||||
ratingID := createdRating["id"].(float64)
|
||||
|
||||
// Голосуем
|
||||
voteData := map[string]interface{}{
|
||||
"score": 5,
|
||||
}
|
||||
_, err = config.Request("POST", "/ratings/"+string(rune(ratingID))+"/vote/tourist", voteData, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to cast vote: %v", err)
|
||||
}
|
||||
|
||||
// Удаляем голос
|
||||
deleteResp, err := config.Request("DELETE", "/ratings/"+string(rune(ratingID))+"/my-vote/tourist", nil, user.Token)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to delete vote: %v", err)
|
||||
}
|
||||
defer deleteResp.Body.Close()
|
||||
|
||||
if deleteResp.StatusCode != 204 {
|
||||
t.Errorf("Expected status 204, got %d", deleteResp.StatusCode)
|
||||
}
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user