Skip to content

Commit

Permalink
Merge pull request #631 from PravinPK/assurance
Browse files Browse the repository at this point in the history
[MOB-14383] - Update NetworkService to post raw blob data
  • Loading branch information
PravinPK authored May 20, 2021
2 parents ad8a261 + 45e5a25 commit 1599c5e
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 7 deletions.
2 changes: 1 addition & 1 deletion AEPIntegrationTests/SignalIntegrationTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ class SignalIntegrationTests: XCTestCase {
if request.url.absoluteString.starts(with: "https://www.signal.com") {
XCTAssertEqual("https://www.signal.com?name=testPostRequest", request.url.absoluteString)
XCTAssertEqual(HttpMethod.post, request.httpMethod)
XCTAssertEqual("name=testPostRequest", request.connectPayload)
XCTAssertEqual("name=testPostRequest", String(decoding: request.connectPayload, as: UTF8.self))
XCTAssertEqual("zip", request.httpHeaders["Content-Type"])
XCTAssertEqual(2, request.connectTimeout)
XCTAssertEqual(2, request.readTimeout)
Expand Down
23 changes: 20 additions & 3 deletions AEPServices/Sources/network/NetworkRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import Foundation

public let url: URL
public let httpMethod: HttpMethod
public let connectPayload: String
public let connectPayload: Data
public let httpHeaders: [String: String]
public let connectTimeout: TimeInterval
public let readTimeout: TimeInterval
Expand All @@ -33,10 +33,27 @@ import Foundation
/// - connectTimeout: optional connect timeout value in seconds; default is 5 seconds
/// - readTimeout: optional read timeout value in seconds, used to wait for a read to finish after a successful connect, default is 5 seconds
/// - Returns: an initialized `NetworkRequest` object
public init(url: URL, httpMethod: HttpMethod = HttpMethod.get, connectPayload: String = "", httpHeaders: [String: String] = [:], connectTimeout: TimeInterval = 5, readTimeout: TimeInterval = 5) {
public convenience init(url: URL, httpMethod: HttpMethod = HttpMethod.get, connectPayload: String = "", httpHeaders: [String: String] = [:], connectTimeout: TimeInterval = 5, readTimeout: TimeInterval = 5) {
self.init(url: url,
httpMethod: httpMethod,
connectPayloadData: connectPayload.data(using: .utf8) ?? Data(),
httpHeaders: httpHeaders,
connectTimeout: connectTimeout,
readTimeout: readTimeout)
}

/// Initialize the `NetworkRequest`
/// - Parameters:
/// - url: URL used to initiate the network connection, should use https scheme
/// - connectPayloadData: the body of the network request as a Data
/// - httpHeaders: optional HTTP headers for the request
/// - connectTimeout: optional connect timeout value in seconds; default is 5 seconds
/// - readTimeout: optional read timeout value in seconds, used to wait for a read to finish after a successful connect, default is 5 seconds
/// - Returns: an initialized `NetworkRequest` object
public init(url: URL, httpMethod: HttpMethod = HttpMethod.get, connectPayloadData: Data, httpHeaders: [String: String] = [:], connectTimeout: TimeInterval = 5, readTimeout: TimeInterval = 5) {
self.url = url
self.httpMethod = httpMethod
self.connectPayload = connectPayload
self.connectPayload = connectPayloadData

let systemInfoService = ServiceProvider.shared.systemInfoService
let defaultHeaders = [NetworkRequest.REQUEST_HEADER_KEY_USER_AGENT: systemInfoService.getDefaultUserAgent(),
Expand Down
2 changes: 1 addition & 1 deletion AEPServices/Sources/network/NetworkService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ class NetworkService: Networking {
request.httpMethod = networkRequest.httpMethod.toString()

if !networkRequest.connectPayload.isEmpty, networkRequest.httpMethod == .post {
request.httpBody = networkRequest.connectPayload.data(using: .utf8)
request.httpBody = networkRequest.connectPayload
}

for (key, val) in networkRequest.httpHeaders {
Expand Down
23 changes: 23 additions & 0 deletions AEPServices/Tests/services/NetworkServiceTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,29 @@ class NetworkServiceTests: XCTestCase {
XCTAssertEqual(testUrl, mockSession.calledWithUrlRequest?.url)
}

func testConnectAsync_initiatesConnection_whenValidNetworkRequest_withData() {
// setup
let sampleData = "sampleData".data(using: .utf8)!
let expectation = XCTestExpectation(description: "Completion handler called")

// test
let testUrl = URL(string: "https://test.com")!
let networkRequest = NetworkRequest(url: testUrl, httpMethod: .post, connectPayloadData: sampleData, connectTimeout: 2.0, readTimeout: 2.0)
networkStub.connectAsync(networkRequest: networkRequest, completionHandler: { connection in
XCTAssertEqual(jsonData, connection.data) // jsonData is the data returned from MockSession
XCTAssertNil(connection.response)
XCTAssertNil(connection.error)
expectation.fulfill()
})

// verify
wait(for: [expectation], timeout: 1.0)
XCTAssertTrue(mockSession.dataTaskWithCompletionHandlerCalled)
XCTAssertEqual(sampleData, mockSession.calledWithUrlRequest?.httpBody) // makes the network call with the same data provided in network request
XCTAssertEqual("POST", mockSession.calledWithUrlRequest?.httpMethod)
XCTAssertEqual(testUrl, mockSession.calledWithUrlRequest?.url)
}

func testConnectAsync_returnsTimeoutError_whenConnectionTimesOut() {
let defaultNetworkService = NetworkService()
let expectation = XCTestExpectation(description: "Completion handler called")
Expand Down
4 changes: 2 additions & 2 deletions AEPSignal/Tests/SignalHitProcessorTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ class SignalHitProcessorTests: XCTestCase {
throw SignalHitProcessingError.invalidNetworkRequest
}
XCTAssertEqual(testUrl, sentRequest.url)
XCTAssertEqual(testPostBody, sentRequest.connectPayload)
XCTAssertEqual(testPostBody, String(decoding: sentRequest.connectPayload, as: UTF8.self))
XCTAssertEqual(HttpMethod.post, sentRequest.httpMethod)
XCTAssertEqual(testContentType, sentRequest.httpHeaders[NetworkServiceConstants.Headers.CONTENT_TYPE])
XCTAssertEqual(testTimeout, sentRequest.connectTimeout)
Expand Down Expand Up @@ -101,7 +101,7 @@ class SignalHitProcessorTests: XCTestCase {
throw SignalHitProcessingError.invalidNetworkRequest
}
XCTAssertEqual(testUrl, sentRequest.url)
XCTAssertEqual("", sentRequest.connectPayload)
XCTAssertEqual("", String(decoding: sentRequest.connectPayload, as: UTF8.self))
XCTAssertEqual(HttpMethod.get, sentRequest.httpMethod)
XCTAssertNil(sentRequest.httpHeaders[NetworkServiceConstants.Headers.CONTENT_TYPE])
XCTAssertEqual(testTimeout, sentRequest.connectTimeout)
Expand Down

0 comments on commit 1599c5e

Please sign in to comment.