Added additional unit tests for construction of objects containing deviceId property

This commit is contained in:
Jason Axley 2025-08-21 10:36:04 -07:00
parent 3a4aacb7bf
commit 974e17ee3e
9 changed files with 333 additions and 124 deletions

View file

@ -71,10 +71,13 @@ class AudioFile {
}
}
/**
* @param {{ index: any; ino: any; deviceId: any; metadata: any; addedAt: any; updatedAt: any; manuallyVerified: any; exclude: any; error: null; trackNumFromMeta: any; discNumFromMeta: any; trackNumFromFilename: any; cdNumFromFilename: undefined; discNumFromFilename: any; format: any; duration: any; bitRate: any; language: any; codec: null; timeBase: any; channels: any; channelLayout: any; chapters: any[]; embeddedCoverArt: null; metaTags: any; }} data
*/
construct(data) {
this.index = data.index
this.ino = data.ino
this.deviceId = data.dev
this.deviceId = data.deviceId
this.metadata = new FileMetadata(data.metadata || {})
this.addedAt = data.addedAt
this.updatedAt = data.updatedAt

View file

@ -1,6 +1,9 @@
const FileMetadata = require('../metadata/FileMetadata')
class EBookFile {
/**
* @param {{ ino: any; deviceId: any; isSupplementary?: boolean; addedAt?: number; updatedAt?: number; metadata?: { filename: string; ext: string; path: string; relPath: string; size: number; mtimeMs: number; ctimeMs: number; birthtimeMs: number; }; libraryFolderId?: any; libraryId?: any; mediaType?: any; mtimeMs?: any; ctimeMs?: any; birthtimeMs?: any; path?: any; relPath?: any; isFile?: any; mediaMetadata?: any; libraryFiles?: any; }} file
*/
constructor(file) {
this.ino = null
this.deviceId = null
@ -14,9 +17,12 @@ class EBookFile {
}
}
/**
* @param {{ ino: any; deviceId: any; isSupplementary?: boolean | undefined; addedAt: any; updatedAt: any; metadata: any; libraryFolderId?: any; libraryId?: any; mediaType?: any; mtimeMs?: any; ctimeMs?: any; birthtimeMs?: any; path?: any; relPath?: any; isFile?: any; mediaMetadata?: any; libraryFiles?: any; ebookFormat?: any; }} file
*/
construct(file) {
this.ino = file.ino
this.deviceId = file.dev
this.deviceId = file.deviceId
this.metadata = new FileMetadata(file.metadata)
this.ebookFormat = file.ebookFormat || this.metadata.format
this.addedAt = file.addedAt

View file

@ -4,6 +4,9 @@ const globals = require('../../utils/globals')
const FileMetadata = require('../metadata/FileMetadata')
class LibraryFile {
/**
* @param {{ ino: any; deviceId: any; metadata?: { filename: any; ext: any; path: any; relPath: any; size: any; mtimeMs: any; ctimeMs: any; birthtimeMs: any; } | { filename: string; ext: string; path: string; relPath: string; size: number; mtimeMs: number; ctimeMs: number; birthtimeMs: number; } | null; isSupplementary?: any; addedAt?: any; updatedAt?: any; fileType?: string; libraryFolderId?: any; libraryId?: any; mediaType?: any; mtimeMs?: any; ctimeMs?: any; birthtimeMs?: any; path?: any; relPath?: any; isFile?: any; mediaMetadata?: any; libraryFiles?: any; } | undefined} [file]
*/
constructor(file) {
this.ino = null
this.deviceId = null

View file

@ -5,11 +5,11 @@ const globals = require('../utils/globals')
class LibraryItemScanData {
/**
* @typedef LibraryFileModifiedObject
* @typedef {Object} LibraryFileModifiedObject
* @property {LibraryItem.LibraryFileObject} old
* @property {LibraryItem.LibraryFileObject} new
* @param {{ libraryFolderId: any; libraryId: any; mediaType: any; ino: any; deviceId: any; mtimeMs: any; ctimeMs: any; birthtimeMs: any; path: any; relPath: any; isFile: any; mediaMetadata: any; libraryFiles: any; }} data
*/
constructor(data) {
/** @type {string} */
this.libraryFolderId = data.libraryFolderId
@ -20,7 +20,7 @@ class LibraryItemScanData {
/** @type {string} */
this.ino = data.ino
/** @type {string} */
this.deviceId = data.dev
this.deviceId = data.deviceId
/** @type {number} */
this.mtimeMs = data.mtimeMs
/** @type {number} */
@ -179,8 +179,8 @@ class LibraryItemScanData {
/**
*
* @param {LibraryItem} existingLibraryItem
* @param {import('./LibraryScan')} libraryScan
* @returns {boolean} true if changes found
* @param {import('./LibraryScan') | import('./ScanLogger')} libraryScan
* @returns {Promise<boolean>} true if changes found
*/
async checkLibraryItemData(existingLibraryItem, libraryScan) {
const keysToCompare = ['libraryFolderId', 'ino', 'deviceId', 'path', 'relPath', 'isFile']

View file

@ -23,7 +23,7 @@ class LibraryItemScanner {
* Scan single library item
*
* @param {string} libraryItemId
* @param {{relPath:string, path:string}} [updateLibraryItemDetails] used by watcher when item folder was renamed
* @param {{relPath:string, path:string, isFile: boolean}} [updateLibraryItemDetails] used by watcher when item folder was renamed
* @returns {number} ScanResult
*/
async scanLibraryItem(libraryItemId, updateLibraryItemDetails = null) {
@ -190,7 +190,7 @@ class LibraryItemScanner {
* @param {import('../models/Library')} library
* @param {import('../models/LibraryFolder')} folder
* @param {boolean} isSingleMediaItem
* @returns {Promise<LibraryItem>} ScanResult
* @returns {Promise<LibraryItem | null>} ScanResult
*/
async scanPotentialNewLibraryItem(libraryItemPath, library, folder, isSingleMediaItem) {
const libraryItemScanData = await this.getLibraryItemScanData(libraryItemPath, library, folder, isSingleMediaItem)
@ -209,6 +209,13 @@ class LibraryItemScanner {
}
module.exports = new LibraryItemScanner()
/**
* @param {{ path?: any; relPath?: any; mediaMetadata?: any; }} libraryItemData
* @param {import("../models/LibraryFolder")} folder
* @param {import("../models/Library")} library
* @param {boolean} isSingleMediaItem
* @param {LibraryFile[]} libraryFiles
*/
async function buildLibraryItemScanData(libraryItemData, folder, library, isSingleMediaItem, libraryFiles) {
const libraryItemStats = await fileUtils.getFileTimestampsWithIno(libraryItemData.path)
return new LibraryItemScanData({