Spaces:
Build error
Build error
Validify-testbot-1
/
botbuilder-python
/libraries
/botbuilder-dialogs
/tests
/test_attachment_prompt.py
| # Copyright (c) Microsoft Corporation. All rights reserved. | |
| # Licensed under the MIT License. | |
| import copy | |
| import aiounittest | |
| from botbuilder.dialogs.prompts import ( | |
| AttachmentPrompt, | |
| PromptOptions, | |
| PromptValidatorContext, | |
| ) | |
| from botbuilder.schema import Activity, ActivityTypes, Attachment, InputHints | |
| from botbuilder.core import ( | |
| TurnContext, | |
| ConversationState, | |
| MemoryStorage, | |
| MessageFactory, | |
| ) | |
| from botbuilder.core.adapters import TestAdapter | |
| from botbuilder.dialogs import DialogSet, DialogTurnStatus | |
| class AttachmentPromptTests(aiounittest.AsyncTestCase): | |
| def test_attachment_prompt_with_empty_id_should_fail(self): | |
| empty_id = "" | |
| with self.assertRaises(TypeError): | |
| AttachmentPrompt(empty_id) | |
| def test_attachment_prompt_with_none_id_should_fail(self): | |
| with self.assertRaises(TypeError): | |
| AttachmentPrompt(None) | |
| async def test_basic_attachment_prompt(self): | |
| async def exec_test(turn_context: TurnContext): | |
| dialog_context = await dialogs.create_context(turn_context) | |
| results = await dialog_context.continue_dialog() | |
| if results.status == DialogTurnStatus.Empty: | |
| options = PromptOptions( | |
| prompt=Activity( | |
| type=ActivityTypes.message, text="please add an attachment." | |
| ) | |
| ) | |
| await dialog_context.prompt("AttachmentPrompt", options) | |
| elif results.status == DialogTurnStatus.Complete: | |
| attachment = results.result[0] | |
| content = MessageFactory.text(attachment.content) | |
| await turn_context.send_activity(content) | |
| await convo_state.save_changes(turn_context) | |
| # Initialize TestAdapter. | |
| adapter = TestAdapter(exec_test) | |
| # Create ConversationState with MemoryStorage and register the state as middleware. | |
| convo_state = ConversationState(MemoryStorage()) | |
| # Create a DialogState property, DialogSet and AttachmentPrompt. | |
| dialog_state = convo_state.create_property("dialog_state") | |
| dialogs = DialogSet(dialog_state) | |
| dialogs.add(AttachmentPrompt("AttachmentPrompt")) | |
| # Create incoming activity with attachment. | |
| attachment = Attachment(content="some content", content_type="text/plain") | |
| attachment_activity = Activity( | |
| type=ActivityTypes.message, attachments=[attachment] | |
| ) | |
| step1 = await adapter.send("hello") | |
| step2 = await step1.assert_reply("please add an attachment.") | |
| step3 = await step2.send(attachment_activity) | |
| await step3.assert_reply("some content") | |
| async def test_attachment_prompt_with_input_hint(self): | |
| prompt_activity = Activity( | |
| type=ActivityTypes.message, | |
| text="please add an attachment.", | |
| input_hint=InputHints.accepting_input, | |
| ) | |
| async def exec_test(turn_context: TurnContext): | |
| dialog_context = await dialogs.create_context(turn_context) | |
| results = await dialog_context.continue_dialog() | |
| if results.status == DialogTurnStatus.Empty: | |
| options = PromptOptions(prompt=copy.copy(prompt_activity)) | |
| await dialog_context.prompt("AttachmentPrompt", options) | |
| elif results.status == DialogTurnStatus.Complete: | |
| attachment = results.result[0] | |
| content = MessageFactory.text(attachment.content) | |
| await turn_context.send_activity(content) | |
| await convo_state.save_changes(turn_context) | |
| # Initialize TestAdapter. | |
| adapter = TestAdapter(exec_test) | |
| # Create ConversationState with MemoryStorage and register the state as middleware. | |
| convo_state = ConversationState(MemoryStorage()) | |
| # Create a DialogState property, DialogSet and AttachmentPrompt. | |
| dialog_state = convo_state.create_property("dialog_state") | |
| dialogs = DialogSet(dialog_state) | |
| dialogs.add(AttachmentPrompt("AttachmentPrompt")) | |
| step1 = await adapter.send("hello") | |
| await step1.assert_reply(prompt_activity) | |
| async def test_attachment_prompt_with_validator(self): | |
| async def exec_test(turn_context: TurnContext): | |
| dialog_context = await dialogs.create_context(turn_context) | |
| results = await dialog_context.continue_dialog() | |
| if results.status == DialogTurnStatus.Empty: | |
| options = PromptOptions( | |
| prompt=Activity( | |
| type=ActivityTypes.message, text="please add an attachment." | |
| ) | |
| ) | |
| await dialog_context.prompt("AttachmentPrompt", options) | |
| elif results.status == DialogTurnStatus.Complete: | |
| attachment = results.result[0] | |
| content = MessageFactory.text(attachment.content) | |
| await turn_context.send_activity(content) | |
| await convo_state.save_changes(turn_context) | |
| # Initialize TestAdapter. | |
| adapter = TestAdapter(exec_test) | |
| # Create ConversationState with MemoryStorage and register the state as middleware. | |
| convo_state = ConversationState(MemoryStorage()) | |
| # Create a DialogState property, DialogSet and AttachmentPrompt. | |
| dialog_state = convo_state.create_property("dialog_state") | |
| dialogs = DialogSet(dialog_state) | |
| async def aux_validator(prompt_context: PromptValidatorContext): | |
| assert prompt_context, "Validator missing prompt_context" | |
| return prompt_context.recognized.succeeded | |
| dialogs.add(AttachmentPrompt("AttachmentPrompt", aux_validator)) | |
| # Create incoming activity with attachment. | |
| attachment = Attachment(content="some content", content_type="text/plain") | |
| attachment_activity = Activity( | |
| type=ActivityTypes.message, attachments=[attachment] | |
| ) | |
| step1 = await adapter.send("hello") | |
| step2 = await step1.assert_reply("please add an attachment.") | |
| step3 = await step2.send(attachment_activity) | |
| await step3.assert_reply("some content") | |
| async def test_retry_attachment_prompt(self): | |
| async def exec_test(turn_context: TurnContext): | |
| dialog_context = await dialogs.create_context(turn_context) | |
| results = await dialog_context.continue_dialog() | |
| if results.status == DialogTurnStatus.Empty: | |
| options = PromptOptions( | |
| prompt=Activity( | |
| type=ActivityTypes.message, text="please add an attachment." | |
| ) | |
| ) | |
| await dialog_context.prompt("AttachmentPrompt", options) | |
| elif results.status == DialogTurnStatus.Complete: | |
| attachment = results.result[0] | |
| content = MessageFactory.text(attachment.content) | |
| await turn_context.send_activity(content) | |
| await convo_state.save_changes(turn_context) | |
| # Initialize TestAdapter. | |
| adapter = TestAdapter(exec_test) | |
| # Create ConversationState with MemoryStorage and register the state as middleware. | |
| convo_state = ConversationState(MemoryStorage()) | |
| # Create a DialogState property, DialogSet and AttachmentPrompt. | |
| dialog_state = convo_state.create_property("dialog_state") | |
| dialogs = DialogSet(dialog_state) | |
| dialogs.add(AttachmentPrompt("AttachmentPrompt")) | |
| # Create incoming activity with attachment. | |
| attachment = Attachment(content="some content", content_type="text/plain") | |
| attachment_activity = Activity( | |
| type=ActivityTypes.message, attachments=[attachment] | |
| ) | |
| step1 = await adapter.send("hello") | |
| step2 = await step1.assert_reply("please add an attachment.") | |
| step3 = await step2.send("hello again") | |
| step4 = await step3.assert_reply("please add an attachment.") | |
| step5 = await step4.send(attachment_activity) | |
| await step5.assert_reply("some content") | |
| async def test_attachment_prompt_with_custom_retry(self): | |
| async def exec_test(turn_context: TurnContext): | |
| dialog_context = await dialogs.create_context(turn_context) | |
| results = await dialog_context.continue_dialog() | |
| if results.status == DialogTurnStatus.Empty: | |
| options = PromptOptions( | |
| prompt=Activity( | |
| type=ActivityTypes.message, text="please add an attachment." | |
| ), | |
| retry_prompt=Activity( | |
| type=ActivityTypes.message, text="please try again." | |
| ), | |
| ) | |
| await dialog_context.prompt("AttachmentPrompt", options) | |
| elif results.status == DialogTurnStatus.Complete: | |
| attachment = results.result[0] | |
| content = MessageFactory.text(attachment.content) | |
| await turn_context.send_activity(content) | |
| await convo_state.save_changes(turn_context) | |
| # Initialize TestAdapter. | |
| adapter = TestAdapter(exec_test) | |
| # Create ConversationState with MemoryStorage and register the state as middleware. | |
| convo_state = ConversationState(MemoryStorage()) | |
| # Create a DialogState property, DialogSet and AttachmentPrompt. | |
| dialog_state = convo_state.create_property("dialog_state") | |
| dialogs = DialogSet(dialog_state) | |
| async def aux_validator(prompt_context: PromptValidatorContext): | |
| assert prompt_context, "Validator missing prompt_context" | |
| return prompt_context.recognized.succeeded | |
| dialogs.add(AttachmentPrompt("AttachmentPrompt", aux_validator)) | |
| # Create incoming activity with attachment. | |
| attachment = Attachment(content="some content", content_type="text/plain") | |
| attachment_activity = Activity( | |
| type=ActivityTypes.message, attachments=[attachment] | |
| ) | |
| invalid_activty = Activity(type=ActivityTypes.message, text="invalid") | |
| step1 = await adapter.send("hello") | |
| step2 = await step1.assert_reply("please add an attachment.") | |
| step3 = await step2.send(invalid_activty) | |
| step4 = await step3.assert_reply("please try again.") | |
| step5 = await step4.send(attachment_activity) | |
| await step5.assert_reply("some content") | |
| async def test_should_send_ignore_retry_rompt_if_validator_replies(self): | |
| async def exec_test(turn_context: TurnContext): | |
| dialog_context = await dialogs.create_context(turn_context) | |
| results = await dialog_context.continue_dialog() | |
| if results.status == DialogTurnStatus.Empty: | |
| options = PromptOptions( | |
| prompt=Activity( | |
| type=ActivityTypes.message, text="please add an attachment." | |
| ), | |
| retry_prompt=Activity( | |
| type=ActivityTypes.message, text="please try again." | |
| ), | |
| ) | |
| await dialog_context.prompt("AttachmentPrompt", options) | |
| elif results.status == DialogTurnStatus.Complete: | |
| attachment = results.result[0] | |
| content = MessageFactory.text(attachment.content) | |
| await turn_context.send_activity(content) | |
| await convo_state.save_changes(turn_context) | |
| # Initialize TestAdapter. | |
| adapter = TestAdapter(exec_test) | |
| # Create ConversationState with MemoryStorage and register the state as middleware. | |
| convo_state = ConversationState(MemoryStorage()) | |
| # Create a DialogState property, DialogSet and AttachmentPrompt. | |
| dialog_state = convo_state.create_property("dialog_state") | |
| dialogs = DialogSet(dialog_state) | |
| async def aux_validator(prompt_context: PromptValidatorContext): | |
| assert prompt_context, "Validator missing prompt_context" | |
| if not prompt_context.recognized.succeeded: | |
| await prompt_context.context.send_activity("Bad input.") | |
| return prompt_context.recognized.succeeded | |
| dialogs.add(AttachmentPrompt("AttachmentPrompt", aux_validator)) | |
| # Create incoming activity with attachment. | |
| attachment = Attachment(content="some content", content_type="text/plain") | |
| attachment_activity = Activity( | |
| type=ActivityTypes.message, attachments=[attachment] | |
| ) | |
| invalid_activty = Activity(type=ActivityTypes.message, text="invalid") | |
| step1 = await adapter.send("hello") | |
| step2 = await step1.assert_reply("please add an attachment.") | |
| step3 = await step2.send(invalid_activty) | |
| step4 = await step3.assert_reply("Bad input.") | |
| step5 = await step4.send(attachment_activity) | |
| await step5.assert_reply("some content") | |
| async def test_should_not_send_retry_if_not_specified(self): | |
| async def exec_test(turn_context: TurnContext): | |
| dialog_context = await dialogs.create_context(turn_context) | |
| results = await dialog_context.continue_dialog() | |
| if results.status == DialogTurnStatus.Empty: | |
| await dialog_context.begin_dialog("AttachmentPrompt", PromptOptions()) | |
| elif results.status == DialogTurnStatus.Complete: | |
| attachment = results.result[0] | |
| content = MessageFactory.text(attachment.content) | |
| await turn_context.send_activity(content) | |
| await convo_state.save_changes(turn_context) | |
| # Initialize TestAdapter. | |
| adapter = TestAdapter(exec_test) | |
| # Create ConversationState with MemoryStorage and register the state as middleware. | |
| convo_state = ConversationState(MemoryStorage()) | |
| # Create a DialogState property, DialogSet and AttachmentPrompt. | |
| dialog_state = convo_state.create_property("dialog_state") | |
| dialogs = DialogSet(dialog_state) | |
| dialogs.add(AttachmentPrompt("AttachmentPrompt")) | |
| # Create incoming activity with attachment. | |
| attachment = Attachment(content="some content", content_type="text/plain") | |
| attachment_activity = Activity( | |
| type=ActivityTypes.message, attachments=[attachment] | |
| ) | |
| step1 = await adapter.send("hello") | |
| step2 = await step1.send("what?") | |
| step3 = await step2.send(attachment_activity) | |
| await step3.assert_reply("some content") | |