ContextTest   A
last analyzed

Complexity

Total Complexity 4

Size/Duplication

Total Lines 183
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 124
dl 0
loc 183
rs 10
c 1
b 0
f 1
wmc 4

4 Methods

Rating   Name   Duplication   Size   Complexity  
A testAlexaPresentationAPLFromAmazonRequest() 0 42 1
A testContextWithAPLAndAdvancedFields() 0 79 1
A testAdvertisingFromAmazonRequest() 0 12 1
A testViewportFromAmazonRequest() 0 42 1
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