microsoft/teams.net

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
411466c009b3ae7aeeb169d3a8f51ca09c90eca2

Branches

Tags

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

Clone

HTTPS

Download ZIP

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

120lines · modecode

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