Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,12 @@ struct LocalStorage: LocalStorageType {
}

let storage: UserDefaults
let passPhraseStorage: PassPhraseStorageType & LogOutHandler

init(storage: UserDefaults = .standard) {
init(storage: UserDefaults = .standard,
passPhraseStorage: PassPhraseStorageType & LogOutHandler = InMemoryPassPhraseStorage()) {
self.storage = storage
self.passPhraseStorage = passPhraseStorage
}
}

Expand All @@ -40,6 +43,7 @@ extension LocalStorage {

extension LocalStorage: LogOutHandler {
func logOutUser(email: String) throws {
try passPhraseStorage.logOutUser(email: email)
// For now we store only trash folder path in user defaults
// see no reason to add logic for removing data for a concrete user
cleanup()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ final class InMemoryPassPhraseStorage: PassPhraseStorageType {
}

func remove(passPhrase: PassPhrase) {
passPhraseProvider.removePassPhrases(with: passPhrase)
passPhraseProvider.remove(passPhrases: [passPhrase])
}

func getPassPhrases() -> [PassPhrase] {
Expand Down Expand Up @@ -65,12 +65,18 @@ final class InMemoryPassPhraseStorage: PassPhraseStorageType {
}
}

extension InMemoryPassPhraseStorage: LogOutHandler {
func logOutUser(email: String) throws {
passPhraseProvider.remove(passPhrases: passPhraseProvider.passPhrases)
}
}

// MARK: - Convenience

protocol InMemoryPassPhraseProviderType {
var passPhrases: Set<PassPhrase> { get }
func save(passPhrase: PassPhrase)
func removePassPhrases(with objects: PassPhrase)
func remove(passPhrases: Set<PassPhrase>)
}

/// - Warning: - should be shared instance
Expand All @@ -86,9 +92,7 @@ final class InMemoryPassPhraseProvider: InMemoryPassPhraseProviderType {
passPhrases.insert(passPhrase)
}

func removePassPhrases(with objects: PassPhrase) {
if passPhrases.contains(objects) {
passPhrases.remove(objects)
}
func remove(passPhrases passPhrasesToDelete: Set<PassPhrase>) {
passPhrasesToDelete.forEach { passPhrases.remove($0) }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,7 @@ class InMemoryPassPhraseProviderMock: InMemoryPassPhraseProviderType {
passPhrases.insert(passPhrase)
}

func removePassPhrases(with objects: PassPhrase) {
if passPhrases.contains(objects) {
passPhrases.remove(objects)
}
func remove(passPhrases passPhrasesToDelete: Set<PassPhrase>) {
passPhrasesToDelete.forEach { passPhrases.remove($0) }
}
}
7 changes: 7 additions & 0 deletions FlowCryptAppTests/LocalStorageTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ class LocalStorageTests: XCTestCase {

override func setUp() {
sut = LocalStorage()

let passPhrase = PassPhrase(value: "123", fingerprints: ["123"], date: nil)
sut.passPhraseStorage.save(passPhrase: passPhrase)
}

var trashKey: String {
Expand All @@ -27,8 +30,12 @@ class LocalStorageTests: XCTestCase {
}

func testLogOutForUser() throws {
XCTAssertFalse(sut.passPhraseStorage.getPassPhrases().isEmpty)

let user = "anton@gmail.com"
try sut.logOutUser(email: user)

XCTAssertNil(UserDefaults.standard.string(forKey: trashKey))
XCTAssertTrue(sut.passPhraseStorage.getPassPhrases().isEmpty)
}
}