actions-on-google / actions-on-google-testing-nodejs

Apache License 2.0
75 stars 18 forks source link

Actions on Google Testing Library

:warning: Warning: Conversational Actions will be deprecated on June 13, 2023. For more information, see Conversational Actions Sunset.

This library allows developers to write automated testing for their actions in Node.js.

NPM Version

:warning: This library supports Dialogflow and the legacy Actions SDK. We now recommend using Actions Builder or the new Actions SDK to develop, test, and deploy Conversational Actions. For testing Conversational Actions built using Actions Builder see the @assistant/conversation-testing library.

Examples can be found in the /examples directory for two sample apps.

The Assistant SDK is used to give developers programmatic access to the Assistant and returns debug information about their actions that are in a test state.

Note: This library is currently in an alpha, experimental state. APIs may break between releases. Feedback and bugs can be provided by filing an issue in this repository.

How to get started

  1. Go to the Actions console
  2. Create a new project. This project can be independent of your other projects.
    • You can use this project to test any of your actions that are in a test state
  3. For this new project, enable the Google Assistant API
  4. Go to the Device Registration section.
  5. Click REGISTER MODEL
    1. Fill out the product and manufacturer name
    2. Set the Device type to Light, although the choice does not matter
  6. Download the credentials.json file
  7. Use this credentials file to generate test credentials:
node generate-credentials.js /path/to/credentials.json
  1. Copy and paste the URL and enter the authorization code. You will see a response similar to the following:

Saved user credentials in "test-credentials.json"

  1. Create a JavaScript file for your tests: test.js
'use strict';
const { ActionsOnGoogleAva } = require('actions-on-google-testing');
const { expect } = require('chai');
// Library will try to obtain credentials from environment variables in case
// credentials file is not specified
const action = new ActionsOnGoogleAva(require('./test/test-credentials.json'));

// Start out with giving a name to this test
action.startTest('Facts about Google - direct cat path', action => {
    // Return a promise that starts a conversation with your test app
    return action.start()
        .then(({ textToSpeech }) => {
            // Get a response back from your fulfillment.
            // To continue the conversation, you can send
            // a new text query. This starts the next
            // turn of the conversation.
            return action.send('cats');
        })
        .then(({ ssml }) => {
            // The entire set of responses are listed below.
            // You can use Chai to verify responses.
            expect(ssml[0]).to.have.string("Alright, here's a cat fact.")
        })
});
  1. Run yarn
  2. Update your package.json to add this test file to your test script.
"scripts": {
    "test": "./node_modules/.bin/ava -c 1 -s ./test.js"
},
  1. Run yarn test. You should see your test be executed.

NOTE You can also alternatively set the following environment variables - ACTIONS_TESTING_CLIENT_ID,ACTIONS_TESTING_CLIENT_SECRET, ACTIONS_TESTING_REFRESH_TOKEN - to authenticate your Actions project with the Assistant SDK.

Supported features

This library provides the following features to control your conversation:

Possible responses

These responses will come from your fulfillment, and will consist of whatever objects that you return.

res
  .micOpen - Boolean
  .textToSpeech - String[]
  .displayText - String[]
  .ssml - String[]
  .cards - Card[]
    .title - String
    .subtitle - String
    .text - String
    .imageUrl - String
    .imageAltText - String
    .buttons - Button[]
      .title - String
      .url - String
  .carousel - Array for Browse Carousel or Selection Carousel
    .title - String
    .description - String,
    .imageUrl - String,
    .imageAltText - String,
    .url - String
  .list
    .title - String
    .items - Item[]
      .title - String
      .description - String
      .imageUrl - String
      .imageAltText - String
  .mediaResponse
    .type - String
    .name - String
    .description - String
    .sourceUrl - String
    .icon - String
  .suggestions - String[]
  .linkOutSuggestion
    .url - String
    .name - String
  .table
    .headers - String[]
    .rows - Row[]
      .cells - String[]
      .divider - Boolean

Known Issues

License

See LICENSE