Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
SketchingDev committed Oct 28, 2023
1 parent 567ad37 commit df4e1fc
Show file tree
Hide file tree
Showing 15 changed files with 373 additions and 0 deletions.
8 changes: 8 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
version: 2
updates:
- package-ecosystem: bundler
directory: /
schedule:
interval: daily
allow:
- dependency-type: direct
22 changes: 22 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
name: CI

on:
push:
branches: ["main"]
pull_request:

jobs:
# Build job
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.1' # Not needed with a .ruby-version file
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
cache-version: 0 # Increment this number if you need to re-download cached gems
- name: Build with Jekyll
run: bundle exec jekyll build
62 changes: 62 additions & 0 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

# Sample workflow for building and deploying a Jekyll site to GitHub Pages
name: Deploy Jekyll site to Pages

on:
push:
branches: ["main"]

# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:

# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
contents: read
pages: write
id-token: write

# Allow one concurrent deployment
concurrency:
group: "pages"
cancel-in-progress: true

jobs:
# Build job
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.1' # Not needed with a .ruby-version file
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
cache-version: 0 # Increment this number if you need to re-download cached gems
- name: Setup Pages
id: pages
uses: actions/configure-pages@v3
- name: Build with Jekyll
# Outputs to the './_site' directory by default
run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}"
env:
JEKYLL_ENV: production
- name: Upload artifact
# Automatically uploads an artifact from the './_site' directory by default
uses: actions/upload-pages-artifact@v1

# Deployment job
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v2
15 changes: 15 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Not sure what a .gitignore is?
# See: https://git-scm.com/docs/gitignore

# These are directly copied from Jekyll's first-party docs on `.gitignore` files:
# https://jekyllrb.com/tutorials/using-jekyll-with-bundler/#commit-to-source-control

# Ignore the default location of the built site, and caches and metadata generated by Jekyll
_site/
.sass-cache/
.jekyll-cache/
.jekyll-metadata

# Ignore folders generated by Bundler
.bundle/
vendor/
1 change: 1 addition & 0 deletions CNAME
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ivr-tester.makingchatbots.com
7 changes: 7 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
source 'https://rubygems.org'

gem "jekyll", "~> 4.3.2" # installed by `gem jekyll`
gem "webrick" # required when using Ruby >= 3 and Jekyll <= 4.2.2

gem "just-the-docs", "0.7.0" # pinned to the current release
# gem "just-the-docs" # always download the latest release
86 changes: 86 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
GEM
remote: https://rubygems.org/
specs:
addressable (2.8.5)
public_suffix (>= 2.0.2, < 6.0)
colorator (1.1.0)
concurrent-ruby (1.2.2)
em-websocket (0.5.3)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0)
eventmachine (1.2.7)
ffi (1.16.3)
forwardable-extended (2.6.0)
google-protobuf (3.24.4-arm64-darwin)
google-protobuf (3.24.4-x86_64-linux)
http_parser.rb (0.8.0)
i18n (1.14.1)
concurrent-ruby (~> 1.0)
jekyll (4.3.2)
addressable (~> 2.4)
colorator (~> 1.0)
em-websocket (~> 0.5)
i18n (~> 1.0)
jekyll-sass-converter (>= 2.0, < 4.0)
jekyll-watch (~> 2.0)
kramdown (~> 2.3, >= 2.3.1)
kramdown-parser-gfm (~> 1.0)
liquid (~> 4.0)
mercenary (>= 0.3.6, < 0.5)
pathutil (~> 0.9)
rouge (>= 3.0, < 5.0)
safe_yaml (~> 1.0)
terminal-table (>= 1.8, < 4.0)
webrick (~> 1.7)
jekyll-include-cache (0.2.1)
jekyll (>= 3.7, < 5.0)
jekyll-sass-converter (3.0.0)
sass-embedded (~> 1.54)
jekyll-seo-tag (2.8.0)
jekyll (>= 3.8, < 5.0)
jekyll-watch (2.2.1)
listen (~> 3.0)
just-the-docs (0.7.0)
jekyll (>= 3.8.5)
jekyll-include-cache
jekyll-seo-tag (>= 2.0)
rake (>= 12.3.1)
kramdown (2.4.0)
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
liquid (4.0.4)
listen (3.8.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.4.0)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (5.0.3)
rake (13.0.6)
rb-fsevent (0.11.2)
rb-inotify (0.10.1)
ffi (~> 1.0)
rexml (3.2.6)
rouge (4.2.0)
safe_yaml (1.0.5)
sass-embedded (1.69.4-arm64-darwin)
google-protobuf (~> 3.23)
sass-embedded (1.69.4-x86_64-linux-gnu)
google-protobuf (~> 3.23)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
unicode-display_width (2.5.0)
webrick (1.8.1)

PLATFORMS
arm64-darwin-21
x86_64-linux

DEPENDENCIES
jekyll (~> 4.3.2)
just-the-docs (= 0.7.0)
webrick

BUNDLED WITH
2.3.26
19 changes: 19 additions & 0 deletions _config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
title: IVR Tester
description: Open-source tool for automating the testing of your IVR call flows
theme: just-the-docs

url: https://ivr-tester.makingchatbots.com

footer_content: "Copyright &copy; 2023 Lucas Woodward"

author: Lucas Woodward
social:
name: Lucas Woodward
links:
- https://www.linkedin.com/in/lucas-woodward-the-dev

