コード例 #1
0
        public async Task GivenValidInput_Preview_ReturnsBotPreviewWithCorrectValues()
        {
            var gift                     = Guid.NewGuid().ToString();
            var winnerCount              = "56";
            var giftImageUrl             = "https://www.some.com/image";
            var plannedDrawTimeLocal     = DateTimeOffset.UtcNow.AddDays(1);
            var plannedDrawTimeLocalDate = plannedDrawTimeLocal.ToString("yyyy-MM-dd");
            var plannedDrawTimeLocalTime = plannedDrawTimeLocal.ToString("HH:mm");

            using (var server = CreateServerFixture(ServerFixtureConfigurations.Default))
                using (var client = server.CreateClient())
                {
                    var activity = new Activity
                    {
                        Name       = "composeExtension/submitAction",
                        ServiceUrl = "https://service-url.com",
                        ChannelId  = "msteams",
                        Type       = ActivityTypes.Invoke,
                        Value      = new
                        {
                            CommandId = "create",
                            Data      = new
                            {
                                UserAction  = "Preview",
                                Gift        = gift,
                                WinnerCount = winnerCount,
                                PlannedDrawTimeLocalDate = plannedDrawTimeLocalDate,
                                PlannedDrawTimeLocalTime = plannedDrawTimeLocalTime,
                                GiftImageUrl             = giftImageUrl
                            }
                        },
                        Locale         = "en-us",
                        LocalTimestamp = new DateTimeOffset(2018, 1, 1, 1, 1, 1, 1, TimeSpan.FromHours(5.5))
                    };
                    var response = await client.SendActivity(activity);

                    response.StatusCode.Should().Be(HttpStatusCode.OK);
                    var actionResponse = await response.Content.ReadAsWithNewtonsoftJsonAsync <MessagingExtensionActionResponse>();

                    actionResponse.ComposeExtension.Type.Should().Be("botMessagePreview");
                    var card = ((JObject)actionResponse.ComposeExtension.ActivityPreview.Attachments[0].Content).ToObject <AdaptiveCard>();
                    ((AdaptiveTextBlock)card.Body[0]).Text.Should().Be(gift);
                    ((AdaptiveTextBlock)card.Body[1]).Text.Should().Contain(winnerCount);
                    ((AdaptiveTextBlock)card.Body[1]).Text.Should().Contain(DateTimeOffset.Parse(plannedDrawTimeLocalDate + " " + plannedDrawTimeLocalTime).ToString("f", CultureInfo.GetCultureInfo("en-us")));
                    ((AdaptiveImage)card.Body[3]).UrlString.Should().Be(giftImageUrl);
                    var hiddenEditFormData = (AdaptiveTextBlock)card.Body[4];
                    hiddenEditFormData.Id.Should().Be("LuckyDrawData");
                    hiddenEditFormData.IsVisible.Should().BeFalse();
                    var editForm = new CompetitionEditForm
                    {
                        Gift                     = gift,
                        GiftImageUrl             = giftImageUrl,
                        WinnerCount              = winnerCount,
                        PlannedDrawTimeLocalDate = plannedDrawTimeLocalDate,
                        PlannedDrawTimeLocalTime = plannedDrawTimeLocalTime,
                    };
                    hiddenEditFormData.Text.Should().Be(System.Text.Json.JsonSerializer.Serialize(editForm));
                }
        }
コード例 #2
0
        public Attachment CreatePreviewCard(CompetitionEditForm editForm, DateTimeOffset localPlannedDrawTime, string locale)
        {
            var localization          = _localizationFactory.Create(locale);
            var plannedDrawTimeString = localPlannedDrawTime.ToString("f", CultureInfo.GetCultureInfo(locale));
            var winnerCount           = int.Parse(editForm.WinnerCount);

            var elements = new List <AdaptiveElement>
            {
                new AdaptiveTextBlock {
                    Text = editForm.Gift, Size = AdaptiveTextSize.Large
                },
                new AdaptiveTextBlock {
                    Text = localization["MainActivity.Description", winnerCount, plannedDrawTimeString], Size = AdaptiveTextSize.Default
                },
                new AdaptiveTextBlock {
                    Text = localization["MainActivity.NoCompetitor"], Size = AdaptiveTextSize.Default
                },
            };

            if (!string.IsNullOrEmpty(editForm.GiftImageUrl))
            {
                elements.Add(new AdaptiveImage {
                    UrlString = editForm.GiftImageUrl
                });
            }
            elements.Add(new AdaptiveTextBlock {
                Id = "LuckyDrawData", IsVisible = false, Text = JsonSerializer.Serialize(editForm)
            });

            var card = new Attachment
            {
                ContentType = AdaptiveCard.ContentType,
                Content     = new AdaptiveCard("1.0")
                {
                    Body    = elements,
                    Height  = AdaptiveHeight.Auto,
                    Actions = new List <AdaptiveAction>()
                    {
                        new AdaptiveSubmitAction
                        {
                            Type  = AdaptiveSubmitAction.TypeName,
                            Title = localization["MainActivity.JoinButton"]
                        },
                        new AdaptiveSubmitAction
                        {
                            Type  = AdaptiveSubmitAction.TypeName,
                            Title = localization["MainActivity.ViewDetailButton"]
                        },
                    }
                }
            };

            return(card);
        }
