66from slack_sdk .models .blocks .basic_components import FeedbackButtonObject
77from slack_sdk .models .blocks .block_elements import FeedbackButtonsElement , IconButtonElement
88from slack_sdk .models .blocks .blocks import ContextActionsBlock
9+ from slack_sdk .models .messages .chunk import MarkdownTextChunk , TaskUpdateChunk
910from slack_sdk .web .async_client import AsyncWebClient
1011from tests .mock_web_api_server import cleanup_mock_web_api_server , setup_mock_web_api_server
1112from tests .slack_sdk .web .mock_web_api_handler import MockHandler
@@ -107,7 +108,10 @@ async def test_streams_a_short_message(self):
107108 stop_request = self .thread .server .chat_stream_requests .get ("/chat.stopStream" , {})
108109 self .assertEqual (stop_request .get ("channel" ), "C0123456789" )
109110 self .assertEqual (stop_request .get ("ts" ), "123.123" )
110- self .assertEqual (stop_request .get ("markdown_text" ), "nice!" )
111+ self .assertEqual (
112+ json .dumps (stop_request .get ("chunks" )),
113+ '[{"type": "markdown_text", "text": "nice!"}]' ,
114+ )
111115
112116 @async_test
113117 async def test_streams_a_long_message (self ):
@@ -149,13 +153,19 @@ async def test_streams_a_long_message(self):
149153 start_request = self .thread .server .chat_stream_requests .get ("/chat.startStream" , {})
150154 self .assertEqual (start_request .get ("channel" ), "C0123456789" )
151155 self .assertEqual (start_request .get ("thread_ts" ), "123.000" )
152- self .assertEqual (start_request .get ("markdown_text" ), "**this messag" )
156+ self .assertEqual (
157+ json .dumps (start_request .get ("chunks" )),
158+ '[{"type": "markdown_text", "text": "**this messag"}]' ,
159+ )
153160 self .assertEqual (start_request .get ("recipient_team_id" ), "T0123456789" )
154161 self .assertEqual (start_request .get ("recipient_user_id" ), "U0123456789" )
155162
156163 append_request = self .thread .server .chat_stream_requests .get ("/chat.appendStream" , {})
157164 self .assertEqual (append_request .get ("channel" ), "C0123456789" )
158- self .assertEqual (append_request .get ("markdown_text" ), "e is bold!" )
165+ self .assertEqual (
166+ json .dumps (append_request .get ("chunks" )),
167+ '[{"type": "markdown_text", "text": "e is bold!"}]' ,
168+ )
159169 self .assertEqual (append_request .get ("token" ), "xoxb-chat_stream_test_token1" )
160170 self .assertEqual (append_request .get ("ts" ), "123.123" )
161171
@@ -165,10 +175,75 @@ async def test_streams_a_long_message(self):
165175 '[{"elements": [{"negative_button": {"text": {"emoji": true, "text": "bad", "type": "plain_text"}, "value": "-1"}, "positive_button": {"text": {"emoji": true, "text": "good", "type": "plain_text"}, "value": "+1"}, "type": "feedback_buttons"}, {"icon": "trash", "text": {"emoji": true, "text": "delete", "type": "plain_text"}, "type": "icon_button"}], "type": "context_actions"}]' ,
166176 )
167177 self .assertEqual (stop_request .get ("channel" ), "C0123456789" )
168- self .assertEqual (stop_request .get ("markdown_text" ), "**" )
178+ self .assertEqual (
179+ json .dumps (stop_request .get ("chunks" )),
180+ '[{"type": "markdown_text", "text": "**"}]' ,
181+ )
169182 self .assertEqual (stop_request .get ("token" ), "xoxb-chat_stream_test_token2" )
170183 self .assertEqual (stop_request .get ("ts" ), "123.123" )
171184
185+ @async_test
186+ async def test_streams_a_chunk_message (self ):
187+ streamer = await self .client .chat_stream (
188+ channel = "C0123456789" ,
189+ recipient_team_id = "T0123456789" ,
190+ recipient_user_id = "U0123456789" ,
191+ thread_ts = "123.000" ,
192+ )
193+ await streamer .append (markdown_text = "**this is " )
194+ await streamer .append (markdown_text = "buffered**" )
195+ await streamer .append (
196+ chunks = [
197+ TaskUpdateChunk (
198+ id = "001" ,
199+ title = "Counting..." ,
200+ status = "pending" ,
201+ ),
202+ ],
203+ )
204+ await streamer .append (
205+ chunks = [
206+ MarkdownTextChunk (text = "**this is unbuffered**" ),
207+ ],
208+ )
209+ await streamer .append (markdown_text = "\n " )
210+ await streamer .stop (
211+ chunks = [
212+ MarkdownTextChunk (text = ":space_invader:" ),
213+ ],
214+ )
215+
216+ self .assertEqual (self .received_requests .get ("/chat.startStream" , 0 ), 1 )
217+ self .assertEqual (self .received_requests .get ("/chat.appendStream" , 0 ), 1 )
218+ self .assertEqual (self .received_requests .get ("/chat.stopStream" , 0 ), 1 )
219+
220+ if hasattr (self .thread .server , "chat_stream_requests" ):
221+ start_request = self .thread .server .chat_stream_requests .get ("/chat.startStream" , {})
222+ self .assertEqual (start_request .get ("channel" ), "C0123456789" )
223+ self .assertEqual (start_request .get ("thread_ts" ), "123.000" )
224+ self .assertEqual (
225+ json .dumps (start_request .get ("chunks" )),
226+ '[{"type": "markdown_text", "text": "**this is buffered**"}, {"id": "001", "status": "pending", "title": "Counting...", "type": "task_update"}]' ,
227+ )
228+ self .assertEqual (start_request .get ("recipient_team_id" ), "T0123456789" )
229+ self .assertEqual (start_request .get ("recipient_user_id" ), "U0123456789" )
230+
231+ append_request = self .thread .server .chat_stream_requests .get ("/chat.appendStream" , {})
232+ self .assertEqual (append_request .get ("channel" ), "C0123456789" )
233+ self .assertEqual (append_request .get ("ts" ), "123.123" )
234+ self .assertEqual (
235+ json .dumps (append_request .get ("chunks" )),
236+ '[{"text": "**this is unbuffered**", "type": "markdown_text"}]' ,
237+ )
238+
239+ stop_request = self .thread .server .chat_stream_requests .get ("/chat.stopStream" , {})
240+ self .assertEqual (stop_request .get ("channel" ), "C0123456789" )
241+ self .assertEqual (stop_request .get ("ts" ), "123.123" )
242+ self .assertEqual (
243+ json .dumps (stop_request .get ("chunks" )),
244+ '[{"type": "markdown_text", "text": "\\ n"}, {"text": ":space_invader:", "type": "markdown_text"}]' ,
245+ )
246+
172247 @async_test
173248 async def test_streams_errors_when_appending_to_an_unstarted_stream (self ):
174249 streamer = await self .client .chat_stream (
0 commit comments