Browse Source

Use DI for Menubar Provider..

pull/113/head
Abhishek Banthia 3 years ago
parent
commit
389dc88dc8
  1. 92
      Clocker/ClockerUnitTests/StandardMenubarHandlerTests.swift
  2. 2
      Clocker/Panel/ParentPanelController.swift
  3. 13
      Clocker/Preferences/Menu Bar/MenubarTitleProvider.swift
  4. 2
      Clocker/Preferences/Menu Bar/StatusItemHandler.swift

92
Clocker/ClockerUnitTests/StandardMenubarHandlerTests.swift

@ -14,51 +14,59 @@ class StandardMenubarHandlerTests: XCTestCase {
"latitude": "19.0759837",
"longitude": "72.8776559"]
func testValidStandardMenubarHandler_returnMenubarTitle() {
private func makeMockStore(with menubarMode: Int = 1) -> DataStore {
// Wipe all timezones from UserDefaults
DataStore.shared().setTimezones(nil)
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() {
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()
saveObject(object: dataObject, in: store)
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"))
// 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())
}
}

2
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()

13
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 {

2
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?

Loading…
Cancel
Save