test(electron): split sqlite ipc contract fixtures

This commit is contained in:
4gray committed 2026-05-22 03:53:35 +03:00
1 parent 6cf730ddf6
commit dce5b557af
5 files changed
+630 -622

No files matched your search

@@ -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'],
},
];
@@ -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<string, (...args: unknown[]) => 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);
@@ -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' },
},
];
@@ -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<unknown>;
@@ -13,13 +18,6 @@ type MockIpcEvent = {
};
};
type WorkerIpcContractCase = {
operation: DbWorkerOperation;
args: unknown[];
payload: unknown;
forwardsEvents?: boolean;
};
const mockRegisteredHandlers = new Map<string, IpcHandler>();
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<void> {
await import('./category.events');
await import('./content.events');
+2
View File
@@ -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"]