/
ArtSerg
/
IntegrationProject
Обзор
Документация
Войти
/
ArtSerg
/
IntegrationProject
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
lab4
Integration1/TestRabbitMQ.cs
309 строк
14 KB
artS3rg
Добавлена интеграция RabbitMQ для асинхронного обмена сообщениями
14 дек 2025, 21:50
14 дек 2025, 21:50
a02de12
Код
Авторство
О чём код?
using Integration1.Client; using Integration1.Messaging; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration.Json; namespace Integration1 { /// <summary> /// Простой тест для проверки работоспособности RabbitMQ API /// </summary> public class TestRabbitMQ { public static async Task RunTests() { // Загружаем конфигурацию var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false) .Build(); Console.WriteLine("=== Тестирование RabbitMQ API ===\n"); try { using var client = new RabbitMQClient(config); var apiKey = config["Internal:ApiKey"] ?? ""; // Тест 1: Регистрация пользователя Console.WriteLine("1. Тест регистрации пользователя..."); var registerRequest = new RequestMessage { Version = "v1", Action = "register", Auth = apiKey, Data = new Dictionary<string, object> { { "username", $"testuser_{DateTime.Now:yyyyMMddHHmmss}" }, { "password", "123456" } } }; var registerResponse = await client.SendRequestAsync(registerRequest); if (registerResponse.Status == "ok") { Console.WriteLine(" ✓ Регистрация успешна"); } else { Console.WriteLine($" ✗ Ошибка регистрации: {registerResponse.Error}"); } Console.WriteLine(); // Тест 2: Вход в систему Console.WriteLine("2. Тест входа в систему..."); var registerData = registerRequest.Data as Dictionary<string, object>; var loginRequest = new RequestMessage { Version = "v1", Action = "login", Auth = apiKey, Data = new Dictionary<string, object> { { "username", registerData?["username"] ?? "" }, { "password", "123456" } } }; var loginResponse = await client.SendRequestAsync(loginRequest); string? jwtToken = null; if (loginResponse.Status == "ok" && loginResponse.Data != null) { Console.WriteLine(" ✓ Вход успешен"); // Извлекаем токен try { if (loginResponse.Data is System.Text.Json.JsonElement jsonElement && jsonElement.ValueKind == System.Text.Json.JsonValueKind.Object) { if (jsonElement.TryGetProperty("token", out var tokenElement)) { jwtToken = tokenElement.GetString(); Console.WriteLine($" ✓ JWT токен получен (длина: {jwtToken?.Length ?? 0} символов)"); } } } catch (Exception ex) { Console.WriteLine($" ⚠ Не удалось извлечь токен: {ex.Message}"); } } else { Console.WriteLine($" ✗ Ошибка входа: {loginResponse.Error}"); } Console.WriteLine(); if (string.IsNullOrEmpty(jwtToken)) { Console.WriteLine("⚠ Пропускаем тесты задач, так как не получен токен"); return; } // Тест 3: Создание задачи Console.WriteLine("3. Тест создания задачи..."); var createTaskRequest = new RequestMessage { Version = "v1", Action = "create_task", Data = new Dictionary<string, object> { { "token", jwtToken }, { "title", "Тестовая задача" }, { "description", "Описание тестовой задачи" }, { "priority", "High" } } }; var createTaskResponse = await client.SendRequestAsync(createTaskRequest); int? taskId = null; if (createTaskResponse.Status == "ok") { Console.WriteLine(" ✓ Задача создана"); // Извлекаем ID задачи try { if (createTaskResponse.Data is System.Text.Json.JsonElement taskElement && taskElement.ValueKind == System.Text.Json.JsonValueKind.Object) { if (taskElement.TryGetProperty("id", out var idElement)) { taskId = idElement.GetInt32(); Console.WriteLine($" ✓ ID задачи: {taskId}"); } } } catch (Exception ex) { Console.WriteLine($" ⚠ Не удалось извлечь ID задачи: {ex.Message}"); } } else { Console.WriteLine($" ✗ Ошибка создания задачи: {createTaskResponse.Error}"); } Console.WriteLine(); // Тест 4: Получение списка задач Console.WriteLine("4. Тест получения списка задач..."); var getTasksRequest = new RequestMessage { Version = "v1", Action = "get_tasks", Data = new Dictionary<string, object> { { "token", jwtToken }, { "page", 1 }, { "pageSize", 10 } } }; var getTasksResponse = await client.SendRequestAsync(getTasksRequest); if (getTasksResponse.Status == "ok") { Console.WriteLine(" ✓ Список задач получен"); Console.WriteLine($" Данные: {System.Text.Json.JsonSerializer.Serialize(getTasksResponse.Data)}"); } else { Console.WriteLine($" ✗ Ошибка получения задач: {getTasksResponse.Error}"); } Console.WriteLine(); // Тест 5: Обновление задачи if (taskId.HasValue) { Console.WriteLine("5. Тест обновления задачи..."); var updateTaskRequest = new RequestMessage { Version = "v1", Action = "update_task", Data = new Dictionary<string, object> { { "token", jwtToken }, { "id", taskId.Value }, { "title", "Обновленная задача" }, { "isCompleted", true } } }; var updateTaskResponse = await client.SendRequestAsync(updateTaskRequest); if (updateTaskResponse.Status == "ok") { Console.WriteLine(" ✓ Задача обновлена"); } else { Console.WriteLine($" ✗ Ошибка обновления задачи: {updateTaskResponse.Error}"); } Console.WriteLine(); // Тест 6: Удаление задачи Console.WriteLine("6. Тест удаления задачи..."); var deleteTaskRequest = new RequestMessage { Version = "v1", Action = "delete_task", Data = new Dictionary<string, object> { { "token", jwtToken }, { "id", taskId.Value } } }; var deleteTaskResponse = await client.SendRequestAsync(deleteTaskRequest); if (deleteTaskResponse.Status == "ok") { Console.WriteLine(" ✓ Задача удалена"); } else { Console.WriteLine($" ✗ Ошибка удаления задачи: {deleteTaskResponse.Error}"); } Console.WriteLine(); } // Тест 7: Проверка идемпотентности Console.WriteLine("7. Тест идемпотентности (повторная отправка того же сообщения)..."); var fixedId = Guid.NewGuid().ToString(); Console.WriteLine($" Используемый ID для идемпотентности: {fixedId}"); var idempotencyRequest = new RequestMessage { Id = fixedId, // Фиксированный ID для теста Version = "v1", Action = "create_task", Auth = apiKey, Data = new Dictionary<string, object> { { "token", jwtToken ?? "" }, { "title", "Идемпотентная задача" }, { "description", "Эта задача должна быть создана только один раз" }, { "priority", "Medium" } } }; // Первая отправка Console.WriteLine($" Первая отправка с ID: {idempotencyRequest.Id}"); var firstResponse = await client.SendRequestAsync(idempotencyRequest); Console.WriteLine($" Первая отправка: {firstResponse.Status}"); if (firstResponse.Status == "error") { Console.WriteLine($" Ошибка первой отправки: {firstResponse.Error}"); } // Вторая отправка с тем же ID - создаем новый объект с тем же ID var secondRequest = new RequestMessage { Id = fixedId, // Используем тот же фиксированный ID Version = "v1", Action = "create_task", Auth = apiKey, Data = new Dictionary<string, object> { { "token", jwtToken ?? "" }, { "title", "Идемпотентная задача" }, { "description", "Эта задача должна быть создана только один раз" }, { "priority", "Medium" } } }; Console.WriteLine($" Вторая отправка с ID: {secondRequest.Id}"); var secondResponse = await client.SendRequestAsync(secondRequest); Console.WriteLine($" Вторая отправка: {secondResponse.Status}"); if (secondResponse.Status == "error") { Console.WriteLine($" Ошибка второй отправки: {secondResponse.Error}"); } if (firstResponse.Status == "ok" && secondResponse.Status == "ok") { // Проверяем, что данные ответов одинаковые (задача не создалась дважды) var firstData = System.Text.Json.JsonSerializer.Serialize(firstResponse.Data); var secondData = System.Text.Json.JsonSerializer.Serialize(secondResponse.Data); if (firstData == secondData) { Console.WriteLine(" ✓ Идемпотентность работает (повторное сообщение вернуло тот же результат)"); } else { Console.WriteLine(" ⚠ Идемпотентность: ответы различаются"); } } else { Console.WriteLine(" ⚠ Идемпотентность требует проверки"); } Console.WriteLine(); Console.WriteLine("=== Все тесты завершены ==="); } catch (Exception ex) { Console.WriteLine($"\n✗ Критическая ошибка: {ex.Message}"); Console.WriteLine($"Stack trace: {ex.StackTrace}"); } } } }