From 2ac341830e729ccf5b3eeb7c2114cdad6280d2f1 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Wed, 23 Feb 2022 18:39:09 +0400 Subject: [PATCH] feat: added test for python --- .../Functions/FunctionsCustomServerTest.php | 105 ++++++++++++++++++ tests/resources/functions/python/main.py | 28 +++++ 2 files changed, 133 insertions(+) create mode 100644 tests/resources/functions/python/main.py diff --git a/tests/e2e/Services/Functions/FunctionsCustomServerTest.php b/tests/e2e/Services/Functions/FunctionsCustomServerTest.php index aac90c7efc..cd3b933956 100644 --- a/tests/e2e/Services/Functions/FunctionsCustomServerTest.php +++ b/tests/e2e/Services/Functions/FunctionsCustomServerTest.php @@ -991,6 +991,111 @@ class FunctionsCustomServerTest extends Scope $this->assertEquals(204, $response['headers']['status-code']); } + public function testCreateCustomPythonExecution() + { + $name = 'python-3.9'; + $folder = 'python'; + $code = realpath(__DIR__ . '/../../../resources/functions'). "/$folder/code.tar.gz"; + $this->packageCode($folder); + + $entrypoint = 'main.py'; + $timeout = 2; + + $function = $this->client->call(Client::METHOD_POST, '/functions', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'functionId' => 'unique()', + 'name' => 'Test '.$name, + 'runtime' => $name, + 'vars' => [ + 'CUSTOM_VARIABLE' => 'variable', + ], + 'events' => [], + 'schedule' => '', + 'timeout' => $timeout, + ]); + + $functionId = $function['body']['$id'] ?? ''; + + $this->assertEquals(201, $function['headers']['status-code']); + + $deployment = $this->client->call(Client::METHOD_POST, '/functions/'.$functionId.'/deployments', array_merge([ + 'content-type' => 'multipart/form-data', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'entrypoint' => $entrypoint, + 'code' => new CURLFile($code, 'application/x-gzip', basename($code)), + 'activate' => true, + ]); + + $deploymentId = $deployment['body']['$id'] ?? ''; + $this->assertEquals(201, $deployment['headers']['status-code']); + + // Allow build step to run + sleep(10); + + $execution = $this->client->call(Client::METHOD_POST, '/functions/'.$functionId.'/executions', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'data' => 'foobar', + ]); + + $executionId = $execution['body']['$id'] ?? ''; + + $this->assertEquals(201, $execution['headers']['status-code']); + + $executionId = $execution['body']['$id'] ?? ''; + + sleep(10); + + $executions = $this->client->call(Client::METHOD_GET, '/functions/'.$functionId.'/executions/'.$executionId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders())); + + $output = json_decode($executions['body']['stdout'], true); + + $this->assertEquals(200, $executions['headers']['status-code']); + $this->assertEquals('completed', $executions['body']['status']); + $this->assertEquals($functionId, $output['APPWRITE_FUNCTION_ID']); + $this->assertEquals('Test '.$name, $output['APPWRITE_FUNCTION_NAME']); + $this->assertEquals($deploymentId, $output['APPWRITE_FUNCTION_DEPLOYMENT']); + $this->assertEquals('http', $output['APPWRITE_FUNCTION_TRIGGER']); + $this->assertEquals('Python', $output['APPWRITE_FUNCTION_RUNTIME_NAME']); + $this->assertEquals('3.9', $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('variable', $output['CUSTOM_VARIABLE']); + $this->assertEquals('', $output['APPWRITE_FUNCTION_USER_ID']); + $this->assertEmpty($output['APPWRITE_FUNCTION_JWT']); + $this->assertEquals($this->getProject()['$id'], $output['APPWRITE_FUNCTION_PROJECT_ID']); + + $executions = $this->client->call(Client::METHOD_GET, '/functions/'.$functionId.'/executions', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders())); + + $this->assertEquals($executions['headers']['status-code'], 200); + $this->assertEquals($executions['body']['sum'], 1); + $this->assertIsArray($executions['body']['executions']); + $this->assertCount(1, $executions['body']['executions']); + $this->assertEquals($executions['body']['executions'][0]['$id'], $executionId); + $this->assertEquals($executions['body']['executions'][0]['trigger'], 'http'); + $this->assertStringContainsString('foobar', $executions['body']['executions'][0]['stdout']); + + // Cleanup : Delete function + $response = $this->client->call(Client::METHOD_DELETE, '/functions/'. $functionId, [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'], + ], []); + + $this->assertEquals(204, $response['headers']['status-code']); + } + public function testGetRuntimes() { $runtimes = $this->client->call(Client::METHOD_GET, '/functions/runtimes', array_merge([ diff --git a/tests/resources/functions/python/main.py b/tests/resources/functions/python/main.py new file mode 100644 index 0000000000..af7d79ab23 --- /dev/null +++ b/tests/resources/functions/python/main.py @@ -0,0 +1,28 @@ +import json + +# 'req' variable has: +# 'headers' - object with request headers +# 'payload' - object with request body data +# 'env' - object with environment variables +# 'res' variable has: +# 'send(text, status)' - function to return text response. Status code defaults to 200 +# 'json(obj, status)' - function to return JSON response. Status code defaults to 200 +# +# If an error is thrown, a response with code 500 will be returned. + +def main(request, response): + return response.json({ + 'APPWRITE_FUNCTION_ID' : request.env['APPWRITE_FUNCTION_ID'], + 'APPWRITE_FUNCTION_NAME' : request.env['APPWRITE_FUNCTION_NAME'], + 'APPWRITE_FUNCTION_DEPLOYMENT' : request.env['APPWRITE_FUNCTION_DEPLOYMENT'], + 'APPWRITE_FUNCTION_TRIGGER' : request.env['APPWRITE_FUNCTION_TRIGGER'], + 'APPWRITE_FUNCTION_RUNTIME_NAME' : request.env['APPWRITE_FUNCTION_RUNTIME_NAME'], + 'APPWRITE_FUNCTION_RUNTIME_VERSION' : request.env['APPWRITE_FUNCTION_RUNTIME_VERSION'], + 'APPWRITE_FUNCTION_EVENT' : request.env['APPWRITE_FUNCTION_EVENT'], + 'APPWRITE_FUNCTION_EVENT_DATA' : request.env['APPWRITE_FUNCTION_EVENT_DATA'], + 'APPWRITE_FUNCTION_DATA' : request.env['APPWRITE_FUNCTION_DATA'], + 'APPWRITE_FUNCTION_USER_ID' : request.env['APPWRITE_FUNCTION_USER_ID'], + 'APPWRITE_FUNCTION_JWT' : request.env['APPWRITE_FUNCTION_JWT'], + 'APPWRITE_FUNCTION_PROJECT_ID' : request.env['APPWRITE_FUNCTION_PROJECT_ID'], + 'CUSTOM_VARIABLE' : request.env['CUSTOM_VARIABLE'], + }) \ No newline at end of file