audiobookshelf/test/server/utils/libraryBrowseStrategy.test.js
2026-03-14 02:04:10 -04:00

205 lines
6.1 KiB
JavaScript

const chai = require('chai')
const expect = chai.expect
const { getLibraryBrowseStrategy } = require('../../../server/utils/queries/libraryBrowseStrategy')
describe('libraryBrowseStrategy', () => {
afterEach(() => {
delete global.ServerSettings
})
it('uses keyset pagination for title browse', () => {
global.ServerSettings = { sortingIgnorePrefix: true }
const strategy = getLibraryBrowseStrategy({
mediaType: 'book',
sortBy: 'media.metadata.title',
filterGroup: null,
pageMode: 'endless'
})
expect(strategy.paginationMode).to.equal('keyset')
expect(strategy.countMode).to.equal('deferred-exact')
expect(strategy.deepScrollAllowed).to.equal(true)
expect(strategy.tieBreaker).to.equal('id')
expect(strategy.cursorKeys).to.deep.equal(['titleIgnorePrefix', 'id'])
})
it('uses raw title cursor keys when prefix ignoring is disabled', () => {
global.ServerSettings = { sortingIgnorePrefix: false }
const strategy = getLibraryBrowseStrategy({
mediaType: 'book',
sortBy: 'media.metadata.title',
filterGroup: null,
pageMode: 'endless'
})
expect(strategy.paginationMode).to.equal('keyset')
expect(strategy.cursorKeys).to.deep.equal(['title', 'id'])
})
it('falls back to offset for random sort', () => {
const strategy = getLibraryBrowseStrategy({
mediaType: 'book',
sortBy: 'random',
filterGroup: null,
pageMode: 'endless'
})
expect(strategy.paginationMode).to.equal('offset')
expect(strategy.deepScrollAllowed).to.equal(false)
})
it('uses keyset pagination for recently added browse', () => {
const strategy = getLibraryBrowseStrategy({
mediaType: 'book',
sortBy: 'addedAt',
filterGroup: 'recent',
pageMode: 'endless'
})
expect(strategy.family).to.equal('recent-browse')
expect(strategy.paginationMode).to.equal('keyset')
expect(strategy.cursorKeys).to.deep.equal(['createdAt', 'id'])
})
it('uses keyset pagination for progress browse', () => {
const strategy = getLibraryBrowseStrategy({
mediaType: 'book',
sortBy: 'progress',
filterGroup: 'progress',
pageMode: 'endless'
})
expect(strategy.family).to.equal('progress-browse')
expect(strategy.paginationMode).to.equal('keyset')
expect(strategy.cursorKeys).to.deep.equal(['mediaProgresses.updatedAt', 'id'])
})
it('uses keyset pagination for updated browse', () => {
const strategy = getLibraryBrowseStrategy({
mediaType: 'book',
sortBy: 'updatedAt',
filterGroup: null,
pageMode: 'endless'
})
expect(strategy.family).to.equal('plain-browse')
expect(strategy.paginationMode).to.equal('offset')
expect(strategy.cursorKeys).to.deep.equal([])
})
it('uses keyset pagination for deterministic author browse', () => {
global.ServerSettings = { sortingIgnorePrefix: true }
const strategy = getLibraryBrowseStrategy({
mediaType: 'book',
sortBy: 'media.metadata.authorName',
filterGroup: null,
pageMode: 'endless'
})
expect(strategy.family).to.equal('author-browse')
expect(strategy.paginationMode).to.equal('keyset')
expect(strategy.cursorKeys).to.deep.equal(['authorNamesFirstLast', 'titleIgnorePrefix', 'id'])
})
it('uses keyset pagination for deterministic author last-first browse', () => {
global.ServerSettings = { sortingIgnorePrefix: false }
const strategy = getLibraryBrowseStrategy({
mediaType: 'book',
sortBy: 'media.metadata.authorNameLF',
filterGroup: null,
pageMode: 'endless'
})
expect(strategy.family).to.equal('author-browse')
expect(strategy.paginationMode).to.equal('keyset')
expect(strategy.cursorKeys).to.deep.equal(['authorNamesLastFirst', 'title', 'id'])
})
it('uses keyset pagination for progress created-at browse', () => {
const strategy = getLibraryBrowseStrategy({
mediaType: 'book',
sortBy: 'progress.createdAt',
filterGroup: 'progress',
pageMode: 'endless'
})
expect(strategy.family).to.equal('progress-browse')
expect(strategy.paginationMode).to.equal('keyset')
expect(strategy.cursorKeys).to.deep.equal(['mediaProgresses.createdAt', 'id'])
})
it('uses keyset pagination for progress finished-at browse', () => {
const strategy = getLibraryBrowseStrategy({
mediaType: 'book',
sortBy: 'progress.finishedAt',
filterGroup: 'progress',
pageMode: 'endless'
})
expect(strategy.family).to.equal('progress-browse')
expect(strategy.paginationMode).to.equal('keyset')
expect(strategy.cursorKeys).to.deep.equal(['mediaProgresses.finishedAt', 'id'])
})
it('defines a filtered browse family for generic library filters', () => {
const strategy = getLibraryBrowseStrategy({
mediaType: 'book',
sortBy: 'media.metadata.title',
filterGroup: 'tags',
pageMode: 'endless'
})
expect(strategy.family).to.equal('filtered-browse')
})
it('defines a series browse family', () => {
const strategy = getLibraryBrowseStrategy({
mediaType: 'book',
sortBy: 'sequence',
filterGroup: 'series',
pageMode: 'endless'
})
expect(strategy.family).to.equal('series-browse')
})
it('defines a collapsed-series browse family', () => {
const strategy = getLibraryBrowseStrategy({
mediaType: 'book',
sortBy: 'sequence',
filterGroup: 'series',
pageMode: 'endless',
collapseseries: true
})
expect(strategy.family).to.equal('collapsed-series-browse')
})
it('defines a podcast browse family', () => {
const strategy = getLibraryBrowseStrategy({
mediaType: 'podcast',
sortBy: 'media.metadata.title',
filterGroup: null,
pageMode: 'endless'
})
expect(strategy.family).to.equal('podcast-browse')
})
it('falls back to offset for unsupported endless-scroll sorts', () => {
const strategy = getLibraryBrowseStrategy({
mediaType: 'book',
sortBy: 'size',
filterGroup: null,
pageMode: 'endless'
})
expect(strategy.paginationMode).to.equal('offset')
expect(strategy.cursorKeys).to.deep.equal([])
})
})