Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/bespoken/virtual-alexa
:robot: Easily test and debug Alexa skills programmatically
https://github.com/bespoken/virtual-alexa
alexa alexa-custom-skill alexa-skills-kit alexa-voice-service unit-testing
Last synced: about 2 months ago
JSON representation
:robot: Easily test and debug Alexa skills programmatically
- Host: GitHub
- URL: https://github.com/bespoken/virtual-alexa
- Owner: bespoken
- License: apache-2.0
- Created: 2017-09-06T22:08:08.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2022-12-06T14:33:34.000Z (about 2 years ago)
- Last Synced: 2024-11-11T18:38:34.245Z (about 2 months ago)
- Topics: alexa, alexa-custom-skill, alexa-skills-kit, alexa-voice-service, unit-testing
- Language: TypeScript
- Homepage: https://bespoken.io
- Size: 1.25 MB
- Stars: 112
- Watchers: 11
- Forks: 35
- Open Issues: 28
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
Virtual Alexa
Interact with skills intuitively and programmatically.# Virtual Alexa
Virtual Alexa allows for interacting with skills programmatically.The core Virtual Alexa API provides several routines - the three most essential ones:
* launch: Generates JSON for a launch request
* intend: Generates JSON as if the given intent was uttered
* utter: Generates JSON as if the user said the given phrase
And also check out our YAML Test Scripts. They allow for:
* End-to-end Testing (using our virtual devices)
* SMAPI Simulation-Based Testing (using the Skill Management API)
* Unit-Testing (using this library)All via our simple, readable YAML syntax. [Read more here](https://read.bespoken.io).
**What's New In The Latest Version (0.7.x)**
* [Request Builder](https://bespoken.github.io/virtual-alexa/api/classes/skillrequest.html)
* [Improved Dialog Manager](https://github.com/bespoken/virtual-alexa/blob/master/docs/Dialog.md)
* More Internals - We've exposed more of the internal elements of Virtual Alexa, such as the AudioPlayer and DialogManager.## Why Do I Need This?
This library allows for easy testing of skills.You can use it for:
1) Unit-testing - ensuring individual routines work correctly
2) Regression testing - ensuring the code as a whole works properly## How Do I Get It?
```
npm install virtual-alexa --save-dev
```## How Do I Use It?
Easy! Just add a line of code like so:
```javascript
const va = require("virtual-alexa");
const alexa = va.VirtualAlexa.Builder()
.handler("index.handler") // Lambda function file and name
.interactionModelFile("./models/en-US.json") // Path to interaction model file
.create();alexa.intend("PlayIntent").then((payload) => {
console.log("OutputSpeech: " + payload.response.outputSpeech.ssml);
// Prints out returned SSML, e.g., " Welcome to my Skill "
});
```Our "canonical" full example is the [Super Simple Unit Testing project](https://github.com/bespoken/super-simple-unit-testing/blob/master/test/index-test.js).
### Virtual Alexa With Async/Await
Here are some basic tests that uses async/await:
```javascript
it("Accepts responses without dollars", async function () {
const alexa = bvd.VirtualAlexa.Builder()
.handler("index.handler") // Lambda function file and name
.intentSchemaFile("./speechAssets/IntentSchema.json") // Uses old-style intent schema
.sampleUtterancesFile("./speechAssets/SampleUtterances.txt")
.create();const launchResponse = await alexa.launch();
assert.include(launchResponse.response.outputSpeech.ssml, "Welcome to guess the price");const playerOneResponse = await alexa.intend("NumberIntent", { number: "2" });
assert.include(playerOneResponse.response.outputSpeech.ssml, "what is your name");
assert.include(playerOneResponse.response.outputSpeech.ssml, "contestant one");const playerTwoResponse = await alexa.intend("NameIntent", { name: "john" });
assert.include(playerTwoResponse.response.outputSpeech.ssml, "what is your name");
assert.include(playerTwoResponse.response.outputSpeech.ssml, "Contestant 2");const gameStartResponse = await alexa.intend("NameIntent", { name: "juan" });
assert.include(gameStartResponse.response.outputSpeech.ssml, "let's start the game");
assert.include(gameStartResponse.response.outputSpeech.ssml, "Guess the price");const priceGuessResponse = await alexa.intend("NumberIntent", { number: "200" });
assert.include(priceGuessResponse.response.outputSpeech.ssml, "the actual price was");
});
```
This one is using Mocha (and Babel) - you can see the full example here:
https://github.com/bespoken/GuessThePrice/blob/ProgrammaticTests/test/index-test.js### Virtual Alexa With Promises
Here's an example using promises:
```javascript
test("Plays once", (done) => {
alexa.intend("GetStartedIntent").then((payload) => {
expect(payload.response.outputSpeech.ssml).toContain("What is the search term for it");
return alexa.intend("IncorrectGuessIntent");}).then((payload) => {
expect(payload.response.outputSpeech.ssml).toContain("Nice try");
return alexa.intend("IncorrectGuessIntent");}).then((payload) => {
expect(payload.response.outputSpeech.ssml).toContain("That is not correct");
return alexa.intend("IncorrectGuessIntent");}).then((payload) => {
expect(payload.response.outputSpeech.ssml).toContain("Goodbye");
done();});
});
```
You can see the full example this is taken from here:
https://github.com/bespoken/giftionary/blob/master/test/index.test.jsAnd read all the docs here:
https://bespoken.github.io/virtual-alexa/api/## Using The Request Filter
The [filter](https://bespoken.github.io/virtual-alexa/api/classes/virtualalexa.html#filter) is a powerful tool for manipulating the request payloads that are made to your Alexa skill.
```javascript
alexa.filter((requestJSON) => {
// Do something with the request
requestJSON.request.locale = "en-US" // Arbitrary example of changing the request payload
});
```More info on using it [here](docs/Filters.md).
## Using the request builder:
Our request builder allows for fine-tuning requests with ease.To use it, make a call to Virtual Alexa like so:
```javascript
// Construct the requestconst request = alexa.request()
.intent("MyIntentName")
.slot("SlotName", "SlotValue")
.dialogState("COMPLETED")
// Directly set any property on the JSON easily with the new set method
.set("context.System.user.permissions.consentToken", "")
.set("context.System.device.deviceId", "");const response = await request.send();
```[Read more here](https://bespoken.github.io/virtual-alexa/api/classes/skillrequest.html).
## AudioPlayer Interface
We also support the AudioPlayer! [Read more here](https://github.com/bespoken/virtual-alexa/blob/master/docs/AudioPlayer.md).## Display Interface
We also support the Display Interface! [Read more here](https://github.com/bespoken/virtual-alexa/blob/master/docs/Display.md).## Dialog Interface
We also support the Dialog Interface. [Read more here](https://github.com/bespoken/virtual-alexa/blob/master/docs/Dialog.md).Using our implementation, you can simulate different payloads coming from the Dialog Manager with ease.
# In-Skill Purchase Responses
You can emulate responses from an In-Skill Purchase with the following request type:
```
const request = alexa.request().inSkillPurchaseResponse(
"Buy",
"ACCEPTED",
"MyProductId",
"MyToken"
);const response = await request.send();
```## Mocking External Calls (Dynamo and Address API)
We also support mocking external calls, such as ones made to the Address API and Dynamo.
[Read more here](https://github.com/bespoken/virtual-alexa/blob/master/docs/Externals.md).This allows for testing without relying on the actual calls, which are difficult if not impossible to configure for unit tests.
## Entity Resolution
We support the entity resolution request payloads.Using Virtual Alexa, we will automatically add entity resolution information to your slots, based on the your interaction model. It's like magic :-)
[Read more here](https://github.com/bespoken/virtual-alexa/blob/master/docs/EntityResolution.md).
## How Do I Talk To You?
Easy, find us on [our Gitter](https://gitter.im/bespoken/virtual-alexa) or email [[email protected]](mailto:[email protected]).We look forward to hearing from you!