2024-03-07 15:20:34 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace Tests\Unit\Utopia;
|
|
|
|
|
|
2025-01-17 04:31:39 +00:00
|
|
|
use Appwrite\SDK\Method;
|
2025-05-12 05:30:36 +00:00
|
|
|
use Appwrite\SDK\Parameter;
|
2024-03-07 15:20:34 +00:00
|
|
|
use Appwrite\Utopia\Request;
|
|
|
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
|
use Swoole\Http\Request as SwooleRequest;
|
|
|
|
|
use Tests\Unit\Utopia\Request\Filters\First;
|
|
|
|
|
use Tests\Unit\Utopia\Request\Filters\Second;
|
2026-02-10 05:04:24 +00:00
|
|
|
use Utopia\Http\Route;
|
2024-03-07 15:20:34 +00:00
|
|
|
|
|
|
|
|
class RequestTest extends TestCase
|
|
|
|
|
{
|
|
|
|
|
protected ?Request $request = null;
|
|
|
|
|
|
|
|
|
|
public function setUp(): void
|
|
|
|
|
{
|
2024-10-08 07:54:40 +00:00
|
|
|
$this->request = new Request(new SwooleRequest());
|
2024-03-07 15:20:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testFilters(): void
|
|
|
|
|
{
|
|
|
|
|
$this->assertFalse($this->request->hasFilters());
|
|
|
|
|
$this->assertIsArray($this->request->getFilters());
|
|
|
|
|
$this->assertEmpty($this->request->getFilters());
|
|
|
|
|
|
|
|
|
|
$this->request->addFilter(new First());
|
|
|
|
|
$this->request->addFilter(new Second());
|
|
|
|
|
|
|
|
|
|
$this->assertTrue($this->request->hasFilters());
|
|
|
|
|
$this->assertCount(2, $this->request->getFilters());
|
|
|
|
|
|
|
|
|
|
$route = new Route(Request::METHOD_GET, '/test');
|
2025-01-17 04:31:39 +00:00
|
|
|
$route->label('sdk', new Method(
|
|
|
|
|
namespace: 'namespace',
|
2025-03-31 06:23:31 +00:00
|
|
|
group: 'group',
|
2025-01-17 04:31:39 +00:00
|
|
|
name: 'method',
|
|
|
|
|
description: 'description',
|
|
|
|
|
auth: [],
|
|
|
|
|
responses: [],
|
|
|
|
|
));
|
2024-03-07 15:20:34 +00:00
|
|
|
// set test header to prevent header populaten inside the request class
|
|
|
|
|
$this->request->addHeader('EXAMPLE', 'VALUE');
|
|
|
|
|
$this->request->setRoute($route);
|
2024-10-08 07:54:40 +00:00
|
|
|
$this->request->setQueryString([
|
2024-03-07 15:20:34 +00:00
|
|
|
'initial' => true,
|
|
|
|
|
'first' => false
|
|
|
|
|
]);
|
|
|
|
|
$output = $this->request->getParams();
|
|
|
|
|
|
|
|
|
|
$this->assertArrayHasKey('initial', $output);
|
|
|
|
|
$this->assertTrue($output['initial']);
|
|
|
|
|
$this->assertArrayHasKey('first', $output);
|
|
|
|
|
$this->assertTrue($output['first']);
|
|
|
|
|
$this->assertArrayHasKey('second', $output);
|
|
|
|
|
$this->assertTrue($output['second']);
|
|
|
|
|
$this->assertArrayNotHasKey('deleted', $output);
|
|
|
|
|
}
|
2025-05-12 05:30:36 +00:00
|
|
|
|
|
|
|
|
public function testGetParamsWithMultipleMethods(): void
|
|
|
|
|
{
|
|
|
|
|
$this->setupMultiMethodRoute();
|
|
|
|
|
|
|
|
|
|
// Pass only "foo", should match Method A
|
|
|
|
|
$this->request->setQueryString([
|
|
|
|
|
'foo' => 'valueFoo',
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$params = $this->request->getParams();
|
|
|
|
|
|
|
|
|
|
$this->assertArrayHasKey('foo', $params);
|
|
|
|
|
$this->assertSame('valueFoo', $params['foo']);
|
|
|
|
|
$this->assertArrayNotHasKey('baz', $params);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testGetParamsWithAllRequired(): void
|
|
|
|
|
{
|
|
|
|
|
$this->setupMultiMethodRoute();
|
|
|
|
|
|
|
|
|
|
// Pass "foo" and "bar", should match Method A
|
|
|
|
|
$this->request->setQueryString([
|
|
|
|
|
'foo' => 'valueFoo',
|
|
|
|
|
'bar' => 'valueBar',
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$params = $this->request->getParams();
|
|
|
|
|
$this->assertArrayHasKey('foo', $params);
|
|
|
|
|
$this->assertSame('valueFoo', $params['foo']);
|
|
|
|
|
$this->assertArrayHasKey('bar', $params);
|
|
|
|
|
$this->assertSame('valueBar', $params['bar']);
|
|
|
|
|
$this->assertArrayNotHasKey('baz', $params);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testGetParamsWithAllOptional(): void
|
|
|
|
|
{
|
|
|
|
|
$this->setupMultiMethodRoute();
|
|
|
|
|
|
|
|
|
|
// Pass only "bar", should match Method A
|
|
|
|
|
$this->request->setQueryString([
|
|
|
|
|
'bar' => 'valueBar',
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$params = $this->request->getParams();
|
|
|
|
|
|
|
|
|
|
$this->assertArrayHasKey('bar', $params);
|
|
|
|
|
$this->assertSame('valueBar', $params['bar']);
|
|
|
|
|
$this->assertArrayNotHasKey('foo', $params);
|
|
|
|
|
$this->assertArrayNotHasKey('baz', $params);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testGetParamsMatchesMethodB(): void
|
|
|
|
|
{
|
|
|
|
|
$this->setupMultiMethodRoute();
|
|
|
|
|
|
|
|
|
|
// Pass only "baz", should match Method B
|
|
|
|
|
$this->request->setQueryString([
|
|
|
|
|
'baz' => 'valueBaz',
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$params = $this->request->getParams();
|
|
|
|
|
|
|
|
|
|
$this->assertArrayHasKey('baz', $params);
|
|
|
|
|
$this->assertSame('valueBaz', $params['baz']);
|
|
|
|
|
$this->assertArrayNotHasKey('foo', $params);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testGetParamsFallbackForMixedAndUnknown(): void
|
|
|
|
|
{
|
|
|
|
|
$this->setupMultiMethodRoute();
|
|
|
|
|
|
|
|
|
|
// Mixed and unknown should fallback to raw params
|
|
|
|
|
$this->request->setQueryString([
|
|
|
|
|
'foo' => 'valueFoo',
|
|
|
|
|
'baz' => 'valueBaz',
|
|
|
|
|
'extra' => 'unexpected',
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$params = $this->request->getParams();
|
|
|
|
|
|
|
|
|
|
$this->assertArrayHasKey('foo', $params);
|
|
|
|
|
$this->assertSame('valueFoo', $params['foo']);
|
|
|
|
|
$this->assertArrayHasKey('baz', $params);
|
|
|
|
|
$this->assertSame('valueBaz', $params['baz']);
|
|
|
|
|
$this->assertArrayHasKey('extra', $params);
|
|
|
|
|
$this->assertSame('unexpected', $params['extra']);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Helper to attach a route with multiple SDK methods to the request.
|
|
|
|
|
*/
|
|
|
|
|
private function setupMultiMethodRoute(): void
|
|
|
|
|
{
|
|
|
|
|
$route = new Route(Request::METHOD_GET, '/multi');
|
|
|
|
|
|
|
|
|
|
$methodA = new Method(
|
|
|
|
|
namespace: 'namespace',
|
|
|
|
|
group: 'group',
|
|
|
|
|
name: 'methodA',
|
|
|
|
|
description: 'desc',
|
|
|
|
|
auth: [],
|
|
|
|
|
responses: [],
|
|
|
|
|
parameters: [
|
|
|
|
|
new Parameter('foo'),
|
|
|
|
|
new Parameter('bar', optional: true),
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
$methodB = new Method(
|
|
|
|
|
namespace: 'namespace',
|
|
|
|
|
group: 'group',
|
|
|
|
|
name: 'methodB',
|
|
|
|
|
description: 'desc',
|
|
|
|
|
auth: [],
|
|
|
|
|
responses: [],
|
|
|
|
|
parameters: [
|
|
|
|
|
new Parameter('baz'),
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
$route->label('sdk', [$methodA, $methodB]);
|
|
|
|
|
$this->request->addFilter(new First());
|
|
|
|
|
$this->request->addFilter(new Second());
|
|
|
|
|
$this->request->setRoute($route);
|
|
|
|
|
}
|
2024-03-07 15:20:34 +00:00
|
|
|
}
|