public void TaskModuleContinueResponseInitsWithNoArgs() { var continueResponse = new TaskModuleContinueResponse(); Assert.NotNull(continueResponse); Assert.IsType <TaskModuleContinueResponse>(continueResponse); }
public TaskModuleResponse CreateCompetitionDetailTaskInfoResponse(Competition competition) { var localization = _localizationFactory.Create(competition.Locale); List <AdaptiveElement> body; if (competition.Competitors.Any()) { body = new List <AdaptiveElement> { new AdaptiveTextBlock { Text = localization["CompetitionDetail.Competitors"], Size = AdaptiveTextSize.Large }, }; foreach (var competitor in competition.Competitors) { var isWinner = competition.WinnerAadObjectIds.Contains(competitor.AadObjectId); var namePrefix = isWinner ? "🎁 " : string.Empty; body.Add(new AdaptiveTextBlock { Text = namePrefix + competitor.Name }); } } else { body = new List <AdaptiveElement> { new AdaptiveTextBlock { Text = localization["CompetitionDetail.NoCompetitorJoined"], Size = AdaptiveTextSize.Medium }, }; } var taskInfo = new TaskModuleContinueResponse { Type = "continue", Value = new TaskModuleTaskInfo { Title = string.Empty, Height = "medium", Width = "small", Card = new Attachment { ContentType = AdaptiveCard.ContentType, Content = new AdaptiveCard("1.0") { Body = body } } } }; return(new TaskModuleResponse { Task = taskInfo }); }
public async Task <MessagingExtensionActionResponse> Handle(Activity activity) { var editForm = GetEditForm(activity); var localPlannedDrawTime = _dateTimeService.UtcNow.AddHours(2).ToOffset(activity.GetOffset()); if (!string.IsNullOrEmpty(editForm.PlannedDrawTimeLocalDate) && !string.IsNullOrEmpty(editForm.PlannedDrawTimeLocalTime)) { var dateTime = DateTime.Parse(editForm.PlannedDrawTimeLocalDate + "T" + editForm.PlannedDrawTimeLocalTime, CultureInfo.InvariantCulture); localPlannedDrawTime = new DateTimeOffset(dateTime.Year, dateTime.Month, dateTime.Day, dateTime.Hour, dateTime.Minute, 0, activity.GetOffset()); } var card = _activityBuilder.CreateComposeEditForm(editForm.Gift, int.Parse(editForm.WinnerCount), editForm.GiftImageUrl, localPlannedDrawTime, string.Empty, activity.Locale); var taskInfo = new TaskModuleContinueResponse { Type = "continue", Value = new TaskModuleTaskInfo { Title = string.Empty, Card = card } }; var response = new MessagingExtensionActionResponse { Task = taskInfo }; return(await Task.FromResult(response)); }
public async Task CreateTicketTaskModuleGetUserInputCard() { var sp = Services.BuildServiceProvider(); var adapter = sp.GetService <TestAdapter>(); adapter.AddUserToken(AuthenticationProvider, adapter.Conversation.ChannelId, adapter.Conversation.User.Id, TestToken, MagicCode); // TaskModule Activity For Fetch var taskFetch = "{\r\n \"data\": {\r\n \"data\": {\r\n \"TaskModuleFlowType\": \"CreateTicket_Form\",\r\n \"Submit\": false\r\n },\r\n \"type\": \"task / fetch\"\r\n },\r\n \"context\": {\r\n \"theme\": \"dark\"\r\n }\r\n}"; var activity = new Activity { Type = ActivityTypes.Invoke, Name = "task/fetch", Value = JObject.Parse(taskFetch) }; var turnContext = new TurnContext(adapter, activity); var teamsImplementation = new CreateTicketTeamsImplementation(sp); TaskModuleContinueResponse response = await teamsImplementation.OnTeamsTaskModuleFetchAsync(turnContext, CancellationToken.None); Assert.IsNotNull(response); Assert.AreEqual("Create Incident", response.Value.Title); var attachment = response.Value.Card; Assert.IsNotNull(attachment); var adaptiveCard = (AdaptiveCard)attachment.Content; Assert.IsNotNull(adaptiveCard); Assert.AreEqual(adaptiveCard.Id, "GetUserInput"); // TODO: Add more validation steps on AdaptiveCard }
public void TaskModuleContinueResponseInits() { var value = new TaskModuleTaskInfo(); var continueResponse = new TaskModuleContinueResponse(value); Assert.NotNull(continueResponse); Assert.IsType <TaskModuleContinueResponse>(continueResponse); Assert.Equal(value, continueResponse.Value); }
public async Task DeleteTicketTaskModuleSubmitUserInputCard() { var sp = Services.BuildServiceProvider(); var adapter = sp.GetService <TestAdapter>(); var conversationState = sp.GetService <ConversationState>(); var stateAccessor = conversationState.CreateProperty <SkillState>(nameof(SkillState)); var skillState = new SkillState(); skillState.AccessTokenResponse = new TokenResponse { Token = "Test" }; // TaskModule Activity For Submit var taskSubmit = "{\r\n \"data\": {\r\n \"msteams\": {\r\n \"type\": \"task /fetch\"\r\n },\r\n \"data\": {\r\n \"TaskModuleFlowType\": \"DeleteTicket_Form\",\r\n \"FlowData\": {\r\n \"IncidentId\": \"MockCreateTicketId\"\r\n },\r\n \"Submit\": true\r\n },\r\n \"IncidentCloseReason\": \"Test\"\r\n },\r\n \"context\": {\r\n \"theme\": \"dark\"\r\n }\r\n}"; var activity = new Activity { ChannelId = "test", Conversation = new ConversationAccount { Id = "Test" }, Type = ActivityTypes.Invoke, Name = "task/fetch", Value = JObject.Parse(taskSubmit) }; var turnContext = new TurnContext(adapter, activity); await stateAccessor.SetAsync(turnContext, skillState, CancellationToken.None); var teamsImplementation = new DeleteTicketTeamsImplementation(sp); TaskModuleContinueResponse response = await teamsImplementation.OnTeamsTaskModuleSubmitAsync(turnContext, CancellationToken.None); Assert.IsNotNull(response); Assert.AreEqual("Incident Deleted", response.Value.Title); var attachment = response.Value.Card; Assert.IsNotNull(attachment); var adaptiveCard = (AdaptiveCard)attachment.Content; Assert.IsNotNull(adaptiveCard); Assert.AreEqual(adaptiveCard.Id, "IncidentResponseCard"); // TODO: Add more validation steps on AdaptiveCard }
public async Task <object> Handle(Activity activity) { var data = ((JObject)activity.Value).GetValue("data"); var editForm = JsonSerializer.Deserialize <CompetitionEditForm>(Newtonsoft.Json.JsonConvert.SerializeObject(data)); var plannedDrawTime = editForm.GetPlannedDrawTime(activity.GetOffset(), _dateTimeService.UtcNow.AddHours(2)); var localPlannedDrawTime = plannedDrawTime.ToOffset(activity.GetOffset()); var errorMessage = CanPreviewCompetition(editForm.Gift, int.Parse(editForm.WinnerCount), plannedDrawTime, editForm.GiftImageUrl, activity.Locale); if (string.IsNullOrEmpty(errorMessage)) { var card = _activityBuilder.CreatePreviewCard(editForm, localPlannedDrawTime, activity.Locale); var preview = MessageFactory.Attachment(card) as Activity; preview.Value = editForm; var response = new MessagingExtensionActionResponse { ComposeExtension = new MessagingExtensionResult { Type = "botMessagePreview", ActivityPreview = preview } }; return(await Task.FromResult(response)); } else { var card = _activityBuilder.CreateComposeEditForm(editForm.Gift, int.Parse(editForm.WinnerCount), editForm.GiftImageUrl, localPlannedDrawTime, errorMessage, activity.Locale); var taskInfo = new TaskModuleContinueResponse { Type = "continue", Value = new TaskModuleTaskInfo { Title = string.Empty, Width = "medium", Card = card } }; var response = new MessagingExtensionActionResponse { Task = taskInfo }; return(await Task.FromResult(response)); } }
public async Task <MessagingExtensionActionResponse> Handle(Activity activity) { var localPlannedDrawTime = _dateTimeService.UtcNow.AddHours(2).ToOffset(TimeSpan.FromHours(activity.GetOffset().TotalHours)); var card = _activityBuilder.CreateComposeEditForm(string.Empty, 1, string.Empty, localPlannedDrawTime, string.Empty, activity.Locale); var taskInfo = new TaskModuleContinueResponse { Type = "continue", Value = new TaskModuleTaskInfo { Title = string.Empty, Width = "medium", Card = card } }; var response = new MessagingExtensionActionResponse { Task = taskInfo }; return(await Task.FromResult(response)); }
public async Task UpdateTicketTaskModuleGetUserInputCard() { var sp = Services.BuildServiceProvider(); var adapter = sp.GetService <TestAdapter>(); adapter.AddUserToken(AuthenticationProvider, adapter.Conversation.ChannelId, adapter.Conversation.User.Id, TestToken, MagicCode); // TaskModule Activity For Fetch var taskFetch = "{\r\n \"data\": {\r\n \"data\": {\r\n \"TaskModuleFlowType\": \"UpdateTicket_Form\",\r\n \"FlowData\": {\r\n \"IncidentDetails\": {\r\n \"Id\": \"120874\",\r\n \"Title\": \"Test\",\r\n \"Description\": \"Test\",\r\n \"Urgency\": 1,\r\n \"State\": 1,\r\n \"OpenedTime\": \"2020-04-30T14:29:44.4485304Z\",\r\n \"Number\": \"120874\"\r\n }\r\n },\r\n \"Submit\": true\r\n },\r\n \"type\": \"task / fetch\"\r\n },\r\n \"context\": {\r\n \"theme\": \"dark\"\r\n }\r\n}"; var activity = new Activity { Type = ActivityTypes.Invoke, Name = "task/fetch", Value = JObject.Parse(taskFetch) }; var turnContext = new TurnContext(adapter, activity); var teamsImplementation = new UpdateTicketTeamsImplementation(sp); TaskModuleContinueResponse response = await teamsImplementation.OnTeamsTaskModuleFetchAsync(turnContext, CancellationToken.None); Assert.IsNotNull(response); Assert.AreEqual("Update Incident", response.Value.Title); var attachment = response.Value.Card; Assert.IsNotNull(attachment); var adaptiveCard = (AdaptiveCard)attachment.Content; Assert.IsNotNull(adaptiveCard); Assert.AreEqual(adaptiveCard.Id, "UpdateAdaptiveCard"); // TODO: Add more validation steps on AdaptiveCard }
public TaskModuleResponse CreateDraftCompetitionEditTaskInfoResponse(Competition competition, string errorMessage, string currentLocale) { var localization = _localizationFactory.Create(competition.Locale); var localPlannedDrawTime = competition.PlannedDrawTime.ToOffset(TimeSpan.FromHours(competition.OffsetHours)); var body = new List <AdaptiveElement> { new AdaptiveTextBlock { Text = localization["EditCompetition.Form.Gift.Label"], }, new AdaptiveTextInput { Id = "gift", Placeholder = localization["EditCompetition.Form.Gift.Placeholder"], Value = competition.Gift, IsMultiline = false }, new AdaptiveTextBlock { Text = localization["EditCompetition.Form.WinnerCount.Label"], }, new AdaptiveNumberInput { Id = "winnerCount", Placeholder = localization["EditCompetition.Form.WinnerCount.Placeholder"], Value = competition.WinnerCount, Min = 1, Max = 10000 }, new AdaptiveTextBlock { Text = localization["EditCompetition.Form.PlannedDrawTime.Label"], }, new AdaptiveColumnSet { Columns = new List <AdaptiveColumn> { new AdaptiveColumn { Width = "1", Items = new List <AdaptiveElement> { // Teams/AdaptiveCards BUG: https://github.com/Microsoft/AdaptiveCards/issues/2644 // DateInput does not post back the value in non-English situation. // Workaround: use TextInput instead and validate user's input against "yyyy-MM-dd" format (currentLocale != null && currentLocale.StartsWith("en")) ? new AdaptiveDateInput { Id = "plannedDrawTimeLocalDate", Value = localPlannedDrawTime.ToString("yyyy-MM-dd") } : new AdaptiveTextInput { Id = "plannedDrawTimeLocalDate", Placeholder = localization["EditCompetition.Form.PlannedDrawTimeLocalDate.Placeholder"], Value = localPlannedDrawTime.ToString("yyyy-MM-dd") } as AdaptiveElement } }, new AdaptiveColumn { Width = "1", Items = new List <AdaptiveElement> { // Similar to the above BUG: https://github.com/Microsoft/AdaptiveCards/issues/2644 // TimeInput does not send back the correct value for non-English culture, when user selects 4:30 of afternoon, it sends back "04:30". // Workaround: use TextInput instead and validate user's input against "HH:mm" format (currentLocale != null && currentLocale.StartsWith("en")) ? new AdaptiveTimeInput { Id = "plannedDrawTimeLocalTime", Value = localPlannedDrawTime.ToString("HH:mm") } : new AdaptiveTextInput { Id = "plannedDrawTimeLocalTime", Placeholder = localization["EditCompetition.Form.PlannedDrawTimeLocalTime.Placeholder"], Value = localPlannedDrawTime.ToString("HH:mm") } as AdaptiveElement } } } }, new AdaptiveTextBlock { Text = localization["EditCompetition.Form.GiftImageUrl.Label"], }, new AdaptiveTextInput { Id = "giftImageUrl", Style = AdaptiveTextInputStyle.Url, Placeholder = localization["EditCompetition.Form.GiftImageUrl.Placeholder"], Value = competition.GiftImageUrl } }; if (!string.IsNullOrEmpty(errorMessage)) { body.Insert(0, new AdaptiveTextBlock { Text = errorMessage, Color = AdaptiveTextColor.Attention }); } var actions = new List <AdaptiveAction> { new AdaptiveSubmitAction { Title = localization["EditCompetition.SaveDraftButton"], Data = new InvokeActionData { UserAction = InvokeActionType.SaveDraft, CompetitionId = competition.Id } }, new AdaptiveSubmitAction { Title = localization["EditCompetition.ActivateCompetition"], Data = new InvokeActionData { UserAction = InvokeActionType.ActivateCompetition, CompetitionId = competition.Id } } }; var taskInfo = new TaskModuleContinueResponse { Type = "continue", Value = new TaskModuleTaskInfo { Title = string.Empty, Card = new Attachment { ContentType = AdaptiveCard.ContentType, Content = new AdaptiveCard("1.0") { Body = body, Actions = actions } } } }; return(new TaskModuleResponse { Task = taskInfo }); }