nav_external_links:
- title: GitHub Project
url: https://github.com/SketchingDev/ivr-tester
hide_icon: false
opens_in_new_tab: true
1 change: 1 addition & 0 deletions _includes/head_custom.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<link href="https://fonts.googleapis.com/css2?family=Zilla+Slab:ital,wght@1,700&amp;display=swap" rel="stylesheet">
3 changes: 3 additions & 0 deletions _includes/nav_footer_custom.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<div class="site-footer text-center fs-6" style="font-family: 'Zilla Slab', serif">
<a href="https://makingchatbots.com/">Making Chatbots</a>
</div>
Binary file added assets/images/cli/demo.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/flow.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
16 changes: 16 additions & 0 deletions how-it-works.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
title: How it Works
layout: home
nav_order: 2
---

# How it works

<p class="text-center">
<img src="assets/images/flow.jpg">
</p>

Under the hood this orchestrates:
1. Establishing a bi-directional audio stream of the call to the IVR flow - using [Twilio](https://www.twilio.com/)
2. Transcribing the voice responses from the flow - using [Google Speech-to-Text](https://cloud.google.com/speech-to-text)
3. Using the test to conditionally respond with DTMF tones to transcripts
52 changes: 52 additions & 0 deletions index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
---
title: Home
layout: home
nav_order: 1
---

<p class="text-center">
Automate the testing of your IVR call flows!
</p>

IVR Tester automates the testing of IVR flows by calling them, interpreting prompts and replying with DTMF tones based
on fluent test definitions.

<p class="text-center">
<img src="assets/images/cli/demo.gif">
</p>

Features:
* Fully automates testing call flows
* Test multiple scenarios in parallel
* Expressive test definitions help document call flow
* Record audio of tests
* Record transcriptions of tests
* Supports Google Speech-to-Text and AWS Transcript for transcribing calls
* Open-source

```typescript
const config = { transcriber: googleSpeechToText({ languageCode: "en-GB" }) };

new IvrTester(config).run(
{ from: "0123 456 789", to: "0123 123 123" },
{
name: "Customer is provided a menu after their account number confirmed",
steps: [
{
whenPrompt: similarTo("Please enter your account number"),
then: press("184748"),
silenceAfterPrompt: 3000,
timeout: 6000,
},
{
whenPrompt: similarTo(
"press 1 for booking a repair or 2 for changing your address"
),
then: hangUp(),
silenceAfterPrompt: 3000,
timeout: 6000,
},
],
}
);
```
81 changes: 81 additions & 0 deletions quick-start.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
---
title: Quick Start
layout: page
nav_order: 3
---

# Quick Start

1. [Create a Twilio account](https://www.twilio.com/), load it with money and rent a phone number
2. Store an [authentication token](https://support.twilio.com/hc/en-us/articles/223136027-Auth-Tokens-and-How-to-Change-Them) in environment variables:
```shell
export TWILIO_ACCOUNT_SID=ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
export TWILIO_AUTH_TOKEN=your_auth_token
```
3. Configure your environment for either [Google](https://github.com/SketchingDev/ivr-tester/tree/main/packages/transcriber-google-speech-to-text) or [Amazon's](https://github.com/SketchingDev/ivr-tester/tree/main/packages/transcriber-amazon-transcribe) transcription service
4. Install and start ngrok
```shell
npm install ngrok -g
ngrok http 8080
```
5. Run the tests
```shell
# Local port that IVR Tester will listen on
export LOCAL_SERVER_PORT=8080
# URL that ngrok exposes to the outside world
export PUBLIC_SERVER_URL=$(curl -s localhost:4040/api/tunnels | jq -r .tunnels[0].public_url)
node test.js
```
```typescript
const config = { transcriber: googleSpeechToText({ languageCode: "en-GB" }) };
new IvrTester(config).run(
{ from: "0123 456 789", to: "0123 123 123" },
{
name: "Customer is provided a menu after their account number confirmed",
steps: [
{
whenPrompt: similarTo("Please enter your account number"),
then: press("184748"),
silenceAfterPrompt: 3000,
timeout: 6000,
},
{
whenPrompt: similarTo(
"press 1 for booking a repair or 2 for changing your address"
),
then: hangUp(),
silenceAfterPrompt: 3000,
timeout: 6000,
},
],
}
);
```
## Commands
| When | Overview |
|--------------|--------------------------------------|
| [contains] | Prompt contains a piece of text |
| [matches] | Prompt matches regular expression |
| [similarTo] | Prompt is similar to a piece of text |
| [isAnything] | Prompt can be anything |
[contains]: https://github.com/SketchingDev/ivr-tester/tree/main/packages/ivr-tester/doc#contains
[matches]: https://github.com/SketchingDev/ivr-tester/tree/main/packages/ivr-tester/doc#matches
[similarTo]: https://github.com/SketchingDev/ivr-tester/tree/main/packages/ivr-tester/doc#similarto
[isAnything]: https://github.com/SketchingDev/ivr-tester/tree/main/packages/ivr-tester/doc#isanything
| Then | Overview |
|-------------|---------------------|
| [press] | Produces DTMF tones |
| [hangUp] | Terminates the call |
| [doNothing] | Doesn't do anything |

[press]: https://github.com/SketchingDev/ivr-tester/tree/main/packages/ivr-tester/doc#press
[hangUp]: https://github.com/SketchingDev/ivr-tester/tree/main/packages/ivr-tester/doc#hangup
[doNothing]: https://github.com/SketchingDev/ivr-tester/tree/main/packages/ivr-tester/doc#donothing

0 comments on commit df4e1fc

Please sign in to comment.