alexa_ruby 1.0.3 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/Gemfile.lock +13 -6
- data/README.md +1 -0
- data/lib/alexa_ruby/response/audio_player.rb +13 -0
- data/lib/alexa_ruby/response/card.rb +23 -2
- data/lib/alexa_ruby/{response.rb → response/response.rb} +3 -3
- data/lib/alexa_ruby/version.rb +1 -1
- data/lib/alexa_ruby.rb +1 -1
- data/spec/spec_helper.rb +3 -2
- metadata +4 -36
- data/spec/request_spec.rb +0 -197
- data/spec/response_spec.rb +0 -201
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 81b1c1d716759449c12046344b3cd8fc75a39063
|
4
|
+
data.tar.gz: ad89af2cee60262bdb2f00c2283113fd575a1a20
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9282ec9d6a7fe0a36e0121da659d3dbfe17eaff4f4a9f961d2b05190c1eb92cab63e73f886ce613ec2596d935caf334c55f50f5bfd696ca27b2d9159c073e6fc
|
7
|
+
data.tar.gz: 5b508751a1daafd887f0f29b33b9915b3aa3372386b82e11c699667fc1384737c38748d5b60980d777819ef1259e1a12d03db4e887ca954ad9a5515e69e59223
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
alexa_ruby (1.0.
|
4
|
+
alexa_ruby (1.0.3)
|
5
5
|
bundler (>= 1.6.9)
|
6
6
|
oj (~> 3.0)
|
7
7
|
rake
|
@@ -11,8 +11,12 @@ GEM
|
|
11
11
|
specs:
|
12
12
|
ansi (1.5.0)
|
13
13
|
builder (3.2.3)
|
14
|
-
|
15
|
-
|
14
|
+
coveralls (0.8.21)
|
15
|
+
json (>= 1.8, < 3)
|
16
|
+
simplecov (~> 0.14.1)
|
17
|
+
term-ansicolor (~> 1.3)
|
18
|
+
thor (~> 0.19.4)
|
19
|
+
tins (~> 1.6)
|
16
20
|
docile (1.1.5)
|
17
21
|
json (2.1.0)
|
18
22
|
minitest (5.10.2)
|
@@ -24,21 +28,24 @@ GEM
|
|
24
28
|
oj (3.0.10)
|
25
29
|
rake (12.0.0)
|
26
30
|
ruby-progressbar (1.8.1)
|
27
|
-
simplecov (0.
|
31
|
+
simplecov (0.14.1)
|
28
32
|
docile (~> 1.1.0)
|
29
33
|
json (>= 1.8, < 3)
|
30
34
|
simplecov-html (~> 0.10.0)
|
31
35
|
simplecov-html (0.10.1)
|
36
|
+
term-ansicolor (1.6.0)
|
37
|
+
tins (~> 1.0)
|
38
|
+
thor (0.19.4)
|
39
|
+
tins (1.14.0)
|
32
40
|
|
33
41
|
PLATFORMS
|
34
42
|
ruby
|
35
43
|
|
36
44
|
DEPENDENCIES
|
37
45
|
alexa_ruby!
|
38
|
-
|
46
|
+
coveralls
|
39
47
|
minitest (~> 5.10, >= 5.10.2)
|
40
48
|
minitest-reporters (~> 1.1, >= 1.1.14)
|
41
|
-
simplecov
|
42
49
|
|
43
50
|
BUNDLED WITH
|
44
51
|
1.15.0
|
data/README.md
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
[](https://badge.fury.io/rb/alexa_ruby)
|
4
4
|
[](https://travis-ci.org/mulev/alexa-ruby)
|
5
5
|
[](https://codeclimate.com/github/mulev/alexa-ruby)
|
6
|
+
[](https://coveralls.io/github/mulev/alexa-ruby?branch=develop)
|
6
7
|
|
7
8
|
Originally forked from [damianFC's AlexaRubykit](https://github.com/damianFC/alexa-rubykit), this gem implements a convenient back-end service for interaction with Amazon Alexa API.
|
8
9
|
|
@@ -8,8 +8,13 @@ module AlexaRuby
|
|
8
8
|
# token [String] streaming service token
|
9
9
|
# offset [Integer] playback offset
|
10
10
|
# @return [Hash] AudioPlayer.Play directive
|
11
|
+
# @raise [ArgumentError] if audio URL isn't valid
|
11
12
|
def play_directive(params)
|
12
13
|
url = params[:url]
|
14
|
+
if invalid_url?(url)
|
15
|
+
raise ArgumentError, 'Audio URL must be a valid ' \
|
16
|
+
'SSL-enabled (HTTPS) endpoint'
|
17
|
+
end
|
13
18
|
token = params[:token] || SecureRandom.uuid
|
14
19
|
offset = params[:offset] || 0
|
15
20
|
build_directive('AudioPlayer.Play', url, token, offset)
|
@@ -40,5 +45,13 @@ module AlexaRuby
|
|
40
45
|
directive[:audioItem][:stream][:offsetInMilliseconds] = offset
|
41
46
|
directive
|
42
47
|
end
|
48
|
+
|
49
|
+
# Check if given URL isn't an SSL-enabled endpoint
|
50
|
+
#
|
51
|
+
# @param url [String] some URL
|
52
|
+
# @return [Boolean]
|
53
|
+
def invalid_url?(url)
|
54
|
+
URI.parse(url).scheme != 'https'
|
55
|
+
end
|
43
56
|
end
|
44
57
|
end
|
@@ -70,11 +70,32 @@ module AlexaRuby
|
|
70
70
|
@obj[:image] = {}
|
71
71
|
|
72
72
|
if @params[:small_image_url]
|
73
|
-
|
73
|
+
add_image(:smallImageUrl, @params[:small_image_url])
|
74
74
|
end
|
75
75
|
|
76
76
|
return unless @params[:large_image_url]
|
77
|
-
|
77
|
+
add_image(:largeImageUrl, @params[:large_image_url])
|
78
|
+
end
|
79
|
+
|
80
|
+
# Add image to object
|
81
|
+
#
|
82
|
+
# @param type [Symbol] image type
|
83
|
+
# @param image_url [String] image URL
|
84
|
+
# @raise [ArgumentError] if card URL doesn't starts with HTTPS
|
85
|
+
def add_image(type, image_url)
|
86
|
+
if invalid_url?(image_url)
|
87
|
+
raise ArgumentError, 'Card image URL must be a valid ' \
|
88
|
+
'SSL-enabled (HTTPS) endpoint'
|
89
|
+
end
|
90
|
+
@obj[:image][type] = image_url
|
91
|
+
end
|
92
|
+
|
93
|
+
# Check if given URL isn't an SSL-enabled endpoint
|
94
|
+
#
|
95
|
+
# @param url [String] some URL
|
96
|
+
# @return [Boolean]
|
97
|
+
def invalid_url?(url)
|
98
|
+
URI.parse(url).scheme != 'https'
|
78
99
|
end
|
79
100
|
end
|
80
101
|
end
|
@@ -59,7 +59,7 @@ module AlexaRuby
|
|
59
59
|
# content [String] card content (line breaks must be already included)
|
60
60
|
# small_image_url [String] an URL for small card image
|
61
61
|
# large_image_url [String] an URL for large card image
|
62
|
-
# @raise [
|
62
|
+
# @raise [ArgumentError] if card is not allowed
|
63
63
|
def add_card(params = {})
|
64
64
|
card_exception unless %i[launch intent].include? @req_type
|
65
65
|
card = Card.new(params)
|
@@ -195,9 +195,9 @@ module AlexaRuby
|
|
195
195
|
|
196
196
|
# Raise card exception
|
197
197
|
#
|
198
|
-
# @raise [
|
198
|
+
# @raise [ArgumentError] if card is not allowed
|
199
199
|
def card_exception
|
200
|
-
raise
|
200
|
+
raise ArgumentError, 'Card can only be included in response ' \
|
201
201
|
'to a "LaunchRequest" or "IntentRequest"'
|
202
202
|
end
|
203
203
|
end
|
data/lib/alexa_ruby/version.rb
CHANGED
data/lib/alexa_ruby.rb
CHANGED
@@ -14,7 +14,7 @@ require 'alexa_ruby/request/launch_request'
|
|
14
14
|
require 'alexa_ruby/request/intent_request'
|
15
15
|
require 'alexa_ruby/request/intent_request/slot'
|
16
16
|
require 'alexa_ruby/request/session_ended_request'
|
17
|
-
require 'alexa_ruby/response'
|
17
|
+
require 'alexa_ruby/response/response'
|
18
18
|
require 'alexa_ruby/response/audio_player'
|
19
19
|
require 'alexa_ruby/response/card'
|
20
20
|
require 'alexa_ruby/version'
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alexa_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Mulev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-06-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -92,34 +92,6 @@ dependencies:
|
|
92
92
|
- - ">="
|
93
93
|
- !ruby/object:Gem::Version
|
94
94
|
version: 1.1.14
|
95
|
-
- !ruby/object:Gem::Dependency
|
96
|
-
name: simplecov
|
97
|
-
requirement: !ruby/object:Gem::Requirement
|
98
|
-
requirements:
|
99
|
-
- - ">="
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
version: '0'
|
102
|
-
type: :development
|
103
|
-
prerelease: false
|
104
|
-
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
requirements:
|
106
|
-
- - ">="
|
107
|
-
- !ruby/object:Gem::Version
|
108
|
-
version: '0'
|
109
|
-
- !ruby/object:Gem::Dependency
|
110
|
-
name: codeclimate-test-reporter
|
111
|
-
requirement: !ruby/object:Gem::Requirement
|
112
|
-
requirements:
|
113
|
-
- - "~>"
|
114
|
-
- !ruby/object:Gem::Version
|
115
|
-
version: 1.0.0
|
116
|
-
type: :development
|
117
|
-
prerelease: false
|
118
|
-
version_requirements: !ruby/object:Gem::Requirement
|
119
|
-
requirements:
|
120
|
-
- - "~>"
|
121
|
-
- !ruby/object:Gem::Version
|
122
|
-
version: 1.0.0
|
123
95
|
description: Ruby toolkit for Amazon Alexa API
|
124
96
|
email:
|
125
97
|
- m.mulev@gmail.com
|
@@ -144,12 +116,10 @@ files:
|
|
144
116
|
- lib/alexa_ruby/request/intent_request/slot.rb
|
145
117
|
- lib/alexa_ruby/request/launch_request.rb
|
146
118
|
- lib/alexa_ruby/request/session_ended_request.rb
|
147
|
-
- lib/alexa_ruby/response.rb
|
148
119
|
- lib/alexa_ruby/response/audio_player.rb
|
149
120
|
- lib/alexa_ruby/response/card.rb
|
121
|
+
- lib/alexa_ruby/response/response.rb
|
150
122
|
- lib/alexa_ruby/version.rb
|
151
|
-
- spec/request_spec.rb
|
152
|
-
- spec/response_spec.rb
|
153
123
|
- spec/spec_helper.rb
|
154
124
|
homepage: https://github.com/mulev/alexa-ruby
|
155
125
|
licenses:
|
@@ -171,11 +141,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
171
141
|
version: '0'
|
172
142
|
requirements: []
|
173
143
|
rubyforge_project:
|
174
|
-
rubygems_version: 2.
|
144
|
+
rubygems_version: 2.6.12
|
175
145
|
signing_key:
|
176
146
|
specification_version: 4
|
177
147
|
summary: Ruby toolkit for Amazon Alexa API
|
178
148
|
test_files:
|
179
|
-
- spec/request_spec.rb
|
180
|
-
- spec/response_spec.rb
|
181
149
|
- spec/spec_helper.rb
|
data/spec/request_spec.rb
DELETED
@@ -1,197 +0,0 @@
|
|
1
|
-
require_relative 'spec_helper'
|
2
|
-
|
3
|
-
describe 'Amazon Alexa request handling' do
|
4
|
-
before do
|
5
|
-
@fpath = 'spec/fixtures/request'
|
6
|
-
end
|
7
|
-
|
8
|
-
describe 'General request handling' do
|
9
|
-
before do
|
10
|
-
@json = File.read("#{@fpath}/launch_request.json")
|
11
|
-
end
|
12
|
-
|
13
|
-
describe 'Request' do
|
14
|
-
it 'should build a Request object for valid JSON' do
|
15
|
-
alexa = AlexaRuby.new(@json)
|
16
|
-
alexa.request.wont_be_nil
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'should build a Response object for valid JSON' do
|
20
|
-
alexa = AlexaRuby.new(@json)
|
21
|
-
alexa.response.wont_be_nil
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'should build a Request object for valid Hash' do
|
25
|
-
alexa = AlexaRuby.new(Oj.load(@json))
|
26
|
-
alexa.request.wont_be_nil
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'should build a Response object for valid Hash' do
|
30
|
-
alexa = AlexaRuby.new(Oj.load(@json))
|
31
|
-
alexa.response.wont_be_nil
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'should raise ArgumentError in case of invalid JSON' do
|
35
|
-
err = proc { AlexaRuby.new('{"test":}') }.must_raise ArgumentError
|
36
|
-
err.message.must_equal 'Request must be a valid JSON object'
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'should raise ArgumentError in case of invalid Hash' do
|
40
|
-
err = proc { AlexaRuby.new('{"test":}') }.must_raise ArgumentError
|
41
|
-
err.message.must_equal 'Request must be a valid JSON object'
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'should setup all request parameters' do
|
45
|
-
alexa = AlexaRuby.new(@json)
|
46
|
-
alexa.request.version.wont_be_nil
|
47
|
-
alexa.request.type.wont_be_nil
|
48
|
-
alexa.request.context.wont_be_nil
|
49
|
-
alexa.request.id.wont_be_nil
|
50
|
-
alexa.request.timestamp.wont_be_nil
|
51
|
-
alexa.request.locale.wont_be_nil
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'should raise ArgumentError if request ID is missing' do
|
55
|
-
req = Oj.load(@json, symbol_keys: true)
|
56
|
-
req[:request][:requestId] = nil
|
57
|
-
err = proc { AlexaRuby.new(req) }.must_raise ArgumentError
|
58
|
-
err.message.must_equal 'Missing request ID'
|
59
|
-
end
|
60
|
-
|
61
|
-
it 'should raise ArgumentError if request timestamp is missing' do
|
62
|
-
req = Oj.load(@json, symbol_keys: true)
|
63
|
-
req[:request][:timestamp] = nil
|
64
|
-
err = proc { AlexaRuby.new(req) }.must_raise ArgumentError
|
65
|
-
err.message.must_equal 'Missing request timestamp'
|
66
|
-
end
|
67
|
-
|
68
|
-
it 'should raise ArgumentError if request type unknown' do
|
69
|
-
req = Oj.load(@json, symbol_keys: true)
|
70
|
-
req[:request][:type] = 'dummy'
|
71
|
-
err = proc { AlexaRuby.new(req) }.must_raise ArgumentError
|
72
|
-
err.message.must_equal 'Unknown type of Alexa request'
|
73
|
-
end
|
74
|
-
|
75
|
-
it 'should raise ArgumentError if request structure isn\'t valid' do
|
76
|
-
req = Oj.load(@json, symbol_keys: true)
|
77
|
-
req[:request] = nil
|
78
|
-
msg = 'Invalid request structure, ' \
|
79
|
-
'please, refer to the Amazon Alexa manual: ' \
|
80
|
-
'https://developer.amazon.com/public/solutions' \
|
81
|
-
'/alexa/alexa-skills-kit/docs/alexa-skills-kit-interface-reference'
|
82
|
-
err = proc { AlexaRuby.new(req) }.must_raise ArgumentError
|
83
|
-
err.message.must_equal msg
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
describe 'Session' do
|
88
|
-
it 'should set correct session params' do
|
89
|
-
alexa = AlexaRuby.new(@json)
|
90
|
-
alexa.request.session.state.wont_be_nil
|
91
|
-
alexa.request.session.id.wont_be_nil
|
92
|
-
end
|
93
|
-
|
94
|
-
it 'should raise ArgumentError if session isn\'t valid' do
|
95
|
-
req = Oj.load(@json, symbol_keys: true)
|
96
|
-
req[:session] = nil
|
97
|
-
err = proc { AlexaRuby.new(req) }.must_raise ArgumentError
|
98
|
-
err.message.must_equal 'Empty user session'
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
describe 'Context' do
|
103
|
-
it 'should set correct context params' do
|
104
|
-
alexa = AlexaRuby.new(@json)
|
105
|
-
alexa.request.context.app_id.wont_be_nil
|
106
|
-
alexa.request.context.user.wont_be_nil
|
107
|
-
alexa.request.context.user.id.wont_be_nil
|
108
|
-
alexa.request.context.device.wont_be_nil
|
109
|
-
alexa.request.context.device.id.wont_be_nil
|
110
|
-
end
|
111
|
-
|
112
|
-
it 'should raise ArgumentError if application ID is missing' do
|
113
|
-
req = Oj.load(@json, symbol_keys: true)
|
114
|
-
req[:context][:System][:application][:applicationId] = nil
|
115
|
-
err = proc { AlexaRuby.new(req) }.must_raise ArgumentError
|
116
|
-
err.message.must_equal 'Missing application ID'
|
117
|
-
end
|
118
|
-
|
119
|
-
it 'should raise ArgumentError if user ID is missing' do
|
120
|
-
req = Oj.load(@json, symbol_keys: true)
|
121
|
-
req[:context][:System][:user][:userId] = nil
|
122
|
-
err = proc { AlexaRuby.new(req) }.must_raise ArgumentError
|
123
|
-
err.message.must_equal 'Missing user ID'
|
124
|
-
end
|
125
|
-
|
126
|
-
it 'should raise ArgumentError if device ID is missing' do
|
127
|
-
req = Oj.load(@json, symbol_keys: true)
|
128
|
-
req[:context][:System][:device][:deviceId] = nil
|
129
|
-
err = proc { AlexaRuby.new(req) }.must_raise ArgumentError
|
130
|
-
err.message.must_equal 'Missing device ID'
|
131
|
-
end
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
describe 'LaunchRequest' do
|
136
|
-
before do
|
137
|
-
@json = File.read("#{@fpath}/launch_request.json")
|
138
|
-
end
|
139
|
-
|
140
|
-
it 'should parse valid LaunchRequest correctly' do
|
141
|
-
alexa = AlexaRuby.new(@json)
|
142
|
-
alexa.request.type.must_equal :launch
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
describe 'IntentRequest' do
|
147
|
-
before do
|
148
|
-
@json = File.read("#{@fpath}/intent_request.json")
|
149
|
-
end
|
150
|
-
|
151
|
-
it 'should parse valid IntentRequest correctly' do
|
152
|
-
alexa = AlexaRuby.new(@json)
|
153
|
-
alexa.request.type.must_equal :intent
|
154
|
-
alexa.request.intent_name.must_equal 'GetZodiacHoroscopeIntent'
|
155
|
-
alexa.request.confirmation_status.must_equal :unknown
|
156
|
-
alexa.request.dialog_state.must_equal :completed
|
157
|
-
alexa.request.slots[0].name.must_equal 'ZodiacSign'
|
158
|
-
end
|
159
|
-
|
160
|
-
it 'should raise an ArgumentError if intent is undefined' do
|
161
|
-
req = Oj.load(@json, symbol_keys: true)
|
162
|
-
req[:request][:intent] = nil
|
163
|
-
err = proc { AlexaRuby.new(req) }.must_raise ArgumentError
|
164
|
-
err.message.must_equal 'Intent must be defined'
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
describe 'SessionEndedRequest' do
|
169
|
-
before do
|
170
|
-
@json = File.read("#{@fpath}/session_ended_request.json")
|
171
|
-
end
|
172
|
-
|
173
|
-
it 'should parse valid SessionEndedRequest correctly' do
|
174
|
-
alexa = AlexaRuby.new(@json)
|
175
|
-
alexa.request.type.must_equal :session_ended
|
176
|
-
alexa.request.session.state.must_equal :ended
|
177
|
-
alexa.request.session.end_reason.must_equal :user_quit
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
describe 'AudioPlayerRequest' do
|
182
|
-
before do
|
183
|
-
@json = File.read("#{@fpath}/audio_player_request.json")
|
184
|
-
end
|
185
|
-
|
186
|
-
it 'should parse valid AudioPlayerRequest correctly' do
|
187
|
-
alexa = AlexaRuby.new(@json)
|
188
|
-
alexa.request.type.must_equal :audio_player
|
189
|
-
alexa.request.playback_state.must_equal 'PlaybackFailed'
|
190
|
-
alexa.request.playback_offset.must_equal 0
|
191
|
-
alexa.request.error_type.must_equal 'string'
|
192
|
-
alexa.request.error_message.must_equal 'string'
|
193
|
-
alexa.request.error_playback_token.must_equal 'string'
|
194
|
-
alexa.request.error_player_activity.must_equal 'string'
|
195
|
-
end
|
196
|
-
end
|
197
|
-
end
|
data/spec/response_spec.rb
DELETED
@@ -1,201 +0,0 @@
|
|
1
|
-
require_relative 'spec_helper'
|
2
|
-
|
3
|
-
describe 'Build response to Amazon Alexa service' do
|
4
|
-
before do
|
5
|
-
@req_path = 'spec/fixtures/request'
|
6
|
-
@resp_path = 'spec/fixtures/response'
|
7
|
-
end
|
8
|
-
|
9
|
-
describe 'General response handling' do
|
10
|
-
before do
|
11
|
-
@json = File.read("#{@req_path}/launch_request.json")
|
12
|
-
@alexa = AlexaRuby.new(@json)
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'should build a Response object for valid JSON' do
|
16
|
-
@alexa.response.wont_be_nil
|
17
|
-
resp = Oj.load(@alexa.response.json, symbol_keys: true)
|
18
|
-
resp[:version].wont_be_nil
|
19
|
-
resp[:response][:shouldEndSession].must_equal true
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
describe 'Session parameters management' do
|
24
|
-
before do
|
25
|
-
@json = File.read("#{@req_path}/launch_request.json")
|
26
|
-
@alexa = AlexaRuby.new(@json)
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'should add one session attribute correctly' do
|
30
|
-
@alexa.response.add_session_attribute(:id, 'djsdhdsjhdsjhdsjh')
|
31
|
-
resp = Oj.load(@alexa.response.json, symbol_keys: true)
|
32
|
-
resp[:sessionAttributes][:id].must_equal 'djsdhdsjhdsjhdsjh'
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'should add pack of session attributes correctly' do
|
36
|
-
@alexa.response.add_session_attributes(
|
37
|
-
id: 'djsdhdsjhdsjhdsjh',
|
38
|
-
test: 'test'
|
39
|
-
)
|
40
|
-
resp = Oj.load(@alexa.response.json, symbol_keys: true)
|
41
|
-
resp[:sessionAttributes][:id].must_equal 'djsdhdsjhdsjhdsjh'
|
42
|
-
resp[:sessionAttributes][:test].must_equal 'test'
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'should merge pack of session attributes correctly' do
|
46
|
-
@alexa.response.add_session_attributes(
|
47
|
-
id: 'djsdhdsjhdsjhdsjh',
|
48
|
-
test: 'test'
|
49
|
-
)
|
50
|
-
@alexa.response.merge_session_attributes(token: '7783y3h43hg4ghh')
|
51
|
-
resp = Oj.load(@alexa.response.json, symbol_keys: true)
|
52
|
-
resp[:sessionAttributes][:id].must_equal 'djsdhdsjhdsjhdsjh'
|
53
|
-
resp[:sessionAttributes][:test].must_equal 'test'
|
54
|
-
resp[:sessionAttributes][:token].must_equal '7783y3h43hg4ghh'
|
55
|
-
end
|
56
|
-
|
57
|
-
it 'should raise ArgumentError if duplicate attribute found' do
|
58
|
-
@alexa.response.add_session_attribute(:id, 'djsdhdsjhdsjhdsjh')
|
59
|
-
err = proc {
|
60
|
-
@alexa.response.add_session_attribute(:id, '833hj33jh3hj')
|
61
|
-
}.must_raise ArgumentError
|
62
|
-
err.message.must_equal 'Duplicate session attributes not allowed'
|
63
|
-
end
|
64
|
-
|
65
|
-
it 'should raise ArgumentError if attributes pack isn\'t a Hash' do
|
66
|
-
err = proc {
|
67
|
-
@alexa.response.add_session_attributes('Test')
|
68
|
-
}.must_raise ArgumentError
|
69
|
-
err.message.must_equal 'Attributes must be a Hash'
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
describe 'Cards management' do
|
74
|
-
before do
|
75
|
-
@json = File.read("#{@req_path}/launch_request.json")
|
76
|
-
@card = Oj.load(
|
77
|
-
File.read("#{@resp_path}/sample_card.json"),
|
78
|
-
symbol_keys: true
|
79
|
-
)
|
80
|
-
@alexa = AlexaRuby.new(@json)
|
81
|
-
end
|
82
|
-
|
83
|
-
it 'should add card to response' do
|
84
|
-
@alexa.response.add_card(@card)
|
85
|
-
resp = Oj.load(@alexa.response.json, symbol_keys: true)
|
86
|
-
resp[:response][:card][:type].must_equal 'Simple'
|
87
|
-
resp[:response][:card][:title].must_equal 'title'
|
88
|
-
resp[:response][:card][:content].must_equal 'text'
|
89
|
-
end
|
90
|
-
|
91
|
-
it 'should add "text" and "image" nodes if card type is Standard' do
|
92
|
-
@card[:type] = 'Standard'
|
93
|
-
@alexa.response.add_card(@card)
|
94
|
-
resp = Oj.load(@alexa.response.json, symbol_keys: true)
|
95
|
-
small_url = 'https://test.ru/example_small.jpg'
|
96
|
-
large_url = 'https://test.ru/example_large.jpg'
|
97
|
-
resp[:response][:card][:type].must_equal 'Standard'
|
98
|
-
resp[:response][:card][:text].must_equal 'text'
|
99
|
-
resp[:response][:card][:image][:smallImageUrl].must_equal small_url
|
100
|
-
resp[:response][:card][:image][:largeImageUrl].must_equal large_url
|
101
|
-
end
|
102
|
-
|
103
|
-
it 'should raise ArgumentError if no title given' do
|
104
|
-
@card[:title] = nil
|
105
|
-
err = proc { @alexa.response.add_card(@card) }.must_raise ArgumentError
|
106
|
-
err.message.must_equal 'Card need a title'
|
107
|
-
end
|
108
|
-
|
109
|
-
it 'should raise ArgumentError if card type unknown' do
|
110
|
-
@card[:type] = 'Test'
|
111
|
-
err = proc { @alexa.response.add_card(@card) }.must_raise ArgumentError
|
112
|
-
err.message.must_equal 'Unknown card type'
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
describe 'Audio directives management' do
|
117
|
-
before do
|
118
|
-
@json = File.read("#{@req_path}/launch_request.json")
|
119
|
-
@audio = Oj.load(
|
120
|
-
File.read("#{@resp_path}/sample_audio.json"),
|
121
|
-
symbol_keys: true
|
122
|
-
)
|
123
|
-
@alexa = AlexaRuby.new(@json)
|
124
|
-
end
|
125
|
-
|
126
|
-
it 'should add AudioPlayer.Play directive' do
|
127
|
-
@alexa.response.add_audio_player_directive(:start, @audio)
|
128
|
-
resp = Oj.load(@alexa.response.json, symbol_keys: true)
|
129
|
-
directive = resp[:response][:directives][0]
|
130
|
-
directive[:type].must_equal 'AudioPlayer.Play'
|
131
|
-
directive[:playBehavior].must_equal 'REPLACE_ALL'
|
132
|
-
stream = directive[:audioItem][:stream]
|
133
|
-
stream[:url].must_equal @audio[:url]
|
134
|
-
stream[:token].must_equal @audio[:token]
|
135
|
-
stream[:offsetInMilliseconds].must_equal @audio[:offset]
|
136
|
-
end
|
137
|
-
|
138
|
-
it 'should add AudioPlayer.Stop directive' do
|
139
|
-
@alexa.response.add_audio_player_directive(:stop)
|
140
|
-
resp = Oj.load(@alexa.response.json, symbol_keys: true)
|
141
|
-
resp[:response][:directives][0][:type].must_equal 'AudioPlayer.Stop'
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
describe 'Speech management' do
|
146
|
-
before do
|
147
|
-
@json = File.read("#{@req_path}/launch_request.json")
|
148
|
-
@alexa = AlexaRuby.new(@json)
|
149
|
-
end
|
150
|
-
|
151
|
-
it 'should add plain text output to response' do
|
152
|
-
@alexa.response.tell('Test')
|
153
|
-
resp = Oj.load(@alexa.response.json, symbol_keys: true)
|
154
|
-
resp[:response][:outputSpeech][:type].must_equal 'PlainText'
|
155
|
-
resp[:response][:outputSpeech][:text].must_equal 'Test'
|
156
|
-
resp[:response][:outputSpeech][:ssml].must_be_nil
|
157
|
-
end
|
158
|
-
|
159
|
-
it 'should add SSML output to response' do
|
160
|
-
@alexa.response.tell('Test', nil, true)
|
161
|
-
resp = Oj.load(@alexa.response.json, symbol_keys: true)
|
162
|
-
resp[:response][:outputSpeech][:type].must_equal 'SSML'
|
163
|
-
resp[:response][:outputSpeech][:ssml].must_equal '<speak>Test</speak>'
|
164
|
-
resp[:response][:outputSpeech][:text].must_be_nil
|
165
|
-
end
|
166
|
-
|
167
|
-
it 'should add output with repromt' do
|
168
|
-
@alexa.response.tell('Test', 'One more test')
|
169
|
-
resp = Oj.load(@alexa.response.json, symbol_keys: true)
|
170
|
-
resp[:response][:outputSpeech][:type].must_equal 'PlainText'
|
171
|
-
resp[:response][:outputSpeech][:text].must_equal 'Test'
|
172
|
-
resp[:response][:outputSpeech][:ssml].must_be_nil
|
173
|
-
repromt = resp[:response][:reprompt][:outputSpeech]
|
174
|
-
repromt[:type].must_equal 'PlainText'
|
175
|
-
repromt[:text].must_equal 'One more test'
|
176
|
-
repromt[:ssml].must_be_nil
|
177
|
-
end
|
178
|
-
|
179
|
-
it 'should add output speech and return JSON' do
|
180
|
-
sample = Oj.to_json(
|
181
|
-
Oj.load(File.read("#{@resp_path}/sample_response.json"))
|
182
|
-
)
|
183
|
-
@alexa.response.tell!('Test').must_equal sample
|
184
|
-
end
|
185
|
-
|
186
|
-
it 'should add output speech without closing session' do
|
187
|
-
@alexa.response.ask('Test')
|
188
|
-
resp = Oj.load(@alexa.response.json, symbol_keys: true)
|
189
|
-
resp[:response][:shouldEndSession].must_equal false
|
190
|
-
end
|
191
|
-
|
192
|
-
it 'should add output speech without closing session and return JSON' do
|
193
|
-
sample = Oj.load(
|
194
|
-
File.read("#{@resp_path}/sample_response.json"),
|
195
|
-
symbol_keys: true
|
196
|
-
)
|
197
|
-
sample[:response][:shouldEndSession] = false
|
198
|
-
@alexa.response.ask!('Test').must_equal Oj.to_json(sample)
|
199
|
-
end
|
200
|
-
end
|
201
|
-
end
|