From dce5b557afc31225fc2786a44520194f244a81f2 Mon Sep 17 00:00:00 2001 From: 4gray Date: Fri, 22 May 2026 03:53:35 +0300 Subject: [PATCH] test(electron): split sqlite ipc contract fixtures --- .../src/app/api/main.preload.spec-data.ts | 321 +++++++++++++++++ .../src/app/api/main.preload.spec.ts | 325 +----------------- .../database/worker-ipc-contract.spec-data.ts | 299 ++++++++++++++++ .../database/worker-ipc-contract.spec.ts | 305 +--------------- apps/electron-backend/tsconfig.app.json | 2 + 5 files changed, 630 insertions(+), 622 deletions(-) create mode 100644 apps/electron-backend/src/app/api/main.preload.spec-data.ts create mode 100644 apps/electron-backend/src/app/events/database/worker-ipc-contract.spec-data.ts diff --git a/apps/electron-backend/src/app/api/main.preload.spec-data.ts b/apps/electron-backend/src/app/api/main.preload.spec-data.ts new file mode 100644 index 000000000..c05a36804 --- /dev/null +++ b/apps/electron-backend/src/app/api/main.preload.spec-data.ts @@ -0,0 +1,321 @@ +type PreloadInvokeCase = { + method: string; + args: unknown[]; + channel: string; + forwardedArgs: unknown[]; +}; + +const playlistId = 'playlist-1'; +export const operationId = 'operation-1'; +const playlist = { id: playlistId, name: 'Playlist', type: 'xtream' }; +const playlists = [playlist]; +const playlistUpdates = { name: 'Updated playlist' }; +const categories = [{ category_id: '10', category_name: 'Live' }]; +const streams = [{ stream_id: 42, name: 'Channel' }]; +const favorites = [{ contentId: 1, playlistId }]; +const recentlyViewed = [{ contentId: 2, playlistId }]; +const categoryIds = [10, 11]; +const reorderUpdates = [{ content_id: 12, position: 1 }]; +const recentItemsBatch = [{ contentId: 13, playlistId }]; +const playbackData = { + contentXtreamId: 42, + contentType: 'vod', + positionSeconds: 120, +}; + +export const dbPreloadCases: PreloadInvokeCase[] = [ + { + method: 'dbCreatePlaylist', + args: [playlist], + channel: 'DB_CREATE_PLAYLIST', + forwardedArgs: [playlist], + }, + { + method: 'dbGetPlaylist', + args: [playlistId], + channel: 'DB_GET_PLAYLIST', + forwardedArgs: [playlistId], + }, + { + method: 'dbUpsertAppPlaylist', + args: [playlist], + channel: 'DB_UPSERT_APP_PLAYLIST', + forwardedArgs: [playlist], + }, + { + method: 'dbUpsertAppPlaylists', + args: [playlists], + channel: 'DB_UPSERT_APP_PLAYLISTS', + forwardedArgs: [playlists], + }, + { + method: 'dbGetAppPlaylists', + args: [], + channel: 'DB_GET_APP_PLAYLISTS', + forwardedArgs: [], + }, + { + method: 'dbGetAppPlaylist', + args: [playlistId], + channel: 'DB_GET_APP_PLAYLIST', + forwardedArgs: [playlistId], + }, + { + method: 'dbUpdatePlaylist', + args: [playlistId, playlistUpdates], + channel: 'DB_UPDATE_PLAYLIST', + forwardedArgs: [playlistId, playlistUpdates], + }, + { + method: 'dbDeletePlaylist', + args: [playlistId, operationId], + channel: 'DB_DELETE_PLAYLIST', + forwardedArgs: [playlistId, operationId], + }, + { + method: 'dbDeleteXtreamContent', + args: [playlistId, operationId], + channel: 'DB_DELETE_XTREAM_CONTENT', + forwardedArgs: [playlistId, operationId], + }, + { + method: 'dbRestoreXtreamUserData', + args: [playlistId, favorites, recentlyViewed, operationId], + channel: 'DB_RESTORE_XTREAM_USER_DATA', + forwardedArgs: [playlistId, favorites, recentlyViewed, operationId], + }, + { + method: 'dbHasCategories', + args: [playlistId, 'live'], + channel: 'DB_HAS_CATEGORIES', + forwardedArgs: [playlistId, 'live'], + }, + { + method: 'dbGetCategories', + args: [playlistId, 'live'], + channel: 'DB_GET_CATEGORIES', + forwardedArgs: [playlistId, 'live'], + }, + { + method: 'dbSaveCategories', + args: [playlistId, categories, 'live', categoryIds], + channel: 'DB_SAVE_CATEGORIES', + forwardedArgs: [playlistId, categories, 'live', categoryIds], + }, + { + method: 'dbGetAllCategories', + args: [playlistId, 'live'], + channel: 'DB_GET_ALL_CATEGORIES', + forwardedArgs: [playlistId, 'live'], + }, + { + method: 'dbUpdateCategoryVisibility', + args: [categoryIds, true], + channel: 'DB_UPDATE_CATEGORY_VISIBILITY', + forwardedArgs: [categoryIds, true], + }, + { + method: 'dbHasContent', + args: [playlistId, 'movie'], + channel: 'DB_HAS_CONTENT', + forwardedArgs: [playlistId, 'movie'], + }, + { + method: 'dbGetContent', + args: [playlistId, 'movie'], + channel: 'DB_GET_CONTENT', + forwardedArgs: [playlistId, 'movie'], + }, + { + method: 'dbSaveContent', + args: [playlistId, streams, 'movie', operationId], + channel: 'DB_SAVE_CONTENT', + forwardedArgs: [playlistId, streams, 'movie', operationId], + }, + { + method: 'dbClearXtreamImportCache', + args: [playlistId, 'movie'], + channel: 'DB_CLEAR_XTREAM_IMPORT_CACHE', + forwardedArgs: [playlistId, 'movie'], + }, + { + method: 'dbSearchContent', + args: [playlistId, 'matrix', ['movie'], true], + channel: 'DB_SEARCH_CONTENT', + forwardedArgs: [playlistId, 'matrix', ['movie'], true], + }, + { + method: 'dbGlobalSearch', + args: ['matrix', ['movie'], true], + channel: 'DB_GLOBAL_SEARCH', + forwardedArgs: ['matrix', ['movie'], true], + }, + { + method: 'dbGetGlobalRecentlyAdded', + args: ['vod', 50, 'xtream'], + channel: 'DB_GET_GLOBAL_RECENTLY_ADDED', + forwardedArgs: ['vod', 50, 'xtream'], + }, + { + method: 'dbGetRecentlyViewed', + args: [], + channel: 'DB_GET_RECENTLY_VIEWED', + forwardedArgs: [], + }, + { + method: 'dbClearRecentlyViewed', + args: [], + channel: 'DB_CLEAR_RECENTLY_VIEWED', + forwardedArgs: [], + }, + { + method: 'dbAddFavorite', + args: [12, playlistId, 'https://image.example/backdrop.jpg'], + channel: 'DB_ADD_FAVORITE', + forwardedArgs: [12, playlistId, 'https://image.example/backdrop.jpg'], + }, + { + method: 'dbRemoveFavorite', + args: [12, playlistId], + channel: 'DB_REMOVE_FAVORITE', + forwardedArgs: [12, playlistId], + }, + { + method: 'dbIsFavorite', + args: [12, playlistId], + channel: 'DB_IS_FAVORITE', + forwardedArgs: [12, playlistId], + }, + { + method: 'dbGetFavorites', + args: [playlistId], + channel: 'DB_GET_FAVORITES', + forwardedArgs: [playlistId], + }, + { + method: 'dbGetGlobalFavorites', + args: [], + channel: 'DB_GET_GLOBAL_FAVORITES', + forwardedArgs: [], + }, + { + method: 'dbGetAllGlobalFavorites', + args: [], + channel: 'DB_GET_ALL_GLOBAL_FAVORITES', + forwardedArgs: [], + }, + { + method: 'dbReorderGlobalFavorites', + args: [reorderUpdates], + channel: 'DB_REORDER_GLOBAL_FAVORITES', + forwardedArgs: [reorderUpdates], + }, + { + method: 'dbGetRecentItems', + args: [playlistId], + channel: 'DB_GET_RECENT_ITEMS', + forwardedArgs: [playlistId], + }, + { + method: 'dbAddRecentItem', + args: [13, playlistId, 'https://image.example/recent.jpg'], + channel: 'DB_ADD_RECENT_ITEM', + forwardedArgs: [13, playlistId, 'https://image.example/recent.jpg'], + }, + { + method: 'dbClearPlaylistRecentItems', + args: [playlistId], + channel: 'DB_CLEAR_PLAYLIST_RECENT_ITEMS', + forwardedArgs: [playlistId], + }, + { + method: 'dbRemoveRecentItem', + args: [13, playlistId], + channel: 'DB_REMOVE_RECENT_ITEM', + forwardedArgs: [13, playlistId], + }, + { + method: 'dbRemoveRecentItemsBatch', + args: [recentItemsBatch], + channel: 'DB_REMOVE_RECENT_ITEMS_BATCH', + forwardedArgs: [recentItemsBatch], + }, + { + method: 'dbGetContentByXtreamId', + args: [42, playlistId, 'movie'], + channel: 'DB_GET_CONTENT_BY_XTREAM_ID', + forwardedArgs: [42, playlistId, 'movie'], + }, + { + method: 'dbSetContentBackdropIfMissing', + args: [12, 'https://image.example/backdrop.jpg'], + channel: 'DB_SET_CONTENT_BACKDROP_IF_MISSING', + forwardedArgs: [12, 'https://image.example/backdrop.jpg'], + }, + { + method: 'dbDeleteAllPlaylists', + args: [operationId], + channel: 'DB_DELETE_ALL_PLAYLISTS', + forwardedArgs: [operationId], + }, + { + method: 'dbCancelOperation', + args: [operationId], + channel: 'DB_CANCEL_OPERATION', + forwardedArgs: [operationId], + }, + { + method: 'dbGetAppState', + args: ['workspace:last-route'], + channel: 'DB_GET_APP_STATE', + forwardedArgs: ['workspace:last-route'], + }, + { + method: 'dbSetAppState', + args: ['workspace:last-route', '/workspace'], + channel: 'DB_SET_APP_STATE', + forwardedArgs: ['workspace:last-route', '/workspace'], + }, + { + method: 'dbSavePlaybackPosition', + args: [playlistId, playbackData], + channel: 'DB_SAVE_PLAYBACK_POSITION', + forwardedArgs: [playlistId, playbackData], + }, + { + method: 'dbGetPlaybackPosition', + args: [playlistId, 42, 'vod'], + channel: 'DB_GET_PLAYBACK_POSITION', + forwardedArgs: [playlistId, 42, 'vod'], + }, + { + method: 'dbGetSeriesPlaybackPositions', + args: [playlistId, 88], + channel: 'DB_GET_SERIES_PLAYBACK_POSITIONS', + forwardedArgs: [playlistId, 88], + }, + { + method: 'dbGetRecentPlaybackPositions', + args: [playlistId, 20], + channel: 'DB_GET_RECENT_PLAYBACK_POSITIONS', + forwardedArgs: [playlistId, 20], + }, + { + method: 'dbGetAllPlaybackPositions', + args: [playlistId], + channel: 'DB_GET_ALL_PLAYBACK_POSITIONS', + forwardedArgs: [playlistId], + }, + { + method: 'dbClearAllPlaybackPositions', + args: [playlistId], + channel: 'DB_CLEAR_ALL_PLAYBACK_POSITIONS', + forwardedArgs: [playlistId], + }, + { + method: 'dbClearPlaybackPosition', + args: [playlistId, 42, 'vod'], + channel: 'DB_CLEAR_PLAYBACK_POSITION', + forwardedArgs: [playlistId, 42, 'vod'], + }, +]; diff --git a/apps/electron-backend/src/app/api/main.preload.spec.ts b/apps/electron-backend/src/app/api/main.preload.spec.ts index 17ceeb626..27b3e9268 100644 --- a/apps/electron-backend/src/app/api/main.preload.spec.ts +++ b/apps/electron-backend/src/app/api/main.preload.spec.ts @@ -2,6 +2,7 @@ import { DB_WORKER_OPERATIONS, DbWorkerOperation, } from '../workers/database-worker.types'; +import { dbPreloadCases, operationId } from './main.preload.spec-data'; type ExposedElectronApi = Record unknown>; @@ -12,332 +13,10 @@ type MockIpcRenderer = { send: jest.Mock; }; -type PreloadInvokeCase = { - method: string; - args: unknown[]; - channel: string; - forwardedArgs: unknown[]; -}; - let mockExposedApi: ExposedElectronApi | null; let mockIpcRenderer: MockIpcRenderer; let mockGetPathForFile: jest.Mock; -const playlistId = 'playlist-1'; -const operationId = 'operation-1'; -const playlist = { id: playlistId, name: 'Playlist', type: 'xtream' }; -const playlists = [playlist]; -const playlistUpdates = { name: 'Updated playlist' }; -const categories = [{ category_id: '10', category_name: 'Live' }]; -const streams = [{ stream_id: 42, name: 'Channel' }]; -const favorites = [{ contentId: 1, playlistId }]; -const recentlyViewed = [{ contentId: 2, playlistId }]; -const categoryIds = [10, 11]; -const reorderUpdates = [{ content_id: 12, position: 1 }]; -const recentItemsBatch = [{ contentId: 13, playlistId }]; -const playbackData = { - contentXtreamId: 42, - contentType: 'vod', - positionSeconds: 120, -}; - -const dbPreloadCases: PreloadInvokeCase[] = [ - { - method: 'dbCreatePlaylist', - args: [playlist], - channel: 'DB_CREATE_PLAYLIST', - forwardedArgs: [playlist], - }, - { - method: 'dbGetPlaylist', - args: [playlistId], - channel: 'DB_GET_PLAYLIST', - forwardedArgs: [playlistId], - }, - { - method: 'dbUpsertAppPlaylist', - args: [playlist], - channel: 'DB_UPSERT_APP_PLAYLIST', - forwardedArgs: [playlist], - }, - { - method: 'dbUpsertAppPlaylists', - args: [playlists], - channel: 'DB_UPSERT_APP_PLAYLISTS', - forwardedArgs: [playlists], - }, - { - method: 'dbGetAppPlaylists', - args: [], - channel: 'DB_GET_APP_PLAYLISTS', - forwardedArgs: [], - }, - { - method: 'dbGetAppPlaylist', - args: [playlistId], - channel: 'DB_GET_APP_PLAYLIST', - forwardedArgs: [playlistId], - }, - { - method: 'dbUpdatePlaylist', - args: [playlistId, playlistUpdates], - channel: 'DB_UPDATE_PLAYLIST', - forwardedArgs: [playlistId, playlistUpdates], - }, - { - method: 'dbDeletePlaylist', - args: [playlistId, operationId], - channel: 'DB_DELETE_PLAYLIST', - forwardedArgs: [playlistId, operationId], - }, - { - method: 'dbDeleteXtreamContent', - args: [playlistId, operationId], - channel: 'DB_DELETE_XTREAM_CONTENT', - forwardedArgs: [playlistId, operationId], - }, - { - method: 'dbRestoreXtreamUserData', - args: [playlistId, favorites, recentlyViewed, operationId], - channel: 'DB_RESTORE_XTREAM_USER_DATA', - forwardedArgs: [playlistId, favorites, recentlyViewed, operationId], - }, - { - method: 'dbHasCategories', - args: [playlistId, 'live'], - channel: 'DB_HAS_CATEGORIES', - forwardedArgs: [playlistId, 'live'], - }, - { - method: 'dbGetCategories', - args: [playlistId, 'live'], - channel: 'DB_GET_CATEGORIES', - forwardedArgs: [playlistId, 'live'], - }, - { - method: 'dbSaveCategories', - args: [playlistId, categories, 'live', categoryIds], - channel: 'DB_SAVE_CATEGORIES', - forwardedArgs: [playlistId, categories, 'live', categoryIds], - }, - { - method: 'dbGetAllCategories', - args: [playlistId, 'live'], - channel: 'DB_GET_ALL_CATEGORIES', - forwardedArgs: [playlistId, 'live'], - }, - { - method: 'dbUpdateCategoryVisibility', - args: [categoryIds, true], - channel: 'DB_UPDATE_CATEGORY_VISIBILITY', - forwardedArgs: [categoryIds, true], - }, - { - method: 'dbHasContent', - args: [playlistId, 'movie'], - channel: 'DB_HAS_CONTENT', - forwardedArgs: [playlistId, 'movie'], - }, - { - method: 'dbGetContent', - args: [playlistId, 'movie'], - channel: 'DB_GET_CONTENT', - forwardedArgs: [playlistId, 'movie'], - }, - { - method: 'dbSaveContent', - args: [playlistId, streams, 'movie', operationId], - channel: 'DB_SAVE_CONTENT', - forwardedArgs: [playlistId, streams, 'movie', operationId], - }, - { - method: 'dbClearXtreamImportCache', - args: [playlistId, 'movie'], - channel: 'DB_CLEAR_XTREAM_IMPORT_CACHE', - forwardedArgs: [playlistId, 'movie'], - }, - { - method: 'dbSearchContent', - args: [playlistId, 'matrix', ['movie'], true], - channel: 'DB_SEARCH_CONTENT', - forwardedArgs: [playlistId, 'matrix', ['movie'], true], - }, - { - method: 'dbGlobalSearch', - args: ['matrix', ['movie'], true], - channel: 'DB_GLOBAL_SEARCH', - forwardedArgs: ['matrix', ['movie'], true], - }, - { - method: 'dbGetGlobalRecentlyAdded', - args: ['vod', 50, 'xtream'], - channel: 'DB_GET_GLOBAL_RECENTLY_ADDED', - forwardedArgs: ['vod', 50, 'xtream'], - }, - { - method: 'dbGetRecentlyViewed', - args: [], - channel: 'DB_GET_RECENTLY_VIEWED', - forwardedArgs: [], - }, - { - method: 'dbClearRecentlyViewed', - args: [], - channel: 'DB_CLEAR_RECENTLY_VIEWED', - forwardedArgs: [], - }, - { - method: 'dbAddFavorite', - args: [12, playlistId, 'https://image.example/backdrop.jpg'], - channel: 'DB_ADD_FAVORITE', - forwardedArgs: [12, playlistId, 'https://image.example/backdrop.jpg'], - }, - { - method: 'dbRemoveFavorite', - args: [12, playlistId], - channel: 'DB_REMOVE_FAVORITE', - forwardedArgs: [12, playlistId], - }, - { - method: 'dbIsFavorite', - args: [12, playlistId], - channel: 'DB_IS_FAVORITE', - forwardedArgs: [12, playlistId], - }, - { - method: 'dbGetFavorites', - args: [playlistId], - channel: 'DB_GET_FAVORITES', - forwardedArgs: [playlistId], - }, - { - method: 'dbGetGlobalFavorites', - args: [], - channel: 'DB_GET_GLOBAL_FAVORITES', - forwardedArgs: [], - }, - { - method: 'dbGetAllGlobalFavorites', - args: [], - channel: 'DB_GET_ALL_GLOBAL_FAVORITES', - forwardedArgs: [], - }, - { - method: 'dbReorderGlobalFavorites', - args: [reorderUpdates], - channel: 'DB_REORDER_GLOBAL_FAVORITES', - forwardedArgs: [reorderUpdates], - }, - { - method: 'dbGetRecentItems', - args: [playlistId], - channel: 'DB_GET_RECENT_ITEMS', - forwardedArgs: [playlistId], - }, - { - method: 'dbAddRecentItem', - args: [13, playlistId, 'https://image.example/recent.jpg'], - channel: 'DB_ADD_RECENT_ITEM', - forwardedArgs: [13, playlistId, 'https://image.example/recent.jpg'], - }, - { - method: 'dbClearPlaylistRecentItems', - args: [playlistId], - channel: 'DB_CLEAR_PLAYLIST_RECENT_ITEMS', - forwardedArgs: [playlistId], - }, - { - method: 'dbRemoveRecentItem', - args: [13, playlistId], - channel: 'DB_REMOVE_RECENT_ITEM', - forwardedArgs: [13, playlistId], - }, - { - method: 'dbRemoveRecentItemsBatch', - args: [recentItemsBatch], - channel: 'DB_REMOVE_RECENT_ITEMS_BATCH', - forwardedArgs: [recentItemsBatch], - }, - { - method: 'dbGetContentByXtreamId', - args: [42, playlistId, 'movie'], - channel: 'DB_GET_CONTENT_BY_XTREAM_ID', - forwardedArgs: [42, playlistId, 'movie'], - }, - { - method: 'dbSetContentBackdropIfMissing', - args: [12, 'https://image.example/backdrop.jpg'], - channel: 'DB_SET_CONTENT_BACKDROP_IF_MISSING', - forwardedArgs: [12, 'https://image.example/backdrop.jpg'], - }, - { - method: 'dbDeleteAllPlaylists', - args: [operationId], - channel: 'DB_DELETE_ALL_PLAYLISTS', - forwardedArgs: [operationId], - }, - { - method: 'dbCancelOperation', - args: [operationId], - channel: 'DB_CANCEL_OPERATION', - forwardedArgs: [operationId], - }, - { - method: 'dbGetAppState', - args: ['workspace:last-route'], - channel: 'DB_GET_APP_STATE', - forwardedArgs: ['workspace:last-route'], - }, - { - method: 'dbSetAppState', - args: ['workspace:last-route', '/workspace'], - channel: 'DB_SET_APP_STATE', - forwardedArgs: ['workspace:last-route', '/workspace'], - }, - { - method: 'dbSavePlaybackPosition', - args: [playlistId, playbackData], - channel: 'DB_SAVE_PLAYBACK_POSITION', - forwardedArgs: [playlistId, playbackData], - }, - { - method: 'dbGetPlaybackPosition', - args: [playlistId, 42, 'vod'], - channel: 'DB_GET_PLAYBACK_POSITION', - forwardedArgs: [playlistId, 42, 'vod'], - }, - { - method: 'dbGetSeriesPlaybackPositions', - args: [playlistId, 88], - channel: 'DB_GET_SERIES_PLAYBACK_POSITIONS', - forwardedArgs: [playlistId, 88], - }, - { - method: 'dbGetRecentPlaybackPositions', - args: [playlistId, 20], - channel: 'DB_GET_RECENT_PLAYBACK_POSITIONS', - forwardedArgs: [playlistId, 20], - }, - { - method: 'dbGetAllPlaybackPositions', - args: [playlistId], - channel: 'DB_GET_ALL_PLAYBACK_POSITIONS', - forwardedArgs: [playlistId], - }, - { - method: 'dbClearAllPlaybackPositions', - args: [playlistId], - channel: 'DB_CLEAR_ALL_PLAYBACK_POSITIONS', - forwardedArgs: [playlistId], - }, - { - method: 'dbClearPlaybackPosition', - args: [playlistId, 42, 'vod'], - channel: 'DB_CLEAR_PLAYBACK_POSITION', - forwardedArgs: [playlistId, 42, 'vod'], - }, -]; - function getExposedApi(): ExposedElectronApi { if (!mockExposedApi) { throw new Error('Expected preload API to be exposed'); @@ -423,7 +102,7 @@ describe('main preload DB IPC contract', () => { expect(mockIpcRenderer.on).toHaveBeenCalledWith( 'DB_OPERATION_EVENT', - handler + expect.any(Function) ); expect(callback).toHaveBeenCalledWith(event); diff --git a/apps/electron-backend/src/app/events/database/worker-ipc-contract.spec-data.ts b/apps/electron-backend/src/app/events/database/worker-ipc-contract.spec-data.ts new file mode 100644 index 000000000..2993aaa5c --- /dev/null +++ b/apps/electron-backend/src/app/events/database/worker-ipc-contract.spec-data.ts @@ -0,0 +1,299 @@ +import { DbWorkerOperation } from '../../workers/database-worker.types'; + +type WorkerIpcContractCase = { + operation: DbWorkerOperation; + args: unknown[]; + payload: unknown; + forwardsEvents?: boolean; +}; + +export const playlistId = 'playlist-1'; +export const operationId = 'operation-1'; +const playlist = { id: playlistId, name: 'Playlist', type: 'xtream' }; +const playlists = [playlist]; +const playlistUpdates = { name: 'Updated playlist' }; +const categories = [{ category_id: '10', category_name: 'Live' }]; +export const streams = [{ stream_id: 42, name: 'Channel' }]; +const favorites = [{ contentId: 1, playlistId }]; +const recentlyViewed = [{ contentId: 2, playlistId }]; +const categoryIds = [10, 11]; +const reorderUpdates = [{ content_id: 12, position: 1 }]; +const recentItemsBatch = [{ contentId: 13, playlistId }]; +const playbackData = { + contentXtreamId: 42, + contentType: 'vod', + positionSeconds: 120, +}; + +export const workerIpcContractCases: WorkerIpcContractCase[] = [ + { + operation: 'DB_CREATE_PLAYLIST', + args: [playlist], + payload: playlist, + }, + { + operation: 'DB_UPSERT_APP_PLAYLIST', + args: [playlist], + payload: playlist, + }, + { + operation: 'DB_UPSERT_APP_PLAYLISTS', + args: [playlists], + payload: playlists, + }, + { + operation: 'DB_GET_APP_PLAYLISTS', + args: [], + payload: {}, + }, + { + operation: 'DB_GET_APP_PLAYLIST', + args: [playlistId], + payload: { playlistId }, + }, + { + operation: 'DB_GET_PLAYLIST', + args: [playlistId], + payload: { playlistId }, + }, + { + operation: 'DB_UPDATE_PLAYLIST', + args: [playlistId, playlistUpdates], + payload: { playlistId, updates: playlistUpdates }, + }, + { + operation: 'DB_GET_APP_STATE', + args: ['workspace:last-route'], + payload: { key: 'workspace:last-route' }, + }, + { + operation: 'DB_SET_APP_STATE', + args: ['workspace:last-route', '/workspace'], + payload: { key: 'workspace:last-route', value: '/workspace' }, + }, + { + operation: 'DB_HAS_CATEGORIES', + args: [playlistId, 'live'], + payload: { playlistId, type: 'live' }, + }, + { + operation: 'DB_GET_CATEGORIES', + args: [playlistId, 'live'], + payload: { playlistId, type: 'live' }, + }, + { + operation: 'DB_SAVE_CATEGORIES', + args: [playlistId, categories, 'live', categoryIds], + payload: { + playlistId, + categories, + type: 'live', + hiddenCategoryXtreamIds: categoryIds, + }, + }, + { + operation: 'DB_GET_ALL_CATEGORIES', + args: [playlistId, 'live'], + payload: { playlistId, type: 'live' }, + }, + { + operation: 'DB_UPDATE_CATEGORY_VISIBILITY', + args: [categoryIds, true], + payload: { categoryIds, hidden: true }, + }, + { + operation: 'DB_HAS_CONTENT', + args: [playlistId, 'movie'], + payload: { playlistId, type: 'movie' }, + }, + { + operation: 'DB_GET_CONTENT', + args: [playlistId, 'movie'], + payload: { playlistId, type: 'movie' }, + }, + { + operation: 'DB_GET_GLOBAL_RECENTLY_ADDED', + args: ['vod', 50, 'xtream'], + payload: { kind: 'vod', limit: 50, playlistType: 'xtream' }, + }, + { + operation: 'DB_SAVE_CONTENT', + args: [playlistId, streams, 'movie', operationId], + payload: { playlistId, streams, type: 'movie', operationId }, + forwardsEvents: true, + }, + { + operation: 'DB_CLEAR_XTREAM_IMPORT_CACHE', + args: [playlistId, 'movie'], + payload: { playlistId, type: 'movie' }, + }, + { + operation: 'DB_GET_CONTENT_BY_XTREAM_ID', + args: [42, playlistId, 'movie'], + payload: { xtreamId: 42, playlistId, contentType: 'movie' }, + }, + { + operation: 'DB_SET_CONTENT_BACKDROP_IF_MISSING', + args: [12, 'https://image.example/backdrop.jpg'], + payload: { + contentId: 12, + backdropUrl: 'https://image.example/backdrop.jpg', + }, + }, + { + operation: 'DB_SEARCH_CONTENT', + args: [playlistId, 'matrix', ['movie'], true], + payload: { + playlistId, + searchTerm: 'matrix', + types: ['movie'], + excludeHidden: true, + }, + }, + { + operation: 'DB_GLOBAL_SEARCH', + args: ['matrix', ['movie'], true], + payload: { + searchTerm: 'matrix', + types: ['movie'], + excludeHidden: true, + }, + }, + { + operation: 'DB_DELETE_PLAYLIST', + args: [playlistId, operationId], + payload: { playlistId, operationId }, + forwardsEvents: true, + }, + { + operation: 'DB_DELETE_ALL_PLAYLISTS', + args: [operationId], + payload: { operationId }, + forwardsEvents: true, + }, + { + operation: 'DB_DELETE_XTREAM_CONTENT', + args: [playlistId, operationId], + payload: { playlistId, operationId }, + forwardsEvents: true, + }, + { + operation: 'DB_RESTORE_XTREAM_USER_DATA', + args: [playlistId, favorites, recentlyViewed, operationId], + payload: { playlistId, favorites, recentlyViewed, operationId }, + forwardsEvents: true, + }, + { + operation: 'DB_ADD_FAVORITE', + args: [12, playlistId, 'https://image.example/backdrop.jpg'], + payload: { + contentId: 12, + playlistId, + backdropUrl: 'https://image.example/backdrop.jpg', + }, + }, + { + operation: 'DB_REMOVE_FAVORITE', + args: [12, playlistId], + payload: { contentId: 12, playlistId }, + }, + { + operation: 'DB_IS_FAVORITE', + args: [12, playlistId], + payload: { contentId: 12, playlistId }, + }, + { + operation: 'DB_GET_FAVORITES', + args: [playlistId], + payload: { playlistId }, + }, + { + operation: 'DB_GET_GLOBAL_FAVORITES', + args: [], + payload: {}, + }, + { + operation: 'DB_GET_ALL_GLOBAL_FAVORITES', + args: [], + payload: {}, + }, + { + operation: 'DB_REORDER_GLOBAL_FAVORITES', + args: [reorderUpdates], + payload: { updates: reorderUpdates }, + }, + { + operation: 'DB_GET_RECENTLY_VIEWED', + args: [], + payload: {}, + }, + { + operation: 'DB_CLEAR_RECENTLY_VIEWED', + args: [], + payload: {}, + }, + { + operation: 'DB_GET_RECENT_ITEMS', + args: [playlistId], + payload: { playlistId }, + }, + { + operation: 'DB_ADD_RECENT_ITEM', + args: [13, playlistId, 'https://image.example/recent.jpg'], + payload: { + contentId: 13, + playlistId, + backdropUrl: 'https://image.example/recent.jpg', + }, + }, + { + operation: 'DB_CLEAR_PLAYLIST_RECENT_ITEMS', + args: [playlistId], + payload: { playlistId }, + }, + { + operation: 'DB_REMOVE_RECENT_ITEM', + args: [13, playlistId], + payload: { contentId: 13, playlistId }, + }, + { + operation: 'DB_REMOVE_RECENT_ITEMS_BATCH', + args: [recentItemsBatch], + payload: { items: recentItemsBatch }, + }, + { + operation: 'DB_SAVE_PLAYBACK_POSITION', + args: [playlistId, playbackData], + payload: { playlistId, data: playbackData }, + }, + { + operation: 'DB_GET_PLAYBACK_POSITION', + args: [playlistId, 42, 'vod'], + payload: { playlistId, contentXtreamId: 42, contentType: 'vod' }, + }, + { + operation: 'DB_GET_SERIES_PLAYBACK_POSITIONS', + args: [playlistId, 88], + payload: { playlistId, seriesXtreamId: 88 }, + }, + { + operation: 'DB_GET_RECENT_PLAYBACK_POSITIONS', + args: [playlistId, 20], + payload: { playlistId, limit: 20 }, + }, + { + operation: 'DB_GET_ALL_PLAYBACK_POSITIONS', + args: [playlistId], + payload: { playlistId }, + }, + { + operation: 'DB_CLEAR_ALL_PLAYBACK_POSITIONS', + args: [playlistId], + payload: { playlistId }, + }, + { + operation: 'DB_CLEAR_PLAYBACK_POSITION', + args: [playlistId, 42, 'vod'], + payload: { playlistId, contentXtreamId: 42, contentType: 'vod' }, + }, +]; diff --git a/apps/electron-backend/src/app/events/database/worker-ipc-contract.spec.ts b/apps/electron-backend/src/app/events/database/worker-ipc-contract.spec.ts index aac035ac4..0a60ac8f8 100644 --- a/apps/electron-backend/src/app/events/database/worker-ipc-contract.spec.ts +++ b/apps/electron-backend/src/app/events/database/worker-ipc-contract.spec.ts @@ -1,8 +1,13 @@ import { DB_WORKER_OPERATIONS, DbOperationEvent, - DbWorkerOperation, } from '../../workers/database-worker.types'; +import { + operationId, + playlistId, + streams, + workerIpcContractCases, +} from './worker-ipc-contract.spec-data'; type IpcHandler = (event: MockIpcEvent, ...args: unknown[]) => Promise; @@ -13,13 +18,6 @@ type MockIpcEvent = { }; }; -type WorkerIpcContractCase = { - operation: DbWorkerOperation; - args: unknown[]; - payload: unknown; - forwardsEvents?: boolean; -}; - const mockRegisteredHandlers = new Map(); const mockWorkerRequest = jest.fn(); const mockWorkerCancel = jest.fn(); @@ -39,297 +37,6 @@ jest.mock('../../services/database-worker-client', () => ({ }, })); -const playlistId = 'playlist-1'; -const operationId = 'operation-1'; -const playlist = { id: playlistId, name: 'Playlist', type: 'xtream' }; -const playlists = [playlist]; -const playlistUpdates = { name: 'Updated playlist' }; -const categories = [{ category_id: '10', category_name: 'Live' }]; -const streams = [{ stream_id: 42, name: 'Channel' }]; -const favorites = [{ contentId: 1, playlistId }]; -const recentlyViewed = [{ contentId: 2, playlistId }]; -const categoryIds = [10, 11]; -const reorderUpdates = [{ content_id: 12, position: 1 }]; -const recentItemsBatch = [{ contentId: 13, playlistId }]; -const playbackData = { - contentXtreamId: 42, - contentType: 'vod', - positionSeconds: 120, -}; - -const workerIpcContractCases: WorkerIpcContractCase[] = [ - { - operation: 'DB_CREATE_PLAYLIST', - args: [playlist], - payload: playlist, - }, - { - operation: 'DB_UPSERT_APP_PLAYLIST', - args: [playlist], - payload: playlist, - }, - { - operation: 'DB_UPSERT_APP_PLAYLISTS', - args: [playlists], - payload: playlists, - }, - { - operation: 'DB_GET_APP_PLAYLISTS', - args: [], - payload: {}, - }, - { - operation: 'DB_GET_APP_PLAYLIST', - args: [playlistId], - payload: { playlistId }, - }, - { - operation: 'DB_GET_PLAYLIST', - args: [playlistId], - payload: { playlistId }, - }, - { - operation: 'DB_UPDATE_PLAYLIST', - args: [playlistId, playlistUpdates], - payload: { playlistId, updates: playlistUpdates }, - }, - { - operation: 'DB_GET_APP_STATE', - args: ['workspace:last-route'], - payload: { key: 'workspace:last-route' }, - }, - { - operation: 'DB_SET_APP_STATE', - args: ['workspace:last-route', '/workspace'], - payload: { key: 'workspace:last-route', value: '/workspace' }, - }, - { - operation: 'DB_HAS_CATEGORIES', - args: [playlistId, 'live'], - payload: { playlistId, type: 'live' }, - }, - { - operation: 'DB_GET_CATEGORIES', - args: [playlistId, 'live'], - payload: { playlistId, type: 'live' }, - }, - { - operation: 'DB_SAVE_CATEGORIES', - args: [playlistId, categories, 'live', categoryIds], - payload: { - playlistId, - categories, - type: 'live', - hiddenCategoryXtreamIds: categoryIds, - }, - }, - { - operation: 'DB_GET_ALL_CATEGORIES', - args: [playlistId, 'live'], - payload: { playlistId, type: 'live' }, - }, - { - operation: 'DB_UPDATE_CATEGORY_VISIBILITY', - args: [categoryIds, true], - payload: { categoryIds, hidden: true }, - }, - { - operation: 'DB_HAS_CONTENT', - args: [playlistId, 'movie'], - payload: { playlistId, type: 'movie' }, - }, - { - operation: 'DB_GET_CONTENT', - args: [playlistId, 'movie'], - payload: { playlistId, type: 'movie' }, - }, - { - operation: 'DB_GET_GLOBAL_RECENTLY_ADDED', - args: ['vod', 50, 'xtream'], - payload: { kind: 'vod', limit: 50, playlistType: 'xtream' }, - }, - { - operation: 'DB_SAVE_CONTENT', - args: [playlistId, streams, 'movie', operationId], - payload: { playlistId, streams, type: 'movie', operationId }, - forwardsEvents: true, - }, - { - operation: 'DB_CLEAR_XTREAM_IMPORT_CACHE', - args: [playlistId, 'movie'], - payload: { playlistId, type: 'movie' }, - }, - { - operation: 'DB_GET_CONTENT_BY_XTREAM_ID', - args: [42, playlistId, 'movie'], - payload: { xtreamId: 42, playlistId, contentType: 'movie' }, - }, - { - operation: 'DB_SET_CONTENT_BACKDROP_IF_MISSING', - args: [12, 'https://image.example/backdrop.jpg'], - payload: { - contentId: 12, - backdropUrl: 'https://image.example/backdrop.jpg', - }, - }, - { - operation: 'DB_SEARCH_CONTENT', - args: [playlistId, 'matrix', ['movie'], true], - payload: { - playlistId, - searchTerm: 'matrix', - types: ['movie'], - excludeHidden: true, - }, - }, - { - operation: 'DB_GLOBAL_SEARCH', - args: ['matrix', ['movie'], true], - payload: { - searchTerm: 'matrix', - types: ['movie'], - excludeHidden: true, - }, - }, - { - operation: 'DB_DELETE_PLAYLIST', - args: [playlistId, operationId], - payload: { playlistId, operationId }, - forwardsEvents: true, - }, - { - operation: 'DB_DELETE_ALL_PLAYLISTS', - args: [operationId], - payload: { operationId }, - forwardsEvents: true, - }, - { - operation: 'DB_DELETE_XTREAM_CONTENT', - args: [playlistId, operationId], - payload: { playlistId, operationId }, - forwardsEvents: true, - }, - { - operation: 'DB_RESTORE_XTREAM_USER_DATA', - args: [playlistId, favorites, recentlyViewed, operationId], - payload: { playlistId, favorites, recentlyViewed, operationId }, - forwardsEvents: true, - }, - { - operation: 'DB_ADD_FAVORITE', - args: [12, playlistId, 'https://image.example/backdrop.jpg'], - payload: { - contentId: 12, - playlistId, - backdropUrl: 'https://image.example/backdrop.jpg', - }, - }, - { - operation: 'DB_REMOVE_FAVORITE', - args: [12, playlistId], - payload: { contentId: 12, playlistId }, - }, - { - operation: 'DB_IS_FAVORITE', - args: [12, playlistId], - payload: { contentId: 12, playlistId }, - }, - { - operation: 'DB_GET_FAVORITES', - args: [playlistId], - payload: { playlistId }, - }, - { - operation: 'DB_GET_GLOBAL_FAVORITES', - args: [], - payload: {}, - }, - { - operation: 'DB_GET_ALL_GLOBAL_FAVORITES', - args: [], - payload: {}, - }, - { - operation: 'DB_REORDER_GLOBAL_FAVORITES', - args: [reorderUpdates], - payload: { updates: reorderUpdates }, - }, - { - operation: 'DB_GET_RECENTLY_VIEWED', - args: [], - payload: {}, - }, - { - operation: 'DB_CLEAR_RECENTLY_VIEWED', - args: [], - payload: {}, - }, - { - operation: 'DB_GET_RECENT_ITEMS', - args: [playlistId], - payload: { playlistId }, - }, - { - operation: 'DB_ADD_RECENT_ITEM', - args: [13, playlistId, 'https://image.example/recent.jpg'], - payload: { - contentId: 13, - playlistId, - backdropUrl: 'https://image.example/recent.jpg', - }, - }, - { - operation: 'DB_CLEAR_PLAYLIST_RECENT_ITEMS', - args: [playlistId], - payload: { playlistId }, - }, - { - operation: 'DB_REMOVE_RECENT_ITEM', - args: [13, playlistId], - payload: { contentId: 13, playlistId }, - }, - { - operation: 'DB_REMOVE_RECENT_ITEMS_BATCH', - args: [recentItemsBatch], - payload: { items: recentItemsBatch }, - }, - { - operation: 'DB_SAVE_PLAYBACK_POSITION', - args: [playlistId, playbackData], - payload: { playlistId, data: playbackData }, - }, - { - operation: 'DB_GET_PLAYBACK_POSITION', - args: [playlistId, 42, 'vod'], - payload: { playlistId, contentXtreamId: 42, contentType: 'vod' }, - }, - { - operation: 'DB_GET_SERIES_PLAYBACK_POSITIONS', - args: [playlistId, 88], - payload: { playlistId, seriesXtreamId: 88 }, - }, - { - operation: 'DB_GET_RECENT_PLAYBACK_POSITIONS', - args: [playlistId, 20], - payload: { playlistId, limit: 20 }, - }, - { - operation: 'DB_GET_ALL_PLAYBACK_POSITIONS', - args: [playlistId], - payload: { playlistId }, - }, - { - operation: 'DB_CLEAR_ALL_PLAYBACK_POSITIONS', - args: [playlistId], - payload: { playlistId }, - }, - { - operation: 'DB_CLEAR_PLAYBACK_POSITION', - args: [playlistId, 42, 'vod'], - payload: { playlistId, contentXtreamId: 42, contentType: 'vod' }, - }, -]; - async function importDatabaseEventModules(): Promise { await import('./category.events'); await import('./content.events'); diff --git a/apps/electron-backend/tsconfig.app.json b/apps/electron-backend/tsconfig.app.json index edca2598d..46b5f34af 100644 --- a/apps/electron-backend/tsconfig.app.json +++ b/apps/electron-backend/tsconfig.app.json @@ -7,9 +7,11 @@ "files": ["../../global.d.ts"], "exclude": [ "**/*.spec.ts", + "**/*.spec-data.ts", "**/*.test.ts", "jest.config.ts", "src/**/*.spec.ts", + "src/**/*.spec-data.ts", "src/**/*.test.ts" ], "include": ["**/*.ts"]