diff --git a/Documentation/APIKit2MigrationGuide.md b/Documentation/APIKit2MigrationGuide.md index a0b10efd..318e5921 100644 --- a/Documentation/APIKit2MigrationGuide.md +++ b/Documentation/APIKit2MigrationGuide.md @@ -77,6 +77,7 @@ APIKit provides 3 parameters types that conform to `BodyParametersType`: - [**Added**] `class JSONBodyParameters` - [**Added**] `class FormURLEncodedBodyParameters` - [**Added**] `class MultipartFormDataBodyParameters` +- [**Added**] `class TextPlainParameters` ### HTTP Headers diff --git a/Documentation/ConvenienceParametersAndActualParameters.md b/Documentation/ConvenienceParametersAndActualParameters.md index 53fdedbf..95dc33f0 100644 --- a/Documentation/ConvenienceParametersAndActualParameters.md +++ b/Documentation/ConvenienceParametersAndActualParameters.md @@ -94,3 +94,4 @@ APIKit provides 3 body parameters type listed below: |`JSONBodyParameters` |`Any` | |`FormURLEncodedBodyParameters` |`[String: Any]` | |`MultipartFormDataBodyParameters`|`[MultipartFormDataBodyParameters.Part]`| +|`TextPlainParameters` |`String` | diff --git a/Sources/APIKit/BodyParameters/TextPlainParameters.swift b/Sources/APIKit/BodyParameters/TextPlainParameters.swift new file mode 100644 index 00000000..3c7331cf --- /dev/null +++ b/Sources/APIKit/BodyParameters/TextPlainParameters.swift @@ -0,0 +1,23 @@ +import Foundation + +/// `TextPlainParameters` serializes plain text for HTTP body and states its content type is plain text. +public struct TextPlainParameters: BodyParameters { + /// The plain text to be serialized. + private let text: String + + /// Returns `TextPlainParameters` that is initialized with plain text. + public init(text: String) { + self.text = text + } + + // MARK: - BodyParameters + /// `Content-Type` to send. The value for this property will be set to `Accept` HTTP header field. + public var contentType: String { + "text/plain" + } + + /// Builds `RequestBodyEntity.data` that represents plain text. + public func buildEntity() throws -> RequestBodyEntity { + .data(Data(self.text.utf8)) + } +} diff --git a/Tests/APIKitTests/BodyParametersType/TextPlainParametersTests.swift b/Tests/APIKitTests/BodyParametersType/TextPlainParametersTests.swift new file mode 100644 index 00000000..e49a3162 --- /dev/null +++ b/Tests/APIKitTests/BodyParametersType/TextPlainParametersTests.swift @@ -0,0 +1,50 @@ +import Foundation +import XCTest +import APIKit + +class TextPlainParametersTests: XCTestCase { + func testTextPlainSuccess() throws { + let text = "Hello, World!" + let parameters = TextPlainParameters(text: text) + + XCTAssertEqual(parameters.contentType, "text/plain") + + guard case .data(let data) = try parameters.buildEntity() else { + XCTFail() + return + } + + let decodedText = String(data: data, encoding: .utf8) + XCTAssertEqual(decodedText, text) + } + + func testTextPlainEmpty() throws { + let text = "" + let parameters = TextPlainParameters(text: text) + + XCTAssertEqual(parameters.contentType, "text/plain") + + guard case .data(let data) = try parameters.buildEntity() else { + XCTFail() + return + } + + let decodedText = String(data: data, encoding: .utf8) + XCTAssertEqual(decodedText, text) + } + + func testTextPlainUnicode() throws { + let text = "Hello, World! 😄🌍" + let parameters = TextPlainParameters(text: text) + + XCTAssertEqual(parameters.contentType, "text/plain") + + guard case .data(let data) = try parameters.buildEntity() else { + XCTFail() + return + } + + let decodedText = String(data: data, encoding: .utf8) + XCTAssertEqual(decodedText, text) + } +}