Beispiel #1
0
        public void TaskModuleContinueResponseInitsWithNoArgs()
        {
            var continueResponse = new TaskModuleContinueResponse();

            Assert.NotNull(continueResponse);
            Assert.IsType <TaskModuleContinueResponse>(continueResponse);
        }
Beispiel #2
0
        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));
        }
Beispiel #4
0
        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
        }
Beispiel #5
0
        public void TaskModuleContinueResponseInits()
        {
            var value = new TaskModuleTaskInfo();

            var continueResponse = new TaskModuleContinueResponse(value);

            Assert.NotNull(continueResponse);
            Assert.IsType <TaskModuleContinueResponse>(continueResponse);
            Assert.Equal(value, continueResponse.Value);
        }
Beispiel #6
0
        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
        }
Beispiel #7
0
        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));
            }
        }
Beispiel #8
0
        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));
        }
Beispiel #9
0
        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
        }
Beispiel #10
0
        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
            });
        }