Prueba de integración usando Bot Framework y DirectLine (2)
En esta parte, realizaremos la autorización de DirectLine y obtendremos los valores de la respuesta del bot.
Ahora que hemos deserializar, es hora de obtener la información de la colección y los archivos completos que usaremos para obtener autorización, realizar las llamadas a la API y afirmar el resultado.
La siguiente explicación no cubrirá toda la información básica sobre cómo funciona Bot Framework. Si no lo comprende, consulte la documentación oficial.
Realizar llamadas API usando WebClient
Para facilitarnos el llamado a la API, creé una clase utils, donde guardamos las funciones que usaremos varias veces, esta clase incluye uploadString para POST y downloadString para GET.
public class Utils
{
/// <summary>
/// Uploads to an URL and gets result
/// </summary>
/// <typeparam name="T">Type of object you are receiving</typeparam>
/// <param name="bearer">Token</param>
/// <param name="url">Url</param>
/// <param name="serializedJson">Serialized JSON to send</param>
/// <returns></returns>
public static T uploadString<T>(string bearer, string url, string serializedJson)
{
string serializedResult = "";
/// Webclient
using (var client = new WebClient())
{
/// Add headers
client.Headers.Add("Content-Type", "application/json");
client.Headers.Add("Authorization", $"Bearer {bearer}");
/// Upload string
serializedResult = client.UploadString(url, serializedJson);
}
/// Get result and return it as an object
return JsonConvert.DeserializeObject<T>(serializedResult);
}
/// <summary>
/// Downloads from URL
/// </summary>
/// <typeparam name="T">Type of object you are receiving</typeparam>
/// <param name="bearer">Token</param>
/// <param name="url">Url</param>
/// <returns></returns>
public static T downloadString<T>(string bearer, string url)
{
string serializedResult = "";
/// Webclient
using (var client = new WebClient())
{
/// Add headers
client.Headers.Add("Content-Type", "application/json");
client.Headers.Add("Authorization", $"Bearer {bearer}");
/// Download string
serializedResult = client.DownloadString(url);
}
/// Get result and return it as an object
return JsonConvert.DeserializeObject<T>(serializedResult);
}
}
Autorización de línea directa
Si lees la documentación oficial podrás encontrar cómo hacerlo, y es bastante fácil, usando nuestras funciones es aún más fácil. Primero que nada recuerda que estamos dentro de la sentencia foreach, ya que estamos haciendo la autenticación para cada caso, en caso de que se nos acabe el tiempo, lo que significará que la prueba fallará.
/// Arrange with current requested values
string token, newToken, conversationId;
/// Act
/// 1 - Get token using secret from DirectLine in BotFramework panel
token = Utils.uploadString<DirectLineAuth>(data.Secret, data.DirectLineGenerateTokenEndpoint, "").token;
Ahora tenemos el token, que se utilizará para realizar todas las siguientes llamadas al punto final de la conversación.
Creando una conversación.
Para hablar con el bot, primero debemos crear una conversación, esta conversación devolverá un nuevo token que incluye la identificación de la conversación.
/// 2 -Create a new conversation
var createdConversation = Utils.uploadString<DirectLineAuth>(token, data.DirectLineConversationEndpoint, "");
// This returns a new token and a conversationId
newToken = createdConversation.token;
conversationId = createdConversation.conversationId;
Además, almacenamos newToken y conversationId, ambos serán necesarios para que el usuario envíe mensajes al bot.
Enviar actividad a la conversación
Ahora, con el conversationId y el conversationEndpoint, podemos crear el punto final para enviar un Activity que es el request del archivo json.
/// 3 - Send an activity to the conversation with new token and conversationId
string directlineConversationActivitiesEndpoint = data.DirectLineConversationEndpoint + conversationId + "/activities";
Utils.uploadString<DirectLineAuth>(newToken, directlineConversationActivitiesEndpoint, JsonConvert.SerializeObject(entry.Request));
Obtener el último mensaje
En el historial de mensajes, después de que enviamos la actividad, el bot ya debería haber respondido, por lo que tenemos que obtener todos los mensajes con la marca de agua y luego, usando esa marca de agua, filtrar el último mensaje/actividad.
/// 4 - Get all activities, we get a List<activity> and a watermark
var getLastActivity = Utils.downloadString<ActivityResponse>(newToken, directlineConversationActivitiesEndpoint);
/// 5 - Get the latest activity which is the response we should be expecting
var latestResponse = getLastActivity.activities[Int32.Parse(getLastActivity.watermark)];
Y eso es todo por esta parte, la siguiente parte incluirá la parte donde obtenemos el texto de assert en el json, lo convertimos a código como si usamos eval() en Javascript pero en C#, y luego usamos Assert.isTrue() para obtener el resultado final de la prueba.
Recuerde que todo el código está almacenado en mi github en este repositorio.