コード例 #3
0
        public async Task GivenValidInput_Send_CreatesLuckyDrawMainActivity()
        {
            var offset               = TimeSpan.FromHours(9.5);
            var utcNow               = DateTimeOffset.UtcNow;
            var plannedDrawTime      = new DateTimeOffset(utcNow.Year, utcNow.Month, utcNow.Day, utcNow.Hour, utcNow.Minute, 0, TimeSpan.Zero);
            var plannedDrawTimeLocal = plannedDrawTime.ToOffset(offset);
            var editForm             = new CompetitionEditForm
            {
                Gift                     = Guid.NewGuid().ToString(),
                GiftImageUrl             = "https://www.some.com/image",
                WinnerCount              = "56",
                PlannedDrawTimeLocalDate = plannedDrawTimeLocal.ToString("yyyy-MM-dd"),
                PlannedDrawTimeLocalTime = plannedDrawTimeLocal.ToString("HH:mm"),
            };

            using (var server = CreateServerFixture(ServerFixtureConfigurations.Default))
                using (var client = server.CreateClient())
                {
                    var activity = new Activity
                    {
                        Name       = "composeExtension/submitAction",
                        ServiceUrl = "https://service-url.com",
                        ChannelId  = "msteams",
                        Type       = ActivityTypes.Invoke,
                        Value      = new
                        {
                            CommandId = "create",
                            BotMessagePreviewAction = "send",
                            BotActivityPreview      = new []
                            {
                                new Activity
                                {
                                    Attachments = new []
                                    {
                                        new Attachment
                                        {
                                            Content = new AdaptiveCard("1.0")
                                            {
                                                Body = new List <AdaptiveElement>
                                                {
                                                    new AdaptiveTextBlock
                                                    {
                                                        Id   = "LuckyDrawData",
                                                        Text = JsonSerializer.Serialize(editForm)
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        },
                        From         = new ChannelAccount("id", "name"),
                        Conversation = new ConversationAccount(isGroup: true, id: "conv id", name: "conv name"),
                        ChannelData  = new TeamsChannelData
                        {
                            Tenant = new TenantInfo {
                                Id = Guid.NewGuid().ToString()
                            },
                            Team = new TeamInfo {
                                Id = Guid.NewGuid().ToString()
                            },
                            Channel = new ChannelInfo {
                                Id = Guid.NewGuid().ToString()
                            }
                        },
                        Locale         = "en-us",
                        LocalTimestamp = new DateTimeOffset(2018, 1, 1, 1, 1, 1, 1, offset)
                    };

                    var response = await client.SendActivity(activity);

                    response.StatusCode.Should().Be(HttpStatusCode.OK);
                    var openCompetitions = server.Assert().GetOpenCompetitions();
                    openCompetitions.Should().HaveCount(1);
                    openCompetitions[0].Status.Should().Be(CompetitionStatus.Active);
                    openCompetitions[0].Gift.Should().Be(editForm.Gift);
                    openCompetitions[0].GiftImageUrl.Should().Be(editForm.GiftImageUrl);
                    openCompetitions[0].WinnerCount.Should().Be(int.Parse(editForm.WinnerCount));
                    openCompetitions[0].PlannedDrawTime.Should().Be(plannedDrawTime);
                    var createdMessages = server.Assert().GetCreatedMessages();
                    createdMessages.Should().HaveCount(1);
                    var heroCard = createdMessages[0].Activity.Attachments[0].Content as HeroCard;
                    heroCard.Buttons.Should().HaveCount(2);
                    heroCard.Buttons[0].Type.Should().Be("invoke");
                    heroCard.Buttons[0].Value.Should().BeEquivalentTo(new InvokeActionData {
                        UserAction = InvokeActionType.Join, CompetitionId = openCompetitions[0].Id
                    });
                    heroCard.Buttons[1].Type.Should().Be("invoke");
                    heroCard.Buttons[1].Value.Should().BeEquivalentTo(new InvokeActionData {
                        Type = InvokeActionData.TypeTaskFetch, UserAction = InvokeActionType.ViewDetail, CompetitionId = openCompetitions[0].Id
                    });
                }
        }
コード例 #4
0
        public async Task GivenValidPreview_EditAgain_ReturnsEditFormWithCorrectInputValues()
        {
            var gift                     = Guid.NewGuid().ToString();
            var winnerCount              = "56";
            var giftImageUrl             = "https://www.some.com/image";
            var plannedDrawTimeLocal     = DateTimeOffset.UtcNow;
            var plannedDrawTimeLocalDate = plannedDrawTimeLocal.ToString("yyyy-MM-dd");
            var plannedDrawTimeLocalTime = plannedDrawTimeLocal.ToString("HH:mm");
            var editForm                 = new CompetitionEditForm
            {
                Gift                     = gift,
                GiftImageUrl             = giftImageUrl,
                WinnerCount              = winnerCount,
                PlannedDrawTimeLocalDate = plannedDrawTimeLocalDate,
                PlannedDrawTimeLocalTime = plannedDrawTimeLocalTime,
            };

            using (var server = CreateServerFixture(ServerFixtureConfigurations.Default))
                using (var client = server.CreateClient())
                {
                    var activity = new Activity
                    {
                        Name       = "composeExtension/submitAction",
                        ServiceUrl = "https://service-url.com",
                        ChannelId  = "msteams",
                        Type       = ActivityTypes.Invoke,
                        Value      = new
                        {
                            CommandId = "create",
                            BotMessagePreviewAction = "edit",
                            BotActivityPreview      = new []
                            {
                                new Activity
                                {
                                    Attachments = new []
                                    {
                                        new Attachment
                                        {
                                            Content = new AdaptiveCard("1.0")
                                            {
                                                Body = new List <AdaptiveElement>
                                                {
                                                    new AdaptiveTextBlock
                                                    {
                                                        Id   = "LuckyDrawData",
                                                        Text = JsonSerializer.Serialize(editForm)
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        },
                        Locale         = "en-us",
                        LocalTimestamp = new DateTimeOffset(2018, 1, 1, 1, 1, 1, 1, TimeSpan.FromHours(3.5))
                    };
                    var response = await client.SendActivity(activity);

                    response.StatusCode.Should().Be(HttpStatusCode.OK);
                    var actionResponse = await response.Content.ReadAsWithNewtonsoftJsonAsync <MessagingExtensionActionResponseForContinue>();

                    var card          = ((JObject)actionResponse.Task.Value.Card.Content).ToObject <AdaptiveCard>();
                    var giftTextInput = card.Body.FirstOrDefault(x => x.Id == "gift") as AdaptiveTextInput;
                    giftTextInput.Should().NotBeNull();
                    giftTextInput.Value.Should().Be(gift);
                    var winnerCountTextInput = card.Body.FirstOrDefault(x => x.Id == "winnerCount") as AdaptiveNumberInput;
                    winnerCountTextInput.Should().NotBeNull();
                    winnerCountTextInput.Value.Should().Be(int.Parse(winnerCount));
                    var columnSet = card.Body[5] as AdaptiveColumnSet;
                    var dateInput = columnSet.Columns[0].Items[0] as AdaptiveDateInput;
                    dateInput.Should().NotBeNull();
                    dateInput.Value.Should().Be(plannedDrawTimeLocalDate);
                    var timeInput = columnSet.Columns[1].Items[0] as AdaptiveTimeInput;
                    timeInput.Should().NotBeNull();
                    timeInput.Value.Should().Be(plannedDrawTimeLocalTime);
                    var giftImageUrlTextInput = card.Body.FirstOrDefault(x => x.Id == "giftImageUrl") as AdaptiveTextInput;
                    giftImageUrlTextInput.Should().NotBeNull();
                    giftImageUrlTextInput.Value.Should().Be(giftImageUrl);
                }
        }