From 5faa570c12fce7058c41cf8a7be45805ce65a39d Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Fri, 29 Jan 2016 17:33:23 +0100 Subject: [PATCH] Add ringtone name change event handling Issue #161 --- Telephone/InteractorFactoryImpl.swift | 4 ++++ .../SoundPreferencesViewEventHandler.swift | 4 ++++ Telephone/SoundPreferencesViewObserver.swift | 1 + .../InteractorFactoryImplTests.swift | 20 +++++++++++++------ ...oundPreferencesViewEventHandlerTests.swift | 10 ++++++++++ UseCases/InteractorFactory.swift | 1 + ...aultsRingtoneSoundNameSaveInteractor.swift | 4 ++-- .../InteractorFactorySpy.swift | 11 ++++++++++ 8 files changed, 47 insertions(+), 8 deletions(-) diff --git a/Telephone/InteractorFactoryImpl.swift b/Telephone/InteractorFactoryImpl.swift index f167569fa..4eff9a697 100644 --- a/Telephone/InteractorFactoryImpl.swift +++ b/Telephone/InteractorFactoryImpl.swift @@ -47,4 +47,8 @@ extension InteractorFactoryImpl: InteractorFactory { func createUserDefaultsSoundIOSaveInteractorWithSoundIO(soundIO: SoundIO) -> Interactor { return UserDefaultsSoundIOSaveInteractor(soundIO: soundIO, userDefaults: userDefaults) } + + func createUserDefaultsRingtoneSoundNameSaveInteractorWithName(name: String) -> Interactor { + return UserDefaultsRingtoneSoundNameSaveInteractor(soundName: name, userDefaults: userDefaults) + } } diff --git a/Telephone/SoundPreferencesViewEventHandler.swift b/Telephone/SoundPreferencesViewEventHandler.swift index 8874784f5..228f4d529 100644 --- a/Telephone/SoundPreferencesViewEventHandler.swift +++ b/Telephone/SoundPreferencesViewEventHandler.swift @@ -46,6 +46,10 @@ extension SoundPreferencesViewEventHandler: SoundPreferencesViewObserver { selectUserAgentAudioDevicesOrLogError() } + func viewDidChangeRingtoneName(name: String) { + interactorFactory.createUserDefaultsRingtoneSoundNameSaveInteractorWithName(name).execute() + } + private func updateUserDefaultsWithSoundIO(soundIO: SoundIO) { interactorFactory.createUserDefaultsSoundIOSaveInteractorWithSoundIO(soundIO).execute() } diff --git a/Telephone/SoundPreferencesViewObserver.swift b/Telephone/SoundPreferencesViewObserver.swift index be164e4d2..b7129eba3 100644 --- a/Telephone/SoundPreferencesViewObserver.swift +++ b/Telephone/SoundPreferencesViewObserver.swift @@ -18,4 +18,5 @@ @objc protocol SoundPreferencesViewObserver { func viewShouldReloadData(view: SoundPreferencesView) func viewDidChangeSoundInput(soundInput: String, soundOutput: String, ringtoneOutput: String) + func viewDidChangeRingtoneName(name: String) } diff --git a/TelephoneTests/InteractorFactoryImplTests.swift b/TelephoneTests/InteractorFactoryImplTests.swift index a76ae7b7b..d214bae17 100644 --- a/TelephoneTests/InteractorFactoryImplTests.swift +++ b/TelephoneTests/InteractorFactoryImplTests.swift @@ -21,14 +21,14 @@ import XCTest class InteractorFactoryImplTests: XCTestCase { var repositoryDummy: SystemAudioDeviceRepository! - var userDefaultsDummy: UserDefaults! + var userDefaults: UserDefaults! var sut: InteractorFactoryImpl! override func setUp() { super.setUp() repositoryDummy = SystemAudioDeviceRepositoryStub() - userDefaultsDummy = UserDefaultsFake() - sut = InteractorFactoryImpl(systemAudioDeviceRepository: repositoryDummy, userDefaults: userDefaultsDummy) + userDefaults = UserDefaultsFake() + sut = InteractorFactoryImpl(systemAudioDeviceRepository: repositoryDummy, userDefaults: userDefaults) } func testCanCreateUserAgentSoundIOSelectionInteractor() { @@ -39,7 +39,7 @@ class InteractorFactoryImplTests: XCTestCase { XCTAssertNotNil(result) XCTAssertTrue(result.systemAudioDeviceRepository === repositoryDummy) XCTAssertTrue(result.userAgent === userAgentDummy) - XCTAssertTrue(result.userDefaults === userDefaultsDummy) + XCTAssertTrue(result.userDefaults === userDefaults) } func testCanCreateUserDefaultsSoundIOLoadInteractor() { @@ -49,7 +49,7 @@ class InteractorFactoryImplTests: XCTestCase { XCTAssertNotNil(result) XCTAssertTrue(result.systemAudioDeviceRepository === repositoryDummy) - XCTAssertTrue(result.userDefaults === userDefaultsDummy) + XCTAssertTrue(result.userDefaults === userDefaults) XCTAssertTrue(result.output === outputDummy) } @@ -60,6 +60,14 @@ class InteractorFactoryImplTests: XCTestCase { XCTAssertNotNil(result) XCTAssertEqual(result.soundIO, soundIO) - XCTAssertTrue(result.userDefaults === userDefaultsDummy) + XCTAssertTrue(result.userDefaults === userDefaults) + } + + func testCanCreateUserDefaultsRingtoneSoundNameSaveInteractor() { + let result = sut.createUserDefaultsRingtoneSoundNameSaveInteractorWithName("sound-name") as! UserDefaultsRingtoneSoundNameSaveInteractor + + XCTAssertNotNil(result) + XCTAssertEqual(result.soundName, "sound-name") + XCTAssertTrue(result.userDefaults === userDefaults) } } diff --git a/TelephoneTests/SoundPreferencesViewEventHandlerTests.swift b/TelephoneTests/SoundPreferencesViewEventHandlerTests.swift index 3867b59f2..576586abd 100644 --- a/TelephoneTests/SoundPreferencesViewEventHandlerTests.swift +++ b/TelephoneTests/SoundPreferencesViewEventHandlerTests.swift @@ -62,4 +62,14 @@ class SoundPreferencesViewEventHandlerTests: XCTestCase { XCTAssertTrue(interactorSpy.didCallExecute) } + + func testExecutesUserDefaultsRingtoneSoundNameSaveInteractorWithExpectedArgumentsOnRingtoneNameChange() { + let interactorSpy = InteractorSpy() + interactorFactorySpy.stubWithUserDefaultsRingtoneSoundNameSaveInteractor(interactorSpy) + + sut.viewDidChangeRingtoneName("sound-name") + + XCTAssertEqual(interactorFactorySpy.invokedRingtoneSoundName, "sound-name") + XCTAssertTrue(interactorSpy.didCallExecute) + } } diff --git a/UseCases/InteractorFactory.swift b/UseCases/InteractorFactory.swift index 884d7a72f..ffbc7a5a1 100644 --- a/UseCases/InteractorFactory.swift +++ b/UseCases/InteractorFactory.swift @@ -19,4 +19,5 @@ public protocol InteractorFactory { func createUserAgentSoundIOSelectionInteractorWithUserAgent(userAgent: UserAgent) -> ThrowingInteractor func createUserDefaultsSoundIOLoadInteractorWithOutput(output: UserDefaultsSoundIOLoadInteractorOutput) -> ThrowingInteractor func createUserDefaultsSoundIOSaveInteractorWithSoundIO(soundIO: SoundIO) -> Interactor + func createUserDefaultsRingtoneSoundNameSaveInteractorWithName(name: String) -> Interactor } diff --git a/UseCases/UserDefaultsRingtoneSoundNameSaveInteractor.swift b/UseCases/UserDefaultsRingtoneSoundNameSaveInteractor.swift index e6e95bdb4..f80c77a8b 100644 --- a/UseCases/UserDefaultsRingtoneSoundNameSaveInteractor.swift +++ b/UseCases/UserDefaultsRingtoneSoundNameSaveInteractor.swift @@ -16,8 +16,8 @@ // public class UserDefaultsRingtoneSoundNameSaveInteractor { - let soundName: String - let userDefaults: UserDefaults + public let soundName: String + public let userDefaults: UserDefaults public init(soundName: String, userDefaults: UserDefaults) { self.soundName = soundName diff --git a/UseCasesTestDoubles/InteractorFactorySpy.swift b/UseCasesTestDoubles/InteractorFactorySpy.swift index 28ce20cab..569f439f5 100644 --- a/UseCasesTestDoubles/InteractorFactorySpy.swift +++ b/UseCasesTestDoubles/InteractorFactorySpy.swift @@ -21,8 +21,10 @@ public class InteractorFactorySpy { public private(set) var userAgentSoundIOSelectionInteractor: ThrowingInteractor! public private(set) var userDefaultsSoundIOLoadInteractor: ThrowingInteractor! public private(set) var userDefaultsSoundIOSaveInteractor: Interactor! + public private(set) var userDefaultsRingtoneSoundNameSaveInteractor: Interactor! public private(set) var invokedSoundIO = SoundIO(soundInput: "", soundOutput: "", ringtoneOutput: "") + public private(set) var invokedRingtoneSoundName = "" public init() {} @@ -37,6 +39,10 @@ public class InteractorFactorySpy { public func stubWithUserDefaultsSoundIOSaveInteractor(interactor: Interactor) { userDefaultsSoundIOSaveInteractor = interactor } + + public func stubWithUserDefaultsRingtoneSoundNameSaveInteractor(interactor: Interactor) { + userDefaultsRingtoneSoundNameSaveInteractor = interactor + } } extension InteractorFactorySpy: InteractorFactory { @@ -52,4 +58,9 @@ extension InteractorFactorySpy: InteractorFactory { invokedSoundIO = soundIO return userDefaultsSoundIOSaveInteractor } + + public func createUserDefaultsRingtoneSoundNameSaveInteractorWithName(name: String) -> Interactor { + invokedRingtoneSoundName = name + return userDefaultsRingtoneSoundNameSaveInteractor + } }