WIP: add empty color-coded collections
This commit is contained in:
@@ -182,6 +182,7 @@ final class ClipboardPanelControllerTests: XCTestCase {
|
||||
XCTAssertEqual(ClipboardPanelController.modifiedShortcutAction(forKeyCode: 1, modifiers: [.command, .shift]), .toggleStack)
|
||||
XCTAssertEqual(ClipboardPanelController.modifiedShortcutAction(forKeyCode: 8, modifiers: [.command, .shift]), .copyPlainText)
|
||||
XCTAssertEqual(ClipboardPanelController.modifiedShortcutAction(forKeyCode: 9, modifiers: [.command, .shift]), .pastePlainText)
|
||||
XCTAssertEqual(ClipboardPanelController.modifiedShortcutAction(forKeyCode: 45, modifiers: [.command, .shift]), .newCollection)
|
||||
XCTAssertEqual(ClipboardPanelController.modifiedShortcutAction(forKeyCode: 36, modifiers: [.command, .shift]), .pasteStackNext)
|
||||
}
|
||||
|
||||
|
||||
@@ -239,6 +239,40 @@ final class ClipboardPanelViewModelTests: XCTestCase {
|
||||
XCTAssertEqual(viewModel.statusMessage, "Added to Pinned Research")
|
||||
}
|
||||
|
||||
func testCreateCollectionAddsEmptySelectableCollection() {
|
||||
let suiteName = "com.clipbored.testmodel.\(UUID().uuidString)"
|
||||
let defaults = UserDefaults(suiteName: suiteName)!
|
||||
defer {
|
||||
defaults.removePersistentDomain(forName: suiteName)
|
||||
}
|
||||
let settings = SettingsModel(defaults: defaults)
|
||||
settings.maxHistoryItems = 10
|
||||
settings.includeImageTextInSearch = false
|
||||
settings.pruneDuplicates = false
|
||||
let cacheService = makeCacheService()
|
||||
let store = makeStore(settings: settings, cacheService: cacheService)
|
||||
store.upsert(makeTextItem("outside note", createdAt: Date(timeIntervalSince1970: 100)))
|
||||
store.flushPersistenceForTesting()
|
||||
|
||||
let viewModel = ClipboardPanelViewModel(store: store, settings: settings, cacheService: cacheService)
|
||||
waitForVisibleItems(in: viewModel, count: 1)
|
||||
|
||||
viewModel.createCollection(named: " Client Work ", colorHex: "#0A9EB8")
|
||||
|
||||
XCTAssertEqual(viewModel.collectionNames, ["Client Work"])
|
||||
XCTAssertEqual(viewModel.collectionCount(named: "Client Work"), 0)
|
||||
XCTAssertEqual(viewModel.selectedCollectionName, "Client Work")
|
||||
XCTAssertTrue(viewModel.visibleItems.isEmpty)
|
||||
XCTAssertEqual(viewModel.collectionColorHex(named: "client work"), "#0A9EB8")
|
||||
XCTAssertEqual(viewModel.statusMessage, "Created Client Work")
|
||||
|
||||
let restoredSettings = SettingsModel(defaults: defaults)
|
||||
let restoredViewModel = ClipboardPanelViewModel(store: store, settings: restoredSettings, cacheService: cacheService)
|
||||
waitForVisibleItems(in: restoredViewModel, count: 1)
|
||||
XCTAssertEqual(restoredViewModel.collectionNames, ["Client Work"])
|
||||
XCTAssertEqual(restoredViewModel.collectionColorHex(named: "Client Work"), "#0A9EB8")
|
||||
}
|
||||
|
||||
func testSearchTextRecomputesVisibleItemsImmediately() {
|
||||
let settings = makeSettings()
|
||||
let cacheService = makeCacheService()
|
||||
|
||||
@@ -184,16 +184,10 @@ final class ClipboardPanelViewTests: XCTestCase {
|
||||
XCTAssertEqual(fixture.view.debugSelectedCollectionTitle, "Links")
|
||||
}
|
||||
|
||||
func testCollectionRailAddButtonCreatesCollectionForSelectedClip() {
|
||||
func testCollectionRailAddButtonCreatesEmptyCollection() {
|
||||
let fixture = makePanelFixture()
|
||||
|
||||
XCTAssertTrue(fixture.view.debugCollectionRailContainsAddButton)
|
||||
XCTAssertFalse(fixture.view.debugAddCollectionButtonIsEnabled)
|
||||
|
||||
fixture.store.upsert(makeTextItem("Collect this note", store: fixture.store))
|
||||
drainMainQueue()
|
||||
fixture.window.contentView?.layoutSubtreeIfNeeded()
|
||||
|
||||
XCTAssertTrue(fixture.view.debugAddCollectionButtonIsEnabled)
|
||||
|
||||
fixture.view.debugSetCollectionNameProvider { " Research Stack " }
|
||||
@@ -201,22 +195,29 @@ final class ClipboardPanelViewTests: XCTestCase {
|
||||
drainMainQueue()
|
||||
fixture.window.contentView?.layoutSubtreeIfNeeded()
|
||||
|
||||
XCTAssertEqual(fixture.viewModel.statusMessage, "Added to Research Stack")
|
||||
XCTAssertEqual(fixture.viewModel.statusMessage, "Created Research Stack")
|
||||
XCTAssertEqual(fixture.view.debugCustomCollectionTitles, ["Research Stack"])
|
||||
XCTAssertEqual(fixture.view.debugFirstCardHeaderTitle, "Text")
|
||||
XCTAssertEqual(fixture.view.debugFirstCardFooterDetailText, "Research Stack - 17 characters")
|
||||
XCTAssertEqual(fixture.view.debugCustomCollectionCounts, [0])
|
||||
XCTAssertEqual(fixture.view.debugSelectedCollectionTitle, "Research Stack")
|
||||
XCTAssertEqual(fixture.view.debugVisibleCardCount, 0)
|
||||
XCTAssertEqual(fixture.view.debugEmptyStateText?.title, "No clips in Research Stack")
|
||||
XCTAssertEqual(fixture.view.debugEmptyStateText?.detail, "Drag clips here or use Collect to add them.")
|
||||
}
|
||||
|
||||
fixture.viewModel.selectCollection(named: "Research Stack")
|
||||
func testCollectionFilteredCardsUseStoredCollectionHeaderColor() {
|
||||
let fixture = makePanelFixture()
|
||||
fixture.viewModel.createCollection(named: "Research Stack", colorHex: "#0A9EB8")
|
||||
var item = makeTextItem("Collect this note", store: fixture.store)
|
||||
item.collectionName = "Research Stack"
|
||||
fixture.store.upsert(item)
|
||||
drainMainQueue()
|
||||
fixture.window.contentView?.layoutSubtreeIfNeeded()
|
||||
|
||||
XCTAssertEqual(fixture.viewModel.visibleItems.map(\.payload), ["Collect this note"])
|
||||
XCTAssertEqual(fixture.view.debugFirstCardHeaderTitle, "Research Stack")
|
||||
XCTAssertEqual(fixture.view.debugFirstCardHeaderSubtitle, "Text - Just now")
|
||||
XCTAssertEqual(
|
||||
fixture.view.debugFirstCardHeaderColorHex,
|
||||
fixture.view.debugCustomCollectionColorHexes["Research Stack"] ?? ""
|
||||
)
|
||||
XCTAssertEqual(fixture.view.debugFirstCardHeaderColorHex, "#0A9EB8")
|
||||
XCTAssertEqual(fixture.view.debugCustomCollectionColorHexes["Research Stack"], "#0A9EB8")
|
||||
XCTAssertEqual(fixture.view.debugFirstCardFooterDetailText, "17 characters")
|
||||
}
|
||||
|
||||
|
||||
@@ -25,4 +25,28 @@ final class SettingsModelTests: XCTestCase {
|
||||
let restored = SettingsModel(defaults: defaults)
|
||||
XCTAssertTrue(restored.showDockIcon)
|
||||
}
|
||||
|
||||
func testCustomCollectionsPersistWithNormalizedColors() {
|
||||
let suiteName = "com.clipbored.settingsmodel.\(UUID().uuidString)"
|
||||
let defaults = UserDefaults(suiteName: suiteName)!
|
||||
defer {
|
||||
defaults.removePersistentDomain(forName: suiteName)
|
||||
}
|
||||
let settings = SettingsModel(defaults: defaults)
|
||||
var changes: [SettingsModel.Change] = []
|
||||
settings.observe { changes.append($0) }
|
||||
|
||||
settings.ensureCollection(named: " Research Stack ", colorHex: "0a9eb8")
|
||||
settings.ensureCollection(named: "research stack", colorHex: "#FF3355")
|
||||
settings.ensureCollection(named: "Client Work", colorHex: "not-a-color")
|
||||
|
||||
XCTAssertEqual(settings.customCollectionNames, ["Research Stack", "Client Work"])
|
||||
XCTAssertEqual(settings.collectionColorHex(forCollectionNamed: "research stack"), "#FF3355")
|
||||
XCTAssertNil(settings.collectionColorHex(forCollectionNamed: "Client Work"))
|
||||
XCTAssertEqual(changes, [.collections, .collections, .collections])
|
||||
|
||||
let restored = SettingsModel(defaults: defaults)
|
||||
XCTAssertEqual(restored.customCollectionNames, ["Research Stack", "Client Work"])
|
||||
XCTAssertEqual(restored.collectionColorHex(forCollectionNamed: "Research Stack"), "#FF3355")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user