package integration import ( "testing" "api_yal/tests/testutils" ) // TestFeedbackEndpoints тестирует все эндпоинты для работы с отзывами // Включает создание, получение, обновление, удаление отзывов, поиск и статистику func TestFeedbackEndpoints(t *testing.T) { config := testutils.NewTestConfig() // CreateFeedback тестирует создание нового отзыва 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") } }) // GetFeedbackByID тестирует получение отзыва по ID 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) } }) // UpdateFeedback тестирует обновление отзыва автором 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") } }) // ListFeedbacks тестирует получение списка отзывов с пагинацией 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) } }) // MyFeedbacks тестирует получение отзывов текущего пользователя 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) } }) // FeedbacksByObject тестирует получение отзывов для конкретного объекта 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) } }) // FeedbacksByPlatform тестирует получение отзывов по платформе 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) } }) // SearchFeedbacks тестирует поиск отзывов по тексту 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) } }) // FeedbackStats тестирует получение статистики по отзывам 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) } } }) // DeleteFeedback тестирует удаление отзыва 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() // Ожидаем статус 204 No Content при успешном удалении if resp.StatusCode != 204 { t.Errorf("Expected status 204, got %d", resp.StatusCode) } // Проверяем, что отзыв удален - должен вернуть 404 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) } }) }