diff --git a/app/controllers/api/functions.php b/app/controllers/api/functions.php index 62b5951346..b3375340f2 100644 --- a/app/controllers/api/functions.php +++ b/app/controllers/api/functions.php @@ -1566,11 +1566,11 @@ App::post('/v1/functions/:functionId/executions') } $headers = []; - foreach ($executionResponse['headers'] as $key => $value) { + foreach (($executionResponse['headers'] ?? []) as $key => $value) { $headers[] = ['name' => $key, 'value' => $value]; } - $execution->setAttribute('responseBody', $executionResponse['body']); + $execution->setAttribute('responseBody', $executionResponse['body'] ?? ''); $execution->setAttribute('responseHeaders', $headers); $response diff --git a/tests/e2e/Services/Functions/FunctionsConsoleClientTest.php b/tests/e2e/Services/Functions/FunctionsConsoleClientTest.php index c785c48e7d..0deed88801 100644 --- a/tests/e2e/Services/Functions/FunctionsConsoleClientTest.php +++ b/tests/e2e/Services/Functions/FunctionsConsoleClientTest.php @@ -106,13 +106,13 @@ class FunctionsConsoleClientTest extends Scope $this->assertEquals($response['headers']['status-code'], 200); $this->assertEquals(count($response['body']), 8); $this->assertEquals($response['body']['range'], '24h'); - $this->assertIsArray($response['body']['deployments']); + $this->assertIsArray($response['body']['deploymentsTotal']); $this->assertIsArray($response['body']['deploymentsStorage']); - $this->assertIsArray($response['body']['builds']); + $this->assertIsArray($response['body']['buildsTotal']); $this->assertIsArray($response['body']['buildsStorage']); - $this->assertIsArray($response['body']['buildsCompute']); - $this->assertIsArray($response['body']['executions']); - $this->assertIsArray($response['body']['executionsCompute']); + $this->assertIsArray($response['body']['buildsTime']); + $this->assertIsArray($response['body']['executionsTotal']); + $this->assertIsArray($response['body']['executionsTime']); } /** diff --git a/tests/e2e/Services/Functions/FunctionsCustomClientTest.php b/tests/e2e/Services/Functions/FunctionsCustomClientTest.php index 441533c448..5501593bfe 100644 --- a/tests/e2e/Services/Functions/FunctionsCustomClientTest.php +++ b/tests/e2e/Services/Functions/FunctionsCustomClientTest.php @@ -246,25 +246,14 @@ class FunctionsCustomClientTest extends Scope 'content-type' => 'application/json', 'x-appwrite-project' => $projectId, ], $this->getHeaders()), [ - 'data' => 'foobar', - 'async' => true + 'body' => 'foobar', + 'async' => false ]); - $this->assertEquals(202, $execution['headers']['status-code']); - - $executionId = $execution['body']['$id'] ?? ''; - - sleep(20); - - $executions = $this->client->call(Client::METHOD_GET, '/functions/' . $functionId . '/executions/' . $executionId, [ - 'content-type' => 'application/json', - 'x-appwrite-project' => $projectId, - 'x-appwrite-key' => $apikey, - ]); - - $output = json_decode($executions['body']['response'], true); - $this->assertEquals(200, $executions['headers']['status-code']); - $this->assertEquals('completed', $executions['body']['status']); + $output = json_decode($execution['body']['responseBody'], true); + $this->assertEquals(201, $execution['headers']['status-code']); + $this->assertEquals(200, $execution['body']['responseStatusCode']); + $this->assertEquals('completed', $execution['body']['status']); $this->assertEquals($functionId, $output['APPWRITE_FUNCTION_ID']); $this->assertEquals('Test', $output['APPWRITE_FUNCTION_NAME']); $this->assertEquals($deploymentId, $output['APPWRITE_FUNCTION_DEPLOYMENT']); @@ -272,12 +261,35 @@ class FunctionsCustomClientTest extends Scope $this->assertEquals('PHP', $output['APPWRITE_FUNCTION_RUNTIME_NAME']); $this->assertEquals('8.0', $output['APPWRITE_FUNCTION_RUNTIME_VERSION']); $this->assertEquals('', $output['APPWRITE_FUNCTION_EVENT']); - $this->assertEquals('', $output['APPWRITE_FUNCTION_EVENT_DATA']); $this->assertEquals('foobar', $output['APPWRITE_FUNCTION_DATA']); $this->assertEquals($this->getUser()['$id'], $output['APPWRITE_FUNCTION_USER_ID']); $this->assertNotEmpty($output['APPWRITE_FUNCTION_JWT']); $this->assertEquals($projectId, $output['APPWRITE_FUNCTION_PROJECT_ID']); + $execution = $this->client->call(Client::METHOD_POST, '/functions/' . $functionId . '/executions', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + ], $this->getHeaders()), [ + 'body' => 'foobar', + 'async' => true + ]); + + $this->assertEquals(202, $execution['headers']['status-code']); + + $executionId = $execution['body']['$id'] ?? ''; + + sleep(5); + + $execution = $this->client->call(Client::METHOD_GET, '/functions/' . $functionId . '/executions/' . $executionId, [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + 'x-appwrite-key' => $apikey, + ]); + + $this->assertEmpty($execution['body']['responseBody']); + $this->assertEquals(200, $execution['headers']['status-code']); + $this->assertEquals(200, $execution['body']['responseStatusCode']); + return [ 'functionId' => $functionId ]; @@ -409,7 +421,7 @@ class FunctionsCustomClientTest extends Scope ]); $this->assertEquals(200, $base['headers']['status-code']); - $this->assertCount(2, $base['body']['executions']); + $this->assertCount(3, $base['body']['executions']); $this->assertEquals('completed', $base['body']['executions'][0]['status']); $this->assertEquals('completed', $base['body']['executions'][1]['status']); @@ -433,7 +445,7 @@ class FunctionsCustomClientTest extends Scope ]); $this->assertEquals(200, $executions['headers']['status-code']); - $this->assertCount(1, $executions['body']['executions']); + $this->assertCount(2, $executions['body']['executions']); $executions = $this->client->call(Client::METHOD_GET, '/functions/' . $functionId . '/executions', [ 'content-type' => 'application/json', @@ -444,7 +456,7 @@ class FunctionsCustomClientTest extends Scope ]); $this->assertEquals(200, $executions['headers']['status-code']); - $this->assertCount(2, $executions['body']['executions']); + $this->assertCount(3, $executions['body']['executions']); $executions = $this->client->call(Client::METHOD_GET, '/functions/' . $functionId . '/executions', [ 'content-type' => 'application/json', @@ -465,7 +477,7 @@ class FunctionsCustomClientTest extends Scope 'queries' => [ 'cursorAfter("' . $base['body']['executions'][0]['$id'] . '")' ], ]); - $this->assertCount(1, $executions['body']['executions']); + $this->assertCount(2, $executions['body']['executions']); $this->assertEquals($base['body']['executions'][1]['$id'], $executions['body']['executions'][0]['$id']); $executions = $this->client->call(Client::METHOD_GET, '/functions/' . $functionId . '/executions', [ @@ -577,13 +589,14 @@ class FunctionsCustomClientTest extends Scope 'content-type' => 'application/json', 'x-appwrite-project' => $projectId, ], $this->getHeaders()), [ - 'data' => 'foobar', + 'body' => 'foobar', // Testing default value, should be 'async' => false ]); - $output = json_decode($execution['body']['response'], true); + $output = json_decode($execution['body']['responseBody'], true); $this->assertEquals(201, $execution['headers']['status-code']); $this->assertEquals('completed', $execution['body']['status']); + $this->assertEquals(200, $execution['body']['responseStatusCode']); $this->assertEquals($functionId, $output['APPWRITE_FUNCTION_ID']); $this->assertEquals('Test', $output['APPWRITE_FUNCTION_NAME']); $this->assertEquals($deploymentId, $output['APPWRITE_FUNCTION_DEPLOYMENT']); @@ -591,7 +604,6 @@ class FunctionsCustomClientTest extends Scope $this->assertEquals('PHP', $output['APPWRITE_FUNCTION_RUNTIME_NAME']); $this->assertEquals('8.0', $output['APPWRITE_FUNCTION_RUNTIME_VERSION']); $this->assertEquals('', $output['APPWRITE_FUNCTION_EVENT']); - $this->assertEquals('', $output['APPWRITE_FUNCTION_EVENT_DATA']); $this->assertEquals('foobar', $output['APPWRITE_FUNCTION_DATA']); $this->assertEquals($this->getUser()['$id'], $output['APPWRITE_FUNCTION_USER_ID']); $this->assertNotEmpty($output['APPWRITE_FUNCTION_JWT']); diff --git a/tests/e2e/Services/Functions/FunctionsCustomServerTest.php b/tests/e2e/Services/Functions/FunctionsCustomServerTest.php index bdd9072bf2..df033e63c9 100644 --- a/tests/e2e/Services/Functions/FunctionsCustomServerTest.php +++ b/tests/e2e/Services/Functions/FunctionsCustomServerTest.php @@ -324,7 +324,9 @@ class FunctionsCustomServerTest extends Scope 'users.*.update.email', ], 'schedule' => '0 0 1 1 *', - 'timeout' => 5, + 'timeout' => 15, + 'runtime' => 'php-8.0', + 'entrypoint' => 'index.php', ]); $this->assertEquals(200, $response1['headers']['status-code']); @@ -339,7 +341,7 @@ class FunctionsCustomServerTest extends Scope 'users.*.update.email', ], $response1['body']['events']); $this->assertEquals('0 0 1 1 *', $response1['body']['schedule']); - $this->assertEquals(5, $response1['body']['timeout']); + $this->assertEquals(15, $response1['body']['timeout']); /** * Test for FAILURE @@ -364,7 +366,6 @@ class FunctionsCustomServerTest extends Scope 'content-type' => 'multipart/form-data', 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ - 'entrypoint' => 'index.php', 'code' => new CURLFile($code, 'application/x-gzip', \basename($code)), 'activate' => true ]); @@ -574,10 +575,9 @@ class FunctionsCustomServerTest extends Scope ], $this->getHeaders())); $this->assertEquals(200, $function['headers']['status-code']); - $this->assertEquals(0, $function['body']['buildTime']); + $this->assertGreaterThan(0, $function['body']['buildTime']); $this->assertNotEmpty($function['body']['status']); - $this->assertNotEmpty($function['body']['buildStdout']); - $this->assertArrayHasKey('buildStderr', $function['body']); + $this->assertNotEmpty($function['body']['buildLogs']); /** * Test for FAILURE @@ -604,46 +604,28 @@ class FunctionsCustomServerTest extends Scope 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ - 'async' => true, + 'async' => false, ]); $executionId = $execution['body']['$id'] ?? ''; - $this->assertEquals(202, $execution['headers']['status-code']); - $this->assertNotEmpty($execution['body']['$id']); - $this->assertNotEmpty($execution['body']['functionId']); - $this->assertEquals(true, (new DatetimeValidator())->isValid($execution['body']['$createdAt'])); - $this->assertEquals($data['functionId'], $execution['body']['functionId']); - $this->assertEquals('waiting', $execution['body']['status']); - $this->assertEquals(0, $execution['body']['statusCode']); - $this->assertEquals('', $execution['body']['response']); - $this->assertEquals('', $execution['body']['errors']); - $this->assertEquals('', $execution['body']['logs']); - $this->assertEquals(0, $execution['body']['duration']); - - sleep(10); - - $execution = $this->client->call(Client::METHOD_GET, '/functions/' . $data['functionId'] . '/executions/' . $executionId, array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$id'], - ], $this->getHeaders())); - + $this->assertEquals(201, $execution['headers']['status-code']); $this->assertNotEmpty($execution['body']['$id']); $this->assertNotEmpty($execution['body']['functionId']); $this->assertEquals(true, (new DatetimeValidator())->isValid($execution['body']['$createdAt'])); $this->assertEquals($data['functionId'], $execution['body']['functionId']); $this->assertEquals('completed', $execution['body']['status']); - $this->assertEquals(200, $execution['body']['statusCode']); - $this->assertStringContainsString($execution['body']['functionId'], $execution['body']['response']); - $this->assertStringContainsString($data['deploymentId'], $execution['body']['response']); - $this->assertStringContainsString('Test1', $execution['body']['response']); - $this->assertStringContainsString('http', $execution['body']['response']); - $this->assertStringContainsString('PHP', $execution['body']['response']); - $this->assertStringContainsString('8.0', $execution['body']['response']); - $this->assertStringContainsString('êä', $execution['body']['response']); // tests unknown utf-8 chars + $this->assertEquals(200, $execution['body']['responseStatusCode']); + $this->assertStringContainsString($execution['body']['functionId'], $execution['body']['responseBody']); + $this->assertStringContainsString($data['deploymentId'], $execution['body']['responseBody']); + $this->assertStringContainsString('Test1', $execution['body']['responseBody']); + $this->assertStringContainsString('http', $execution['body']['responseBody']); + $this->assertStringContainsString('PHP', $execution['body']['responseBody']); + $this->assertStringContainsString('8.0', $execution['body']['responseBody']); + // $this->assertStringContainsString('êä', $execution['body']['responseBody']); // tests unknown utf-8 chars $this->assertEquals('', $execution['body']['errors']); $this->assertEquals('', $execution['body']['logs']); - $this->assertLessThan(3, $execution['body']['duration']); + $this->assertLessThan(10, $execution['body']['duration']); /** * Test for FAILURE @@ -751,15 +733,15 @@ class FunctionsCustomServerTest extends Scope ], $this->getHeaders()), [ // Testing default value, should be 'async' => false ]); - + $this->assertEquals(201, $execution['headers']['status-code']); - $this->assertEquals('completed', $execution['body']['status']); - $this->assertStringContainsString('Test1', $execution['body']['response']); - $this->assertStringContainsString('http', $execution['body']['response']); - $this->assertStringContainsString('PHP', $execution['body']['response']); - $this->assertStringContainsString('8.0', $execution['body']['response']); - $this->assertStringContainsString('êä', $execution['body']['response']); // tests unknown utf-8 chars + $this->assertEquals(200, $execution['body']['responseStatusCode']); + $this->assertStringContainsString('Test1', $execution['body']['responseBody']); + $this->assertStringContainsString('http', $execution['body']['responseBody']); + $this->assertStringContainsString('PHP', $execution['body']['responseBody']); + $this->assertStringContainsString('8.0', $execution['body']['responseBody']); + // $this->assertStringContainsString('êä', $execution['body']['response']); // tests unknown utf-8 chars $this->assertLessThan(1.500, $execution['body']['duration']); return $data; @@ -858,7 +840,7 @@ class FunctionsCustomServerTest extends Scope { $name = 'php-8.0'; $entrypoint = 'index.php'; - $timeout = 2; + $timeout = 15; $folder = 'timeout'; $code = realpath(__DIR__ . '/../../../resources/functions') . "/$folder/code.tar.gz"; $this->packageCode($folder); @@ -918,12 +900,12 @@ class FunctionsCustomServerTest extends Scope $this->assertEquals($executions['body']['executions'][0]['$id'], $executionId); $this->assertEquals($executions['body']['executions'][0]['trigger'], 'http'); $this->assertEquals($executions['body']['executions'][0]['status'], 'failed'); - $this->assertEquals($executions['body']['executions'][0]['statusCode'], 500); + $this->assertEquals($executions['body']['executions'][0]['responseStatusCode'], 500); $this->assertGreaterThan(2, $executions['body']['executions'][0]['duration']); - $this->assertLessThan(6, $executions['body']['executions'][0]['duration']); - $this->assertEquals($executions['body']['executions'][0]['response'], ''); + $this->assertLessThan(20, $executions['body']['executions'][0]['duration']); + $this->assertEquals($executions['body']['executions'][0]['responseBody'], ''); $this->assertEquals($executions['body']['executions'][0]['logs'], ''); - $this->assertEquals($executions['body']['executions'][0]['errors'], 'An internal curl error has occurred within the executor! Error Msg: Operation timed out'); + $this->assertStringContainsString('timed out', $executions['body']['executions'][0]['errors']); // Cleanup : Delete function $response = $this->client->call(Client::METHOD_DELETE, '/functions/' . $functionId, [ @@ -1022,7 +1004,7 @@ class FunctionsCustomServerTest extends Scope $this->assertEquals('', $output['APPWRITE_FUNCTION_USER_ID']); $this->assertEmpty($output['APPWRITE_FUNCTION_JWT']); $this->assertEquals($this->getProject()['$id'], $output['APPWRITE_FUNCTION_PROJECT_ID']); - $this->assertStringContainsString('Amazing Function Log', $executions['body']['stdout']); + $this->assertStringContainsString('Amazing Function Log', $executions['body']['logs']); $executions = $this->client->call(Client::METHOD_GET, '/functions/' . $functionId . '/executions', array_merge([ 'content-type' => 'application/json', diff --git a/tests/resources/functions/php-fn/index.php b/tests/resources/functions/php-fn/index.php index 7947c4a6a6..d614b21e0b 100644 --- a/tests/resources/functions/php-fn/index.php +++ b/tests/resources/functions/php-fn/index.php @@ -1,20 +1,20 @@ log('Amazing Function Log'); - $response->json([ - 'APPWRITE_FUNCTION_ID' => $request['variables']['APPWRITE_FUNCTION_ID'], - 'APPWRITE_FUNCTION_NAME' => $request['variables']['APPWRITE_FUNCTION_NAME'], - 'APPWRITE_FUNCTION_DEPLOYMENT' => $request['variables']['APPWRITE_FUNCTION_DEPLOYMENT'], - 'APPWRITE_FUNCTION_TRIGGER' => $request['variables']['APPWRITE_FUNCTION_TRIGGER'], - 'APPWRITE_FUNCTION_RUNTIME_NAME' => $request['variables']['APPWRITE_FUNCTION_RUNTIME_NAME'], - 'APPWRITE_FUNCTION_RUNTIME_VERSION' => $request['variables']['APPWRITE_FUNCTION_RUNTIME_VERSION'], - 'APPWRITE_FUNCTION_EVENT' => $request['variables']['APPWRITE_FUNCTION_EVENT'], - 'APPWRITE_FUNCTION_EVENT_DATA' => $request['variables']['APPWRITE_FUNCTION_EVENT_DATA'], - 'APPWRITE_FUNCTION_DATA' => $request['variables']['APPWRITE_FUNCTION_DATA'], - 'APPWRITE_FUNCTION_USER_ID' => $request['variables']['APPWRITE_FUNCTION_USER_ID'], - 'APPWRITE_FUNCTION_JWT' => $request['variables']['APPWRITE_FUNCTION_JWT'], - 'APPWRITE_FUNCTION_PROJECT_ID' => $request['variables']['APPWRITE_FUNCTION_PROJECT_ID'], + return $context->res->json([ + 'APPWRITE_FUNCTION_ID' => \getenv('APPWRITE_FUNCTION_ID'), + 'APPWRITE_FUNCTION_NAME' => \getenv('APPWRITE_FUNCTION_NAME'), + 'APPWRITE_FUNCTION_DEPLOYMENT' => \getenv('APPWRITE_FUNCTION_DEPLOYMENT'), + 'APPWRITE_FUNCTION_TRIGGER' => $context->req->headers['x-appwrite-trigger'], + 'APPWRITE_FUNCTION_RUNTIME_NAME' => \getenv('APPWRITE_FUNCTION_RUNTIME_NAME'), + 'APPWRITE_FUNCTION_RUNTIME_VERSION' => \getenv('APPWRITE_FUNCTION_RUNTIME_VERSION'), + 'APPWRITE_FUNCTION_EVENT' => $context->req->headers['x-appwrite-event'], + 'APPWRITE_FUNCTION_EVENT_DATA' => $context->req->bodyRaw, + 'APPWRITE_FUNCTION_DATA' => $context->req->bodyRaw, + 'APPWRITE_FUNCTION_USER_ID' => $context->req->headers['x-appwrite-user-id'], + 'APPWRITE_FUNCTION_JWT' => $context->req->headers['x-appwrite-user-jwt'], + 'APPWRITE_FUNCTION_PROJECT_ID' => \getenv('APPWRITE_FUNCTION_PROJECT_ID'), ]); }; diff --git a/tests/resources/functions/php-large/index.php b/tests/resources/functions/php-large/index.php index 84b6a991fe..7d8a77a136 100644 --- a/tests/resources/functions/php-large/index.php +++ b/tests/resources/functions/php-large/index.php @@ -1,15 +1,13 @@ json([ - 'APPWRITE_FUNCTION_ID' => $request['variables']['APPWRITE_FUNCTION_ID'], - 'APPWRITE_FUNCTION_NAME' => $request['variables']['APPWRITE_FUNCTION_NAME'], - 'APPWRITE_FUNCTION_DEPLOYMENT' => $request['variables']['APPWRITE_FUNCTION_DEPLOYMENT'], - 'APPWRITE_FUNCTION_TRIGGER' => $request['variables']['APPWRITE_FUNCTION_TRIGGER'], - 'APPWRITE_FUNCTION_RUNTIME_NAME' => $request['variables']['APPWRITE_FUNCTION_RUNTIME_NAME'], - 'APPWRITE_FUNCTION_RUNTIME_VERSION' => $request['variables']['APPWRITE_FUNCTION_RUNTIME_VERSION'], - 'APPWRITE_FUNCTION_EVENT' => $request['variables']['APPWRITE_FUNCTION_EVENT'], - 'APPWRITE_FUNCTION_EVENT_DATA' => $request['variables']['APPWRITE_FUNCTION_EVENT_DATA'], +return function ($context) { + return $context->res->json([ + 'APPWRITE_FUNCTION_ID' => \getenv('APPWRITE_FUNCTION_ID'), + 'APPWRITE_FUNCTION_NAME' => \getenv('APPWRITE_FUNCTION_NAME'), + 'APPWRITE_FUNCTION_DEPLOYMENT' => \getenv('APPWRITE_FUNCTION_DEPLOYMENT'), + 'APPWRITE_FUNCTION_TRIGGER' => $context->req->headers['x-appwrite-trigger'] ?? '', + 'APPWRITE_FUNCTION_RUNTIME_NAME' => \getenv('APPWRITE_FUNCTION_RUNTIME_NAME'), + 'APPWRITE_FUNCTION_RUNTIME_VERSION' => \getenv('APPWRITE_FUNCTION_RUNTIME_VERSION'), 'UNICODE_TEST' => "êä" ]); }; diff --git a/tests/resources/functions/php/index.php b/tests/resources/functions/php/index.php index 84b6a991fe..7d8a77a136 100644 --- a/tests/resources/functions/php/index.php +++ b/tests/resources/functions/php/index.php @@ -1,15 +1,13 @@ json([ - 'APPWRITE_FUNCTION_ID' => $request['variables']['APPWRITE_FUNCTION_ID'], - 'APPWRITE_FUNCTION_NAME' => $request['variables']['APPWRITE_FUNCTION_NAME'], - 'APPWRITE_FUNCTION_DEPLOYMENT' => $request['variables']['APPWRITE_FUNCTION_DEPLOYMENT'], - 'APPWRITE_FUNCTION_TRIGGER' => $request['variables']['APPWRITE_FUNCTION_TRIGGER'], - 'APPWRITE_FUNCTION_RUNTIME_NAME' => $request['variables']['APPWRITE_FUNCTION_RUNTIME_NAME'], - 'APPWRITE_FUNCTION_RUNTIME_VERSION' => $request['variables']['APPWRITE_FUNCTION_RUNTIME_VERSION'], - 'APPWRITE_FUNCTION_EVENT' => $request['variables']['APPWRITE_FUNCTION_EVENT'], - 'APPWRITE_FUNCTION_EVENT_DATA' => $request['variables']['APPWRITE_FUNCTION_EVENT_DATA'], +return function ($context) { + return $context->res->json([ + 'APPWRITE_FUNCTION_ID' => \getenv('APPWRITE_FUNCTION_ID'), + 'APPWRITE_FUNCTION_NAME' => \getenv('APPWRITE_FUNCTION_NAME'), + 'APPWRITE_FUNCTION_DEPLOYMENT' => \getenv('APPWRITE_FUNCTION_DEPLOYMENT'), + 'APPWRITE_FUNCTION_TRIGGER' => $context->req->headers['x-appwrite-trigger'] ?? '', + 'APPWRITE_FUNCTION_RUNTIME_NAME' => \getenv('APPWRITE_FUNCTION_RUNTIME_NAME'), + 'APPWRITE_FUNCTION_RUNTIME_VERSION' => \getenv('APPWRITE_FUNCTION_RUNTIME_VERSION'), 'UNICODE_TEST' => "êä" ]); }; diff --git a/tests/resources/functions/timeout/index.php b/tests/resources/functions/timeout/index.php index c45ab5a5b8..c9aedb3a30 100644 --- a/tests/resources/functions/timeout/index.php +++ b/tests/resources/functions/timeout/index.php @@ -1,5 +1,6 @@ res->send('OK'); };