Skip to content
This repository was archived by the owner on Jan 5, 2026. It is now read-only.

Commit 2f3dd0c

Browse files
authored
Merge pull request #177 from southworkscom/add-date-time-prompt-test
Add tests for DateTimePrompt and NumberPrompt
2 parents df55ed1 + 158fc01 commit 2f3dd0c

File tree

4 files changed

+107
-19
lines changed

4 files changed

+107
-19
lines changed

libraries/botbuilder-dialogs/botbuilder/dialogs/prompts/datetime_prompt.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from .prompt import Prompt
99
from .prompt_options import PromptOptions
1010
from .prompt_recognizer_result import PromptRecognizerResult
11+
from recognizers_date_time import recognize_datetime
1112

1213
class DateTimePrompt(Prompt):
1314
def __init__(self, dialog_id: str, validator: object = None, default_locale: str = None):
@@ -34,10 +35,9 @@ async def on_recognize(self, turn_context: TurnContext, state: Dict[str, object]
3435
if turn_context.activity.type == ActivityTypes.message:
3536
# Recognize utterance
3637
message = turn_context.activity
37-
# TODO: English contsant needs to be ported.
38+
# TODO: English constant needs to be ported.
3839
culture = message.locale if message.locale != None else "English"
39-
# TODO: Move this import to top of file when recognizers package is published
40-
from recognizers_date_time import recognize_datetime
40+
4141
results = recognize_datetime(message.text, culture)
4242
if len(results) > 0:
4343
result.succeeded = True

libraries/botbuilder-dialogs/botbuilder/dialogs/prompts/number_prompt.py

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,46 +4,43 @@
44
from typing import Dict
55
from botbuilder.core.turn_context import TurnContext
66
from botbuilder.schema import (ActivityTypes, Activity)
7-
from .datetime_resolution import DateTimeResolution
87
from .prompt import Prompt
98
from .prompt_options import PromptOptions
109
from .prompt_recognizer_result import PromptRecognizerResult
11-
10+
from recognizers_number import recognize_number
1211

1312
class NumberPrompt(Prompt):
1413
# TODO: PromptValidator
1514
def __init__(self, dialog_id: str, validator: object, default_locale: str):
1615
super(NumberPrompt, self).__init__(dialog_id, validator)
1716
self.default_locale = default_locale
18-
1917

2018
async def on_prompt(self, turn_context: TurnContext, state: Dict[str, object], options: PromptOptions, is_retry: bool):
2119
if not turn_context:
2220
raise TypeError('NumberPrompt.on_prompt(): turn_context cannot be None.')
2321
if not options:
2422
raise TypeError('NumberPrompt.on_prompt(): options cannot be None.')
25-
23+
2624
if is_retry == True and options.retry_prompt != None:
27-
prompt = turn_context.send_activity(options.retry_prompt)
25+
prompt = turn_context.send_activity(options.retry_prompt)
2826
else:
2927
if options.prompt != None:
30-
turn_context.send_activity(options.prompt)
31-
28+
await turn_context.send_activity(options.prompt)
3229

3330
async def on_recognize(self, turn_context: TurnContext, state: Dict[str, object], options: PromptOptions) -> PromptRecognizerResult:
3431
if not turn_context:
3532
raise TypeError('NumberPrompt.on_recognize(): turn_context cannot be None.')
36-
33+
3734
result = PromptRecognizerResult()
3835
if turn_context.activity.type == ActivityTypes.message:
3936
message = turn_context.activity
40-
37+
4138
# TODO: Fix constant English with correct constant from text recognizer
4239
culture = turn_context.activity.locale if turn_context.activity.locale != None else 'English'
43-
# TODO: Port ChoiceRecognizer
44-
results = ChoiceRecognizer.recognize_number(message.text, culture)
45-
if results.Count > 0:
40+
41+
results = recognize_number(message.text, culture)
42+
if len(results) > 0:
4643
result.succeeded = True
4744
result.value = results[0].resolution["value"]
48-
49-
return result
45+
46+
return result
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# Copyright (c) Microsoft Corporation. All rights reserved.
2+
# Licensed under the MIT License.
3+
import aiounittest
4+
from botbuilder.dialogs.prompts import (DateTimePrompt, PromptOptions)
5+
from botbuilder.core import MessageFactory
6+
from botbuilder.core import (ConversationState, MemoryStorage, TurnContext)
7+
from botbuilder.dialogs import (DialogSet, DialogTurnStatus)
8+
from botbuilder.core.adapters import (TestAdapter, TestFlow)
9+
10+
11+
class DatetimePromptTests(aiounittest.AsyncTestCase):
12+
13+
async def test_date_time_prompt(self):
14+
# Create new ConversationState with MemoryStorage and register the state as middleware.
15+
conver_state = ConversationState(MemoryStorage())
16+
17+
# Create a DialogState property
18+
dialog_state = conver_state.create_property('dialogState')
19+
20+
#Create new DialogSet.
21+
dialogs = DialogSet(dialog_state)
22+
23+
#Create and add DateTime prompt to DialogSet.
24+
dateTimePrompt = DateTimePrompt('DateTimePrompt')
25+
26+
dialogs.add(dateTimePrompt)
27+
28+
# Initialize TestAdapter
29+
async def exec_test(turn_context: TurnContext) -> None:
30+
prompt_msg = 'What date would you like?'
31+
dc = await dialogs.create_context(turn_context)
32+
33+
results = await dc.continue_dialog()
34+
if results.status == DialogTurnStatus.Empty:
35+
36+
options = PromptOptions(
37+
prompt=MessageFactory.text(prompt_msg)
38+
)
39+
await dc.begin_dialog('DateTimePrompt', options)
40+
else:
41+
if results.status == DialogTurnStatus.Complete:
42+
resolution = results.result[0]
43+
reply = MessageFactory.text(f"Timex: '{resolution.timex}' Value: '{resolution.value}'")
44+
await turn_context.send_activity(reply)
45+
await conver_state.save_changes(turn_context)
46+
47+
adapt = TestAdapter(exec_test)
48+
49+
tf = TestFlow(None, adapt)
50+
tf2 = await tf.send('hello')
51+
tf3 = await tf2.assert_reply('What date would you like?')
52+
tf4 = await tf3.send('5th December 2018 at 9am')
53+
tf5 = await tf4.assert_reply("Timex: '2018-12-05T09' Value: '2018-12-05 09:00:00'")
Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,48 @@
11
# Copyright (c) Microsoft Corporation. All rights reserved.
22
# Licensed under the MIT License.
33
import aiounittest
4-
from botbuilder.dialogs.prompts import NumberPrompt
4+
from botbuilder.dialogs.prompts import NumberPrompt, PromptOptions
5+
from botbuilder.core import MemoryStorage, ConversationState, TurnContext, MessageFactory
6+
from botbuilder.core.adapters import TestAdapter, TestFlow
7+
from botbuilder.dialogs import DialogSet, DialogTurnStatus
58

69
class NumberPromptTests(aiounittest.AsyncTestCase):
710
def test_empty_should_fail(self):
811
empty_id = ''
912
self.assertRaises(TypeError, lambda:NumberPrompt(empty_id))
10-
13+
14+
async def test_number_prompt(self):
15+
# Create new ConversationState with MemoryStorage and register the state as middleware.
16+
conver_state = ConversationState(MemoryStorage())
17+
18+
# Create a DialogState property, DialogSet and register the WaterfallDialog.
19+
dialog_state = conver_state.create_property('dialogState')
20+
21+
dialogs = DialogSet(dialog_state)
22+
23+
# Create and add number prompt to DialogSet.
24+
numberPrompt = NumberPrompt('NumberPrompt', None, 'English')
25+
dialogs.add(numberPrompt)
26+
27+
async def exec_test(turn_context: TurnContext) -> None:
28+
29+
dialogContext = await dialogs.create_context(turn_context)
30+
results = await dialogContext.continue_dialog()
31+
32+
if results.status == DialogTurnStatus.Empty:
33+
await dialogContext.begin_dialog('NumberPrompt', PromptOptions(prompt = MessageFactory.text('Enter quantity of cable')))
34+
else:
35+
if results.status == DialogTurnStatus.Complete:
36+
numberResult = results.result
37+
await turn_context.send_activity(MessageFactory.text(f"You asked me for '{numberResult}' meters of cable."))
38+
39+
await conver_state.save_changes(turn_context)
40+
41+
adapter = TestAdapter(exec_test)
42+
43+
test_flow = TestFlow(None, adapter)
44+
45+
test_flow2 = await test_flow.send('Hello')
46+
test_flow3 = await test_flow2.assert_reply('Enter quantity of cable')
47+
test_flow4 = await test_flow3.send('Give me twenty meters of cable')
48+
test_flow5 = await test_flow4.assert_reply("You asked me for '20' meters of cable.")

0 commit comments

Comments
 (0)