Skip to content

Commit

Permalink
Add GitHub tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Nef10 committed May 26, 2021
1 parent 0efc45a commit dad1aa2
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 4 deletions.
28 changes: 24 additions & 4 deletions Sources/SwiftDependencyUpdaterLibrary/Services/GitHub.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,24 @@ import FoundationNetworking
#endif
import Rainbow

protocol URLSessionProvider {
func myUploadTask(with request: URLRequest, from bodyData: Data?, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionUploadTaskProvider
}

protocol URLSessionUploadTaskProvider {
func resume()
}

class GitHub {

private let git: Git
private let token: String
private let session: URLSessionProvider

init(git: Git) {
init(git: Git, token: String = ProcessInfo.processInfo.environment["TOKEN"]!, urlSession session: URLSessionProvider = URLSession.shared) {
self.git = git
self.token = token
self.session = session
}

func createPullRequest(branchName: String, title: String) throws {
Expand All @@ -24,13 +36,12 @@ class GitHub {
"maintainer_can_modify": true
]
var request = URLRequest(url: URL(string: "https://api.github.com/repos/\(git.slug)/pulls")!)
let session = URLSession.shared
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("application/vnd.github.v3+json", forHTTPHeaderField: "Accept")
request.setValue("token \(ProcessInfo.processInfo.environment["TOKEN"]!)", forHTTPHeaderField: "Authorization")
request.setValue("token \(token)", forHTTPHeaderField: "Authorization")
let parameters = try JSONSerialization.data(withJSONObject: parameterArray, options: [])
let task = session.uploadTask(with: request, from: parameters) { data, response, error in
let task = session.myUploadTask(with: request, from: parameters) { data, response, error in
self.handleCreatePullRequestResponse(data: data, response: response, error: error)
group.leave()
}
Expand Down Expand Up @@ -63,3 +74,12 @@ class GitHub {
}

}

extension URLSession: URLSessionProvider {
func myUploadTask(with request: URLRequest, from bodyData: Data?, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionUploadTaskProvider {
uploadTask(with: request, from: bodyData, completionHandler: completionHandler)
}
}

extension URLSessionUploadTask: URLSessionUploadTaskProvider {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import ShellOut
@testable import SwiftDependencyUpdaterLibrary
import XCTest

class GitHubTests: XCTestCase {

class MockURLSession: URLSessionProvider {

private let expectation: XCTestExpectation

init(expectation: XCTestExpectation) {
self.expectation = expectation
}

func myUploadTask(with request: URLRequest, from bodyData: Data?, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionUploadTaskProvider {
XCTAssertEqual(request.httpMethod, "POST")
XCTAssertEqual(request.value(forHTTPHeaderField: "Content-Type"), "application/json")
XCTAssertEqual(request.value(forHTTPHeaderField: "Accept"), "application/vnd.github.v3+json")
XCTAssertEqual(request.value(forHTTPHeaderField: "Authorization"), "token abc")
XCTAssertEqual(request.url, URL(string: "https://api.github.com/repos/Nef10/swift-dependency-updater/pulls")!)

// swiftlint:disable force_cast
let parameters = try! JSONSerialization.jsonObject(with: bodyData!, options: []) as! [String: Any]
XCTAssertEqual(parameters["head"] as! String, "Branch")
XCTAssertEqual(parameters["base"] as! String, "main")
XCTAssertEqual(parameters["title"] as! String, "Title1")
XCTAssertTrue(parameters["maintainer_can_modify"] as! Bool)
// swiftlint:enable force_cast

return MockURLSessionUploadTask {
completionHandler(nil, nil, nil)
self.expectation.fulfill()
}
}

}

class MockURLSessionUploadTask: URLSessionUploadTaskProvider {

private let closure: () -> Void

init(closure: @escaping () -> Void) {
self.closure = closure
}

func resume() {
closure()
}
}

func testCreatePullRequest() {
let expectation = XCTestExpectation(description: "Call GitHub Pull Request API")

let folder = emptyFolderURL()
try! shellOut(to: ShellOutCommand.gitClone(url: URL(string: "https://github.com/Nef10/swift-dependency-updater.git")!, to: folder.path, allowingPrompt: false))
let git = try! Git(in: folder)

let session = MockURLSession(expectation: expectation)
let gitHub = GitHub(git: git, token: "abc", urlSession: session)

try! gitHub.createPullRequest(branchName: "Branch", title: "Title1")

wait(for: [expectation], timeout: 1.0)
}

}

0 comments on commit dad1aa2

Please sign in to comment.