mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-07-07 18:01:42 +00:00
70 lines
2.7 KiB
JavaScript
70 lines
2.7 KiB
JavaScript
const { expect } = require('chai')
|
|
const sinon = require('sinon')
|
|
|
|
const Logger = require('../../../server/Logger')
|
|
const MediaProgress = require('../../../server/models/MediaProgress')
|
|
|
|
function createProgressInstance() {
|
|
const progress = Object.create(MediaProgress.prototype)
|
|
|
|
Object.defineProperties(progress, {
|
|
id: { value: 'progress-1', writable: true, configurable: true },
|
|
mediaItemId: { value: 'media-1', writable: true, configurable: true },
|
|
duration: { value: 3600, writable: true, configurable: true },
|
|
currentTime: { value: 120, writable: true, configurable: true },
|
|
isFinished: { value: false, writable: true, configurable: true },
|
|
hideFromContinueListening: { value: false, writable: true, configurable: true },
|
|
extraData: { value: {}, writable: true, configurable: true }
|
|
})
|
|
|
|
progress.changed = sinon.stub().returns(false)
|
|
progress.set = sinon.stub().callsFake((payload) => Object.assign(progress, payload))
|
|
progress.save = sinon.stub().resolves()
|
|
progress.reload = sinon.stub().resolves()
|
|
progress.constructor = {
|
|
update: sinon.stub().resolves(),
|
|
sequelize: {
|
|
escape: (value) => `'${value.toISOString ? value.toISOString() : value}'`
|
|
}
|
|
}
|
|
|
|
return progress
|
|
}
|
|
|
|
describe('MediaProgress', () => {
|
|
afterEach(() => {
|
|
sinon.restore()
|
|
})
|
|
|
|
describe('applyProgressUpdate', () => {
|
|
it('should update updatedAt via model update for valid lastUpdate', async () => {
|
|
const progress = createProgressInstance()
|
|
const infoStub = sinon.stub(Logger, 'info')
|
|
const lastUpdate = '2026-03-03T01:00:00.000Z'
|
|
|
|
await progress.applyProgressUpdate({ currentTime: 130, lastUpdate })
|
|
|
|
expect(progress.save.calledOnce).to.equal(true)
|
|
expect(progress.constructor.update.calledOnce).to.equal(true)
|
|
expect(progress.constructor.update.firstCall.args[0].updatedAt.toISOString()).to.equal(new Date(lastUpdate).toISOString())
|
|
expect(progress.constructor.update.firstCall.args[1]).to.deep.equal({
|
|
where: { id: 'progress-1' },
|
|
silent: true
|
|
})
|
|
expect(progress.reload.calledOnce).to.equal(true)
|
|
expect(infoStub.calledWithMatch('[MediaProgress] Manually setting updatedAt')).to.equal(true)
|
|
})
|
|
|
|
it('should skip manual updatedAt update when lastUpdate is invalid', async () => {
|
|
const progress = createProgressInstance()
|
|
const warnStub = sinon.stub(Logger, 'warn')
|
|
|
|
await progress.applyProgressUpdate({ currentTime: 130, lastUpdate: 'invalid-date' })
|
|
|
|
expect(progress.save.calledOnce).to.equal(true)
|
|
expect(progress.constructor.update.called).to.equal(false)
|
|
expect(progress.reload.called).to.equal(false)
|
|
expect(warnStub.calledWithMatch('[MediaProgress] Invalid date provided for lastUpdate')).to.equal(true)
|
|
})
|
|
})
|
|
})
|