107 lines
3.9 KiB
JavaScript
107 lines
3.9 KiB
JavaScript
import { expect, test, describe, beforeEach, afterEach, vi } from 'vitest';
|
|
import { MusicDatabase } from '../db.js';
|
|
|
|
describe('MusicDatabase', () => {
|
|
let db;
|
|
const TEST_DB_NAME = 'TestMonochromeDB';
|
|
|
|
beforeEach(async () => {
|
|
db = new MusicDatabase();
|
|
db.dbName = TEST_DB_NAME;
|
|
const req = indexedDB.deleteDatabase(TEST_DB_NAME);
|
|
await new Promise((resolve) => {
|
|
req.onsuccess = resolve;
|
|
req.onerror = resolve;
|
|
});
|
|
});
|
|
|
|
afterEach(async () => {
|
|
if (db.db) {
|
|
db.db.close();
|
|
}
|
|
const req = indexedDB.deleteDatabase(TEST_DB_NAME);
|
|
await new Promise((resolve) => {
|
|
req.onsuccess = resolve;
|
|
req.onerror = resolve;
|
|
});
|
|
});
|
|
|
|
test('opens database and creates stores', async () => {
|
|
const openedDb = await db.open();
|
|
expect(openedDb.name).toBe(TEST_DB_NAME);
|
|
expect(openedDb.objectStoreNames.contains('favorites_tracks')).toBe(true);
|
|
expect(openedDb.objectStoreNames.contains('history_tracks')).toBe(true);
|
|
expect(openedDb.objectStoreNames.contains('user_playlists')).toBe(true);
|
|
});
|
|
|
|
test('toggleFavorite adds and removes items', async () => {
|
|
const track = { id: 'track1', title: 'Test Track', artist: { name: 'Artist' } };
|
|
|
|
const added = await db.toggleFavorite('track', track);
|
|
expect(added).toBe(true);
|
|
const favorites = await db.getFavorites('track');
|
|
expect(favorites.length).toBe(1);
|
|
expect(favorites[0].id).toBe('track1');
|
|
|
|
const removed = await db.toggleFavorite('track', track);
|
|
expect(removed).toBe(false);
|
|
const favoritesAfter = await db.getFavorites('track');
|
|
expect(favoritesAfter.length).toBe(0);
|
|
});
|
|
|
|
test('addToHistory manages recent tracks and avoids duplicates', async () => {
|
|
const track1 = { id: 't1', title: 'Track 1' };
|
|
const track2 = { id: 't2', title: 'Track 2' };
|
|
|
|
await db.addToHistory(track1);
|
|
await db.addToHistory(track2);
|
|
await db.addToHistory(track1);
|
|
|
|
const history = await db.getHistory();
|
|
expect(history.length).toBe(2);
|
|
expect(history[0].id).toBe('t1');
|
|
expect(history[1].id).toBe('t2');
|
|
});
|
|
|
|
test('playlist operations: create, add, remove, delete', async () => {
|
|
const track = { id: 'track1', title: 'Test Track' };
|
|
|
|
const playlist = await db.createPlaylist('My Playlist', [track]);
|
|
expect(playlist.name).toBe('My Playlist');
|
|
expect(playlist.tracks.length).toBe(1);
|
|
|
|
const track2 = { id: 'track2', title: 'Track 2' };
|
|
await db.addTrackToPlaylist(playlist.id, track2);
|
|
|
|
const updated = await db.getPlaylist(playlist.id);
|
|
expect(updated.tracks.length).toBe(2);
|
|
expect(updated.tracks[1].id).toBe('track2');
|
|
|
|
await db.removeTrackFromPlaylist(playlist.id, 'track1');
|
|
const afterRemove = await db.getPlaylist(playlist.id);
|
|
expect(afterRemove.tracks.length).toBe(1);
|
|
expect(afterRemove.tracks[0].id).toBe('track2');
|
|
|
|
await db.deletePlaylist(playlist.id);
|
|
const deleted = await db.getPlaylist(playlist.id);
|
|
expect(deleted).toBeUndefined();
|
|
});
|
|
|
|
test('pinned items management', async () => {
|
|
const album = { id: 'album1', title: 'Album 1', type: 'album' };
|
|
|
|
await db.togglePinned(album, 'album');
|
|
let pinned = await db.getPinned();
|
|
expect(pinned.length).toBe(1);
|
|
expect(pinned[0].id).toBe('album1');
|
|
|
|
await db.togglePinned({ id: 'a2', title: 'A2' }, 'album');
|
|
await db.togglePinned({ id: 'a3', title: 'A3' }, 'album');
|
|
await db.togglePinned({ id: 'a4', title: 'A4' }, 'album');
|
|
|
|
pinned = await db.getPinned();
|
|
expect(pinned.length).toBe(3);
|
|
expect(pinned.some((p) => p.id === 'a4')).toBe(true);
|
|
expect(pinned.some((p) => p.id === 'album1')).toBe(false);
|
|
});
|
|
});
|