|
1
|
|
|
<?php |
|
2
|
|
|
|
|
3
|
|
|
declare(strict_types=1); |
|
4
|
|
|
|
|
5
|
|
|
namespace MaxBeckers\AmazonAlexa\Test\Request; |
|
6
|
|
|
|
|
7
|
|
|
use MaxBeckers\AmazonAlexa\Request\Advertising; |
|
8
|
|
|
use MaxBeckers\AmazonAlexa\Request\AlexaPresentationAPL; |
|
9
|
|
|
use MaxBeckers\AmazonAlexa\Request\ComponentVisibleOnScreen; |
|
10
|
|
|
use MaxBeckers\AmazonAlexa\Request\Context; |
|
11
|
|
|
use MaxBeckers\AmazonAlexa\Request\Entity; |
|
12
|
|
|
use MaxBeckers\AmazonAlexa\Request\Experience; |
|
13
|
|
|
use MaxBeckers\AmazonAlexa\Request\KeyboardType; |
|
14
|
|
|
use MaxBeckers\AmazonAlexa\Request\Request; |
|
15
|
|
|
use MaxBeckers\AmazonAlexa\Request\Request\Standard\LaunchRequest; |
|
16
|
|
|
use MaxBeckers\AmazonAlexa\Request\TouchType; |
|
17
|
|
|
use MaxBeckers\AmazonAlexa\Request\Video; |
|
18
|
|
|
use MaxBeckers\AmazonAlexa\Request\Viewport; |
|
19
|
|
|
use MaxBeckers\AmazonAlexa\Request\ViewportMode; |
|
20
|
|
|
use MaxBeckers\AmazonAlexa\Request\ViewportShape; |
|
21
|
|
|
use MaxBeckers\AmazonAlexa\Request\ViewportTag; |
|
22
|
|
|
use PHPUnit\Framework\TestCase; |
|
23
|
|
|
|
|
24
|
|
|
class ContextTest extends TestCase |
|
25
|
|
|
{ |
|
26
|
|
|
public function testContextWithAPLAndAdvancedFields(): void |
|
27
|
|
|
{ |
|
28
|
|
|
$requestBody = file_get_contents(__DIR__ . '/RequestData/contextWithAPL.json'); |
|
29
|
|
|
$request = Request::fromAmazonRequest($requestBody, 'https://s3.amazonaws.com/echo.api/echo-api-cert.pem', 'signature'); |
|
30
|
|
|
|
|
31
|
|
|
$this->assertInstanceOf(LaunchRequest::class, $request->request); |
|
32
|
|
|
$this->assertInstanceOf(Context::class, $request->context); |
|
33
|
|
|
|
|
34
|
|
|
// Test Advertising |
|
35
|
|
|
$this->assertInstanceOf(Advertising::class, $request->context->advertising); |
|
36
|
|
|
$this->assertEquals('12345-advertising-id', $request->context->advertising->advertisingId); |
|
37
|
|
|
$this->assertFalse($request->context->advertising->limitAdTracking); |
|
38
|
|
|
|
|
39
|
|
|
// Test Viewport |
|
40
|
|
|
$this->assertInstanceOf(Viewport::class, $request->context->viewport); |
|
41
|
|
|
$this->assertEquals(ViewportMode::TV, $request->context->viewport->mode); |
|
42
|
|
|
$this->assertEquals(ViewportShape::RECTANGLE, $request->context->viewport->shape); |
|
43
|
|
|
$this->assertEquals(1920, $request->context->viewport->pixelWidth); |
|
44
|
|
|
$this->assertEquals(1080, $request->context->viewport->pixelHeight); |
|
45
|
|
|
$this->assertEquals(160, $request->context->viewport->dpi); |
|
46
|
|
|
|
|
47
|
|
|
// Test Viewport Experiences |
|
48
|
|
|
$this->assertCount(1, $request->context->viewport->experiences); |
|
49
|
|
|
$this->assertInstanceOf(Experience::class, $request->context->viewport->experiences[0]); |
|
50
|
|
|
$this->assertEquals('246', $request->context->viewport->experiences[0]->arcMinuteWidth); |
|
51
|
|
|
$this->assertEquals('144', $request->context->viewport->experiences[0]->arcMinuteHeight); |
|
52
|
|
|
$this->assertFalse($request->context->viewport->experiences[0]->canRotate); |
|
53
|
|
|
|
|
54
|
|
|
// Test Viewport Touch and Keyboard |
|
55
|
|
|
$this->assertCount(1, $request->context->viewport->touch); |
|
56
|
|
|
$this->assertEquals(TouchType::SINGLE, $request->context->viewport->touch[0]); |
|
57
|
|
|
$this->assertCount(1, $request->context->viewport->keyboard); |
|
58
|
|
|
$this->assertEquals(KeyboardType::DIRECTION, $request->context->viewport->keyboard[0]); |
|
59
|
|
|
|
|
60
|
|
|
// Test Viewport Video |
|
61
|
|
|
$this->assertInstanceOf(Video::class, $request->context->viewport->video); |
|
62
|
|
|
$this->assertCount(2, $request->context->viewport->video->codecs); |
|
63
|
|
|
$this->assertEquals('H_264_42', $request->context->viewport->video->codecs[0]); |
|
64
|
|
|
$this->assertEquals('H_264_41', $request->context->viewport->video->codecs[1]); |
|
65
|
|
|
|
|
66
|
|
|
// Test Viewports array |
|
67
|
|
|
$this->assertCount(1, $request->context->viewports); |
|
68
|
|
|
$this->assertInstanceOf(Viewport::class, $request->context->viewports[0]); |
|
69
|
|
|
$this->assertEquals(ViewportMode::HUB, $request->context->viewports[0]->mode); |
|
70
|
|
|
$this->assertEquals(ViewportShape::ROUND, $request->context->viewports[0]->shape); |
|
71
|
|
|
$this->assertEquals(960, $request->context->viewports[0]->pixelWidth); |
|
72
|
|
|
|
|
73
|
|
|
// Test Alexa.Presentation.APL |
|
74
|
|
|
$this->assertInstanceOf(AlexaPresentationAPL::class, $request->context->apl); |
|
75
|
|
|
$this->assertEquals('apl-token-123', $request->context->apl->token); |
|
76
|
|
|
$this->assertEquals('2024.1', $request->context->apl->version); |
|
77
|
|
|
$this->assertCount(1, $request->context->apl->componentsVisibleOnScreen); |
|
78
|
|
|
|
|
79
|
|
|
// Test ComponentVisibleOnScreen |
|
80
|
|
|
$component = $request->context->apl->componentsVisibleOnScreen[0]; |
|
81
|
|
|
$this->assertInstanceOf(ComponentVisibleOnScreen::class, $component); |
|
82
|
|
|
$this->assertEquals('main-container', $component->id); |
|
83
|
|
|
$this->assertEquals('Container', $component->type); |
|
84
|
|
|
$this->assertEquals(':10001', $component->uid); |
|
85
|
|
|
$this->assertEquals('1280x720+0+0:0', $component->position); |
|
86
|
|
|
|
|
87
|
|
|
// Test Component Entities |
|
88
|
|
|
$this->assertCount(1, $component->entities); |
|
89
|
|
|
$this->assertInstanceOf(Entity::class, $component->entities[0]); |
|
90
|
|
|
$this->assertEquals('entity1', $component->entities[0]->id); |
|
91
|
|
|
$this->assertEquals('text', $component->entities[0]->type); |
|
92
|
|
|
$this->assertEquals('Hello World', $component->entities[0]->value); |
|
93
|
|
|
|
|
94
|
|
|
// Test Component Tags with Viewport |
|
95
|
|
|
$this->assertNotNull($component->tags); |
|
96
|
|
|
$this->assertInstanceOf(ViewportTag::class, $component->tags->viewport); |
|
97
|
|
|
$this->assertEquals('2024-01-01T12:00:00Z', $component->tags->viewport->utcTime); |
|
98
|
|
|
$this->assertEquals(5000, $component->tags->viewport->elapsedTime); |
|
99
|
|
|
|
|
100
|
|
|
// Test Extensions |
|
101
|
|
|
$this->assertNotNull($request->context->extensions); |
|
102
|
|
|
$this->assertArrayHasKey('available', $request->context->extensions); |
|
103
|
|
|
$this->assertArrayHasKey('settings', $request->context->extensions); |
|
104
|
|
|
$this->assertArrayHasKey('aplext:backstack:10', $request->context->extensions['available']); |
|
105
|
|
|
} |
|
106
|
|
|
|
|
107
|
|
|
public function testAdvertisingFromAmazonRequest(): void |
|
108
|
|
|
{ |
|
109
|
|
|
$amazonRequest = [ |
|
110
|
|
|
'advertisingId' => 'test-ad-id', |
|
111
|
|
|
'limitAdTracking' => true, |
|
112
|
|
|
]; |
|
113
|
|
|
|
|
114
|
|
|
$advertising = Advertising::fromAmazonRequest($amazonRequest); |
|
115
|
|
|
|
|
116
|
|
|
$this->assertInstanceOf(Advertising::class, $advertising); |
|
117
|
|
|
$this->assertEquals('test-ad-id', $advertising->advertisingId); |
|
118
|
|
|
$this->assertTrue($advertising->limitAdTracking); |
|
119
|
|
|
} |
|
120
|
|
|
|
|
121
|
|
|
public function testViewportFromAmazonRequest(): void |
|
122
|
|
|
{ |
|
123
|
|
|
$amazonRequest = [ |
|
124
|
|
|
'mode' => 'HUB', |
|
125
|
|
|
'shape' => 'ROUND', |
|
126
|
|
|
'pixelWidth' => 1024, |
|
127
|
|
|
'pixelHeight' => 600, |
|
128
|
|
|
'dpi' => 160, |
|
129
|
|
|
'touch' => ['SINGLE'], |
|
130
|
|
|
'keyboard' => ['DIRECTION'], |
|
131
|
|
|
'video' => [ |
|
132
|
|
|
'codecs' => ['H_264_42'], |
|
133
|
|
|
], |
|
134
|
|
|
'experiences' => [ |
|
135
|
|
|
[ |
|
136
|
|
|
'arcMinuteWidth' => '120', |
|
137
|
|
|
'arcMinuteHeight' => '80', |
|
138
|
|
|
'canRotate' => true, |
|
139
|
|
|
'canResize' => false, |
|
140
|
|
|
], |
|
141
|
|
|
], |
|
142
|
|
|
]; |
|
143
|
|
|
|
|
144
|
|
|
$viewport = Viewport::fromAmazonRequest($amazonRequest); |
|
145
|
|
|
|
|
146
|
|
|
$this->assertInstanceOf(Viewport::class, $viewport); |
|
147
|
|
|
$this->assertEquals(ViewportMode::HUB, $viewport->mode); |
|
148
|
|
|
$this->assertEquals(ViewportShape::ROUND, $viewport->shape); |
|
149
|
|
|
$this->assertEquals(1024, $viewport->pixelWidth); |
|
150
|
|
|
$this->assertEquals(600, $viewport->pixelHeight); |
|
151
|
|
|
$this->assertEquals(160, $viewport->dpi); |
|
152
|
|
|
$this->assertCount(1, $viewport->touch); |
|
153
|
|
|
$this->assertEquals(TouchType::SINGLE, $viewport->touch[0]); |
|
154
|
|
|
$this->assertCount(1, $viewport->keyboard); |
|
155
|
|
|
$this->assertEquals(KeyboardType::DIRECTION, $viewport->keyboard[0]); |
|
156
|
|
|
$this->assertInstanceOf(Video::class, $viewport->video); |
|
157
|
|
|
$this->assertCount(1, $viewport->video->codecs); |
|
158
|
|
|
$this->assertEquals('H_264_42', $viewport->video->codecs[0]); |
|
159
|
|
|
$this->assertCount(1, $viewport->experiences); |
|
160
|
|
|
$this->assertInstanceOf(Experience::class, $viewport->experiences[0]); |
|
161
|
|
|
$this->assertEquals('120', $viewport->experiences[0]->arcMinuteWidth); |
|
162
|
|
|
$this->assertTrue($viewport->experiences[0]->canRotate); |
|
163
|
|
|
} |
|
164
|
|
|
|
|
165
|
|
|
public function testAlexaPresentationAPLFromAmazonRequest(): void |
|
166
|
|
|
{ |
|
167
|
|
|
$amazonRequest = [ |
|
168
|
|
|
'token' => 'test-token', |
|
169
|
|
|
'version' => '2024.1', |
|
170
|
|
|
'componentsVisibleOnScreen' => [ |
|
171
|
|
|
[ |
|
172
|
|
|
'id' => 'test-component', |
|
173
|
|
|
'type' => 'Text', |
|
174
|
|
|
'uid' => ':10001', |
|
175
|
|
|
'position' => '100x100+0+0:0', |
|
176
|
|
|
'entities' => [ |
|
177
|
|
|
[ |
|
178
|
|
|
'id' => 'test-entity', |
|
179
|
|
|
'type' => 'text', |
|
180
|
|
|
'value' => 'Test Value', |
|
181
|
|
|
], |
|
182
|
|
|
], |
|
183
|
|
|
], |
|
184
|
|
|
], |
|
185
|
|
|
]; |
|
186
|
|
|
|
|
187
|
|
|
$apl = AlexaPresentationAPL::fromAmazonRequest($amazonRequest); |
|
188
|
|
|
|
|
189
|
|
|
$this->assertInstanceOf(AlexaPresentationAPL::class, $apl); |
|
190
|
|
|
$this->assertEquals('test-token', $apl->token); |
|
191
|
|
|
$this->assertEquals('2024.1', $apl->version); |
|
192
|
|
|
$this->assertCount(1, $apl->componentsVisibleOnScreen); |
|
193
|
|
|
|
|
194
|
|
|
$component = $apl->componentsVisibleOnScreen[0]; |
|
195
|
|
|
$this->assertInstanceOf(ComponentVisibleOnScreen::class, $component); |
|
196
|
|
|
$this->assertEquals('test-component', $component->id); |
|
197
|
|
|
$this->assertEquals('Text', $component->type); |
|
198
|
|
|
$this->assertEquals(':10001', $component->uid); |
|
199
|
|
|
$this->assertEquals('100x100+0+0:0', $component->position); |
|
200
|
|
|
$this->assertCount(1, $component->entities); |
|
201
|
|
|
|
|
202
|
|
|
$entity = $component->entities[0]; |
|
203
|
|
|
$this->assertInstanceOf(Entity::class, $entity); |
|
204
|
|
|
$this->assertEquals('test-entity', $entity->id); |
|
205
|
|
|
$this->assertEquals('text', $entity->type); |
|
206
|
|
|
$this->assertEquals('Test Value', $entity->value); |
|
207
|
|
|
} |
|
208
|
|
|
} |
|
209
|
|
|
|