diff --git a/Libraries/Microsoft.Teams.Api/Activities/Message/MessageReactionActivity.cs b/Libraries/Microsoft.Teams.Api/Activities/Message/MessageReactionActivity.cs index 48f83139..e1d40bc3 100644 --- a/Libraries/Microsoft.Teams.Api/Activities/Message/MessageReactionActivity.cs +++ b/Libraries/Microsoft.Teams.Api/Activities/Message/MessageReactionActivity.cs @@ -23,6 +23,7 @@ public class MessageReactionActivity() : Activity(ActivityType.MessageReaction) [JsonPropertyOrder(122)] public IList? ReactionsRemoved { get; set; } + [Obsolete("Use the Reactions client instead.")] public MessageReactionActivity AddReaction(Messages.Reaction reaction) { ReactionsAdded ??= []; @@ -30,6 +31,7 @@ public MessageReactionActivity AddReaction(Messages.Reaction reaction) return this; } + [Obsolete("Use the Reactions client instead.")] public MessageReactionActivity AddReaction(Messages.ReactionType type) { ReactionsAdded ??= []; @@ -37,6 +39,7 @@ public MessageReactionActivity AddReaction(Messages.ReactionType type) return this; } + [Obsolete("Use the Reactions client instead.")] public MessageReactionActivity RemoveReaction(Messages.Reaction reaction) { ReactionsRemoved ??= []; @@ -58,6 +61,7 @@ public MessageReactionActivity RemoveReaction(Messages.Reaction reaction) return this; } + [Obsolete("Use the Reactions client instead.")] public MessageReactionActivity RemoveReaction(Messages.ReactionType type) { ReactionsRemoved ??= []; diff --git a/Libraries/Microsoft.Teams.Api/Clients/ApiClient.cs b/Libraries/Microsoft.Teams.Api/Clients/ApiClient.cs index 3a7d9269..b1588d2a 100644 --- a/Libraries/Microsoft.Teams.Api/Clients/ApiClient.cs +++ b/Libraries/Microsoft.Teams.Api/Clients/ApiClient.cs @@ -14,6 +14,20 @@ public class ApiClient : Client public virtual TeamClient Teams { get; } public virtual MeetingClient Meetings { get; } + /// + /// Gets the underlying instance used by this + /// and its sub-clients to perform HTTP requests. + /// + /// + /// This property is provided for advanced scenarios where you need to issue custom HTTP + /// calls that are not yet covered by the strongly-typed clients exposed by . + /// Prefer using the typed clients (, , + /// , , ) whenever possible. + /// Relying on this property may couple your code to the current HTTP implementation and + /// could limit future refactoring of the underlying client. + /// + public IHttpClient Client { get => base._http; } + public ApiClient(string serviceUrl, CancellationToken cancellationToken = default) : base(cancellationToken) { ServiceUrl = serviceUrl; diff --git a/Libraries/Microsoft.Teams.Api/Clients/ConversationClient.cs b/Libraries/Microsoft.Teams.Api/Clients/ConversationClient.cs index 8523faae..3ec316aa 100644 --- a/Libraries/Microsoft.Teams.Api/Clients/ConversationClient.cs +++ b/Libraries/Microsoft.Teams.Api/Clients/ConversationClient.cs @@ -13,12 +13,14 @@ public class ConversationClient : Client public readonly string ServiceUrl; public readonly ActivityClient Activities; public readonly MemberClient Members; + public readonly ReactionClient Reactions; public ConversationClient(string serviceUrl, CancellationToken cancellationToken = default) : base(cancellationToken) { ServiceUrl = serviceUrl; Activities = new ActivityClient(serviceUrl, _http, cancellationToken); Members = new MemberClient(serviceUrl, _http, cancellationToken); + Reactions = new ReactionClient(serviceUrl, _http, cancellationToken); } public ConversationClient(string serviceUrl, IHttpClient client, CancellationToken cancellationToken = default) : base(client, cancellationToken) @@ -26,6 +28,7 @@ public ConversationClient(string serviceUrl, IHttpClient client, CancellationTok ServiceUrl = serviceUrl; Activities = new ActivityClient(serviceUrl, _http, cancellationToken); Members = new MemberClient(serviceUrl, _http, cancellationToken); + Reactions = new ReactionClient(serviceUrl, _http, cancellationToken); } public ConversationClient(string serviceUrl, IHttpClientOptions options, CancellationToken cancellationToken = default) : base(options, cancellationToken) @@ -33,6 +36,7 @@ public ConversationClient(string serviceUrl, IHttpClientOptions options, Cancell ServiceUrl = serviceUrl; Activities = new ActivityClient(serviceUrl, _http, cancellationToken); Members = new MemberClient(serviceUrl, _http, cancellationToken); + Reactions = new ReactionClient(serviceUrl, _http, cancellationToken); } public ConversationClient(string serviceUrl, IHttpClientFactory factory, CancellationToken cancellationToken = default) : base(factory, cancellationToken) @@ -40,6 +44,7 @@ public ConversationClient(string serviceUrl, IHttpClientFactory factory, Cancell ServiceUrl = serviceUrl; Activities = new ActivityClient(serviceUrl, _http, cancellationToken); Members = new MemberClient(serviceUrl, _http, cancellationToken); + Reactions = new ReactionClient(serviceUrl, _http, cancellationToken); } public async Task CreateAsync(CreateRequest request) diff --git a/Libraries/Microsoft.Teams.Api/Clients/ReactionClient.cs b/Libraries/Microsoft.Teams.Api/Clients/ReactionClient.cs new file mode 100644 index 00000000..85ae72a2 --- /dev/null +++ b/Libraries/Microsoft.Teams.Api/Clients/ReactionClient.cs @@ -0,0 +1,94 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Microsoft.Teams.Api.Messages; +using Microsoft.Teams.Common.Http; + +namespace Microsoft.Teams.Api.Clients; + +/// +/// Client for working with app message reactions for a given conversation/activity. +/// +public class ReactionClient : Client +{ + public readonly string ServiceUrl; + + public ReactionClient(string serviceUrl, CancellationToken cancellationToken = default) + : base(cancellationToken) + { + ServiceUrl = serviceUrl; + } + + public ReactionClient(string serviceUrl, IHttpClient client, CancellationToken cancellationToken = default) + : base(client, cancellationToken) + { + ServiceUrl = serviceUrl; + } + + public ReactionClient(string serviceUrl, IHttpClientOptions options, CancellationToken cancellationToken = default) + : base(options, cancellationToken) + { + ServiceUrl = serviceUrl; + } + + public ReactionClient(string serviceUrl, IHttpClientFactory factory, CancellationToken cancellationToken = default) + : base(factory, cancellationToken) + { + ServiceUrl = serviceUrl; + } + + /// + /// Adds a reaction on an activity in a conversation. + /// + /// The conversation id. + /// The id of the activity to react to. + /// + /// The reaction type (for example: "like", "heart", "launch", etc.). + /// + /// A to observe while waiting for the task to complete. + /// + /// A representing the asynchronous operation. + /// + public async Task AddAsync( + string conversationId, + string activityId, + ReactionType reactionType, + CancellationToken cancellationToken = default + ) + { + // Assumed route: + // PUT v3/conversations/{conversationId}/activities/{activityId}/reactions/{reactionType} + var url = $"{ServiceUrl}v3/conversations/{conversationId}/activities/{activityId}/reactions/{reactionType}"; + var req = HttpRequest.Put(url); + await _http.SendAsync(req, cancellationToken != default ? cancellationToken : _cancellationToken); + } + + /// + /// Removes a reaction from an activity in a conversation. + /// + /// The conversation id. + /// The id of the activity the reaction is on. + /// + /// The reaction type to remove (for example: "like", "heart", "launch", etc.). + /// + /// A to observe while waiting for the task to complete. + /// + /// A representing the asynchronous operation. + /// + public async Task DeleteAsync( + string conversationId, + string activityId, + ReactionType reactionType, + CancellationToken cancellationToken = default + ) + { + // Assumed route: + // DELETE v3/conversations/{conversationId}/activities/{activityId}/reactions/{reactionType} + var url = + $"{ServiceUrl}v3/conversations/{conversationId}/activities/{activityId}/reactions/{reactionType}"; + + var req = HttpRequest.Delete(url); + + await _http.SendAsync(req, cancellationToken != default ? cancellationToken : _cancellationToken); + } +} diff --git a/Libraries/Microsoft.Teams.Api/Messages/Reaction.cs b/Libraries/Microsoft.Teams.Api/Messages/Reaction.cs index 58fe0b35..974f0fd4 100644 --- a/Libraries/Microsoft.Teams.Api/Messages/Reaction.cs +++ b/Libraries/Microsoft.Teams.Api/Messages/Reaction.cs @@ -8,33 +8,46 @@ namespace Microsoft.Teams.Api.Messages; /// -/// The type of reaction given to the -/// message. Possible values include: 'like', 'heart', 'laugh', 'surprised', -/// 'sad', 'angry', 'plusOne' +/// The type of reaction given to the message. /// [JsonConverter(typeof(JsonConverter))] public class ReactionType(string value) : StringEnum(value) { + /// + /// 👍 + /// public static readonly ReactionType Like = new("like"); public bool IsLike => Like.Equals(Value); + /// + /// ❤️ + /// public static readonly ReactionType Heart = new("heart"); public bool IsHeart => Heart.Equals(Value); - public static readonly ReactionType Laugh = new("laugh"); - public bool IsLaugh => Laugh.Equals(Value); - - public static readonly ReactionType Surprise = new("surprise"); - public bool IsSurprise => Surprise.Equals(Value); + /// + /// 👀 + /// + public static readonly ReactionType Eyes = new("1f440_eyes"); + public bool IsEyes => Eyes.Equals(Value); - public static readonly ReactionType Sad = new("sad"); - public bool IsSad => Sad.Equals(Value); + /// + /// ✅ + /// + public static readonly ReactionType CheckMark = new("2705_whiteheavycheckmark"); + public bool IsCheckMark => CheckMark.Equals(Value); - public static readonly ReactionType Angry = new("angry"); - public bool IsAngry => Angry.Equals(Value); + /// + /// 🚀 + /// + public static readonly ReactionType Launch = new("launch"); + public bool IsLaunch => Launch.Equals(Value); - public static readonly ReactionType PlusOne = new("plusOne"); - public bool IsPlusOne => PlusOne.Equals(Value); + /// + /// 📌 + /// + public static readonly ReactionType Pushpin = new("1f4cc_pushpin"); + public bool IsPushpin => Pushpin.Equals(Value); } /// diff --git a/Microsoft.Teams.sln b/Microsoft.Teams.sln index a6b950d7..f2566bc6 100644 --- a/Microsoft.Teams.sln +++ b/Microsoft.Teams.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 18 -VisualStudioVersion = 18.2.11415.280 d18.0 +VisualStudioVersion = 18.2.11415.280 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{809F86A1-1C4C-B159-0CD4-DF9D33D876CE}" EndProject @@ -89,6 +89,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Deprecated.Controllers", "S EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.TargetedMessages", "Samples\Samples.TargetedMessages\Samples.TargetedMessages.csproj", "{A5989DC4-B182-4218-A858-24FA5FE31251}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.Reactions", "Samples\Samples.Reactions\Samples.Reactions.csproj", "{1FCD6490-DD3A-4D76-A07F-A30655365CA8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -543,6 +545,18 @@ Global {A5989DC4-B182-4218-A858-24FA5FE31251}.Release|x64.Build.0 = Release|Any CPU {A5989DC4-B182-4218-A858-24FA5FE31251}.Release|x86.ActiveCfg = Release|Any CPU {A5989DC4-B182-4218-A858-24FA5FE31251}.Release|x86.Build.0 = Release|Any CPU + {1FCD6490-DD3A-4D76-A07F-A30655365CA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1FCD6490-DD3A-4D76-A07F-A30655365CA8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1FCD6490-DD3A-4D76-A07F-A30655365CA8}.Debug|x64.ActiveCfg = Debug|Any CPU + {1FCD6490-DD3A-4D76-A07F-A30655365CA8}.Debug|x64.Build.0 = Debug|Any CPU + {1FCD6490-DD3A-4D76-A07F-A30655365CA8}.Debug|x86.ActiveCfg = Debug|Any CPU + {1FCD6490-DD3A-4D76-A07F-A30655365CA8}.Debug|x86.Build.0 = Debug|Any CPU + {1FCD6490-DD3A-4D76-A07F-A30655365CA8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1FCD6490-DD3A-4D76-A07F-A30655365CA8}.Release|Any CPU.Build.0 = Release|Any CPU + {1FCD6490-DD3A-4D76-A07F-A30655365CA8}.Release|x64.ActiveCfg = Release|Any CPU + {1FCD6490-DD3A-4D76-A07F-A30655365CA8}.Release|x64.Build.0 = Release|Any CPU + {1FCD6490-DD3A-4D76-A07F-A30655365CA8}.Release|x86.ActiveCfg = Release|Any CPU + {1FCD6490-DD3A-4D76-A07F-A30655365CA8}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -588,6 +602,7 @@ Global {FCEEF7AD-1E78-4615-8BE4-7B46B034A514} = {5D20AA90-6969-D8BD-9DCD-8634F4692FDA} {1F0A8B29-3792-4E11-B6A7-43F03F9A591F} = {5D20AA90-6969-D8BD-9DCD-8634F4692FDA} {A5989DC4-B182-4218-A858-24FA5FE31251} = {5D20AA90-6969-D8BD-9DCD-8634F4692FDA} + {1FCD6490-DD3A-4D76-A07F-A30655365CA8} = {5D20AA90-6969-D8BD-9DCD-8634F4692FDA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {378263F2-C2B2-4DB1-83CF-CA228AF03ABF} diff --git a/Samples/Samples.Reactions/Program.cs b/Samples/Samples.Reactions/Program.cs new file mode 100644 index 00000000..248b4819 --- /dev/null +++ b/Samples/Samples.Reactions/Program.cs @@ -0,0 +1,38 @@ +using Microsoft.Teams.Api.Clients; +using Microsoft.Teams.Api.Messages; +using Microsoft.Teams.Apps.Activities; +using Microsoft.Teams.Apps.Extensions; +using Microsoft.Teams.Plugins.AspNetCore.DevTools.Extensions; +using Microsoft.Teams.Plugins.AspNetCore.Extensions; + +var builder = WebApplication.CreateBuilder(args); +builder.AddTeams().AddTeamsDevTools(); +var app = builder.Build(); +var teams = app.UseTeams(); + + +teams.OnMessage(async (context, cancellationToken) => +{ + await context.Send($"you said '{context.Activity.Text}'", cancellationToken); + + // replace with context.Api.Conversations.Reactions once Reactions client is available in PROD. + var api = new ApiClient(context.Activity.ServiceUrl!, context.Api.Client, cancellationToken); + + await api.Conversations.Reactions.AddAsync(context.Activity.Conversation.Id, context.Activity.Id, new ReactionType("1f44b_wavinghand-tone4")); + + await Task.Delay(2000, cancellationToken); + await api.Conversations.Reactions.AddAsync(context.Activity.Conversation.Id, context.Activity.Id, new ReactionType("1f601_beamingfacewithsmilingeyes")); + + await Task.Delay(2000, cancellationToken); + await api.Conversations.Reactions.DeleteAsync(context.Activity.Conversation.Id, context.Activity.Id, new ReactionType("1f601_beamingfacewithsmilingeyes")); + +}); + +teams.OnMessageReaction(async (context, cancellationToken) => +{ + context.Log.Info($"Reaction '{context.Activity.ReactionsAdded?.FirstOrDefault()?.Type}' added by {context.Activity.From?.Name}"); + await context.Send($"you added '{context.Activity.ReactionsAdded?.FirstOrDefault()?.Type}' " + + $"and removed '{context.Activity.ReactionsRemoved?.FirstOrDefault()?.Type}'", cancellationToken); +}); + +app.Run(); \ No newline at end of file diff --git a/Samples/Samples.Reactions/Properties/launchSettings.TEMPLATE.json b/Samples/Samples.Reactions/Properties/launchSettings.TEMPLATE.json new file mode 100644 index 00000000..6fc6823f --- /dev/null +++ b/Samples/Samples.Reactions/Properties/launchSettings.TEMPLATE.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "bot-config": { + "commandName": "Project", + "launchBrowser": false, + "applicationUrl": "http://localhost:3978", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "Teams__TenantId": "", + "Teams__ClientId": "", + "Teams__ClientSecret": "" + } + } + } +} diff --git a/Samples/Samples.Reactions/Samples.Reactions.csproj b/Samples/Samples.Reactions/Samples.Reactions.csproj new file mode 100644 index 00000000..682a8f9d --- /dev/null +++ b/Samples/Samples.Reactions/Samples.Reactions.csproj @@ -0,0 +1,14 @@ + + + + net10.0 + enable + enable + + + + + + + + diff --git a/Samples/Samples.Reactions/appsettings.json b/Samples/Samples.Reactions/appsettings.json new file mode 100644 index 00000000..10f68b8c --- /dev/null +++ b/Samples/Samples.Reactions/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/Tests/Microsoft.Teams.Api.Tests/Activities/Message/MessageReactionActivityTests.cs b/Tests/Microsoft.Teams.Api.Tests/Activities/Message/MessageReactionActivityTests.cs index ac52de79..eaff0dd3 100644 --- a/Tests/Microsoft.Teams.Api.Tests/Activities/Message/MessageReactionActivityTests.cs +++ b/Tests/Microsoft.Teams.Api.Tests/Activities/Message/MessageReactionActivityTests.cs @@ -29,15 +29,7 @@ public void JsonSerialize() Name = "test-bot", Role = Role.Bot } - }.AddReaction(new Messages.Reaction() - { - Type = Messages.ReactionType.Like, - User = new Messages.User() - { - Id = "100", - UserIdentityType = Messages.UserIdentityType.AnonymousGuest - } - }); + }; var json = JsonSerializer.Serialize(activity, new JsonSerializerOptions() { @@ -74,15 +66,7 @@ public void JsonSerialize_Derived() Name = "test-bot", Role = Role.Bot } - }.AddReaction(new Messages.Reaction() - { - Type = Messages.ReactionType.Like, - User = new Messages.User() - { - Id = "100", - UserIdentityType = Messages.UserIdentityType.AnonymousGuest - } - }); + }; var json = JsonSerializer.Serialize(activity, new JsonSerializerOptions() { @@ -119,15 +103,7 @@ public void JsonSerialize_Derived_Interface() Name = "test-bot", Role = Role.Bot } - }.AddReaction(new Messages.Reaction() - { - Type = Messages.ReactionType.Like, - User = new Messages.User() - { - Id = "100", - UserIdentityType = Messages.UserIdentityType.AnonymousGuest - } - }); + }; var json = JsonSerializer.Serialize(activity, new JsonSerializerOptions() { @@ -166,15 +142,7 @@ public void JsonDeserialize() Name = "test-bot", Role = Role.Bot } - }.AddReaction(new Messages.Reaction() - { - Type = Messages.ReactionType.Like, - User = new Messages.User() - { - Id = "100", - UserIdentityType = Messages.UserIdentityType.AnonymousGuest - } - }); + }; Assert.Equivalent(expected, activity); } @@ -204,15 +172,7 @@ public void JsonDeserialize_Derived() Name = "test-bot", Role = Role.Bot } - }.AddReaction(new Messages.Reaction() - { - Type = Messages.ReactionType.Like, - User = new Messages.User() - { - Id = "100", - UserIdentityType = Messages.UserIdentityType.AnonymousGuest - } - }); + }; Assert.Equivalent(expected, activity); } diff --git a/Tests/Microsoft.Teams.Api.Tests/Clients/ReactionClientTests.cs b/Tests/Microsoft.Teams.Api.Tests/Clients/ReactionClientTests.cs new file mode 100644 index 00000000..ce4722ac --- /dev/null +++ b/Tests/Microsoft.Teams.Api.Tests/Clients/ReactionClientTests.cs @@ -0,0 +1,74 @@ +using System.Net; + +using Microsoft.Teams.Api.Clients; +using Microsoft.Teams.Api.Messages; +using Microsoft.Teams.Common.Http; + +using Moq; + +namespace Microsoft.Teams.Api.Tests.Clients; + +public class ReactionClientTests +{ + [Fact] + public async Task ReactionClient_AddAsync() + { + var responseMessage = new HttpResponseMessage(); + responseMessage.Headers.Add("Custom-Header", "HeaderValue"); + var mockHandler = new Mock(); + mockHandler + .Setup(handler => handler.SendAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(new HttpResponse() + { + Headers = responseMessage.Headers, + StatusCode = HttpStatusCode.OK, + Body = string.Empty + }); + + string serviceUrl = "https://serviceurl.com/"; + var reactionClient = new ReactionClient(serviceUrl, mockHandler.Object); + string conversationId = "conversationId"; + string activityId = "activityId"; + var reactionType = ReactionType.Like; + + await reactionClient.AddAsync(conversationId, activityId, reactionType); + + string expectedUrl = "https://serviceurl.com/v3/conversations/conversationId/activities/activityId/reactions/like"; + HttpMethod expectedMethod = HttpMethod.Put; + mockHandler.Verify(x => x.SendAsync( + It.Is(arg => arg.Url == expectedUrl && arg.Method == expectedMethod), + It.IsAny()), + Times.Once); + } + + [Fact] + public async Task ReactionClient_DeleteAsync() + { + var responseMessage = new HttpResponseMessage(); + responseMessage.Headers.Add("Custom-Header", "HeaderValue"); + var mockHandler = new Mock(); + mockHandler + .Setup(handler => handler.SendAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(new HttpResponse() + { + Headers = responseMessage.Headers, + StatusCode = HttpStatusCode.OK, + Body = string.Empty + }); + + string serviceUrl = "https://serviceurl.com/"; + var reactionClient = new ReactionClient(serviceUrl, mockHandler.Object); + string conversationId = "conversationId"; + string activityId = "activityId"; + var reactionType = ReactionType.Heart; + + await reactionClient.DeleteAsync(conversationId, activityId, reactionType); + + string expectedUrl = "https://serviceurl.com/v3/conversations/conversationId/activities/activityId/reactions/heart"; + HttpMethod expectedMethod = HttpMethod.Delete; + mockHandler.Verify(x => x.SendAsync( + It.Is(arg => arg.Url == expectedUrl && arg.Method == expectedMethod), + It.IsAny()), + Times.Once); + } +} diff --git a/Tests/Microsoft.Teams.Api.Tests/Json/Activity/Message/MessageReactionActivity.json b/Tests/Microsoft.Teams.Api.Tests/Json/Activity/Message/MessageReactionActivity.json index 488ea5f2..f8dd48d9 100644 --- a/Tests/Microsoft.Teams.Api.Tests/Json/Activity/Message/MessageReactionActivity.json +++ b/Tests/Microsoft.Teams.Api.Tests/Json/Activity/Message/MessageReactionActivity.json @@ -15,14 +15,5 @@ "conversation": { "id": "1", "conversationType": "personal" - }, - "reactionsAdded": [ - { - "type": "like", - "user": { - "id": "100", - "userIdentityType": "anonymousGuest" - } - } - ] + } } \ No newline at end of file diff --git a/Tests/Microsoft.Teams.Apps.Tests/Activities/Messages/MessageReactionActivityTests.cs b/Tests/Microsoft.Teams.Apps.Tests/Activities/Messages/MessageReactionActivityTests.cs index b5f9623c..d1b6b1b5 100644 --- a/Tests/Microsoft.Teams.Apps.Tests/Activities/Messages/MessageReactionActivityTests.cs +++ b/Tests/Microsoft.Teams.Apps.Tests/Activities/Messages/MessageReactionActivityTests.cs @@ -35,16 +35,16 @@ public async Task Should_CallHandler() calls++; Assert.True(context.Activity.Type.IsMessageReaction); Assert.Single(context.Activity.ReactionsAdded ?? []); - Assert.True(context.Activity.ReactionsAdded!.First().Type.IsAngry); + Assert.True(context.Activity.ReactionsAdded!.First().Type.IsLike); return Task.CompletedTask; }); - var res = await _app.Process(_token, new MessageReactionActivity().AddReaction(Api.Messages.ReactionType.Angry)); + var res = await _app.Process(_token, new MessageReactionActivity()); Assert.Equal(System.Net.HttpStatusCode.OK, res.Status); Assert.Equal(2, calls); - Assert.Equal(2, _controller.Calls); - Assert.Equal(4, res.Meta.Routes); + Assert.Equal(1, _controller.Calls); + Assert.Equal(3, res.Meta.Routes); } [Fact] @@ -84,7 +84,7 @@ public async Task Should_CallHandler_OnAdd() calls++; Assert.True(context.Activity.Type.IsMessageReaction); Assert.Single(context.Activity.ReactionsAdded ?? []); - Assert.True(context.Activity.ReactionsAdded!.First().Type.IsAngry); + Assert.True(context.Activity.ReactionsAdded!.First().Type.IsLike); return context.Next(); }); @@ -94,16 +94,16 @@ public async Task Should_CallHandler_OnAdd() Assert.True(context.Activity.Type.IsMessageReaction); Assert.Single(context.Activity.ReactionsAdded ?? []); Assert.Empty(context.Activity.ReactionsRemoved ?? []); - Assert.True(context.Activity.ReactionsAdded!.First().Type.IsAngry); + Assert.True(context.Activity.ReactionsAdded!.First().Type.IsLike); return Task.CompletedTask; }); - var res = await _app.Process(_token, new MessageReactionActivity().AddReaction(Api.Messages.ReactionType.Angry)); + var res = await _app.Process(_token, new MessageReactionActivity()); Assert.Equal(System.Net.HttpStatusCode.OK, res.Status); - Assert.Equal(3, calls); - Assert.Equal(2, _controller.Calls); - Assert.Equal(5, res.Meta.Routes); + Assert.Equal(2, calls); + Assert.Equal(1, _controller.Calls); + Assert.Equal(3, res.Meta.Routes); } [Fact] @@ -123,7 +123,7 @@ public async Task Should_CallHandler_OnRemove() calls++; Assert.True(context.Activity.Type.IsMessageReaction); Assert.Single(context.Activity.ReactionsRemoved ?? []); - Assert.True(context.Activity.ReactionsRemoved!.First().Type.IsAngry); + Assert.True(context.Activity.ReactionsRemoved!.First().Type.IsLike); return context.Next(); }); @@ -133,16 +133,16 @@ public async Task Should_CallHandler_OnRemove() Assert.True(context.Activity.Type.IsMessageReaction); Assert.Single(context.Activity.ReactionsAdded ?? []); Assert.Empty(context.Activity.ReactionsRemoved ?? []); - Assert.True(context.Activity.ReactionsRemoved!.First().Type.IsAngry); + Assert.True(context.Activity.ReactionsRemoved!.First().Type.IsLike); return Task.CompletedTask; }); - var res = await _app.Process(_token, new MessageReactionActivity().RemoveReaction(Api.Messages.ReactionType.Angry)); + var res = await _app.Process(_token, new MessageReactionActivity()); Assert.Equal(System.Net.HttpStatusCode.OK, res.Status); - Assert.Equal(3, calls); - Assert.Equal(2, _controller.Calls); - Assert.Equal(5, res.Meta.Routes); + Assert.Equal(2, calls); + Assert.Equal(1, _controller.Calls); + Assert.Equal(3, res.Meta.Routes); } [TeamsController] diff --git a/Tests/Microsoft.Teams.Apps.Tests/Microsoft.Teams.Apps.Tests.csproj b/Tests/Microsoft.Teams.Apps.Tests/Microsoft.Teams.Apps.Tests.csproj index 03f2566f..2da9ef9e 100644 --- a/Tests/Microsoft.Teams.Apps.Tests/Microsoft.Teams.Apps.Tests.csproj +++ b/Tests/Microsoft.Teams.Apps.Tests/Microsoft.Teams.Apps.Tests.csproj @@ -1,29 +1,30 @@  - - net8.0;net10.0 - enable - enable - false - + + net8.0;net10.0 + enable + enable + false + $(NoWarn);CS0618 + - - - - - - - - - + + + + + + + + + - - - + + + - - - - + + + +