Skip to content

Commit 6de066f

Browse files
committed
test: add use case for getting dataset versions
1 parent 7ed3bce commit 6de066f

3 files changed

Lines changed: 264 additions & 0 deletions

File tree

test/integration/datasets/DatasetsRepository.test.ts

Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1555,6 +1555,204 @@ describe('DatasetsRepository', () => {
15551555
}, 180000)
15561556
})
15571557

1558+
describe('getDatasetVersions', () => {
1559+
const testDatasetVersionsCollectionAlias = 'testDatasetVersionsCollection'
1560+
1561+
beforeAll(async () => {
1562+
await createCollectionViaApi(testDatasetVersionsCollectionAlias)
1563+
await publishCollectionViaApi(testDatasetVersionsCollectionAlias)
1564+
await setStorageDriverViaApi(testDatasetVersionsCollectionAlias, 'LocalStack')
1565+
})
1566+
1567+
afterAll(async () => {
1568+
await deleteCollectionViaApi(testDatasetVersionsCollectionAlias)
1569+
})
1570+
1571+
test('should return dataset versions when dataset exists', async () => {
1572+
const testDatasetIds = await createDataset.execute(
1573+
TestConstants.TEST_NEW_DATASET_DTO,
1574+
testDatasetVersionsCollectionAlias
1575+
)
1576+
1577+
const actual = await sut.getDatasetVersions(testDatasetIds.numericId)
1578+
1579+
expect(actual.versions.length).toBeGreaterThan(0)
1580+
expect(actual.totalCount).toBeGreaterThan(0)
1581+
expect(actual.versions[0].versionState).toBe('DRAFT')
1582+
expect(actual.versions[0].latestVersionPublishingState).toBe('DRAFT')
1583+
expect(actual.versions[0].isInReviewState).toBe(false)
1584+
1585+
await deleteUnpublishedDatasetViaApi(testDatasetIds.numericId)
1586+
})
1587+
1588+
test('should return dataset versions correctly after first publish', async () => {
1589+
const testDatasetIds = await createDataset.execute(
1590+
TestConstants.TEST_NEW_DATASET_DTO,
1591+
testDatasetVersionsCollectionAlias
1592+
)
1593+
await publishDataset.execute(testDatasetIds.numericId, VersionUpdateType.MAJOR)
1594+
1595+
await waitForNoLocks(testDatasetIds.numericId, 10)
1596+
1597+
const actual = await sut.getDatasetVersions(testDatasetIds.numericId)
1598+
1599+
expect(actual.versions.length).toBeGreaterThan(0)
1600+
expect(actual.totalCount).toBeGreaterThan(0)
1601+
expect(actual.versions[0].versionNumber).toBe(1)
1602+
expect(actual.versions[0].versionMinorNumber).toBe(0)
1603+
expect(actual.versions[0].versionState).toBe('RELEASED')
1604+
expect(actual.versions[0].isInReviewState).toBe(false)
1605+
1606+
await deletePublishedDatasetViaApi(testDatasetIds.persistentId)
1607+
})
1608+
1609+
test('should return dataset versions correctly after deaccessioned', async () => {
1610+
const testDatasetIds = await createDataset.execute(
1611+
TestConstants.TEST_NEW_DATASET_DTO,
1612+
testDatasetVersionsCollectionAlias
1613+
)
1614+
await publishDataset.execute(testDatasetIds.numericId, VersionUpdateType.MAJOR)
1615+
1616+
await waitForNoLocks(testDatasetIds.numericId, 10)
1617+
1618+
await deaccessionDatasetViaApi(testDatasetIds.numericId, '1.0')
1619+
1620+
const actual = await sut.getDatasetVersions(testDatasetIds.numericId)
1621+
1622+
expect(actual.versions.length).toBeGreaterThan(0)
1623+
expect(actual.totalCount).toBeGreaterThan(0)
1624+
expect(actual.versions[0].versionNumber).toBe(1)
1625+
expect(actual.versions[0].versionMinorNumber).toBe(0)
1626+
expect(actual.versions[0].versionState).toBe('DEACCESSIONED')
1627+
expect(actual.versions[0].isInReviewState).toBe(false)
1628+
1629+
await deletePublishedDatasetViaApi(testDatasetIds.persistentId)
1630+
})
1631+
1632+
test('should return dataset versions correctly after 1st publish and metadata fields update', async () => {
1633+
const testDatasetIds = await createDataset.execute(
1634+
TestConstants.TEST_NEW_DATASET_DTO,
1635+
testDatasetVersionsCollectionAlias
1636+
)
1637+
await publishDataset.execute(testDatasetIds.numericId, VersionUpdateType.MAJOR)
1638+
1639+
await waitForNoLocks(testDatasetIds.numericId, 10)
1640+
1641+
const metadataBlocksRepository = new MetadataBlocksRepository()
1642+
const citationMetadataBlock = await metadataBlocksRepository.getMetadataBlockByName(
1643+
'citation'
1644+
)
1645+
1646+
await sut.updateDataset(
1647+
testDatasetIds.numericId,
1648+
{
1649+
license: createDatasetLicenseModel(true),
1650+
metadataBlockValues: [
1651+
{
1652+
name: 'citation',
1653+
fields: {
1654+
title: 'Updated Dataset Title'
1655+
}
1656+
}
1657+
]
1658+
},
1659+
[citationMetadataBlock]
1660+
)
1661+
1662+
const actual = await sut.getDatasetVersions(testDatasetIds.numericId)
1663+
1664+
expect(actual.versions.length).toEqual(2)
1665+
expect(actual.totalCount).toEqual(2)
1666+
expect(actual.versions[0].versionState).toBe('DRAFT')
1667+
expect(actual.versions[0].isInReviewState).toBe(false)
1668+
1669+
expect(actual.versions[1].versionNumber).toBe(1)
1670+
expect(actual.versions[1].versionMinorNumber).toBe(0)
1671+
expect(actual.versions[1].versionState).toBe('RELEASED')
1672+
1673+
await deletePublishedDatasetViaApi(testDatasetIds.persistentId)
1674+
})
1675+
1676+
test('should return error when dataset does not exist', async () => {
1677+
const expectedError = new ReadError(
1678+
`[404] Dataset with ID ${nonExistentTestDatasetId} not found.`
1679+
)
1680+
1681+
await expect(sut.getDatasetVersions(nonExistentTestDatasetId)).rejects.toThrow(
1682+
expectedError
1683+
)
1684+
})
1685+
1686+
test('should return dataset versions with pagination', async () => {
1687+
const testDatasetIds = await createDataset.execute(
1688+
TestConstants.TEST_NEW_DATASET_DTO,
1689+
testDatasetVersionsCollectionAlias
1690+
)
1691+
1692+
await publishDataset.execute(testDatasetIds.numericId, VersionUpdateType.MAJOR)
1693+
await waitForNoLocks(testDatasetIds.numericId, 10)
1694+
1695+
const metadataBlocksRepository = new MetadataBlocksRepository()
1696+
const citationMetadataBlock = await metadataBlocksRepository.getMetadataBlockByName(
1697+
'citation'
1698+
)
1699+
1700+
for (let i = 1; i <= 21; i++) {
1701+
await sut.updateDataset(
1702+
testDatasetIds.numericId,
1703+
{
1704+
metadataBlockValues: [
1705+
{
1706+
name: 'citation',
1707+
fields: {
1708+
title: `Updated Dataset Title - Version ${i}`
1709+
}
1710+
}
1711+
]
1712+
},
1713+
[citationMetadataBlock]
1714+
)
1715+
1716+
await publishDataset.execute(testDatasetIds.numericId, VersionUpdateType.MINOR)
1717+
await waitForNoLocks(testDatasetIds.numericId, 10)
1718+
}
1719+
1720+
const firstPage = await sut.getDatasetVersions(testDatasetIds.numericId, 5, 0)
1721+
1722+
expect(firstPage.versions.length).toBe(5)
1723+
expect(firstPage.totalCount).toBe(22)
1724+
expect(firstPage.versions[0].versionNumber).toBe(1)
1725+
expect(firstPage.versions[0].versionMinorNumber).toBe(21)
1726+
expect(firstPage.versions[4].versionNumber).toBe(1)
1727+
expect(firstPage.versions[4].versionMinorNumber).toBe(17)
1728+
1729+
// Test pagination with limit=5, offset=5 (second page)
1730+
const secondPage = await sut.getDatasetVersions(testDatasetIds.numericId, 5, 5)
1731+
expect(secondPage.versions.length).toBe(5)
1732+
expect(secondPage.totalCount).toBe(22)
1733+
expect(firstPage.versions[0].versionNumber).toBe(1)
1734+
expect(firstPage.versions[0].versionMinorNumber).toBe(16)
1735+
expect(firstPage.versions[4].versionNumber).toBe(1)
1736+
expect(firstPage.versions[4].versionMinorNumber).toBe(12)
1737+
1738+
// Test pagination with limit=5, offset=10 (third page)
1739+
const thirdPage = await sut.getDatasetVersions(testDatasetIds.numericId, 5, 10)
1740+
expect(thirdPage.versions.length).toBe(5)
1741+
expect(thirdPage.totalCount).toBe(22)
1742+
expect(firstPage.versions[0].versionNumber).toBe(1)
1743+
expect(firstPage.versions[0].versionMinorNumber).toBe(11)
1744+
expect(firstPage.versions[4].versionNumber).toBe(1)
1745+
expect(firstPage.versions[4].versionMinorNumber).toBe(7)
1746+
1747+
// Test that all versions are returned without pagination
1748+
const allVersions = await sut.getDatasetVersions(testDatasetIds.numericId)
1749+
expect(allVersions.versions.length).toBe(22) // 1 initial + 21 updates
1750+
expect(allVersions.totalCount).toBe(22)
1751+
1752+
await deletePublishedDatasetViaApi(testDatasetIds.persistentId)
1753+
}, 180000)
1754+
})
1755+
15581756
describe('getDatasetDownloadCount', () => {
15591757
const testGetDatasetDownloadCountCollectionAlias = 'testGetDatasetDownloadCountCollection'
15601758
let testDatasetIds: CreatedDatasetIdentifiers
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { DatasetVersion, DatasetVersionState } from '../../../src'
2+
3+
export const createDatasetVersionModel = (
4+
props?: Partial<DatasetVersion>
5+
): DatasetVersion => ({
6+
id: 1,
7+
datasetId: 1,
8+
datasetPersistentId: 'doi:10.5072/FK2/AAENBT',
9+
datasetType: 'dataset',
10+
storageIdentifier: 's3://datasets/1',
11+
internalVersionNumber: 1,
12+
versionState: DatasetVersionState.DRAFT,
13+
latestVersionPublishingState: DatasetVersionState.DRAFT,
14+
isInReviewState: false,
15+
lastUpdateTime: '2021-01-01T00:00:00Z',
16+
createTime: '2021-01-01T00:00:00Z',
17+
publicationDate: '2021-01-01',
18+
citationDate: '2021-01-01',
19+
license: {
20+
'name': 'CC BY 4.0 (Creative Commons Attribution 4.0 International)',
21+
'uri': 'cc-by',
22+
'iconUri': 'https://licensebuttons.net/l/by/4.0/88x31.png'
23+
},
24+
fileAccessRequest: false,
25+
...props
26+
})
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { ReadError } from '../../../src/core/domain/repositories/ReadError'
2+
import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository'
3+
import { createDatasetVersionModel } from '../../testHelpers/datasets/datasetVersionsHelper'
4+
import { GetDatasetVersions } from '../../../src/datasets/domain/useCases/GetDatasetVersions'
5+
import { DatasetVersionSubset } from '../../../src/datasets/domain/models/DatasetVersion'
6+
7+
const testDatasetId = 1
8+
9+
describe('execute', () => {
10+
test('should return dataset versions summaries on repository success', async () => {
11+
const testDatasetVersionsSubset: DatasetVersionSubset = {
12+
versions: [createDatasetVersionModel()],
13+
totalCount: 1
14+
}
15+
const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository
16+
datasetsRepositoryStub.getDatasetVersionsSummaries = jest
17+
.fn()
18+
.mockResolvedValue(testDatasetVersionsSubset)
19+
const sut = new GetDatasetVersions(datasetsRepositoryStub)
20+
21+
const actual = await sut.execute(testDatasetId)
22+
23+
expect(actual).toEqual(testDatasetVersionsSubset)
24+
expect(datasetsRepositoryStub.getDatasetVersionsSummaries).toHaveBeenCalledWith(
25+
testDatasetId,
26+
undefined,
27+
undefined
28+
)
29+
})
30+
31+
test('should return error result on repository error', async () => {
32+
const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository
33+
datasetsRepositoryStub.getDatasetVersionsSummaries = jest
34+
.fn()
35+
.mockRejectedValue(new ReadError())
36+
const sut = new GetDatasetVersions(datasetsRepositoryStub)
37+
38+
await expect(sut.execute(testDatasetId)).rejects.toThrow(ReadError)
39+
})
40+
})

0 commit comments

Comments
 (0)