mirror of
https://github.com/kikootwo/ReadMeABook.git
synced 2026-06-03 04:40:09 +00:00
20c8fb0898
Introduce user-reported-issues and Goodreads shelf sync features and wire them into notifications. Adds Prisma migrations and schema changes (ReportedIssue, GoodreadsShelf, GoodreadsBookMapping), API endpoints for reporting (POST /audiobooks/[asin]/report-issue) and admin management (list, resolve/dismiss, replace), and an admin UI section to view/dismiss/replace reported issues. Adds a new notification event (issue_reported) with updates to notification schemas, docs and provider handling, plus a notification-events constants file. Refactors request creation to use createRequestForUser service, adds a Goodreads sync processor/service/hooks/UI modals, a scrape-resilience util, and related tests and minor integration updates.
93 lines
2.5 KiB
TypeScript
93 lines
2.5 KiB
TypeScript
/**
|
|
* Component: Job Queue Notification Integration Tests
|
|
* Documentation: documentation/backend/services/notifications.md
|
|
*/
|
|
|
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
import type { NotificationEvent } from '@/lib/constants/notification-events';
|
|
|
|
describe('JobQueueService - Notification Integration', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
describe('addNotificationJob payload structure', () => {
|
|
it('creates correct payload for request_pending_approval', () => {
|
|
const event = 'request_pending_approval' as const;
|
|
const requestId = 'req-1';
|
|
const title = 'Test Book';
|
|
const author = 'Test Author';
|
|
const userName = 'Test User';
|
|
|
|
const payload = {
|
|
event,
|
|
requestId,
|
|
title,
|
|
author,
|
|
userName,
|
|
timestamp: new Date(),
|
|
};
|
|
|
|
expect(payload.event).toBe('request_pending_approval');
|
|
expect(payload.requestId).toBe(requestId);
|
|
expect(payload.title).toBe(title);
|
|
expect(payload.author).toBe(author);
|
|
expect(payload.userName).toBe(userName);
|
|
expect(payload.timestamp).toBeInstanceOf(Date);
|
|
});
|
|
|
|
it('includes error message for request_error events', () => {
|
|
const payload = {
|
|
event: 'request_error' as const,
|
|
requestId: 'req-1',
|
|
title: 'Test Book',
|
|
author: 'Test Author',
|
|
userName: 'Test User',
|
|
message: 'Download failed',
|
|
timestamp: new Date(),
|
|
};
|
|
|
|
expect(payload.message).toBe('Download failed');
|
|
});
|
|
|
|
it('handles all event types', () => {
|
|
const events: NotificationEvent[] = [
|
|
'request_pending_approval',
|
|
'request_approved',
|
|
'request_available',
|
|
'request_error',
|
|
];
|
|
|
|
events.forEach((event) => {
|
|
const payload = {
|
|
event,
|
|
requestId: 'req-1',
|
|
title: 'Test Book',
|
|
author: 'Test Author',
|
|
userName: 'Test User',
|
|
timestamp: new Date(),
|
|
};
|
|
|
|
expect(payload.event).toBe(event);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('notification job configuration', () => {
|
|
it('should use priority 5 for notification jobs', () => {
|
|
const priority = 5;
|
|
expect(priority).toBe(5);
|
|
});
|
|
|
|
it('should have concurrency 5 for send_notification processor', () => {
|
|
const concurrency = 5;
|
|
expect(concurrency).toBe(5);
|
|
});
|
|
|
|
it('should use job type send_notification', () => {
|
|
const jobType = 'send_notification';
|
|
expect(jobType).toBe('send_notification');
|
|
});
|
|
});
|
|
});
|