diff --git a/README.md b/README.md index b47acb31..c40fb355 100644 --- a/README.md +++ b/README.md @@ -182,7 +182,8 @@ API Dash currently supports API integration code generation for the following la | Rust | `reqwest` | | | Rust | `ureq` | | | Rust | `Actix Client` | | -| Swift | `URLSession` | Testing Required | +| Swift | `Alamofire` | | +| Swift | `URLSession` | | We welcome contributions to support other programming languages/libraries/frameworks. Please check out more details [here](https://github.com/foss42/apidash/discussions/80). diff --git a/doc/user_guide/instructions_to_run_generated_code.md b/doc/user_guide/instructions_to_run_generated_code.md index 41085943..ad6cf915 100644 --- a/doc/user_guide/instructions_to_run_generated_code.md +++ b/doc/user_guide/instructions_to_run_generated_code.md @@ -29,7 +29,8 @@ Choose your programming language/library from the list provided below to learn m - [Rust (reqwest)](#rust-reqwest) - [Rust (ureq)](#rust-ureq) - [Rust (Actix Client)](#rust-actix-client) -- [Swift](#swift) +- [Swift (URLSession)](#swift-urlsession) +- [Swift (Alamofire)](#swift-alamofire) **Please raise a GitHub issue in case any instruction is not clear or if it is not working.** @@ -1073,6 +1074,133 @@ cargo run TODO -## Swift +## Swift (URLSession) + +### Set Up the Environment +#### MacBook (macOS) + +Verify Swift : +``` +swift --version +``` + + +#### Linux(Multipartformdata is not supported) + +Download Swift for Linux (e.g., Ubuntu) from Swift.org. + +``` +tar xzf filename +export PATH=$PWD/filename/usr/bin:$PATH + +``` +Verify: +``` +swift --version +``` + + + + + +Install Dependencies: +``` +sudo apt-get update +sudo apt-get install clang libicu-dev libcurl4-openssl-dev +``` + + +### Create a Project: +``` +mkdir URLSessionDemo +cd URLSessionDemo +swift package init --type executable +``` + + + + +### Run the Code +Ensure main.swift is in Sources/URLSessionDemo. + + +Run: +``` +swift run +``` + +## Swift (Alamofire) + +### Set Up the Environment +#### MacBook (macOS) + +Verify Swift : +``` +swift --version +``` + + +#### Linux (Multipartformdata is not supported) + +Download Swift for Linux (e.g., Ubuntu) from Swift.org. + +``` +tar xzf filename +export PATH=$PWD/filename/usr/bin:$PATH + +``` +Verify: +``` +swift --version +``` + + + + + + Install Dependencies for swift: +``` +sudo apt-get update +sudo apt-get install clang libicu-dev libcurl4-openssl-dev +``` + + +### Create a Project: +``` +mkdir URLSessionDemo +cd URLSessionDemo +swift package init --type executable +``` + + +### Adding alamofire + open `package.swift` and add following dependencies and target(replace `project-name` with your project name) +``` + dependencies: [ + .package(url: "https://github.com/Alamofire/Alamofire", from: "5.6.4") + ], + targets: [ + .executableTarget( + name: "project-name", + dependencies: [ + "Alamofire" + ] + ) + ] + + +``` + + + +### Run the Code +Ensure main.swift is in Sources/URLSessionDemo. + + +Run: +``` +swift run +``` + + -TODO diff --git a/lib/codegen/codegen.dart b/lib/codegen/codegen.dart index ae224eaa..89557064 100644 --- a/lib/codegen/codegen.dart +++ b/lib/codegen/codegen.dart @@ -30,6 +30,7 @@ import 'rust/curl_rust.dart'; import 'rust/hyper.dart'; import 'rust/reqwest.dart'; import 'rust/ureq.dart'; +import 'swift/alamofire.dart'; import 'swift/urlsession.dart'; class Codegen { @@ -115,6 +116,8 @@ class Codegen { return CSharpRestSharp().getCode(rM); case CodegenLanguage.phpHttpPlug: return PhpHttpPlugCodeGen().getCode(rM); + case CodegenLanguage.swiftAlamofire: + return SwiftAlamofireCodeGen().getCode(rM); case CodegenLanguage.swiftUrlSession: return SwiftURLSessionCodeGen().getCode(rM); } diff --git a/lib/codegen/swift/alamofire.dart b/lib/codegen/swift/alamofire.dart new file mode 100644 index 00000000..b128a727 --- /dev/null +++ b/lib/codegen/swift/alamofire.dart @@ -0,0 +1,148 @@ +import 'package:apidash_core/apidash_core.dart'; +import 'package:jinja/jinja.dart' as jj; +import 'package:path/path.dart' as path; + +class SwiftAlamofireCodeGen { + final String kTemplateStart = """ +import Foundation +import Alamofire +"""; + + final String kTemplateFormData = ''' +let multipartFormData = MultipartFormData() +{% for param in formData %} {% if param.type == 'text' %}multipartFormData.append(Data("{{param.value}}".utf8), withName: "{{param.name}}") {% elif param.type == 'file' %} +let fileURL = URL(fileURLWithPath: "{{param.filepath}}") +multipartFormData.append(fileURL, withName: "{{param.name}}", fileName: "{{param.filename}}", mimeType: "application/octet-stream") + {% endif %} +{% endfor %} +'''; + + final String kTemplateJsonData = ''' +let jsonString = """ +{{jsonData}} +""" +let jsonData = jsonString.data(using: .utf8)\n +'''; + + final String kTemplateTextData = ''' +let textString = """ +{{textData}} +""" +let textData = textString.data(using: .utf8)\n +'''; + + final String kTemplateRequest = """ +let url = "{{url}}" + +{% if hasFormData %} +AF.upload(multipartFormData: multipartFormData, to: url, method: .{{method}}{% if hasHeaders %}, headers: {{headers}}{% endif %}) +{% elif hasBody %} +AF.upload({% if hasJsonData %}jsonData{% else %}textData{% endif %}!, to: url, method: .{{method}}{% if hasHeaders %}, headers: {{headers}}{% endif %}) +{% else %} +AF.request(url, method: .{{method}}{% if hasHeaders %}, headers: {{headers}}{% endif %}) +{% endif %} +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \\(responseString)") + } + case .failure(let error): + print("Error: \\(error)") + } + exit(0) +} + +dispatchMain() +"""; + + String? getCode(HttpRequestModel requestModel) { + try { + String result = kTemplateStart; + + var rec = + getValidRequestUri(requestModel.url, requestModel.enabledParams); + Uri? uri = rec.$1; + + var headers = requestModel.enabledHeadersMap; + + bool hasBody = false; + bool hasJsonData = false; + if (requestModel.hasFormData) { + var formDataList = requestModel.formDataMapList.map((param) { + if (param['type'] == 'file') { + final filePath = param['value'] as String; + final fileName = path.basename(filePath); + return { + 'type': 'file', + 'name': param['name'], + 'filename': fileName, + 'filepath': filePath + }; + } else { + return { + 'type': 'text', + 'name': param['name'], + 'value': param['value'] + }; + } + }).toList(); + + var templateFormData = jj.Template(kTemplateFormData); + result += templateFormData.render({ + "formData": formDataList, + }); + + hasBody = true; + } else if (requestModel.hasJsonData) { + var templateJsonData = jj.Template(kTemplateJsonData); + result += templateJsonData.render({ + "jsonData": + requestModel.body!.replaceAll('"', '\\"').replaceAll('\n', '\\n'), + }); + + headers.putIfAbsent("Content-Type", () => "application/json"); + hasBody = true; + hasJsonData = true; + } + // Handle text data + else if (requestModel.hasTextData) { + var templateTextData = jj.Template(kTemplateTextData); + result += templateTextData.render({ + "textData": + requestModel.body!.replaceAll('"', '\\"').replaceAll('\n', '\\n'), + }); + + headers.putIfAbsent( + kHeaderContentType, () => requestModel.bodyContentType.header); + hasBody = true; + } + + String headersString = "nil"; + bool hasHeaders = false; + if (headers.isNotEmpty) { + List headerItems = []; + headers.forEach((key, value) { + headerItems.add('"$key": "$value"'); + }); + headersString = "[${headerItems.join(', ')}]"; + hasHeaders = true; + } + + var templateRequest = jj.Template(kTemplateRequest); + result += templateRequest.render({ + "url": uri.toString(), + "method": requestModel.method.name.toLowerCase(), + "headers": headersString, + "hasHeaders": hasHeaders, + "hasFormData": requestModel.hasFormData, + "hasBody": hasBody, + "hasJsonData": hasJsonData + }); + + return result; + } catch (e) { + return null; + } + } +} diff --git a/lib/consts.dart b/lib/consts.dart index 83b8cea4..598cc577 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -132,6 +132,7 @@ enum CodegenLanguage { rustReqwest("Rust (reqwest)", "rust", "rs"), rustCurl("Rust (curl-rust)", "rust", "rs"), rustUreq("Rust (ureq)", "rust", "rs"), + swiftAlamofire("Swift (Alamofire)", "swift", "swift"), swiftUrlSession("Swift (URLSession)", "swift", "swift"); const CodegenLanguage(this.label, this.codeHighlightLang, this.ext); diff --git a/lib/screens/history/history_widgets/his_request_pane.dart b/lib/screens/history/history_widgets/his_request_pane.dart index d4a65110..f1435063 100644 --- a/lib/screens/history/history_widgets/his_request_pane.dart +++ b/lib/screens/history/history_widgets/his_request_pane.dart @@ -136,8 +136,8 @@ class HisRequestBody extends ConsumerWidget { ContentType.formdata => Padding( padding: kPh4, child: RequestFormDataTable( - rows: requestModel?.formData ?? [])), - // TODO: Fix JsonTextFieldEditor & plug it here + rows: requestModel?.formData ?? []), + ), ContentType.json => Padding( padding: kPt5o10, child: JsonTextFieldEditor( diff --git a/lib/utils/save_utils.dart b/lib/utils/save_utils.dart index 9f850789..6370ae62 100644 --- a/lib/utils/save_utils.dart +++ b/lib/utils/save_utils.dart @@ -1,7 +1,6 @@ import 'package:apidash_design_system/apidash_design_system.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:apidash/utils/utils.dart'; import 'package:apidash/widgets/widgets.dart'; diff --git a/test/codegen/swift_alamofire_codegen_test.dart b/test/codegen/swift_alamofire_codegen_test.dart new file mode 100644 index 00000000..c5c5f003 --- /dev/null +++ b/test/codegen/swift_alamofire_codegen_test.dart @@ -0,0 +1,1000 @@ +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; +import 'package:apidash_core/apidash_core.dart'; +import 'package:test/test.dart'; + +import '../models/request_models.dart'; + +void main() { + final codeGen = Codegen(); + + group( + 'HTTPVerb.get', + () { + test('GET 1', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev" + + +AF.request(url, method: .get) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet1, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('GET 2', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev/country/data?code=US" + + +AF.request(url, method: .get) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet2, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('GET 3', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev/country/data?code=IND" + + +AF.request(url, method: .get) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet3, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('GET 4', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true" + + +AF.request(url, method: .get) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet4, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('GET 5', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.github.com/repos/foss42/apidash" + + +AF.request(url, method: .get, headers: ["User-Agent": "Test Agent"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet5, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('GET 6', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.github.com/repos/foss42/apidash?raw=true" + + +AF.request(url, method: .get, headers: ["User-Agent": "Test Agent"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet6, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('GET 7', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev" + + +AF.request(url, method: .get) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet7, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('GET 8', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.github.com/repos/foss42/apidash?raw=true" + + +AF.request(url, method: .get, headers: ["User-Agent": "Test Agent"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet8, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('GET 9', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev/humanize/social?num=8700000&add_space=true" + + +AF.request(url, method: .get) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet9, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('GET 10', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev/humanize/social" + + +AF.request(url, method: .get, headers: ["User-Agent": "Test Agent"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet10, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('GET 11', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev/humanize/social?num=8700000&digits=3" + + +AF.request(url, method: .get, headers: ["User-Agent": "Test Agent"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet11, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('GET 12', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev/humanize/social" + + +AF.request(url, method: .get) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet12, + SupportedUriSchemes.https, + ), + expectedCode); + }); + }, + + ); + + group( + 'HTTPVerb.head', + () { + test('HEAD 1', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev" + + +AF.request(url, method: .head) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelHead1, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('HEAD 2', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev" + + +AF.request(url, method: .head) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelHead2, + SupportedUriSchemes.https, + ), + expectedCode); + }); + }, + + ); + + group( + "HTTPVerb.post", + () { + test('POST 1', () { + const expectedCode = r''' +import Foundation +import Alamofire +let textString = """ +{\n\"text\": \"I LOVE Flutter\"\n} +""" +let textData = textString.data(using: .utf8) +let url = "https://api.apidash.dev/case/lower" + + +AF.upload(textData!, to: url, method: .post, headers: ["Content-Type": "text/plain"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()'''; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPost1, + SupportedUriSchemes.https, + ), + expectedCode); + }); + test('POST 2', () { + const expectedCode = r''' +import Foundation +import Alamofire +let jsonString = """ +{\n\"text\": \"I LOVE Flutter\",\n\"flag\": null,\n\"male\": true,\n\"female\": false,\n\"no\": 1.2,\n\"arr\": [\"null\", \"true\", \"false\", null]\n} +""" +let jsonData = jsonString.data(using: .utf8) +let url = "https://api.apidash.dev/case/lower" + + +AF.upload(jsonData!, to: url, method: .post, headers: ["Content-Type": "application/json"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()'''; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPost2, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('POST 3', () { + const expectedCode = r''' +import Foundation +import Alamofire +let jsonString = """ +{\n\"text\": \"I LOVE Flutter\"\n} +""" +let jsonData = jsonString.data(using: .utf8) +let url = "https://api.apidash.dev/case/lower" + + +AF.upload(jsonData!, to: url, method: .post, headers: ["User-Agent": "Test Agent", "Content-Type": "application/json"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()'''; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPost3, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('POST 4', () { + const expectedCode = r""" +import Foundation +import Alamofire +let multipartFormData = MultipartFormData() + multipartFormData.append(Data("API".utf8), withName: "text") + multipartFormData.append(Data("|".utf8), withName: "sep") + multipartFormData.append(Data("3".utf8), withName: "times") +let url = "https://api.apidash.dev/io/form" + + +AF.upload(multipartFormData: multipartFormData, to: url, method: .post) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPost4, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('POST 5', () { + const expectedCode = r""" +import Foundation +import Alamofire +let multipartFormData = MultipartFormData() + multipartFormData.append(Data("API".utf8), withName: "text") + multipartFormData.append(Data("|".utf8), withName: "sep") + multipartFormData.append(Data("3".utf8), withName: "times") +let url = "https://api.apidash.dev/io/form" + + +AF.upload(multipartFormData: multipartFormData, to: url, method: .post, headers: ["User-Agent": "Test Agent"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPost5, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + + test('POST 6', () { + const expectedCode = r""" +import Foundation +import Alamofire +let multipartFormData = MultipartFormData() + multipartFormData.append(Data("xyz".utf8), withName: "token") + +let fileURL = URL(fileURLWithPath: "/Documents/up/1.png") +multipartFormData.append(fileURL, withName: "imfile", fileName: "1.png", mimeType: "application/octet-stream") + +let url = "https://api.apidash.dev/io/img" + + +AF.upload(multipartFormData: multipartFormData, to: url, method: .post) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPost6, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + + + + test('POST 7', () { + const expectedCode = r""" +import Foundation +import Alamofire +let multipartFormData = MultipartFormData() + multipartFormData.append(Data("xyz".utf8), withName: "token") + +let fileURL = URL(fileURLWithPath: "/Documents/up/1.png") +multipartFormData.append(fileURL, withName: "imfile", fileName: "1.png", mimeType: "application/octet-stream") + +let url = "https://api.apidash.dev/io/img" + + +AF.upload(multipartFormData: multipartFormData, to: url, method: .post) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPost7, + SupportedUriSchemes.https, + ), + expectedCode); + }); + test('POST 8', () { + const expectedCode = r""" +import Foundation +import Alamofire +let multipartFormData = MultipartFormData() + multipartFormData.append(Data("API".utf8), withName: "text") + multipartFormData.append(Data("|".utf8), withName: "sep") + multipartFormData.append(Data("3".utf8), withName: "times") +let url = "https://api.apidash.dev/io/form?size=2&len=3" + + +AF.upload(multipartFormData: multipartFormData, to: url, method: .post) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPost8, + SupportedUriSchemes.https, + ), + expectedCode); + }); + test('POST 9', () { + const expectedCode = r""" +import Foundation +import Alamofire +let multipartFormData = MultipartFormData() + multipartFormData.append(Data("xyz".utf8), withName: "token") + +let fileURL = URL(fileURLWithPath: "/Documents/up/1.png") +multipartFormData.append(fileURL, withName: "imfile", fileName: "1.png", mimeType: "application/octet-stream") + +let url = "https://api.apidash.dev/io/img?size=2&len=3" + + +AF.upload(multipartFormData: multipartFormData, to: url, method: .post, headers: ["User-Agent": "Test Agent", "Keep-Alive": "true"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPost9, + SupportedUriSchemes.https, + ), + expectedCode); + }); + test('POST 10', () { + const expectedCode = r''' +import Foundation +import Alamofire +let jsonString = """ +{\n\"text\": \"I LOVE Flutter\"\n} +""" +let jsonData = jsonString.data(using: .utf8) +let url = "https://api.apidash.dev/case/lower?size=2&len=3" + + +AF.upload(jsonData!, to: url, method: .post, headers: ["Content-Type": "application/json; charset=utf-8"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()'''; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPost10, + SupportedUriSchemes.https, + ), + expectedCode); + }); + }, + + ); + + group( + 'HTTPVerb.put', + () { + test('PUT 1', () { + const expectedCode = r''' +import Foundation +import Alamofire +let jsonString = """ +{\n\"name\": \"morpheus\",\n\"job\": \"zion resident\"\n} +""" +let jsonData = jsonString.data(using: .utf8) +let url = "https://reqres.in/api/users/2" + + +AF.upload(jsonData!, to: url, method: .put, headers: ["Content-Type": "application/json"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()'''; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPut1, + SupportedUriSchemes.https, + ), + expectedCode); + }); + }, + + ); + + group( + 'HTTPVerb.patch', + () { + test('PATCH 1', () { + const expectedCode = r''' +import Foundation +import Alamofire +let jsonString = """ +{\n\"name\": \"marfeus\",\n\"job\": \"accountant\"\n} +""" +let jsonData = jsonString.data(using: .utf8) +let url = "https://reqres.in/api/users/2" + + +AF.upload(jsonData!, to: url, method: .patch, headers: ["Content-Type": "application/json"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()'''; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPatch1, + SupportedUriSchemes.https, + ), + expectedCode); + }); + }, + + ); + + group( + 'HTTPVerb.delete', + () { + test('DELETE 1', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://reqres.in/api/users/2" + + +AF.request(url, method: .delete) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelDelete1, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('DELETE 2', () { + const expectedCode = r''' +import Foundation +import Alamofire +let jsonString = """ +{\n\"name\": \"marfeus\",\n\"job\": \"accountant\"\n} +""" +let jsonData = jsonString.data(using: .utf8) +let url = "https://reqres.in/api/users/2" + + +AF.upload(jsonData!, to: url, method: .delete, headers: ["Content-Type": "application/json"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()'''; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelDelete2, + SupportedUriSchemes.https, + ), + expectedCode); + }); + }, + + ); +} diff --git a/test/codegen/swift_urlsession_test.dart b/test/codegen/swift_urlsession_test.dart index c7d1bf8c..b5114d5e 100644 --- a/test/codegen/swift_urlsession_test.dart +++ b/test/codegen/swift_urlsession_test.dart @@ -5,7 +5,6 @@ import 'package:test/test.dart'; import '../models/request_models.dart'; -// TODO: Fix tests for URLSession void main() { final codeGen = Codegen();