secant-ios-wallet/secantTests/UtilTests/UserPreferencesStorageTests...

240 lines
8.2 KiB
Swift

//
// UserPreferencesStorageTests.swift
// secantTests
//
// Created by Lukáš Korba on 22.03.2022.
//
import XCTest
@testable import secant_testnet
import Combine
class UserPreferencesStorageTests: XCTestCase {
private var cancellables: [AnyCancellable] = []
// swiftlint:disable:next implicitly_unwrapped_optional
var storage: UserPreferencesStorage!
override func setUp() {
super.setUp()
guard let userDefaults = UserDefaults.init(suiteName: "test") else {
XCTFail("UserPreferencesStorageTests: UserDefaults.init(suiteName: \"test\") failed to initialize")
return
}
storage = UserPreferencesStorage(
appSessionFrom: 12345678.0,
convertedCurrency: "USD",
fiatConvertion: true,
recoveryPhraseTestCompleted: true,
sessionAutoshielded: false,
userDefaults: .live(userDefaults: userDefaults)
)
storage.removeAll()
.sink(receiveValue: { _ in })
.store(in: &cancellables)
}
override func tearDown() {
super.tearDown()
storage.removeAll()
.sink(receiveValue: { _ in })
.store(in: &cancellables)
storage = nil
}
// MARK: - Default values in the live UserDefaults environment
func testAppSessionFrom_defaultValue() throws {
XCTAssertEqual(12345678.0, storage.activeAppSessionFrom, "User Preferences: `activeAppSessionFrom` default doesn't match.")
}
func testConvertedCurrency_defaultValue() throws {
XCTAssertEqual("USD", storage.currency, "User Preferences: `currency` default doesn't match.")
}
func testFiatConvertion_defaultValue() throws {
XCTAssertEqual(true, storage.isFiatConverted, "User Preferences: `isFiatConverted` default doesn't match.")
}
func testRecoveryPhraseTestCompleted_defaultValue() throws {
XCTAssertEqual(true, storage.isRecoveryPhraseTestCompleted, "User Preferences: `isRecoveryPhraseTestCompleted` default doesn't match.")
}
func testSessionAutoshielded_defaultValue() throws {
XCTAssertEqual(false, storage.isSessionAutoshielded, "User Preferences: `isSessionAutoshielded` default doesn't match.")
}
// MARK: - Set new values in the live UserDefaults environment
func testAppSessionFrom_setNewValue() throws {
storage.setActiveAppSessionFrom(87654321.0)
.sink(receiveValue: { _ in })
.store(in: &cancellables)
XCTAssertEqual(87654321.0, storage.activeAppSessionFrom, "User Preferences: `activeAppSessionFrom` default doesn't match.")
}
func testConvertedCurrency_setNewValue() throws {
storage.setCurrency("CZK")
.sink(receiveValue: { _ in })
.store(in: &cancellables)
XCTAssertEqual("CZK", storage.currency, "User Preferences: `currency` default doesn't match.")
}
func testFiatConvertion_setNewValue() throws {
storage.setIsFiatConverted(false)
.sink(receiveValue: { _ in })
.store(in: &cancellables)
XCTAssertEqual(false, storage.isFiatConverted, "User Preferences: `isFiatConverted` default doesn't match.")
}
func testRecoveryPhraseTestCompleted_setNewValue() throws {
storage.setIsRecoveryPhraseTestCompleted(false)
.sink(receiveValue: { _ in })
.store(in: &cancellables)
XCTAssertEqual(false, storage.isRecoveryPhraseTestCompleted, "User Preferences: `isRecoveryPhraseTestCompleted` default doesn't match.")
}
func testSessionAutoshielded_setNewValue() throws {
storage.setIsSessionAutoshielded(true)
.sink(receiveValue: { _ in })
.store(in: &cancellables)
XCTAssertEqual(true, storage.isSessionAutoshielded, "User Preferences: `isSessionAutoshielded` default doesn't match.")
}
// MARK: - Mocked user defaults vs. default values
func testAppSessionFrom_mocked() throws {
let mockedUD = WrappedUserDefaults(
objectForKey: { _ in 87654321.0 },
remove: { _ in .none },
setValue: { _, _ in .none },
synchronize: { true }
)
let mockedStorage = UserPreferencesStorage(
appSessionFrom: 12345678.0,
convertedCurrency: "USD",
fiatConvertion: true,
recoveryPhraseTestCompleted: true,
sessionAutoshielded: false,
userDefaults: mockedUD
)
XCTAssertEqual(87654321.0, mockedStorage.activeAppSessionFrom, "User Preferences: `activeAppSessionFrom` default doesn't match.")
}
func testConvertedCurrency_mocked() throws {
let mockedUD = WrappedUserDefaults(
objectForKey: { _ in "CZK" },
remove: { _ in .none },
setValue: { _, _ in .none },
synchronize: { true }
)
let mockedStorage = UserPreferencesStorage(
appSessionFrom: 12345678.0,
convertedCurrency: "USD",
fiatConvertion: true,
recoveryPhraseTestCompleted: true,
sessionAutoshielded: false,
userDefaults: mockedUD
)
XCTAssertEqual("CZK", mockedStorage.currency, "User Preferences: `currency` default doesn't match.")
}
func testFiatConvertion_mocked() throws {
let mockedUD = WrappedUserDefaults(
objectForKey: { _ in false },
remove: { _ in .none },
setValue: { _, _ in .none },
synchronize: { true }
)
let mockedStorage = UserPreferencesStorage(
appSessionFrom: 12345678.0,
convertedCurrency: "USD",
fiatConvertion: true,
recoveryPhraseTestCompleted: true,
sessionAutoshielded: false,
userDefaults: mockedUD
)
XCTAssertEqual(false, mockedStorage.isFiatConverted, "User Preferences: `isFiatConverted` default doesn't match.")
}
func testRecoveryPhraseTestCompleted_mocked() throws {
let mockedUD = WrappedUserDefaults(
objectForKey: { _ in false },
remove: { _ in .none },
setValue: { _, _ in .none },
synchronize: { true }
)
let mockedStorage = UserPreferencesStorage(
appSessionFrom: 12345678.0,
convertedCurrency: "USD",
fiatConvertion: true,
recoveryPhraseTestCompleted: true,
sessionAutoshielded: false,
userDefaults: mockedUD
)
XCTAssertEqual(false, mockedStorage.isRecoveryPhraseTestCompleted, "User Preferences: `isRecoveryPhraseTestCompleted` default doesn't match.")
}
func testSessionAutoshielded_mocked() throws {
let mockedUD = WrappedUserDefaults(
objectForKey: { _ in true },
remove: { _ in .none },
setValue: { _, _ in .none },
synchronize: { true }
)
let mockedStorage = UserPreferencesStorage(
appSessionFrom: 12345678.0,
convertedCurrency: "USD",
fiatConvertion: true,
recoveryPhraseTestCompleted: true,
sessionAutoshielded: false,
userDefaults: mockedUD
)
XCTAssertEqual(true, mockedStorage.isSessionAutoshielded, "User Preferences: `isSessionAutoshielded` default doesn't match.")
}
// MARK: - Remove all keys from the live UD environment
func testRemoveAll() throws {
guard let userDefaults = UserDefaults.init(suiteName: "test") else {
XCTFail("User Preferences: UserDefaults.init(suiteName: \"test\") failed to initialize")
return
}
// fill in the data
UserPreferencesStorage.Constants.allCases.forEach {
userDefaults.set("anyValue", forKey: $0.rawValue)
}
// remove it
storage?.removeAll()
.sink(receiveValue: { _ in })
.store(in: &cancellables)
// check the presence
UserPreferencesStorage.Constants.allCases.forEach {
XCTAssertNil(
userDefaults.object(forKey: $0.rawValue),
"User Preferences: key \($0.rawValue) should be removed but it's still present in User Defaults"
)
}
}
}