94 lines
3.5 KiB
Swift
94 lines
3.5 KiB
Swift
/*
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
@testable import FBAEMKit
|
|
import XCTest
|
|
|
|
final class AEMRequestBodyTests: XCTestCase {
|
|
func testEmptyBody() throws {
|
|
let body = AEMRequestBody()
|
|
XCTAssertNil(body.compressedData())
|
|
XCTAssertEqual(body.data.count, 0)
|
|
|
|
let multipartData = try XCTUnwrap(body.multipartData)
|
|
XCTAssertEqual(multipartData.count, 0)
|
|
}
|
|
|
|
func testAppendEmptyKeyWithEmptyValue() throws {
|
|
let body = AEMRequestBody()
|
|
body.append(withKey: "", formValue: "")
|
|
XCTAssertNotNil(body.compressedData())
|
|
|
|
let multipartString = try makeString(multipartData: body.multipartData)
|
|
let expectedMultipartString = "--\r\nContent-Disposition: form-data; name=\"\"\r\n\r\n\r\n"
|
|
XCTAssertEqual(multipartString, expectedMultipartString)
|
|
|
|
let dictionary = try makeStringDictionary(jsonData: body.data)
|
|
XCTAssertEqual(dictionary.keys.count, 1)
|
|
XCTAssertEqual(dictionary[""], "")
|
|
}
|
|
|
|
func testAppendEmptyKeyWithNonEmptyValue() throws {
|
|
let body = AEMRequestBody()
|
|
body.append(withKey: "", formValue: "value")
|
|
XCTAssertNotNil(body.compressedData())
|
|
|
|
let multipartString = try makeString(multipartData: body.multipartData)
|
|
let expectedMultipartString = "--\r\nContent-Disposition: form-data; name=\"\"\r\n\r\nvalue\r\n"
|
|
XCTAssertEqual(multipartString, expectedMultipartString)
|
|
|
|
let dictionary = try makeStringDictionary(jsonData: body.data)
|
|
XCTAssertEqual(dictionary.keys.count, 1)
|
|
XCTAssertEqual(dictionary[""], "value")
|
|
}
|
|
|
|
func testAppendNonEmptyKeyWithEmptyValue() throws {
|
|
let body = AEMRequestBody()
|
|
body.append(withKey: "key", formValue: "")
|
|
XCTAssertNotNil(body.compressedData())
|
|
|
|
let multipartString = try makeString(multipartData: body.multipartData)
|
|
let expectedMultipartString = "--\r\nContent-Disposition: form-data; name=\"key\"\r\n\r\n\r\n"
|
|
XCTAssertEqual(multipartString, expectedMultipartString)
|
|
|
|
let dictionary = try makeStringDictionary(jsonData: body.data)
|
|
XCTAssertEqual(dictionary.keys.count, 1)
|
|
XCTAssertEqual(dictionary["key"], "")
|
|
}
|
|
|
|
func testAppendKeysAndValuesWithEscapedCharacters() throws {
|
|
let body = AEMRequestBody()
|
|
body.append(withKey: "\u{F09F}\u{918D}", formValue: "\u{F09F}\u{918E}")
|
|
body.append(withKey: "\0", formValue: "\0")
|
|
XCTAssertNotNil(body.compressedData())
|
|
|
|
let multipartString = try makeString(multipartData: body.multipartData)
|
|
|
|
// swiftlint:disable:next line_length
|
|
let expectedMultipartString = "--\r\nContent-Disposition: form-data; name=\"\u{F09F}\u{918D}\"\r\n\r\n\u{F09F}\u{918E}\r\nContent-Disposition: form-data; name=\"\0\"\r\n\r\n\0\r\n"
|
|
|
|
XCTAssertEqual(multipartString, expectedMultipartString)
|
|
|
|
let dictionary = try makeStringDictionary(jsonData: body.data)
|
|
XCTAssertEqual(dictionary.keys.count, 2)
|
|
XCTAssertEqual(dictionary["\u{F09F}\u{918D}"], "\u{F09F}\u{918E}")
|
|
XCTAssertEqual(dictionary["\0"], "\0")
|
|
}
|
|
|
|
private func makeString(multipartData: Data?) throws -> String {
|
|
let multipartData = try XCTUnwrap(multipartData)
|
|
let utf8String = String(data: multipartData, encoding: .utf8)
|
|
return try XCTUnwrap(utf8String)
|
|
}
|
|
|
|
private func makeStringDictionary(jsonData: Data) throws -> [String: String] {
|
|
let json = try JSONSerialization.jsonObject(with: jsonData, options: [])
|
|
return try XCTUnwrap(json as? [String: String])
|
|
}
|
|
}
|