Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add ActivityPrompt and ChoicePrompt tests #496

Merged
merged 1 commit into from Sep 27, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
112 changes: 112 additions & 0 deletions libraries/botbuilder-dialogs/tests/activityPrompt.test.js
@@ -0,0 +1,112 @@
const { ConversationState, MemoryStorage, TestAdapter } = require('botbuilder-core');
const { ActivityPrompt, DialogReason, DialogSet, DialogTurnStatus } = require('../');
const assert = require('assert');

class SimpleActivityPrompt extends ActivityPrompt {
constructor(id, validator) {
super(id);
if (!validator) {
throw new Error('validator is a required parameter');
}
this.validator = validator;
}
}

describe('ActivityPrompt', function () {
this.timeout(5000);

it('should call ActivityPrompt using dc.prompt().', async function () {
// Initialize TestAdapter.
const adapter = new TestAdapter(async turnContext => {
const dc = await dialogs.createContext(turnContext);

const results = await dc.continueDialog();
if (results.status === DialogTurnStatus.empty) {
await dc.prompt('prompt', 'Please send an activity.');
} else if (results.status === DialogTurnStatus.complete) {
const reply = results.result.text;
await turnContext.sendActivity(`You said ${reply}`);
}
await convoState.saveChanges(turnContext);
});
// Create new ConversationState with MemoryStorage and register the state as middleware.
const convoState = new ConversationState(new MemoryStorage());

// Create a DialogState property, DialogSet and TextPrompt.
const dialogState = convoState.createProperty('dialogState');
const dialogs = new DialogSet(dialogState);
dialogs.add(new SimpleActivityPrompt('prompt', async prompt => {
assert(prompt, `validator missing PromptValidatorContext.`);
assert(typeof prompt.recognized.value === 'object', 'recognized.value was not an object.');
return true;
}));

await adapter.send('Hello')
.assertReply('Please send an activity.')
.send('test')
.assertReply('You said test');
});

it('should return Dialog.EndOfTurn if validator returned false.', async function () {
const adapter = new TestAdapter(async turnContext => {
const dc = await dialogs.createContext(turnContext);

const results = await dc.continueDialog();
if (results.status === DialogTurnStatus.empty) {
await dc.prompt('prompt', 'Please send an activity.');
} else if (results.status === DialogTurnStatus.complete) {
const reply = results.result.text;
await turnContext.sendActivity(`You said ${reply}`);
} else if (results.status === DialogTurnStatus.waiting) {
// This status is reached if the ActivityPrompt fails the validation process.
await turnContext.sendActivity('Test complete.');
}
await convoState.saveChanges(turnContext);
});
const convoState = new ConversationState(new MemoryStorage());

const dialogState = convoState.createProperty('dialogState');
const dialogs = new DialogSet(dialogState);
dialogs.add(new SimpleActivityPrompt('prompt', async prompt => {
assert(prompt, `validator missing PromptValidatorContext.`);
assert(typeof prompt.recognized.value === 'object', 'recognized.value was not an object.');
return false;
}));

await adapter.send('Hello')
.assertReply('Please send an activity.')
.send('test')
.assertReply('Test complete.');
});

it('should have resumeDialog() prompt user and return Dialog.EndOfTurn.', async function () {
const adapter = new TestAdapter(async turnContext => {
const dc = await dialogs.createContext(turnContext);

const results = await dc.continueDialog();
if (results.status === DialogTurnStatus.empty) {
await dc.prompt('prompt', 'Please send an activity.');
}

const secondResults = await prompt.resumeDialog(dc, DialogReason.nextCalled);
assert(secondResults.status === DialogTurnStatus.waiting, 'resumeDialog() did not return a correct Dialog.EndOfTurn.');
assert(secondResults.result === undefined, 'resumeDialog() did not return a correct Dialog.EndOfTurn.');
await convoState.saveChanges(turnContext);
});
const convoState = new ConversationState(new MemoryStorage());

const dialogState = convoState.createProperty('dialogState');
const dialogs = new DialogSet(dialogState);
const prompt = new SimpleActivityPrompt('prompt', async prompt => {
assert(prompt, `validator missing PromptValidatorContext.`);
assert(typeof prompt.recognized.value === 'object', 'recognized.value was not an object.');
return false;
})
dialogs.add(prompt);

await adapter.send('Hello')
.assertReply('Please send an activity.')
.assertReply('Please send an activity.');

});
});
54 changes: 54 additions & 0 deletions libraries/botbuilder-dialogs/tests/choicePrompt.test.js
Expand Up @@ -263,4 +263,58 @@ describe('ChoicePrompt', function () {
.send(answerMessage)
.assertReply('red');
});

it('should not render choices and not blow up if choices aren\'t passed in', async function () {
const adapter = new TestAdapter(async (turnContext) => {
const dc = await dialogs.createContext(turnContext);

const results = await dc.continueDialog();
if (results.status === DialogTurnStatus.empty) {
await dc.prompt('prompt', { prompt: 'Please choose a color.', choices: undefined });
} else if (results.status === DialogTurnStatus.complete) {
const selectedChoice = results.result;
await turnContext.sendActivity(selectedChoice.value);
}
await convoState.saveChanges(turnContext);
});
const convoState = new ConversationState(new MemoryStorage());

const dialogState = convoState.createProperty('dialogState');
const dialogs = new DialogSet(dialogState);
const choicePrompt = new ChoicePrompt('prompt');
choicePrompt.style = ListStyle.none;

dialogs.add(choicePrompt);

await adapter.send('Hello')
.assertReply('Please choose a color.');
});

it('should not recognize if choices are not passed in.', async function () {
const adapter = new TestAdapter(async (turnContext) => {
const dc = await dialogs.createContext(turnContext);

const results = await dc.continueDialog();
if (results.status === DialogTurnStatus.empty) {
await dc.prompt('prompt', { prompt: 'Please choose a color.', choices: undefined });
} else if (results.status === DialogTurnStatus.complete) {
const selectedChoice = results.result;
await turnContext.sendActivity(selectedChoice.value);
}
await convoState.saveChanges(turnContext);
});
const convoState = new ConversationState(new MemoryStorage());

const dialogState = convoState.createProperty('dialogState');
const dialogs = new DialogSet(dialogState);
const choicePrompt = new ChoicePrompt('prompt');
choicePrompt.style = ListStyle.none;

dialogs.add(choicePrompt);

await adapter.send('Hello')
.assertReply('Please choose a color.')
.send('hello')
.assertReply('Please choose a color.');
});
});