diff --git a/Clocker/ClockerUnitTests/StandardMenubarHandlerTests.swift b/Clocker/ClockerUnitTests/StandardMenubarHandlerTests.swift index 29d5fe7..8d8c53e 100644 --- a/Clocker/ClockerUnitTests/StandardMenubarHandlerTests.swift +++ b/Clocker/ClockerUnitTests/StandardMenubarHandlerTests.swift @@ -13,52 +13,60 @@ class StandardMenubarHandlerTests: XCTestCase { "nextUpdate": "", "latitude": "19.0759837", "longitude": "72.8776559"] + + private func makeMockStore(with menubarMode: Int = 1) -> DataStore { + // Wipe all timezones from UserDefaults + guard let defaults = UserDefaults(suiteName: "com.abhishek.Clocker.StandardMenubarHandlerTests") else { + XCTFail("User defaults couldn't be initialized") + return DataStore.shared() + } + defaults.set(menubarMode, forKey: CLMenubarCompactMode) + defaults.set(0, forKey: CLShowMeetingInMenubar) + XCTAssertNotEqual(defaults, UserDefaults.standard) + return DataStore(with: defaults) + } + + private func saveObject(object: TimezoneData, + in store: DataStore, + at index: Int = -1) { + var defaults = store.timezones() + let encodedObject = NSKeyedArchiver.archivedData(withRootObject: object as Any) + index == -1 ? defaults.append(encodedObject) : defaults.insert(encodedObject, at: index) + store.setTimezones(defaults) + } func testValidStandardMenubarHandler_returnMenubarTitle() { - // Wipe all timezones from UserDefaults - DataStore.shared().setTimezones(nil) + let store = makeMockStore() + store.setTimezones(nil) // Save a menubar selected timezone let dataObject = TimezoneData(with: mumbai) dataObject.isFavourite = 1 - let operationsObject = TimezoneDataOperations(with: dataObject) - operationsObject.saveObject() - - let menubarTimezones = DataStore.shared().menubarTimezones() - XCTAssertTrue(menubarTimezones?.count == 1) - - // Set standard menubar in Prefs - UserDefaults.standard.set(1, forKey: CLMenubarCompactMode) - - let menubarHandler = MenubarTitleProvider() - let menubarString = menubarHandler.titleForMenubar() ?? "" - - // Test menubar string is present - XCTAssertTrue(menubarString.count > 0) - XCTAssertTrue(menubarString.contains("Ghar")) + saveObject(object: dataObject, in: store) - // Set default back to compact menubar - UserDefaults.standard.set(0, forKey: CLMenubarCompactMode) + let menubarTimezones = store.menubarTimezones() + XCTAssertTrue(menubarTimezones?.count == 1, "Count is \(String(describing: menubarTimezones?.count))") } func testUnfavouritedTimezone_returnEmptyMenubarTimezoneCount() { + let store = makeMockStore() // Wipe all timezones from UserDefaults - DataStore.shared().setTimezones(nil) + store.setTimezones(nil) // Save a menubar selected timezone let dataObject = TimezoneData(with: mumbai) dataObject.isFavourite = 0 - let operationsObject = TimezoneDataOperations(with: dataObject) - operationsObject.saveObject() + saveObject(object: dataObject, in: store) - let menubarTimezones = DataStore.shared().menubarTimezones() + let menubarTimezones = store.menubarTimezones() XCTAssertTrue(menubarTimezones?.count == 0) } func testUnfavouritedTimezone_returnNilMenubarString() { + let store = makeMockStore() // Wipe all timezones from UserDefaults - DataStore.shared().setTimezones(nil) - let menubarHandler = MenubarTitleProvider() + store.setTimezones(nil) + let menubarHandler = MenubarTitleProvider(with: store) let emptyMenubarString = menubarHandler.titleForMenubar() // Returns early because DataStore.menubarTimezones is nil XCTAssertNil(emptyMenubarString) @@ -66,12 +74,42 @@ class StandardMenubarHandlerTests: XCTestCase { // Save a menubar selected timezone let dataObject = TimezoneData(with: mumbai) dataObject.isFavourite = 0 - let operationsObject = TimezoneDataOperations(with: dataObject) - operationsObject.saveObject() + saveObject(object: dataObject, in: store) let menubarString = menubarHandler.titleForMenubar() ?? "" // Test menubar string is absent XCTAssertTrue(menubarString.count == 0) } + + func testWithEmptyMenubarTimezones() { + let store = makeMockStore() + store.setTimezones(nil) + let menubarHandler = MenubarTitleProvider(with: store) + XCTAssertNil(menubarHandler.titleForMenubar()) + } + + func testWithStandardMenubarMode() { + // Set mode to standard mode + let store = makeMockStore(with: 0) + // Save a menubar selected timezone + let dataObject = TimezoneData(with: mumbai) + dataObject.isFavourite = 1 + saveObject(object: dataObject, in: store) + + let menubarHandler = MenubarTitleProvider(with: store) + XCTAssertNil(menubarHandler.titleForMenubar()) + } + + func testProviderPassingAllConditions() { + // Set mode to standard mode + let store = makeMockStore() + // Save a menubar selected timezone + let dataObject = TimezoneData(with: mumbai) + dataObject.isFavourite = 1 + saveObject(object: dataObject, in: store) + + let menubarHandler = MenubarTitleProvider(with: store) + XCTAssertNotNil(menubarHandler.titleForMenubar()) + } } diff --git a/Clocker/Panel/ParentPanelController.swift b/Clocker/Panel/ParentPanelController.swift index 3fa0220..d101ed9 100644 --- a/Clocker/Panel/ParentPanelController.swift +++ b/Clocker/Panel/ParentPanelController.swift @@ -584,7 +584,7 @@ class ParentPanelController: NSWindowController { Logger.log(object: nil, for: "Deleted Timezone Through Swipe") } - private lazy var menubarTitleHandler = MenubarTitleProvider() + private lazy var menubarTitleHandler = MenubarTitleProvider(with: DataStore.shared()) @objc func updateTime() { let store = DataStore.shared() diff --git a/Clocker/Preferences/Menu Bar/MenubarTitleProvider.swift b/Clocker/Preferences/Menu Bar/MenubarTitleProvider.swift index 84aee9f..27070de 100644 --- a/Clocker/Preferences/Menu Bar/MenubarTitleProvider.swift +++ b/Clocker/Preferences/Menu Bar/MenubarTitleProvider.swift @@ -6,17 +6,24 @@ import CoreModelKit import EventKit class MenubarTitleProvider: NSObject { + private let store: DataStore + + init(with dataStore: DataStore) { + self.store = dataStore + super.init() + } + func titleForMenubar() -> String? { if let nextEvent = checkForUpcomingEvents() { return nextEvent } - guard let menubarTitles = DataStore.shared().menubarTimezones() else { + guard let menubarTitles = store.menubarTimezones() else { return nil } // If the menubar is in compact mode, we don't need any of the below calculations; exit early - if DataStore.shared().shouldDisplay(.menubarCompactMode) { + if store.shouldDisplay(.menubarCompactMode) { return nil } @@ -35,7 +42,7 @@ class MenubarTitleProvider: NSObject { } func checkForUpcomingEvents() -> String? { - if DataStore.shared().shouldDisplay(.showMeetingInMenubar) { + if store.shouldDisplay(.showMeetingInMenubar) { let filteredDates = EventCenter.sharedCenter().eventsForDate let autoupdatingCal = EventCenter.sharedCenter().autoupdatingCalendar guard let events = filteredDates[autoupdatingCal.startOfDay(for: Date())] else { diff --git a/Clocker/Preferences/Menu Bar/StatusItemHandler.swift b/Clocker/Preferences/Menu Bar/StatusItemHandler.swift index e894650..7506508 100644 --- a/Clocker/Preferences/Menu Bar/StatusItemHandler.swift +++ b/Clocker/Preferences/Menu Bar/StatusItemHandler.swift @@ -22,7 +22,7 @@ class StatusItemHandler: NSObject { return statusItem }() - private var menubarTitleHandler = MenubarTitleProvider() + private var menubarTitleHandler = MenubarTitleProvider(with: DataStore.shared()) private var statusContainerView: StatusContainerView?