protected TestFlow CreateTestFlow(string dialogName, bool userConsentGiven = true) { return(new TestFlow(this.adapter, async(turnContext, cancellationToken) => { this.turnContext = turnContext; this.cancellationToken = cancellationToken; if (turnContext.Activity.Type == ActivityTypes.Message) { // Initialize the dialog context. DialogContext dialogContext = await this.dialogs.CreateContextAsync(turnContext, cancellationToken); // Make sure this channel is supported. if (!Phrases.ValidChannels.Contains(turnContext.Activity.ChannelId)) { await Messages.SendAsync(Phrases.Greeting.InvalidChannel(turnContext), turnContext, cancellationToken); return; } // Create the master dialog. var masterDialog = new MasterDialog(this.state, this.dialogs, this.Api, this.Configuration); // If the user sends the update keyword, clear the dialog stack and start a new update. if (string.Equals(turnContext.Activity.Text, Phrases.Keywords.Update, StringComparison.OrdinalIgnoreCase)) { dialogName = MasterDialog.Name; await dialogContext.CancelAllDialogsAsync(cancellationToken); } // Attempt to continue any existing conversation. DialogTurnResult result = await masterDialog.ContinueDialogAsync(dialogContext, cancellationToken); // Start a new conversation if there isn't one already. if (result.Status == DialogTurnStatus.Empty) { // Clear the user context when a new conversation begins. await this.state.ClearUserContext(dialogContext.Context, cancellationToken); // Tests must init the user once there is a turn context. await InitUser(userConsentGiven); // Difference for tests here is beginning the given dialog instead of master so that individual dialog flows can be tested. await masterDialog.BeginDialogAsync(dialogContext, dialogName, null, cancellationToken); } } })); }
public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default) { if (turnContext.Activity.Type == ActivityTypes.Message) { // Establish context for our dialog from the turn context. DialogContext dialogContext = await this.dialogs.CreateContextAsync(turnContext, cancellationToken); // Make sure this channel is supported. if (!Phrases.ValidChannels.Contains(turnContext.Activity.ChannelId)) { await Messages.SendAsync(Phrases.Greeting.InvalidChannel(turnContext), turnContext, cancellationToken); return; } var schemaError = Helpers.ValidateSchema(); if (!string.IsNullOrEmpty(schemaError)) { await Messages.SendAsync(Phrases.Greeting.InvalidSchema(schemaError), turnContext, cancellationToken); return; } // Create the master dialog. var masterDialog = new MasterDialog(this.state, this.dialogs, this.api, this.configuration); // If the user sends the update keyword, clear the dialog stack and start a new session. if (string.Equals(turnContext.Activity.Text, Phrases.Keywords.Update, StringComparison.OrdinalIgnoreCase)) { await dialogContext.CancelAllDialogsAsync(cancellationToken); } // Attempt to continue any existing conversation. DialogTurnResult result = await masterDialog.ContinueDialogAsync(dialogContext, cancellationToken); // Start a new conversation if there isn't one already. if (result.Status == DialogTurnStatus.Empty) { await masterDialog.BeginDialogAsync(dialogContext, MasterDialog.Name, null, cancellationToken); } } }