source/UberCoreTests/TokenManagerTests.swift (136 lines of code) (raw):
//
// TokenManagerTests.swift
// UberRides
//
// Copyright © 2015 Uber Technologies, Inc. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import XCTest
@testable import UberCore
class TokenManagerTests: XCTestCase {
private var notificationFired = false
private var keychain: KeychainWrapper?
private var token: AccessToken!
override func setUp() {
super.setUp()
Configuration.plistName = "testInfo"
keychain = KeychainWrapper()
notificationFired = false
token = AccessToken(tokenString: "testTokenString")
}
override func tearDown() {
Configuration.restoreDefaults()
keychain = nil
super.tearDown()
}
func testSave() {
let identifier = "testIdentifier"
XCTAssertTrue(TokenManager.save(accessToken: token!, tokenIdentifier:identifier))
guard let actualToken = keychain?.getObjectForKey(identifier) as? AccessToken else {
XCTFail("Unable to fetch token")
return
}
XCTAssertEqual(actualToken.tokenString, token?.tokenString)
XCTAssertTrue(keychain!.deleteObjectForKey(identifier))
}
func testSave_firesNotification() {
let identifier = "testIdentifier"
NotificationCenter.default.addObserver(self, selector: #selector(handleTokenManagerNotifications), name: NSNotification.Name(rawValue: TokenManager.tokenManagerDidSaveTokenNotification), object: nil)
XCTAssertTrue(TokenManager.save(accessToken: token!, tokenIdentifier:identifier))
NotificationCenter.default.removeObserver(self)
guard let actualToken = keychain?.getObjectForKey(identifier) as? AccessToken else {
XCTFail("Unable to fetch token")
return
}
XCTAssertEqual(actualToken.tokenString, token?.tokenString)
XCTAssertTrue(notificationFired)
XCTAssertTrue(keychain!.deleteObjectForKey(identifier))
}
func testGet() {
let identifier = "testIdentifier"
XCTAssertTrue(keychain!.setObject(token!, key: identifier))
let actualToken = TokenManager.fetchToken(identifier: identifier)
XCTAssertNotNil(actualToken)
XCTAssertEqual(actualToken?.tokenString, token?.tokenString)
XCTAssertTrue(keychain!.deleteObjectForKey(identifier))
}
func testGet_nonExistent() {
let identifer = "there.is.no.token.named.this.123412wfdasd3o"
XCTAssertNil(TokenManager.fetchToken(identifier: identifer))
}
func testDelete() {
let identifier = "testIdentifier"
XCTAssertTrue(keychain!.setObject(token!, key: identifier))
XCTAssertTrue(TokenManager.deleteToken(identifier: identifier))
let actualToken = keychain?.getObjectForKey(identifier) as? AccessToken
guard actualToken == nil else {
XCTFail("Token should have been deleted")
XCTAssertTrue(keychain!.deleteObjectForKey(identifier))
return
}
}
func testDelete_nonExistent() {
let identifier = "there.is.no.token.named.this.123412wfdasd3o"
XCTAssertFalse(TokenManager.deleteToken(identifier: identifier))
}
func testDelete_firesNotification() {
let identifier = "testIdentifier"
XCTAssertTrue(keychain!.setObject(token!, key: identifier))
NotificationCenter.default.addObserver(self, selector: #selector(handleTokenManagerNotifications), name: NSNotification.Name(rawValue: TokenManager.tokenManagerDidDeleteTokenNotification), object: nil)
XCTAssertTrue(TokenManager.deleteToken(identifier: identifier))
NotificationCenter.default.removeObserver(self)
XCTAssertTrue(notificationFired)
let actualToken = keychain?.getObjectForKey(identifier) as? AccessToken
guard actualToken == nil else {
XCTFail("Token should have been deleted")
XCTAssertTrue(keychain!.deleteObjectForKey(identifier))
return
}
}
func testDelete_nonExistent_doesNotFireNotification() {
let identifier = "there.is.no.token.named.this.123412wfdasd3o"
NotificationCenter.default.addObserver(self, selector: #selector(handleTokenManagerNotifications), name: NSNotification.Name(rawValue: TokenManager.tokenManagerDidDeleteTokenNotification), object: nil)
XCTAssertFalse(TokenManager.deleteToken(identifier: identifier))
NotificationCenter.default.removeObserver(self)
XCTAssertFalse(notificationFired)
}
func testCookiesCleared_whenTokenDeleted() {
guard let usUrl = URL(string: "https://login.uber.com") else {
XCTAssertFalse(false)
return
}
let cookieStorage = HTTPCookieStorage.shared
if let cookies = cookieStorage.cookies {
for cookie in cookies {
cookieStorage.deleteCookie(cookie)
}
}
cookieStorage.setCookies(createTestUSCookies(), for: usUrl, mainDocumentURL: nil)
UserDefaults.standard.synchronize()
XCTAssertEqual(cookieStorage.cookies?.count, 2)
XCTAssertEqual(cookieStorage.cookies(for: usUrl)?.count, 2)
let identifier = "testIdentifier"
_ = keychain?.setObject(token!, key: identifier)
XCTAssertTrue(TokenManager.deleteToken(identifier: identifier))
let actualToken = keychain?.getObjectForKey(identifier) as? AccessToken
guard actualToken == nil else {
XCTAssert(false)
_ = keychain?.deleteObjectForKey(identifier)
return
}
let testCookieStorage = HTTPCookieStorage.shared
XCTAssertEqual(testCookieStorage.cookies?.count, 0)
}
//MARK: Helpers
func createTestUSCookies() -> [HTTPCookie] {
let secureUSCookie = HTTPCookie(properties: [HTTPCookiePropertyKey.domain: ".uber.com",
HTTPCookiePropertyKey.path : "/",
HTTPCookiePropertyKey.name : "us_login_secure",
HTTPCookiePropertyKey.value : "some_value",
HTTPCookiePropertyKey.secure : true])
let unsecureUSCookie = HTTPCookie(properties: [HTTPCookiePropertyKey.domain: ".uber.com",
HTTPCookiePropertyKey.path : "/",
HTTPCookiePropertyKey.name : "us_login_unecure",
HTTPCookiePropertyKey.value : "some_value",
HTTPCookiePropertyKey.secure : false])
if let secureUSCookie = secureUSCookie, let unsecureUSCookie = unsecureUSCookie {
return [secureUSCookie, unsecureUSCookie]
}
return []
}
func handleTokenManagerNotifications() {
notificationFired = true
}
}