Test d'intégration avec Bot Framework et DirectLine (2)

· 4 min de lecture

Dans cette partie, nous allons effectuer l’autorisation DirectLine et obtenir les valeurs de la réponse du bot.

Maintenant que nous avons effectué la désérialisation, il est temps d’obtenir les informations de la collection et des entiers que nous utiliserons pour obtenir l’autorisation, effectuer les appels API et affirmer le résultat.

** L’explication suivante ne couvrira pas toutes les informations de base sur le fonctionnement du Bot Framework. Si vous ne comprenez pas, veuillez consulter la documentation officielle. **

Effectuer des appels API à l’aide de WebClient

Afin de faciliter l’appel de l’API, j’ai créé une classe utils, où nous enregistrons les fonctions que nous utiliserons plusieurs fois, cette classe comprend uploadString pour POST et downloadString pour 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);
        }
    }

Autorisation DirectLine

Si vous lisez la documentation officielle, vous pourrez trouver comment faire, et c’est assez simple, en utilisant nos fonctions c’est encore plus simple. Tout d’abord, rappelez-vous que nous sommes à l’intérieur de l’instruction foreach, puisque nous effectuons l’authentification pour chaque cas, au cas où nous manquerions de temps, ce qui signifierait que le test échouerait.

/// 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;

Nous avons maintenant le jeton, qui sera utilisé pour effectuer tous les appels suivants vers le point final de la conversation.

Créer une conversation.

Pour parler au bot, nous devons d’abord créer une conversation, cette conversation renverra un nouveau jeton qui inclut l’identifiant de la conversation.

/// 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;

De plus, nous stockons les newToken et conversationId, les deux seront nécessaires à l’utilisateur pour envoyer des messages au bot.

Envoyer l’activité à la conversation

Maintenant, avec le conversationId et le conversationEndpoint, nous pouvons créer le point de terminaison final pour envoyer un Activity qui est le request du fichier 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));

Recevoir le dernier message

Dans l’historique des messages, après avoir envoyé l’activité, le bot aurait déjà dû répondre, nous devons donc récupérer tous les messages avec le filigrane, puis, en utilisant ce filigrane, filtrer le dernier message/activité.

/// 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)];

Et c’est tout pour cette partie, la partie suivante inclura la partie où nous récupérons le texte du assert dans le json, le convertissons en code comme en utilisant eval() en Javascript mais en C#, puis en utilisant le Assert.isTrue() pour obtenir le résultat final du test.

N’oubliez pas que tout le code est stocké dans mon github dans le référentiel this.