diff --git a/lib/codegen/php/guzzle.dart b/lib/codegen/php/guzzle.dart index c7d498da..ce0ebef6 100644 --- a/lib/codegen/php/guzzle.dart +++ b/lib/codegen/php/guzzle.dart @@ -1,21 +1,24 @@ import 'package:jinja/jinja.dart' as jj; import 'package:apidash/utils/utils.dart' - show requestModelToHARJsonRequest, stripUrlParams; + show stripUrlParams; import 'package:apidash/models/models.dart' show RequestModel; import 'package:apidash/consts.dart'; class PhpGuzzleCodeGen { - String kStringImportNode = """use GuzzleHttp\\Client; + String kTemplateImport = """sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); -\$request = new Request('{{method}}', '{{url}}'{{queryParams}} {{headers}} {{body}}); -\$res = \$client->sendAsync(\$request)->wait(); -echo \$res->getBody(); """; String? getCode(RequestModel requestModel) { try { - jj.Template kNodejsImportTemplate = jj.Template(kStringImportNode); - String importsData = kNodejsImportTemplate.render({ + var templateImport = jj.Template(kTemplateImport); + String importsData = templateImport.render({ "hasFormData": requestModel.hasFormData, }); String result = importsData; - if (requestModel.hasFormData && requestModel.formDataMapList.isNotEmpty) { - var templateMultiPartBody = jj.Template(kMultiPartBodyTemplate); + if (requestModel.hasFormData) { + var templateMultiPartBody = jj.Template(kTemplateMultiPartBody); var renderedMultiPartBody = templateMultiPartBody.render({ - "fields_list": requestModel.formDataMapList.map((field) { - return ''' + "fields_list": requestModel.formDataList.map((field) { + var row = ''' [ - 'name' => '${field['name']}', - 'contents' => '${field['value']}' - ],'''; - }).join(), + 'name' => '${field.name}', + 'contents' => ${field.type == FormDataType.file? "fopen('${field.value}', 'r')":"'${field.value}'"} + ]'''; + return row; + }).join(",\n"), }); result += renderedMultiPartBody; } - var harJson = - requestModelToHARJsonRequest(requestModel, useEnabled: true); - - var params = harJson["queryString"]; + var params = requestModel.enabledParamsMap; if (params.isNotEmpty) { var templateParams = jj.Template(kTemplateParams); - var m = {}; - for (var i in params) { - m[i["name"]] = i["value"]; - } - var jsonString = ''; - m.forEach((key, value) { - jsonString += "\t\t\t\t'$key' => '$value', \n"; + List paramList = []; + params.forEach((key, value) { + paramList.add("'$key' => '$value'"); }); - jsonString = jsonString.substring( - 0, jsonString.length - 2); // Removing trailing comma and space result += templateParams.render({ - "params": jsonString, + "params": paramList.join(",\n"), }); } - var headers = harJson["headers"]; - if (headers.isNotEmpty || requestModel.hasFormData) { + var headers = requestModel.enabledHeadersMap; + List headerList = []; + if (headers.isNotEmpty || requestModel.hasBody) { var templateHeader = jj.Template(kTemplateHeader); - var m = {}; - for (var i in headers) { - m[i["name"]] = i["value"]; - } - var headersString = ''; - m.forEach((key, value) { - headersString += "\t\t\t\t'$key' => '$value', \n"; + headers.forEach((key, value) { + headerList.add("'$key' => '$value'"); }); - if (requestModel.hasFormData) { - m[kHeaderContentType] = ContentType.formdata.header; + + if(!requestModel.hasContentTypeHeader && requestModel.hasBody){ + if(requestModel.hasJsonData || requestModel.hasTextData){ + headerList.add("'$kHeaderContentType' => '${requestModel.requestBodyContentType.header}'"); + } + if(requestModel.hasFormData){ + headerList.add("'$kHeaderContentType' => '${requestModel.requestBodyContentType.header}; boundary=' . \$body->getBoundary()"); + } } - headersString = headersString.substring( - 0, headersString.length - 2); // Removing trailing comma and space result += templateHeader.render({ - "headers": headersString, + "headers": headerList.join(",\n"), }); } var templateBody = jj.Template(kTemplateBody); - if (requestModel.hasFormData && requestModel.formDataMapList.isNotEmpty) { - result += templateBody.render({ - "body": "new MultipartStream(\$multipart)", - }); - } - if (harJson["postData"]?["text"] != null) { + if (requestModel.hasJsonData || requestModel.hasTextData) { result += templateBody - .render({"body": kEncoder.convert(harJson["postData"]["text"])}); + .render({"body": requestModel.requestBody}); } - String getRequestBody(Map harJson) { - if (harJson.containsKey("postData")) { - var postData = harJson["postData"]; - if (postData.containsKey("mimeType")) { - var mimeType = postData["mimeType"]; - if (mimeType == "text/plain" || mimeType == "application/json") { - return " \$body"; - } else if (mimeType == "multipart/form-data") { - return " new MultipartStream(\$multipart)"; - } - } - } - return ""; // Return empty string if postData or formdata is not present - } - - var templateRequest = jj.Template(kStringRequest); + var templateRequest = jj.Template(kTemplateRequest); result += templateRequest.render({ "url": stripUrlParams(requestModel.url), - "method": harJson["method"].toLowerCase(), + "method": requestModel.method.name.toLowerCase(), "queryParams": - harJson["queryString"].isNotEmpty ? ". \$queryParamsStr," : "", - "headers": harJson["headers"].isNotEmpty ? " \$headers," : "", - "body": getRequestBody(harJson), + params.isNotEmpty ? ". \$queryParamsStr" : "", + "headers": headerList.isNotEmpty ? ", \$headers" : "", + "body": requestModel.hasBody? ", \$body" : "", }); return result; diff --git a/test/codegen/php_guzzle_codegen_test.dart b/test/codegen/php_guzzle_codegen_test.dart new file mode 100644 index 00000000..91240781 --- /dev/null +++ b/test/codegen/php_guzzle_codegen_test.dart @@ -0,0 +1,853 @@ +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; +import 'package:test/test.dart'; +import '../request_models.dart'; + +void main() { + final codeGen = Codegen(); + + group('GET Request', () { + test('GET 1', () { + const expectedCode = r"""sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode(CodegenLanguage.phpGuzzle, requestModelGet1, "https"), + expectedCode); + }); + + test('GET 2', () { + const expectedCode = r""" 'US' +]; +$queryParamsStr = '?' . http_build_query($queryParams); + +$client = new Client(); + +$request = new Request('get', 'https://api.apidash.dev/country/data'. $queryParamsStr); +$res = $client->sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode(CodegenLanguage.phpGuzzle, requestModelGet2, "https"), + expectedCode); + }); + + test('GET 3', () { + const expectedCode = r""" 'IND' +]; +$queryParamsStr = '?' . http_build_query($queryParams); + +$client = new Client(); + +$request = new Request('get', 'https://api.apidash.dev/country/data'. $queryParamsStr); +$res = $client->sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode(CodegenLanguage.phpGuzzle, requestModelGet3, "https"), + expectedCode); + }); + + test('GET 4', () { + const expectedCode = r""" '8700000', +'digits' => '3', +'system' => 'SS', +'add_space' => 'true', +'trailing_zeros' => 'true' +]; +$queryParamsStr = '?' . http_build_query($queryParams); + +$client = new Client(); + +$request = new Request('get', 'https://api.apidash.dev/humanize/social'. $queryParamsStr); +$res = $client->sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode(CodegenLanguage.phpGuzzle, requestModelGet4, "https"), + expectedCode); + }); + + test('GET 5', () { + const expectedCode = r""" 'Test Agent' +]; + +$client = new Client(); + +$request = new Request('get', 'https://api.github.com/repos/foss42/apidash', $headers); +$res = $client->sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode(CodegenLanguage.phpGuzzle, requestModelGet5, "https"), + expectedCode); + }); + + test('GET 6', () { + const expectedCode = r""" 'true' +]; +$queryParamsStr = '?' . http_build_query($queryParams); + +$headers = [ +'User-Agent' => 'Test Agent' +]; + +$client = new Client(); + +$request = new Request('get', 'https://api.github.com/repos/foss42/apidash'. $queryParamsStr, $headers); +$res = $client->sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode(CodegenLanguage.phpGuzzle, requestModelGet6, "https"), + expectedCode); + }); + + test('GET 7', () { + const expectedCode = r"""sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode(CodegenLanguage.phpGuzzle, requestModelGet7, "https"), + expectedCode); + }); + + test('GET 8', () { + const expectedCode = r""" 'true' +]; +$queryParamsStr = '?' . http_build_query($queryParams); + +$headers = [ +'User-Agent' => 'Test Agent' +]; + +$client = new Client(); + +$request = new Request('get', 'https://api.github.com/repos/foss42/apidash'. $queryParamsStr, $headers); +$res = $client->sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode(CodegenLanguage.phpGuzzle, requestModelGet8, "https"), + expectedCode); + }); + + test('GET 9', () { + const expectedCode = r""" '8700000', +'add_space' => 'true' +]; +$queryParamsStr = '?' . http_build_query($queryParams); + +$client = new Client(); + +$request = new Request('get', 'https://api.apidash.dev/humanize/social'. $queryParamsStr); +$res = $client->sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode(CodegenLanguage.phpGuzzle, requestModelGet9, "https"), + expectedCode); + }); + + test('GET 10', () { + const expectedCode = r""" 'Test Agent' +]; + +$client = new Client(); + +$request = new Request('get', 'https://api.apidash.dev/humanize/social', $headers); +$res = $client->sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode( + CodegenLanguage.phpGuzzle, + requestModelGet10, + "https", + ), + expectedCode); + }); + + test('GET 11', () { + const expectedCode = r""" '8700000', +'digits' => '3' +]; +$queryParamsStr = '?' . http_build_query($queryParams); + +$headers = [ +'User-Agent' => 'Test Agent' +]; + +$client = new Client(); + +$request = new Request('get', 'https://api.apidash.dev/humanize/social'. $queryParamsStr, $headers); +$res = $client->sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode( + CodegenLanguage.phpGuzzle, requestModelGet11, "https"), + expectedCode); + }); + + test('GET 12', () { + const expectedCode = r"""sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode( + CodegenLanguage.phpGuzzle, requestModelGet12, "https"), + expectedCode); + }); + }); + + group('HEAD Request', () { + test('HEAD 1', () { + const expectedCode = r"""sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode( + CodegenLanguage.phpGuzzle, requestModelHead1, "https"), + expectedCode); + }); + + test('HEAD 2', () { + const expectedCode = r"""sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode(CodegenLanguage.phpGuzzle, requestModelHead2, "http"), + expectedCode); + }); + }); + + group('POST Request', () { + test('POST 1', () { + const expectedCode = r""" 'text/plain' +]; + +$body = <<sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode( + CodegenLanguage.phpGuzzle, requestModelPost1, "https"), + expectedCode); + }); + + test('POST 2', () { + const expectedCode = r""" 'application/json' +]; + +$body = <<sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode( + CodegenLanguage.phpGuzzle, requestModelPost2, "https"), + expectedCode); + }); + + test('POST 3', () { + const expectedCode = r""" 'Test Agent', +'Content-Type' => 'application/json' +]; + +$body = <<sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode( + CodegenLanguage.phpGuzzle, requestModelPost3, "https"), + expectedCode); + }); + + test('POST 4', () { + const expectedCode = r""" 'text', + 'contents' => 'API' + ], + [ + 'name' => 'sep', + 'contents' => '|' + ], + [ + 'name' => 'times', + 'contents' => '3' + ] +]); + +$headers = [ +'Content-Type' => 'multipart/form-data; boundary=' . $body->getBoundary() +]; + +$client = new Client(); + +$request = new Request('post', 'https://api.apidash.dev/io/form', $headers, $body); +$res = $client->sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode( + CodegenLanguage.phpGuzzle, requestModelPost4, "https"), + expectedCode); + }); + + test('POST 5', () { + const expectedCode = r""" 'text', + 'contents' => 'API' + ], + [ + 'name' => 'sep', + 'contents' => '|' + ], + [ + 'name' => 'times', + 'contents' => '3' + ] +]); + +$headers = [ +'User-Agent' => 'Test Agent', +'Content-Type' => 'multipart/form-data; boundary=' . $body->getBoundary() +]; + +$client = new Client(); + +$request = new Request('post', 'https://api.apidash.dev/io/form', $headers, $body); +$res = $client->sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode( + CodegenLanguage.phpGuzzle, requestModelPost5, "https"), + expectedCode); + }); + + test('POST 6', () { + const expectedCode = r""" 'token', + 'contents' => 'xyz' + ], + [ + 'name' => 'imfile', + 'contents' => fopen('/Documents/up/1.png', 'r') + ] +]); + +$headers = [ +'Content-Type' => 'multipart/form-data; boundary=' . $body->getBoundary() +]; + +$client = new Client(); + +$request = new Request('post', 'https://api.apidash.dev/io/img', $headers, $body); +$res = $client->sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode( + CodegenLanguage.phpGuzzle, requestModelPost6, "https"), + expectedCode); + }); + + test('POST 7', () { + const expectedCode = r""" 'token', + 'contents' => 'xyz' + ], + [ + 'name' => 'imfile', + 'contents' => fopen('/Documents/up/1.png', 'r') + ] +]); + +$headers = [ +'Content-Type' => 'multipart/form-data; boundary=' . $body->getBoundary() +]; + +$client = new Client(); + +$request = new Request('post', 'https://api.apidash.dev/io/img', $headers, $body); +$res = $client->sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode( + CodegenLanguage.phpGuzzle, requestModelPost7, "https"), + expectedCode); + }); + + test('POST 8', () { + const expectedCode = r""" 'text', + 'contents' => 'API' + ], + [ + 'name' => 'sep', + 'contents' => '|' + ], + [ + 'name' => 'times', + 'contents' => '3' + ] +]); + +$queryParams = [ +'size' => '2', +'len' => '3' +]; +$queryParamsStr = '?' . http_build_query($queryParams); + +$headers = [ +'Content-Type' => 'multipart/form-data; boundary=' . $body->getBoundary() +]; + +$client = new Client(); + +$request = new Request('post', 'https://api.apidash.dev/io/form'. $queryParamsStr, $headers, $body); +$res = $client->sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode( + CodegenLanguage.phpGuzzle, requestModelPost8, "https"), + expectedCode); + }); + + test('POST 9', () { + const expectedCode = r""" 'token', + 'contents' => 'xyz' + ], + [ + 'name' => 'imfile', + 'contents' => fopen('/Documents/up/1.png', 'r') + ] +]); + +$queryParams = [ +'size' => '2', +'len' => '3' +]; +$queryParamsStr = '?' . http_build_query($queryParams); + +$headers = [ +'User-Agent' => 'Test Agent', +'Keep-Alive' => 'true', +'Content-Type' => 'multipart/form-data; boundary=' . $body->getBoundary() +]; + +$client = new Client(); + +$request = new Request('post', 'https://api.apidash.dev/io/img'. $queryParamsStr, $headers, $body); +$res = $client->sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode( + CodegenLanguage.phpGuzzle, requestModelPost9, "https"), + expectedCode); + }); + }); + + group('PUT Request', () { + test('PUT 1', () { + const expectedCode = r""" 'application/json' +]; + +$body = <<sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode(CodegenLanguage.phpGuzzle, requestModelPut1, "https"), + expectedCode); + }); + }); + + group('PATCH Request', () { + test('PATCH 1', () { + const expectedCode = r""" 'application/json' +]; + +$body = <<sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode( + CodegenLanguage.phpGuzzle, requestModelPatch1, "https"), + expectedCode); + }); + }); + + group('DELETE Request', () { + test('DELETE 1', () { + const expectedCode = r"""sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode( + CodegenLanguage.phpGuzzle, requestModelDelete1, "https"), + expectedCode); + }); + + test('DELETE 2', () { + const expectedCode = r""" 'application/json' +]; + +$body = <<sendAsync($request)->wait(); + +echo $res->getStatusCode() . "\n"; +echo $res->getBody(); +"""; + expect( + codeGen.getCode( + CodegenLanguage.phpGuzzle, requestModelDelete2, "https"), + expectedCode); + }); + }); +}