From 967a016393fbc535f6f066a6561ed602e2ab1329 Mon Sep 17 00:00:00 2001 From: Ellen Kraffmiller Date: Mon, 6 Oct 2025 14:52:14 -0400 Subject: [PATCH 01/13] update GetAllNotificationsByUser use case --- src/notifications/domain/models/Notification.ts | 2 +- .../repositories/INotificationsRepository.ts | 7 ++++++- .../domain/useCases/GetAllNotificationsByUser.ts | 15 +++++++++++++-- .../infra/repositories/NotificationsRepository.ts | 15 ++++++++++++--- .../infra/transformers/NotificationPayload.ts | 2 +- .../GetAllNotificationsByUser.test.ts | 9 +++++++++ 6 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/notifications/domain/models/Notification.ts b/src/notifications/domain/models/Notification.ts index 001d0933..f60b0ced 100644 --- a/src/notifications/domain/models/Notification.ts +++ b/src/notifications/domain/models/Notification.ts @@ -67,6 +67,6 @@ export interface Notification { dataFileId?: number dataFileDisplayName?: string currentCurationStatus?: string - additionalInfo?: string + additionalInfo?: Record objectDeleted?: boolean } diff --git a/src/notifications/domain/repositories/INotificationsRepository.ts b/src/notifications/domain/repositories/INotificationsRepository.ts index 9392c543..dc8895ca 100644 --- a/src/notifications/domain/repositories/INotificationsRepository.ts +++ b/src/notifications/domain/repositories/INotificationsRepository.ts @@ -1,7 +1,12 @@ import { Notification } from '../models/Notification' export interface INotificationsRepository { - getAllNotificationsByUser(inAppNotificationFormat?: boolean): Promise + getAllNotificationsByUser( + inAppNotificationFormat?: boolean, + onlyUnread?: boolean, + limit?: number, + offset?: number + ): Promise deleteNotification(notificationId: number): Promise getUnreadNotificationsCount(): Promise markNotificationAsRead(notificationId: number): Promise diff --git a/src/notifications/domain/useCases/GetAllNotificationsByUser.ts b/src/notifications/domain/useCases/GetAllNotificationsByUser.ts index 43555ccc..ba53bc96 100644 --- a/src/notifications/domain/useCases/GetAllNotificationsByUser.ts +++ b/src/notifications/domain/useCases/GetAllNotificationsByUser.ts @@ -9,11 +9,22 @@ export class GetAllNotificationsByUser implements UseCase { * Use case for retrieving all notifications for the current user. * * @param inAppNotificationFormat - Optional parameter to retrieve fields needed for in-app notifications + * @param onlyUnread - Optional parameter to filter only unread notifications + * @param limit - Optional parameter to limit the number of notifications returned + * @param offset - Optional parameter to skip a number of notifications (for pagination) * @returns {Promise} - A promise that resolves to an array of Notification instances. */ - async execute(inAppNotificationFormat?: boolean): Promise { + async execute( + inAppNotificationFormat?: boolean, + onlyUnread?: boolean, + limit?: number, + offset?: number + ): Promise { return (await this.notificationsRepository.getAllNotificationsByUser( - inAppNotificationFormat + inAppNotificationFormat, + onlyUnread, + limit, + offset )) as Notification[] } } diff --git a/src/notifications/infra/repositories/NotificationsRepository.ts b/src/notifications/infra/repositories/NotificationsRepository.ts index f310c34a..a2cf5c8d 100644 --- a/src/notifications/infra/repositories/NotificationsRepository.ts +++ b/src/notifications/infra/repositories/NotificationsRepository.ts @@ -7,13 +7,22 @@ export class NotificationsRepository extends ApiRepository implements INotificat private readonly notificationsResourceName: string = 'notifications' public async getAllNotificationsByUser( - inAppNotificationFormat?: boolean + inAppNotificationFormat?: boolean, + onlyUnread?: boolean, + limit?: number, + offset?: number ): Promise { - const queryParams = inAppNotificationFormat ? { inAppNotificationFormat: 'true' } : undefined + const queryParams: Record = {} + + if (inAppNotificationFormat) queryParams.inAppNotificationFormat = 'true' + if (onlyUnread) queryParams.onlyUnread = 'true' + if (limit !== undefined) queryParams.limit = limit + if (offset !== undefined) queryParams.offset = offset + return this.doGet( this.buildApiEndpoint(this.notificationsResourceName, 'all'), true, - queryParams + Object.keys(queryParams).length ? queryParams : undefined ) .then((response) => { const notifications = response.data.data.notifications diff --git a/src/notifications/infra/transformers/NotificationPayload.ts b/src/notifications/infra/transformers/NotificationPayload.ts index 96d381ac..d63bde79 100644 --- a/src/notifications/infra/transformers/NotificationPayload.ts +++ b/src/notifications/infra/transformers/NotificationPayload.ts @@ -25,6 +25,6 @@ export interface NotificationPayload { dataFileId?: number dataFileDisplayName?: string currentCurationStatus?: string - additionalInfo?: string + additionalInfo?: Record objectDeleted?: boolean } diff --git a/test/functional/notifications/GetAllNotificationsByUser.test.ts b/test/functional/notifications/GetAllNotificationsByUser.test.ts index 7ccd7ec1..08582ac2 100644 --- a/test/functional/notifications/GetAllNotificationsByUser.test.ts +++ b/test/functional/notifications/GetAllNotificationsByUser.test.ts @@ -34,4 +34,13 @@ describe('execute', () => { expect(notifications[0]).toHaveProperty('sentTimestamp') expect(notifications[0]).toHaveProperty('displayAsRead') }) + test('should have correct in-app notification properties when filter and paging params are set', async () => { + const notifications = await getAllNotificationsByUser.execute(true, true, 1, 0) + + expect(notifications[0]).toHaveProperty('id') + expect(notifications[0]).toHaveProperty('type') + expect(notifications[0]).toHaveProperty('sentTimestamp') + expect(notifications[0]).toHaveProperty('displayAsRead') + expect(notifications.length).toBeLessThanOrEqual(1) + }) }) From 40189c879f7d4d4808cb723eca957b85af71567c Mon Sep 17 00:00:00 2001 From: Ellen Kraffmiller Date: Mon, 6 Oct 2025 17:43:02 -0400 Subject: [PATCH 02/13] add integration tests --- test/environment/.env | 4 ++-- .../collections/CollectionsRepository.test.ts | 2 +- .../NotificationsRepository.test.ts | 22 +++++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/test/environment/.env b/test/environment/.env index e7b54bde..7d1dda97 100644 --- a/test/environment/.env +++ b/test/environment/.env @@ -1,6 +1,6 @@ POSTGRES_VERSION=17 DATAVERSE_DB_USER=dataverse SOLR_VERSION=9.8.0 -DATAVERSE_IMAGE_REGISTRY=docker.io -DATAVERSE_IMAGE_TAG=unstable +DATAVERSE_IMAGE_REGISTRY=ghcr.io +DATAVERSE_IMAGE_TAG=11852-notifs-api-pagination-unread DATAVERSE_BOOTSTRAP_TIMEOUT=5m diff --git a/test/integration/collections/CollectionsRepository.test.ts b/test/integration/collections/CollectionsRepository.test.ts index 2974e482..fb913064 100644 --- a/test/integration/collections/CollectionsRepository.test.ts +++ b/test/integration/collections/CollectionsRepository.test.ts @@ -1381,7 +1381,7 @@ describe('CollectionsRepository', () => { }) it('should return error when the dvObjectIdentifier of a file does not exist', async () => { - const invalidFileId = '99' + const invalidFileId = '99999999' const newFeaturedItems: DvObjectFeaturedItemDTO[] = [ { type: FeaturedItemType.FILE, diff --git a/test/integration/notifications/NotificationsRepository.test.ts b/test/integration/notifications/NotificationsRepository.test.ts index 5333e48d..08659a53 100644 --- a/test/integration/notifications/NotificationsRepository.test.ts +++ b/test/integration/notifications/NotificationsRepository.test.ts @@ -183,4 +183,26 @@ describe('NotificationsRepository', () => { expectedError ) }) + test('should only return unread notifications when onlyUnread is true', async () => { + const notifications: Notification[] = await sut.getAllNotificationsByUser(true, true) + + expect(Array.isArray(notifications)).toBe(true) + const originalUnreadCount = notifications.length + expect(notifications.length).toBeGreaterThanOrEqual(0) + + await expect(sut.markNotificationAsRead(notifications[0].id)).resolves.toBeUndefined() + + const updatedNotifications: Notification[] = await sut.getAllNotificationsByUser(true, true) + expect(updatedNotifications.length).toBe(originalUnreadCount - 1) + + const hasReadNotifications = notifications.some((n) => n.displayAsRead === true) + expect(hasReadNotifications).toBe(false) + }) + test('should return limited number of notifications when limit is set', async () => { + const limit = 1 + const notifications: Notification[] = await sut.getAllNotificationsByUser(true, false, limit, 0) + + expect(Array.isArray(notifications)).toBe(true) + expect(notifications.length).toBeLessThanOrEqual(limit) + }) }) From 2ebd8af9a1a96708a7c0388aca9746bfc5d1e8cc Mon Sep 17 00:00:00 2001 From: Ellen Kraffmiller Date: Wed, 8 Oct 2025 14:38:59 -0400 Subject: [PATCH 03/13] add changelog entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb116c44..7e344ca5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,10 +8,14 @@ This changelog follows the principles of [Keep a Changelog](https://keepachangel ### Added +- In GetAllNotificationsByUser use case, added support for filtering unread messages and pagination. + ### Changed ### Fixed +- In GetAllNotificationsByUser use case, additionalInfo field is returned as an object instead of a string. + ### Removed - Removed date fields validations in create and update dataset use cases, since validation is already handled in the backend and SPA frontend (other clients should perform client side validation also). This avoids duplicated logic and keeps the package focused on its core responsibility. From 7e86b7608c576c04b03c23424718af3222c14127 Mon Sep 17 00:00:00 2001 From: Ellen Kraffmiller Date: Tue, 21 Oct 2025 18:06:59 -0400 Subject: [PATCH 04/13] feat: add totalCount to results --- .../domain/models/NotificationSubset.ts | 6 ++ .../repositories/INotificationsRepository.ts | 4 +- .../useCases/GetAllNotificationsByUser.ts | 10 +-- .../repositories/NotificationsRepository.ts | 25 +++--- .../notifications/DeleteNotification.test.ts | 6 +- .../GetAllNotificationsByUser.test.ts | 17 ++-- .../NotificationsRepository.test.ts | 87 +++++++++++-------- 7 files changed, 95 insertions(+), 60 deletions(-) create mode 100644 src/notifications/domain/models/NotificationSubset.ts diff --git a/src/notifications/domain/models/NotificationSubset.ts b/src/notifications/domain/models/NotificationSubset.ts new file mode 100644 index 00000000..fe4644b6 --- /dev/null +++ b/src/notifications/domain/models/NotificationSubset.ts @@ -0,0 +1,6 @@ +import { Notification } from './Notification' + +export interface NotificationSubset { + notifications: Notification[] + totalNotificationCount: number +} diff --git a/src/notifications/domain/repositories/INotificationsRepository.ts b/src/notifications/domain/repositories/INotificationsRepository.ts index dc8895ca..6835f119 100644 --- a/src/notifications/domain/repositories/INotificationsRepository.ts +++ b/src/notifications/domain/repositories/INotificationsRepository.ts @@ -1,4 +1,4 @@ -import { Notification } from '../models/Notification' +import { NotificationSubset } from '../models/NotificationSubset' export interface INotificationsRepository { getAllNotificationsByUser( @@ -6,7 +6,7 @@ export interface INotificationsRepository { onlyUnread?: boolean, limit?: number, offset?: number - ): Promise + ): Promise deleteNotification(notificationId: number): Promise getUnreadNotificationsCount(): Promise markNotificationAsRead(notificationId: number): Promise diff --git a/src/notifications/domain/useCases/GetAllNotificationsByUser.ts b/src/notifications/domain/useCases/GetAllNotificationsByUser.ts index ba53bc96..b4b2e6f6 100644 --- a/src/notifications/domain/useCases/GetAllNotificationsByUser.ts +++ b/src/notifications/domain/useCases/GetAllNotificationsByUser.ts @@ -1,8 +1,8 @@ import { UseCase } from '../../../core/domain/useCases/UseCase' -import { Notification } from '../models/Notification' import { INotificationsRepository } from '../repositories/INotificationsRepository' +import { NotificationSubset } from '../models/NotificationSubset' -export class GetAllNotificationsByUser implements UseCase { +export class GetAllNotificationsByUser implements UseCase { constructor(private readonly notificationsRepository: INotificationsRepository) {} /** @@ -12,19 +12,19 @@ export class GetAllNotificationsByUser implements UseCase { * @param onlyUnread - Optional parameter to filter only unread notifications * @param limit - Optional parameter to limit the number of notifications returned * @param offset - Optional parameter to skip a number of notifications (for pagination) - * @returns {Promise} - A promise that resolves to an array of Notification instances. + * @returns {Promise} - A promise that resolves to an array of Notification instances. */ async execute( inAppNotificationFormat?: boolean, onlyUnread?: boolean, limit?: number, offset?: number - ): Promise { + ): Promise { return (await this.notificationsRepository.getAllNotificationsByUser( inAppNotificationFormat, onlyUnread, limit, offset - )) as Notification[] + )) as NotificationSubset } } diff --git a/src/notifications/infra/repositories/NotificationsRepository.ts b/src/notifications/infra/repositories/NotificationsRepository.ts index a2cf5c8d..662fb3a1 100644 --- a/src/notifications/infra/repositories/NotificationsRepository.ts +++ b/src/notifications/infra/repositories/NotificationsRepository.ts @@ -2,6 +2,7 @@ import { ApiRepository } from '../../../core/infra/repositories/ApiRepository' import { INotificationsRepository } from '../../domain/repositories/INotificationsRepository' import { Notification } from '../../domain/models/Notification' import { NotificationPayload } from '../transformers/NotificationPayload' +import { NotificationSubset } from '../../domain/models/NotificationSubset' export class NotificationsRepository extends ApiRepository implements INotificationsRepository { private readonly notificationsResourceName: string = 'notifications' @@ -11,22 +12,24 @@ export class NotificationsRepository extends ApiRepository implements INotificat onlyUnread?: boolean, limit?: number, offset?: number - ): Promise { - const queryParams: Record = {} - - if (inAppNotificationFormat) queryParams.inAppNotificationFormat = 'true' - if (onlyUnread) queryParams.onlyUnread = 'true' - if (limit !== undefined) queryParams.limit = limit - if (offset !== undefined) queryParams.offset = offset + ): Promise { + const queryParams = new URLSearchParams() + if (inAppNotificationFormat) queryParams.set('inAppNotificationFormat', 'true') + if (onlyUnread) queryParams.set('onlyUnread', 'true') + if (limit !== undefined) queryParams.set('limit', limit.toString()) + if (offset !== undefined) queryParams.set('offset', offset.toString()) + console.log('Fetching notifications with params:', queryParams.toString()) + console.log('keys:', Array.from(queryParams.keys())) + console.log('length:', Object.keys(queryParams).length) return this.doGet( this.buildApiEndpoint(this.notificationsResourceName, 'all'), true, - Object.keys(queryParams).length ? queryParams : undefined + queryParams ) .then((response) => { - const notifications = response.data.data.notifications - return notifications.map((notification: NotificationPayload) => { + console.log('Notifications API response:', response.data) + const notifications = response.data.data.map((notification: NotificationPayload) => { const { dataverseDisplayName, dataverseAlias, ...restNotification } = notification return { ...restNotification, @@ -34,6 +37,8 @@ export class NotificationsRepository extends ApiRepository implements INotificat ...(dataverseAlias && { collectionAlias: dataverseAlias }) } }) as Notification[] + const totalNotificationCount = response.data.totalCount + return { notifications, totalNotificationCount } }) .catch((error) => { throw error diff --git a/test/functional/notifications/DeleteNotification.test.ts b/test/functional/notifications/DeleteNotification.test.ts index 093fa637..86ceab44 100644 --- a/test/functional/notifications/DeleteNotification.test.ts +++ b/test/functional/notifications/DeleteNotification.test.ts @@ -12,12 +12,14 @@ describe('execute', () => { }) test('should successfully delete a notification for authenticated user', async () => { - const notifications = await getAllNotificationsByUser.execute() + const notificationSubset = await getAllNotificationsByUser.execute() + const notifications = notificationSubset.notifications const notificationId = notifications[notifications.length - 1].id await deleteNotification.execute(notificationId) - const notificationsAfterDelete = await getAllNotificationsByUser.execute() + const notificationsAfterDeleteSubset = await getAllNotificationsByUser.execute() + const notificationsAfterDelete = notificationsAfterDeleteSubset.notifications expect(notificationsAfterDelete.length).toBe(notifications.length - 1) }) diff --git a/test/functional/notifications/GetAllNotificationsByUser.test.ts b/test/functional/notifications/GetAllNotificationsByUser.test.ts index 08582ac2..1b41aa3c 100644 --- a/test/functional/notifications/GetAllNotificationsByUser.test.ts +++ b/test/functional/notifications/GetAllNotificationsByUser.test.ts @@ -1,7 +1,7 @@ -import { ApiConfig, getAllNotificationsByUser, Notification } from '../../../src' +import { ApiConfig, getAllNotificationsByUser } from '../../../src' import { TestConstants } from '../../testHelpers/TestConstants' import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig' - +import { NotificationSubset } from '../../../src/notifications/domain/models/NotificationSubset' describe('execute', () => { beforeEach(async () => { ApiConfig.init( @@ -12,14 +12,16 @@ describe('execute', () => { }) test('should successfully return notifications for authenticated user', async () => { - const notifications: Notification[] = await getAllNotificationsByUser.execute() + const result: NotificationSubset = await getAllNotificationsByUser.execute() + const notifications = result.notifications expect(notifications).not.toBeNull() expect(Array.isArray(notifications)).toBe(true) }) test('should have correct notification properties if notifications exist', async () => { - const notifications = await getAllNotificationsByUser.execute() + const result: NotificationSubset = await getAllNotificationsByUser.execute() + const notifications = result.notifications expect(notifications[0]).toHaveProperty('id') expect(notifications[0]).toHaveProperty('type') @@ -27,15 +29,18 @@ describe('execute', () => { }) test('should have correct in-app notification properties when inAppNotificationFormat is true', async () => { - const notifications = await getAllNotificationsByUser.execute(true) + const result: NotificationSubset = await getAllNotificationsByUser.execute(true) + const notifications = result.notifications expect(notifications[0]).toHaveProperty('id') expect(notifications[0]).toHaveProperty('type') expect(notifications[0]).toHaveProperty('sentTimestamp') expect(notifications[0]).toHaveProperty('displayAsRead') }) + test('should have correct in-app notification properties when filter and paging params are set', async () => { - const notifications = await getAllNotificationsByUser.execute(true, true, 1, 0) + const result: NotificationSubset = await getAllNotificationsByUser.execute(true, true, 1, 0) + const notifications = result.notifications expect(notifications[0]).toHaveProperty('id') expect(notifications[0]).toHaveProperty('type') diff --git a/test/integration/notifications/NotificationsRepository.test.ts b/test/integration/notifications/NotificationsRepository.test.ts index 08659a53..a93a1a5b 100644 --- a/test/integration/notifications/NotificationsRepository.test.ts +++ b/test/integration/notifications/NotificationsRepository.test.ts @@ -16,6 +16,7 @@ import { createCollectionDTO, deleteCollectionViaApi } from '../../testHelpers/collections/collectionHelper' +import { NotificationSubset } from '../../../src/notifications/domain/models/NotificationSubset' describe('NotificationsRepository', () => { const sut: NotificationsRepository = new NotificationsRepository() @@ -36,12 +37,12 @@ describe('NotificationsRepository', () => { await publishDatasetViaApi(testDatasetIds.numericId) await waitForNoLocks(testDatasetIds.numericId, 10) - const notifications: Notification[] = await sut.getAllNotificationsByUser() + const notificationSubset: NotificationSubset = await sut.getAllNotificationsByUser() - expect(Array.isArray(notifications)).toBe(true) - expect(notifications.length).toBeGreaterThan(0) + expect(Array.isArray(notificationSubset.notifications)).toBe(true) + expect(notificationSubset.notifications.length).toBeGreaterThan(0) - const publishedNotification = notifications.find( + const publishedNotification = notificationSubset.notifications.find( (n) => n.type === NotificationType.PUBLISHEDDS ) as Notification @@ -62,14 +63,14 @@ describe('NotificationsRepository', () => { }) test('should delete a notification by ID', async () => { - const notifications: Notification[] = await sut.getAllNotificationsByUser() + const notificationSubset: NotificationSubset = await sut.getAllNotificationsByUser() - const notificationToDelete = notifications[0] + const notificationToDelete = notificationSubset.notifications[0] await sut.deleteNotification(notificationToDelete.id) - const notificationsAfterDelete: Notification[] = await sut.getAllNotificationsByUser() - const deletedNotification = notificationsAfterDelete.find( + const notificationsAfterDelete: NotificationSubset = await sut.getAllNotificationsByUser() + const deletedNotification = notificationsAfterDelete.notifications.find( (n) => n.id === notificationToDelete.id ) expect(deletedNotification).toBeUndefined() @@ -86,9 +87,9 @@ describe('NotificationsRepository', () => { }) test('should return notifications with basic properties when inAppNotificationFormat is true', async () => { - const notifications: Notification[] = await sut.getAllNotificationsByUser(true) + const notificationSubset: NotificationSubset = await sut.getAllNotificationsByUser(true) - const notification = notifications[0] + const notification = notificationSubset.notifications[0] expect(notification).toHaveProperty('id') expect(notification).toHaveProperty('type') expect(notification).toHaveProperty('sentTimestamp') @@ -96,9 +97,9 @@ describe('NotificationsRepository', () => { }) test('should find notification with ASSIGNROLE type that has not been deleted', async () => { - const notifications: Notification[] = await sut.getAllNotificationsByUser(true) + const notificationSubset: NotificationSubset = await sut.getAllNotificationsByUser(true) - const assignRoleNotification = notifications.find( + const assignRoleNotification = notificationSubset.notifications.find( (n) => n.type === NotificationType.ASSIGNROLE && !n.objectDeleted ) @@ -106,7 +107,6 @@ describe('NotificationsRepository', () => { expect(assignRoleNotification?.type).toBe(NotificationType.ASSIGNROLE) expect(assignRoleNotification?.sentTimestamp).toBeDefined() expect(assignRoleNotification?.displayAsRead).toBeDefined() - expect(assignRoleNotification?.collectionDisplayName).toBeDefined() expect(assignRoleNotification?.roleAssignments).toBeDefined() expect(assignRoleNotification?.roleAssignments?.length).toBeGreaterThan(0) @@ -125,11 +125,11 @@ describe('NotificationsRepository', () => { expect(createdCollectionId).toBeDefined() expect(createdCollectionId).toBeGreaterThan(0) - const notifications: Notification[] = await sut.getAllNotificationsByUser(true) - expect(Array.isArray(notifications)).toBe(true) - expect(notifications.length).toBeGreaterThan(0) + const notificationSubset: NotificationSubset = await sut.getAllNotificationsByUser(true, true) + expect(Array.isArray(notificationSubset.notifications)).toBe(true) + expect(notificationSubset.notifications.length).toBeGreaterThan(0) - const createdvNotification = notifications.find( + const createdvNotification = notificationSubset.notifications.find( (n) => n.collectionAlias === testCollectionAlias ) @@ -145,9 +145,9 @@ describe('NotificationsRepository', () => { }) test('should return array when inAppNotificationFormat is false', async () => { - const notifications: Notification[] = await sut.getAllNotificationsByUser(false) + const notificationSubset: NotificationSubset = await sut.getAllNotificationsByUser(false) - expect(Array.isArray(notifications)).toBe(true) + expect(Array.isArray(notificationSubset.notifications)).toBe(true) }) test('should return unread count', async () => { @@ -158,16 +158,18 @@ describe('NotificationsRepository', () => { }) test('should mark notification as read successfully', async () => { - const notifications: Notification[] = await sut.getAllNotificationsByUser() + const notificationSubset: NotificationSubset = await sut.getAllNotificationsByUser() - expect(notifications.length).toBeGreaterThan(0) + expect(notificationSubset.notifications.length).toBeGreaterThan(0) - const unreadNotification = notifications[0] + const unreadNotification = notificationSubset.notifications[0] await expect(sut.markNotificationAsRead(unreadNotification.id)).resolves.toBeUndefined() - const updatedNotifications: Notification[] = await sut.getAllNotificationsByUser() - const updatedNotification = updatedNotifications.find((n) => n.id === unreadNotification.id) + const updatedNotificationSubset: NotificationSubset = await sut.getAllNotificationsByUser() + const updatedNotification = updatedNotificationSubset.notifications.find( + (n) => n.id === unreadNotification.id + ) expect(updatedNotification?.displayAsRead).toBe(true) }) @@ -184,25 +186,40 @@ describe('NotificationsRepository', () => { ) }) test('should only return unread notifications when onlyUnread is true', async () => { - const notifications: Notification[] = await sut.getAllNotificationsByUser(true, true) + const notificationSubset: NotificationSubset = await sut.getAllNotificationsByUser(true, true) - expect(Array.isArray(notifications)).toBe(true) - const originalUnreadCount = notifications.length - expect(notifications.length).toBeGreaterThanOrEqual(0) + expect(Array.isArray(notificationSubset.notifications)).toBe(true) + const originalUnreadCount = notificationSubset.totalNotificationCount + expect(notificationSubset.notifications.length).toBeGreaterThanOrEqual(0) - await expect(sut.markNotificationAsRead(notifications[0].id)).resolves.toBeUndefined() + await expect( + sut.markNotificationAsRead(notificationSubset.notifications[0].id) + ).resolves.toBeUndefined() - const updatedNotifications: Notification[] = await sut.getAllNotificationsByUser(true, true) - expect(updatedNotifications.length).toBe(originalUnreadCount - 1) + const updatedNotifications: NotificationSubset = await sut.getAllNotificationsByUser( + true, + true, + 10, + 0 + ) + expect(updatedNotifications.totalNotificationCount).toBe(originalUnreadCount - 1) - const hasReadNotifications = notifications.some((n) => n.displayAsRead === true) + const hasReadNotifications = notificationSubset.notifications.some( + (n) => n.displayAsRead === true + ) expect(hasReadNotifications).toBe(false) }) test('should return limited number of notifications when limit is set', async () => { const limit = 1 - const notifications: Notification[] = await sut.getAllNotificationsByUser(true, false, limit, 0) + const notificationSubset: NotificationSubset = await sut.getAllNotificationsByUser( + true, + false, + limit, + 0 + ) - expect(Array.isArray(notifications)).toBe(true) - expect(notifications.length).toBeLessThanOrEqual(limit) + expect(Array.isArray(notificationSubset.notifications)).toBe(true) + expect(notificationSubset.notifications.length).toBeLessThanOrEqual(limit) + expect(notificationSubset.totalNotificationCount).toBeGreaterThanOrEqual(limit) }) }) From 8d571f35f5458812e7607de743d1f43cec716ff6 Mon Sep 17 00:00:00 2001 From: Ellen Kraffmiller Date: Wed, 22 Oct 2025 20:43:45 -0400 Subject: [PATCH 05/13] fix tests and remove logs --- .../repositories/NotificationsRepository.ts | 4 ---- .../notifications/DeleteNotification.test.ts | 3 ++- .../NotificationsRepository.test.ts | 20 +++++++------------ 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/src/notifications/infra/repositories/NotificationsRepository.ts b/src/notifications/infra/repositories/NotificationsRepository.ts index 662fb3a1..99e37c82 100644 --- a/src/notifications/infra/repositories/NotificationsRepository.ts +++ b/src/notifications/infra/repositories/NotificationsRepository.ts @@ -19,16 +19,12 @@ export class NotificationsRepository extends ApiRepository implements INotificat if (onlyUnread) queryParams.set('onlyUnread', 'true') if (limit !== undefined) queryParams.set('limit', limit.toString()) if (offset !== undefined) queryParams.set('offset', offset.toString()) - console.log('Fetching notifications with params:', queryParams.toString()) - console.log('keys:', Array.from(queryParams.keys())) - console.log('length:', Object.keys(queryParams).length) return this.doGet( this.buildApiEndpoint(this.notificationsResourceName, 'all'), true, queryParams ) .then((response) => { - console.log('Notifications API response:', response.data) const notifications = response.data.data.map((notification: NotificationPayload) => { const { dataverseDisplayName, dataverseAlias, ...restNotification } = notification return { diff --git a/test/functional/notifications/DeleteNotification.test.ts b/test/functional/notifications/DeleteNotification.test.ts index 86ceab44..5902013c 100644 --- a/test/functional/notifications/DeleteNotification.test.ts +++ b/test/functional/notifications/DeleteNotification.test.ts @@ -20,7 +20,8 @@ describe('execute', () => { const notificationsAfterDeleteSubset = await getAllNotificationsByUser.execute() const notificationsAfterDelete = notificationsAfterDeleteSubset.notifications - expect(notificationsAfterDelete.length).toBe(notifications.length - 1) + const deletedExists = notificationsAfterDelete.some((n) => n.id === notificationId) + expect(deletedExists).toBe(false) }) test('should throw an error when the notification id does not exist', async () => { diff --git a/test/integration/notifications/NotificationsRepository.test.ts b/test/integration/notifications/NotificationsRepository.test.ts index a93a1a5b..f9557202 100644 --- a/test/integration/notifications/NotificationsRepository.test.ts +++ b/test/integration/notifications/NotificationsRepository.test.ts @@ -189,22 +189,16 @@ describe('NotificationsRepository', () => { const notificationSubset: NotificationSubset = await sut.getAllNotificationsByUser(true, true) expect(Array.isArray(notificationSubset.notifications)).toBe(true) - const originalUnreadCount = notificationSubset.totalNotificationCount expect(notificationSubset.notifications.length).toBeGreaterThanOrEqual(0) + const notificationToMarkRead = notificationSubset.notifications[0] + await expect(sut.markNotificationAsRead(notificationToMarkRead.id)).resolves.toBeUndefined() - await expect( - sut.markNotificationAsRead(notificationSubset.notifications[0].id) - ).resolves.toBeUndefined() - - const updatedNotifications: NotificationSubset = await sut.getAllNotificationsByUser( - true, - true, - 10, - 0 + const updatedNotifications: NotificationSubset = await sut.getAllNotificationsByUser(true, true) + const stillPresent = updatedNotifications.notifications.some( + (n) => n.id === notificationToMarkRead.id ) - expect(updatedNotifications.totalNotificationCount).toBe(originalUnreadCount - 1) - - const hasReadNotifications = notificationSubset.notifications.some( + expect(stillPresent).toBe(false) + const hasReadNotifications = updatedNotifications.notifications.some( (n) => n.displayAsRead === true ) expect(hasReadNotifications).toBe(false) From 341f655a483a15ccd7a35539b8ea3af8913f6429 Mon Sep 17 00:00:00 2001 From: Ellen Kraffmiller Date: Tue, 2 Dec 2025 15:32:47 -0500 Subject: [PATCH 06/13] fix NotificationsRepository.test.ts: use persistentId to test the correct notification. --- .../NotificationsRepository.test.ts | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/test/integration/notifications/NotificationsRepository.test.ts b/test/integration/notifications/NotificationsRepository.test.ts index f1378a83..37560880 100644 --- a/test/integration/notifications/NotificationsRepository.test.ts +++ b/test/integration/notifications/NotificationsRepository.test.ts @@ -37,29 +37,24 @@ describe('NotificationsRepository', () => { await publishDatasetViaApi(testDatasetIds.numericId) await waitForNoLocks(testDatasetIds.numericId, 10) - const notificationSubset: NotificationSubset = await sut.getAllNotificationsByUser() + const notificationSubset: NotificationSubset = await sut.getAllNotificationsByUser(true) expect(Array.isArray(notificationSubset.notifications)).toBe(true) expect(notificationSubset.notifications.length).toBeGreaterThan(0) const publishedNotification = notificationSubset.notifications.find( - (n) => n.type === NotificationType.PUBLISHEDDS + (n) => + n.datasetPersistentIdentifier === testDatasetIds.persistentId && + n.type === NotificationType.PUBLISHEDDS ) as Notification expect(publishedNotification).toBeDefined() expect(publishedNotification).toHaveProperty('id') expect(publishedNotification).toHaveProperty('type') - expect(publishedNotification).toHaveProperty('subjectText') - expect(publishedNotification).toHaveProperty('messageText') - expect(publishedNotification).toHaveProperty('sentTimestamp') - - expect(publishedNotification?.subjectText).toContain( - `Dataset "${TestConstants.TEST_NEW_DATASET_DTO.metadataBlockValues[0].fields.title}" has been published` - ) - expect(publishedNotification?.messageText).toContain( - `Your dataset named ${TestConstants.TEST_NEW_DATASET_DTO.metadataBlockValues[0].fields.title}` + expect(publishedNotification?.datasetDisplayName).toContain( + `${TestConstants.TEST_NEW_DATASET_DTO.metadataBlockValues[0].fields.title}` ) }) From 10460ef3fad981389670553b828670e0b9c6fa27 Mon Sep 17 00:00:00 2001 From: Juan Pablo Tosca Villanueva Date: Thu, 4 Dec 2025 15:37:35 -0500 Subject: [PATCH 07/13] update .env: change DATAVERSE_IMAGE_TAG to unstable --- test/environment/.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/environment/.env b/test/environment/.env index 7d1dda97..fad1c7af 100644 --- a/test/environment/.env +++ b/test/environment/.env @@ -2,5 +2,5 @@ POSTGRES_VERSION=17 DATAVERSE_DB_USER=dataverse SOLR_VERSION=9.8.0 DATAVERSE_IMAGE_REGISTRY=ghcr.io -DATAVERSE_IMAGE_TAG=11852-notifs-api-pagination-unread +DATAVERSE_IMAGE_TAG=unstable DATAVERSE_BOOTSTRAP_TIMEOUT=5m From 8b77e8f90c1b5b13188c71d1a3702084ea7fcd33 Mon Sep 17 00:00:00 2001 From: Juan Pablo Tosca Villanueva Date: Thu, 4 Dec 2025 15:43:59 -0500 Subject: [PATCH 08/13] update .env: change DATAVERSE_IMAGE_TAG to 11852-notifs-api-pagination-unread --- test/environment/.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/environment/.env b/test/environment/.env index fad1c7af..7d1dda97 100644 --- a/test/environment/.env +++ b/test/environment/.env @@ -2,5 +2,5 @@ POSTGRES_VERSION=17 DATAVERSE_DB_USER=dataverse SOLR_VERSION=9.8.0 DATAVERSE_IMAGE_REGISTRY=ghcr.io -DATAVERSE_IMAGE_TAG=unstable +DATAVERSE_IMAGE_TAG=11852-notifs-api-pagination-unread DATAVERSE_BOOTSTRAP_TIMEOUT=5m From 29e036a55e42c3069c42975b4b7255848ce58bb9 Mon Sep 17 00:00:00 2001 From: Juan Pablo Tosca Villanueva Date: Thu, 4 Dec 2025 16:00:04 -0500 Subject: [PATCH 09/13] update .env: change DATAVERSE_IMAGE_REGISTRY to docker.io and reset DATAVERSE_IMAGE_TAG to unstable --- test/environment/.env | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/environment/.env b/test/environment/.env index 7d1dda97..e7b54bde 100644 --- a/test/environment/.env +++ b/test/environment/.env @@ -1,6 +1,6 @@ POSTGRES_VERSION=17 DATAVERSE_DB_USER=dataverse SOLR_VERSION=9.8.0 -DATAVERSE_IMAGE_REGISTRY=ghcr.io -DATAVERSE_IMAGE_TAG=11852-notifs-api-pagination-unread +DATAVERSE_IMAGE_REGISTRY=docker.io +DATAVERSE_IMAGE_TAG=unstable DATAVERSE_BOOTSTRAP_TIMEOUT=5m From 2a1a04c6d97690941a1b75c4a4d8fbe3686db797 Mon Sep 17 00:00:00 2001 From: Ellen Kraffmiller Date: Thu, 4 Dec 2025 17:01:04 -0500 Subject: [PATCH 10/13] fix CollectionsRepository.test.ts: use persistentId to test the correct notification. --- .../collections/CollectionsRepository.test.ts | 49 ++++++++++--------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/test/integration/collections/CollectionsRepository.test.ts b/test/integration/collections/CollectionsRepository.test.ts index ce080777..c341beb7 100644 --- a/test/integration/collections/CollectionsRepository.test.ts +++ b/test/integration/collections/CollectionsRepository.test.ts @@ -380,9 +380,14 @@ describe('CollectionsRepository', () => { const testTextFile1Name = 'test-file-1.txt' const testSubCollectionAlias = 'collectionsRepositoryTestSubCollection' - + const testCollectionItemsAlias = 'collectionsRepositoryTestCollectionItems' beforeAll(async () => { - await createCollectionViaApi(testSubCollectionAlias, testCollectionAlias).catch(() => { + await createCollectionViaApi(testCollectionItemsAlias, ROOT_COLLECTION_ALIAS).catch(() => { + throw new Error( + `Tests beforeAll(): Error while creating collection ${testCollectionItemsAlias}` + ) + }) + await createCollectionViaApi(testSubCollectionAlias, testCollectionItemsAlias).catch(() => { throw new Error( `Tests beforeAll(): Error while creating subcollection ${testSubCollectionAlias}` ) @@ -421,7 +426,7 @@ describe('CollectionsRepository', () => { // Give enough time to Solr for indexing await new Promise((resolve) => setTimeout(resolve, 5000)) - let actual = await sut.getCollectionItems(testCollectionAlias) + let actual = await sut.getCollectionItems(testCollectionItemsAlias) const actualFilePreview = actual.items[1] as FilePreview const actualDatasetPreview = actual.items[0] as DatasetPreview const actualCollectionPreview = actual.items[2] as CollectionPreview @@ -539,12 +544,12 @@ describe('CollectionsRepository', () => { expect(actualCollectionPreview.alias).toBe(testSubCollectionAlias) expect(actualCollectionPreview.description).toBe('We do all the science.') expect(actualCollectionPreview.imageUrl).toBe(undefined) - expect(actualCollectionPreview.parentAlias).toBe(testCollectionAlias) + expect(actualCollectionPreview.parentAlias).toBe(testCollectionItemsAlias) expect(actualCollectionPreview.parentName).toBe(expectedCollectionsName) expect(actualCollectionPreview.publicationStatuses).toContain(PublicationStatus.Unpublished) expect(actualCollectionPreview.releaseOrCreateDate).not.toBeUndefined() expect(actualCollectionPreview.affiliation).toBe('Scientific Research University') - expect(actualCollectionPreview.parentAlias).toBe('collectionsRepositoryTestCollection') + expect(actualCollectionPreview.parentAlias).toBe('collectionsRepositoryTestCollectionItems') expect(actualCollectionPreview.parentName).toBe(expectedCollectionsName) expect(actualCollectionPreview.type).toBe(CollectionItemType.COLLECTION) @@ -553,7 +558,7 @@ describe('CollectionsRepository', () => { expect(actual.facets).toEqual(expectedFacetsAll) // Test limit and offset - actual = await sut.getCollectionItems(testCollectionAlias, 1, 1) + actual = await sut.getCollectionItems(testCollectionItemsAlias, 1, 1) expect((actual.items[0] as FilePreview).name).toBe(expectedFileName) expect(actual.items.length).toBe(1) expect(actual.totalItemCount).toBe(3) @@ -563,7 +568,7 @@ describe('CollectionsRepository', () => { 'test-fi' ) actual = await sut.getCollectionItems( - testCollectionAlias, + testCollectionItemsAlias, undefined, undefined, collectionSearchCriteriaForFile @@ -575,7 +580,7 @@ describe('CollectionsRepository', () => { 'Dataset created using' ) actual = await sut.getCollectionItems( - testCollectionAlias, + testCollectionItemsAlias, undefined, undefined, collectionSearchCriteriaForDataset @@ -587,7 +592,7 @@ describe('CollectionsRepository', () => { const collectionSearchCriteriaForDatasetAndCollection = new CollectionSearchCriteria().withSearchText('the') actual = await sut.getCollectionItems( - testCollectionAlias, + testCollectionItemsAlias, undefined, undefined, collectionSearchCriteriaForDatasetAndCollection @@ -598,7 +603,7 @@ describe('CollectionsRepository', () => { // Test search text, limit and offset actual = await sut.getCollectionItems( - testCollectionAlias, + testCollectionItemsAlias, 1, 1, collectionSearchCriteriaForDatasetAndCollection @@ -611,7 +616,7 @@ describe('CollectionsRepository', () => { const collectionSearchCriteriaForCollectionType = new CollectionSearchCriteria().withItemTypes([CollectionItemType.COLLECTION]) actual = await sut.getCollectionItems( - testCollectionAlias, + testCollectionItemsAlias, undefined, undefined, collectionSearchCriteriaForCollectionType @@ -626,7 +631,7 @@ describe('CollectionsRepository', () => { CollectionItemType.DATASET ]) actual = await sut.getCollectionItems( - testCollectionAlias, + testCollectionItemsAlias, undefined, undefined, collectionSearchCriteriaForDatasetType @@ -641,7 +646,7 @@ describe('CollectionsRepository', () => { CollectionItemType.FILE ]) actual = await sut.getCollectionItems( - testCollectionAlias, + testCollectionItemsAlias, undefined, undefined, collectionSearchCriteriaForFileType @@ -657,7 +662,7 @@ describe('CollectionsRepository', () => { CollectionItemType.COLLECTION ]) actual = await sut.getCollectionItems( - testCollectionAlias, + testCollectionItemsAlias, undefined, undefined, collectionSearchCriteriaForMultiTypes @@ -674,7 +679,7 @@ describe('CollectionsRepository', () => { .withOrder(OrderType.ASC) actual = await sut.getCollectionItems( - testCollectionAlias, + testCollectionItemsAlias, undefined, undefined, collectionSearchCriteriaNameAscending @@ -691,7 +696,7 @@ describe('CollectionsRepository', () => { .withOrder(OrderType.DESC) actual = await sut.getCollectionItems( - testCollectionAlias, + testCollectionItemsAlias, undefined, undefined, collectionSearchCriteriaNameDescending @@ -708,7 +713,7 @@ describe('CollectionsRepository', () => { .withOrder(OrderType.ASC) actual = await sut.getCollectionItems( - testCollectionAlias, + testCollectionItemsAlias, undefined, undefined, collectionSearchCriteriaDateAscending @@ -725,7 +730,7 @@ describe('CollectionsRepository', () => { .withOrder(OrderType.DESC) actual = await sut.getCollectionItems( - testCollectionAlias, + testCollectionItemsAlias, undefined, undefined, collectionSearchCriteriaDateDescending @@ -741,7 +746,7 @@ describe('CollectionsRepository', () => { new CollectionSearchCriteria().withFilterQueries(['dvCategory:Laboratory']) actual = await sut.getCollectionItems( - testCollectionAlias, + testCollectionItemsAlias, undefined, undefined, collectionSearchCriteriaFilterQueryCollection @@ -758,7 +763,7 @@ describe('CollectionsRepository', () => { ]) actual = await sut.getCollectionItems( - testCollectionAlias, + testCollectionItemsAlias, undefined, undefined, collectionSearchCriteriaFilterQueryDataset @@ -773,7 +778,7 @@ describe('CollectionsRepository', () => { new CollectionSearchCriteria().withFilterQueries(['fileAccess:Public']) actual = await sut.getCollectionItems( - testCollectionAlias, + testCollectionItemsAlias, undefined, undefined, collectionSearchCriteriaFilterQuerieCollAndFile @@ -786,7 +791,7 @@ describe('CollectionsRepository', () => { // Test with showTypeCounts param in true actual = await sut.getCollectionItems( - testCollectionAlias, + testCollectionItemsAlias, undefined, undefined, undefined, From 83d52ae0d82e60bea35c48cadbee3626293c97f3 Mon Sep 17 00:00:00 2001 From: Ellen Kraffmiller Date: Fri, 5 Dec 2025 14:28:05 -0500 Subject: [PATCH 11/13] fix CollectionsRepository.test.ts: remove test of datasetCitation from filePreview (not needed) --- test/integration/collections/CollectionsRepository.test.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/integration/collections/CollectionsRepository.test.ts b/test/integration/collections/CollectionsRepository.test.ts index c341beb7..0426e47e 100644 --- a/test/integration/collections/CollectionsRepository.test.ts +++ b/test/integration/collections/CollectionsRepository.test.ts @@ -501,7 +501,6 @@ describe('CollectionsRepository', () => { expect(actualFilePreview.checksum?.type).toBe('MD5') expect(actualFilePreview.checksum?.value).toBe(expectedFileMd5) - expect(actualFilePreview.datasetCitation).toContain(expectedDatasetCitationFragment) expect(actualFilePreview.datasetId).toBe(testDatasetIds.numericId) expect(actualFilePreview.datasetName).toBe(expectedDatasetDescription) expect(actualFilePreview.datasetPersistentId).toBe(testDatasetIds.persistentId) @@ -1002,7 +1001,6 @@ describe('CollectionsRepository', () => { expect(actualFilePreview.checksum?.type).toBe('MD5') expect(actualFilePreview.checksum?.value).toBe(expectedFileMd5) - expect(actualFilePreview.datasetCitation).toContain(expectedDatasetCitationFragment) expect(actualFilePreview.datasetId).toBe(testDatasetIds.numericId) expect(actualFilePreview.datasetName).toBe(expectedDatasetDescription) expect(actualFilePreview.datasetPersistentId).toBe(testDatasetIds.persistentId) From 160d58bc0df3686e8e431f4bd3dbc0c9f6fd7acf Mon Sep 17 00:00:00 2001 From: Ellen Kraffmiller Date: Fri, 5 Dec 2025 14:37:09 -0500 Subject: [PATCH 12/13] fix CollectionsRepository.test.ts: remove additional test of datasetCitation from filePreview --- test/integration/collections/CollectionsRepository.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/test/integration/collections/CollectionsRepository.test.ts b/test/integration/collections/CollectionsRepository.test.ts index 0426e47e..58eef058 100644 --- a/test/integration/collections/CollectionsRepository.test.ts +++ b/test/integration/collections/CollectionsRepository.test.ts @@ -1802,7 +1802,6 @@ describe('CollectionsRepository', () => { expect(actualFilePreview.checksum?.type).toBe('MD5') expect(actualFilePreview.checksum?.value).toBeDefined() - expect(actualFilePreview.datasetCitation).toContain(expectedDatasetCitationFragment) expect(actualFilePreview.datasetId).toBe(testDatasetIds.numericId) expect(actualFilePreview.datasetName).toBe(expectedDatasetDescription) expect(actualFilePreview.datasetPersistentId).toBe(testDatasetIds.persistentId) From 6eba2d8cf87344341a7befd42ba03727ad396c88 Mon Sep 17 00:00:00 2001 From: Ellen Kraffmiller Date: Fri, 5 Dec 2025 17:32:07 -0500 Subject: [PATCH 13/13] fix CollectionsRepository.test.ts: comment out tests that are affected by displayOrder bug --- .../collections/CollectionsRepository.test.ts | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/test/integration/collections/CollectionsRepository.test.ts b/test/integration/collections/CollectionsRepository.test.ts index 58eef058..f42906d1 100644 --- a/test/integration/collections/CollectionsRepository.test.ts +++ b/test/integration/collections/CollectionsRepository.test.ts @@ -68,7 +68,8 @@ describe('CollectionsRepository', () => { const testCollectionAlias = 'collectionsRepositoryTestCollection' const sut: CollectionsRepository = new CollectionsRepository() let testCollectionId: number - const currentYear = new Date().getFullYear() + // TODO: uncomment this test when https://github.com/IQSS/dataverse/issues/12027 is fixed + // const currentYear = new Date().getFullYear() beforeAll(async () => { // create builtin user and pass API key to APiConfig @@ -432,7 +433,8 @@ describe('CollectionsRepository', () => { const actualCollectionPreview = actual.items[2] as CollectionPreview const expectedFileMd5 = '68b22040025784da775f55cfcb6dee2e' - const expectedDatasetCitationFragment = `Admin, Dataverse; Owner, Dataverse, ${currentYear}, "Dataset created using the createDataset use case"` + // TODO: uncomment this test when https://github.com/IQSS/dataverse/issues/12027 is fixed + // const expectedDatasetCitationFragment = `Admin, Dataverse; Owner, Dataverse, ${currentYear}, "Dataset created using the createDataset use case"` const expectedDatasetDescription = 'Dataset created using the createDataset use case' const expectedFileName = 'test-file-1.txt' const expectedCollectionsName = 'Scientific Research' @@ -501,6 +503,8 @@ describe('CollectionsRepository', () => { expect(actualFilePreview.checksum?.type).toBe('MD5') expect(actualFilePreview.checksum?.value).toBe(expectedFileMd5) + // TODO: uncomment this test when https://github.com/IQSS/dataverse/issues/12027 is fixed + // expect(actualFilePreview.datasetCitation).toContain(expectedDatasetCitationFragment) expect(actualFilePreview.datasetId).toBe(testDatasetIds.numericId) expect(actualFilePreview.datasetName).toBe(expectedDatasetDescription) expect(actualFilePreview.datasetPersistentId).toBe(testDatasetIds.persistentId) @@ -521,7 +525,8 @@ describe('CollectionsRepository', () => { expect(actualFilePreview.canDownloadFile).toBe(true) expect(actualDatasetPreview.title).toBe(expectedDatasetDescription) - expect(actualDatasetPreview.citation).toContain(expectedDatasetCitationFragment) + // TODO: uncomment this test when https://github.com/IQSS/dataverse/issues/12027 is fixed + // expect(actualDatasetPreview.citation).toContain(expectedDatasetCitationFragment) expect(actualDatasetPreview.description).toBe('This is the description of the dataset.') expect(actualDatasetPreview.persistentId).not.toBeUndefined() expect(actualDatasetPreview.persistentId).not.toBeUndefined() @@ -994,13 +999,16 @@ describe('CollectionsRepository', () => { const expectedFileMd5 = '77c7f03a7d7772907b43f0b322cef723' - const expectedDatasetCitationFragment = `Admin, Dataverse; Owner, Dataverse, ${currentYear}, "Dataset created using the createDataset use case` + // TODO: uncomment this test when https://github.com/IQSS/dataverse/issues/12027 is fixed + // const expectedDatasetCitationFragment = `Admin, Dataverse; Owner, Dataverse, ${currentYear}, "Dataset created using the createDataset use case` const expectedDatasetDescription = 'Dataset created using the createDataset use case' const expectedFileName = 'test-file-4.tab' const expectedCollectionsName = 'Scientific Research' expect(actualFilePreview.checksum?.type).toBe('MD5') expect(actualFilePreview.checksum?.value).toBe(expectedFileMd5) + // TODO: uncomment this test when https://github.com/IQSS/dataverse/issues/12027 is fixed + // expect(actualFilePreview.datasetCitation).toContain(expectedDatasetCitationFragment) expect(actualFilePreview.datasetId).toBe(testDatasetIds.numericId) expect(actualFilePreview.datasetName).toBe(expectedDatasetDescription) expect(actualFilePreview.datasetPersistentId).toBe(testDatasetIds.persistentId) @@ -1023,7 +1031,8 @@ describe('CollectionsRepository', () => { expect(actualFilePreview.variables).toBe(3) expect(actualDatasetPreview.title).toBe(expectedDatasetDescription) - expect(actualDatasetPreview.citation).toContain(expectedDatasetCitationFragment) + // TODO: uncomment this test when https://github.com/IQSS/dataverse/issues/12027 is fixed + // expect(actualDatasetPreview.citation).toContain(expectedDatasetCitationFragment) expect(actualDatasetPreview.description).toBe('This is the description of the dataset.') expect(actualDatasetPreview.persistentId).not.toBeUndefined() expect(actualDatasetPreview.persistentId).not.toBeUndefined() @@ -1781,7 +1790,8 @@ describe('CollectionsRepository', () => { ) as CollectionPreview const expectedFileMd5 = '799b5c8c5fdcfbd56c3943f7a6c35326' - const expectedDatasetCitationFragment = `Admin, Dataverse; Owner, Dataverse, ${currentYear}, "Dataset created using the createDataset use case"` + // TODO: uncomment this test when https://github.com/IQSS/dataverse/issues/12027 is fixed + // const expectedDatasetCitationFragment = `Admin, Dataverse; Owner, Dataverse, ${currentYear}, "Dataset created using the createDataset use case"` const expectedDatasetDescription = 'Dataset created using the createDataset use case' const expectedFileName = 'test-file-2.txt' const expectedCollectionsName = 'Test Collection' @@ -1802,6 +1812,8 @@ describe('CollectionsRepository', () => { expect(actualFilePreview.checksum?.type).toBe('MD5') expect(actualFilePreview.checksum?.value).toBeDefined() + // TODO: uncomment this test when https://github.com/IQSS/dataverse/issues/12027 is fixed + // expect(actualFilePreview.datasetCitation).toContain(expectedDatasetCitationFragment) expect(actualFilePreview.datasetId).toBe(testDatasetIds.numericId) expect(actualFilePreview.datasetName).toBe(expectedDatasetDescription) expect(actualFilePreview.datasetPersistentId).toBe(testDatasetIds.persistentId) @@ -1821,7 +1833,8 @@ describe('CollectionsRepository', () => { expect(actualFilePreview.canDownloadFile).toBe(true) expect(actualDatasetPreview.title).toBe(expectedDatasetDescription) - expect(actualDatasetPreview.citation).toContain(expectedDatasetCitationFragment) + // TODO: uncomment this test when https://github.com/IQSS/dataverse/issues/12027 is fixed + // expect(actualDatasetPreview.citation).toContain(expectedDatasetCitationFragment) expect(actualDatasetPreview.description).toBe('This is the description of the dataset.') expect(actualDatasetPreview.persistentId).not.toBeUndefined() expect(actualDatasetPreview.persistentId).not.toBeUndefined()