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)); } }
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); }
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 }); } }
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); } }