mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-03-03 06:29:42 +00:00
Add review and rating features with sorting and filtering options
- Implemented a new ReviewController to handle review creation, updates, and retrieval for library items. - Added pagination, sorting, and filtering capabilities for reviews in the API. - Updated frontend components to support review display, including a new ReviewsTable and enhanced ratings UI. - Introduced new strings for user interface elements related to reviews and ratings. - Added tests for the ReviewController and Review model to ensure functionality and validation. - Enabled the option to toggle the review feature in server settings.
This commit is contained in:
parent
e4e2770fbd
commit
41e8906312
12 changed files with 603 additions and 43 deletions
97
test/server/models/Review.test.js
Normal file
97
test/server/models/Review.test.js
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
const { expect } = require('chai')
|
||||
const { Sequelize } = require('sequelize')
|
||||
const Database = require('../../../server/Database')
|
||||
|
||||
describe('Review Model', () => {
|
||||
beforeEach(async () => {
|
||||
Database.sequelize = new Sequelize({ dialect: 'sqlite', storage: ':memory:', logging: false })
|
||||
await Database.buildModels()
|
||||
})
|
||||
|
||||
afterEach(async () => {
|
||||
await Database.sequelize.close()
|
||||
})
|
||||
|
||||
async function createTestLibraryItem(id = 'li1') {
|
||||
const library = await Database.libraryModel.create({ name: 'Test', mediaType: 'book' })
|
||||
const book = await Database.bookModel.create({ title: 'Test Book' })
|
||||
return await Database.libraryItemModel.create({ id, mediaId: book.id, mediaType: 'book', libraryId: library.id })
|
||||
}
|
||||
|
||||
it('should validate rating between 1 and 5', async () => {
|
||||
const user = await Database.userModel.create({ username: 'u1' })
|
||||
const item = await createTestLibraryItem('li1')
|
||||
const item2 = await createTestLibraryItem('li2')
|
||||
const item3 = await createTestLibraryItem('li3')
|
||||
|
||||
// Valid
|
||||
await Database.reviewModel.create({ userId: user.id, libraryItemId: item.id, rating: 5 })
|
||||
|
||||
// Invalid - too high
|
||||
let error
|
||||
try {
|
||||
await Database.reviewModel.create({ userId: user.id, libraryItemId: item2.id, rating: 6 })
|
||||
} catch (err) {
|
||||
error = err
|
||||
}
|
||||
expect(error).to.exist
|
||||
expect(error.name).to.equal('SequelizeValidationError')
|
||||
|
||||
// Invalid - too low
|
||||
error = null
|
||||
try {
|
||||
await Database.reviewModel.create({ userId: user.id, libraryItemId: item3.id, rating: 0 })
|
||||
} catch (err) {
|
||||
error = err
|
||||
}
|
||||
expect(error).to.exist
|
||||
expect(error.name).to.equal('SequelizeValidationError')
|
||||
})
|
||||
|
||||
it('should enforce unique constraint on userId and libraryItemId', async () => {
|
||||
const user = await Database.userModel.create({ username: 'u1' })
|
||||
const item = await createTestLibraryItem('li1')
|
||||
|
||||
await Database.reviewModel.create({ userId: user.id, libraryItemId: item.id, rating: 5 })
|
||||
|
||||
let error
|
||||
try {
|
||||
await Database.reviewModel.create({ userId: user.id, libraryItemId: item.id, rating: 4 })
|
||||
} catch (err) {
|
||||
error = err
|
||||
}
|
||||
expect(error).to.exist
|
||||
expect(error.name).to.equal('SequelizeUniqueConstraintError')
|
||||
})
|
||||
|
||||
it('should cascade delete when user is deleted', async () => {
|
||||
const user = await Database.userModel.create({ username: 'u1' })
|
||||
const item = await createTestLibraryItem('li1')
|
||||
await Database.reviewModel.create({ userId: user.id, libraryItemId: item.id, rating: 5 })
|
||||
|
||||
await user.destroy()
|
||||
const count = await Database.reviewModel.count()
|
||||
expect(count).to.equal(0)
|
||||
})
|
||||
|
||||
it('should return correct format in toOldJSON', async () => {
|
||||
const user = await Database.userModel.create({ username: 'testuser' })
|
||||
const item = await createTestLibraryItem('li1')
|
||||
const review = await Database.reviewModel.create({
|
||||
userId: user.id,
|
||||
libraryItemId: item.id,
|
||||
rating: 4,
|
||||
reviewText: 'Nice'
|
||||
})
|
||||
|
||||
// Manually associate user for the test
|
||||
review.user = user
|
||||
|
||||
const json = review.toOldJSON()
|
||||
expect(json.rating).to.equal(4)
|
||||
expect(json.reviewText).to.equal('Nice')
|
||||
expect(json.user.username).to.equal('testuser')
|
||||
expect(json.createdAt).to.be.a('number')
|
||||
expect(json.updatedAt).to.be.a('number')
|
||||
})
|
||||
})
|
||||
Loading…
Add table
Add a link
Reference in a new issue