microsoft/teams.net

Public

mirrored fromhttps://github.com/microsoft/teams.netAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
feature/launch-settings-samples

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

Tests/Microsoft.Teams.Plugins.AspNetCore.Tests/AspNetCorePluginStreamTests.cs

122lines · modecode

1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT License.
3
4using Microsoft.Teams.Api;
5using Microsoft.Teams.Api.Activities;
6using Microsoft.Teams.Api.Entities;
7using Microsoft.Teams.Plugins.AspNetCore;
8
9namespace Microsoft.Teams.Plugins.AspNetCore.Tests;
10
11public class AspNetCorePluginStreamTests
12{
13 [Fact]
14 public async Task Stream_EmitMessage_FlushesAfter500ms()
15 {
16 var sendCallCount = 0;
17 var sendTimes = new List<DateTime>();
18 var stream = new AspNetCorePlugin.Stream
19 {
20 Send = activity =>
21 {
22 sendCallCount++;
23 sendTimes.Add(DateTime.Now);
24 activity.Id = $"test-id-{sendCallCount}";
25 return Task.FromResult(activity);
26 }
27 };
28
29 var startTime = DateTime.Now;
30
31 stream.Emit("Test message");
32 await Task.Delay(600); // Wait longer than 500ms timeout
33
34 Assert.True(sendCallCount > 0, "Should have sent at least one message");
35 Assert.True(sendTimes.Any(t => t >= startTime.AddMilliseconds(450)),
36 "Should have waited approximately 500ms before sending");
37 }
38
39 [Fact]
40 public async Task Stream_MultipleEmits_RestartsTimer()
41 {
42 var sendCallCount = 0;
43 var stream = new AspNetCorePlugin.Stream
44 {
45 Send = activity =>
46 {
47 sendCallCount++;
48 activity.Id = $"test-id-{sendCallCount}";
49 return Task.FromResult(activity);
50 }
51 };
52
53 stream.Emit("First message");
54 await Task.Delay(300); // Wait less than 500ms
55
56 stream.Emit("Second message"); // This should reset the timer
57 await Task.Delay(300); // Still less than 500ms from second emit
58
59 Assert.Equal(0, sendCallCount); // Should not have sent yet
60
61 await Task.Delay(300); // Now over 500ms from second emit
62
63 Assert.True(sendCallCount > 0, "Should have sent messages after timer expired");
64 }
65
66 [Fact]
67 public async Task Stream_SendTimeout_HandledGracefully()
68 {
69 var callCount = 0;
70 var stream = new AspNetCorePlugin.Stream
71 {
72 Send = activity =>
73 {
74 callCount++;
75 if (callCount == 1) // Fail first attempt
76 {
77 throw new TimeoutException("Operation timed out");
78 }
79
80 // Succeed on second attempt
81 activity.Id = $"success-after-timeout-{callCount}";
82 return Task.FromResult(activity);
83 }
84 };
85
86 stream.Emit("Test message with timeout");
87 await Task.Delay(600); // Wait for flush and retries
88
89 var result = await stream.Close();
90
91 Assert.True(callCount > 1, "Should have retried after timeout");
92 Assert.NotNull(result);
93 Assert.Contains("Test message with timeout", result.Text);
94 }
95
96 [Fact]
97 public async Task Stream_UpdateStatus_SendsTypingActivity()
98 {
99 var sentActivities = new List<IActivity>();
100 var stream = new AspNetCorePlugin.Stream
101 {
102 Send = activity =>
103 {
104 sentActivities.Add(activity);
105 return Task.FromResult(activity);
106 }
107 };
108
109 stream.Update("Thinking...");
110 await Task.Delay(600); // Wait for the flush task to complete
111
112 Assert.True(stream.Count > 0, "Should have processed the update");
113 Assert.Equal(2, stream.Sequence); // Should increment sequence after sending
114
115 Assert.True(sentActivities.Count > 0, "Should have sent at least one activity");
116 var sentActivity = sentActivities.First();
117 Assert.IsType<TypingActivity>(sentActivity);
118 Assert.Equal("Thinking...", ((TypingActivity)sentActivity).Text);
119 Assert.Equal(StreamType.Informative, ((TypingActivity)sentActivity).ChannelData?.StreamType);
120 }
121
122}
123