You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
3.5 KiB
96 lines
3.5 KiB
import Testing
|
|
@testable import Music
|
|
|
|
struct TrackContextMenuConfigTests {
|
|
// Builds a config with all fields set and verifies:
|
|
// - stored playlists, lastUsedPlaylistName, selectedPlaylist match the inputs
|
|
// - onAddToPlaylist callback fires with the correct track and playlist
|
|
// - onAddToLastPlaylist callback fires with the correct track
|
|
// - onRemoveFromPlaylist callback fires with the correct track
|
|
// - when optional callbacks are nil, optionally calling them is safe
|
|
|
|
@Test func storesPropertiesAndFiresCallbacks() {
|
|
// 1. Create fixture data
|
|
let pl1 = Playlist.fixture(id: 1, name: "Favorites")
|
|
let pl2 = Playlist.fixture(id: 2, name: "Chill")
|
|
let track = Track.fixture(id: 42, title: "Test")
|
|
|
|
var addedTrack: Track? = nil
|
|
var addedPlaylist: Playlist? = nil
|
|
var lastTrack: Track? = nil
|
|
var removedTrack: Track? = nil
|
|
|
|
// 2. Build config with all callbacks
|
|
let config = TrackContextMenuConfig(
|
|
playlists: [pl1, pl2],
|
|
lastUsedPlaylistName: "Favorites",
|
|
selectedPlaylist: pl1,
|
|
onAddToPlaylist: { t, p in addedTrack = t; addedPlaylist = p },
|
|
onAddToLastPlaylist: { t in lastTrack = t },
|
|
onRemoveFromPlaylist: { t in removedTrack = t }
|
|
)
|
|
|
|
// 3. Verify stored properties
|
|
#expect(config.playlists.count == 2)
|
|
#expect(config.playlists[0].name == "Favorites")
|
|
#expect(config.lastUsedPlaylistName == "Favorites")
|
|
#expect(config.selectedPlaylist == pl1)
|
|
|
|
// 4. Invoke callbacks and verify they fire correctly
|
|
config.onAddToPlaylist(track, pl2)
|
|
config.onAddToLastPlaylist?(track)
|
|
config.onRemoveFromPlaylist?(track)
|
|
|
|
#expect(addedTrack?.id == track.id)
|
|
#expect(addedPlaylist?.id == pl2.id)
|
|
#expect(lastTrack?.id == track.id)
|
|
#expect(removedTrack?.id == track.id)
|
|
}
|
|
|
|
@Test func nilOptionalCallbacksAreSafe() {
|
|
// Verifies that a config with nil optional callbacks does not crash
|
|
// when you call them via optional chaining (the normal usage pattern)
|
|
let pl = Playlist.fixture(id: 1, name: "Rock")
|
|
let track = Track.fixture()
|
|
|
|
let config = TrackContextMenuConfig(
|
|
playlists: [pl],
|
|
lastUsedPlaylistName: nil,
|
|
selectedPlaylist: nil,
|
|
onAddToPlaylist: { _, _ in },
|
|
onAddToLastPlaylist: nil,
|
|
onRemoveFromPlaylist: nil
|
|
)
|
|
|
|
// These must not crash
|
|
config.onAddToLastPlaylist?(track)
|
|
config.onRemoveFromPlaylist?(track)
|
|
|
|
#expect(config.lastUsedPlaylistName == nil)
|
|
#expect(config.selectedPlaylist == nil)
|
|
}
|
|
|
|
// Verifies the queue callbacks fire with the right track.
|
|
@Test func queueCallbacksFire() {
|
|
let track = Track.fixture(id: 7, title: "Q")
|
|
var playNextTrack: Track? = nil
|
|
var addQueueTrack: Track? = nil
|
|
|
|
let config = TrackContextMenuConfig(
|
|
playlists: [],
|
|
lastUsedPlaylistName: nil,
|
|
selectedPlaylist: nil,
|
|
onAddToPlaylist: { _, _ in },
|
|
onAddToLastPlaylist: nil,
|
|
onRemoveFromPlaylist: nil,
|
|
onPlayNext: { t in playNextTrack = t },
|
|
onAddToQueue: { t in addQueueTrack = t }
|
|
)
|
|
|
|
config.onPlayNext?(track)
|
|
config.onAddToQueue?(track)
|
|
|
|
#expect(playNextTrack?.id == 7)
|
|
#expect(addQueueTrack?.id == 7)
|
|
}
|
|
}
|
|
|