mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-07-07 09:51:37 +00:00
Add regression test for book duration with disabled tracks
Demonstrates #5311: disabling an audio track via updateTracks does not recompute the stored book duration, so it keeps counting the excluded track. This test fails until the fix is applied (expects duration to drop to only the enabled track's length). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
6f03467f35
commit
2892e99384
1 changed files with 38 additions and 0 deletions
|
|
@ -8,6 +8,7 @@ const LibraryItemController = require('../../../server/controllers/LibraryItemCo
|
||||||
const ApiCacheManager = require('../../../server/managers/ApiCacheManager')
|
const ApiCacheManager = require('../../../server/managers/ApiCacheManager')
|
||||||
const Auth = require('../../../server/Auth')
|
const Auth = require('../../../server/Auth')
|
||||||
const Logger = require('../../../server/Logger')
|
const Logger = require('../../../server/Logger')
|
||||||
|
const SocketAuthority = require('../../../server/SocketAuthority')
|
||||||
|
|
||||||
describe('LibraryItemController', () => {
|
describe('LibraryItemController', () => {
|
||||||
/** @type {ApiRouter} */
|
/** @type {ApiRouter} */
|
||||||
|
|
@ -299,4 +300,41 @@ describe('LibraryItemController', () => {
|
||||||
expect(fakeRes.sendStatus.calledWith(403)).to.be.true
|
expect(fakeRes.sendStatus.calledWith(403)).to.be.true
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('updateTracks', () => {
|
||||||
|
it('recomputes book duration to exclude disabled audio tracks', async () => {
|
||||||
|
const library = await Database.libraryModel.create({ name: 'Tracks Library', mediaType: 'book' })
|
||||||
|
const libraryFolder = await Database.libraryFolderModel.create({ path: '/tracks', libraryId: library.id })
|
||||||
|
|
||||||
|
// Book with two audio tracks (100s + 50s) and a stored duration of 150s
|
||||||
|
const audioFiles = [
|
||||||
|
{ index: 1, ino: 'file-1', duration: 100, exclude: false, metadata: { filename: 'track1.mp3', size: 1000 } },
|
||||||
|
{ index: 2, ino: 'file-2', duration: 50, exclude: false, metadata: { filename: 'track2.mp3', size: 1000 } }
|
||||||
|
]
|
||||||
|
const book = await Database.bookModel.create({ title: 'Two Track Book', duration: 150, audioFiles, tags: [], narrators: [], genres: [], chapters: [] })
|
||||||
|
const libraryItem = await Database.libraryItemModel.create({ libraryFiles: [], mediaId: book.id, mediaType: 'book', libraryId: library.id, libraryFolderId: libraryFolder.id })
|
||||||
|
|
||||||
|
sinon.stub(SocketAuthority, 'libraryItemEmitter')
|
||||||
|
|
||||||
|
const expandedLibraryItem = await Database.libraryItemModel.getExpandedById(libraryItem.id)
|
||||||
|
const fakeReq = {
|
||||||
|
libraryItem: expandedLibraryItem,
|
||||||
|
body: {
|
||||||
|
orderedFileData: [
|
||||||
|
{ ino: 'file-1', exclude: false },
|
||||||
|
{ ino: 'file-2', exclude: true }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const fakeRes = { json: sinon.spy(), sendStatus: sinon.spy() }
|
||||||
|
|
||||||
|
await LibraryItemController.updateTracks.bind(apiRouter)(fakeReq, fakeRes)
|
||||||
|
|
||||||
|
expect(fakeRes.json.calledOnce).to.be.true
|
||||||
|
|
||||||
|
// Duration should now reflect only the enabled track (100s), not the original 150s
|
||||||
|
const updatedBook = await Database.bookModel.findByPk(book.id)
|
||||||
|
expect(updatedBook.duration).to.equal(100)
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue