diff --git a/packages/services/src/Domain/Revision/RevisionManager.ts b/packages/services/src/Domain/Revision/RevisionManager.ts index dd0705ea7..7d492c871 100644 --- a/packages/services/src/Domain/Revision/RevisionManager.ts +++ b/packages/services/src/Domain/Revision/RevisionManager.ts @@ -16,31 +16,23 @@ export class RevisionManager extends AbstractService implements RevisionClientIn async listRevisions( itemUuid: Uuid, ): Promise<{ uuid: string; content_type: string; created_at: string; updated_at: string; required_role: string }[]> { - try { - const result = await this.revisionApiService.listRevisions(itemUuid.value) + const result = await this.revisionApiService.listRevisions(itemUuid.value) - if (result.data.error) { - return [] - } - - return result.data.revisions - } catch (error) { - return [] + if (result.data.error) { + throw new Error(result.data.error.message) } + + return result.data.revisions } async deleteRevision(itemUuid: Uuid, revisionUuid: Uuid): Promise { - try { - const result = await this.revisionApiService.deleteRevision(itemUuid.value, revisionUuid.value) + const result = await this.revisionApiService.deleteRevision(itemUuid.value, revisionUuid.value) - if (result.data.error) { - return result.data.error.message - } - - return result.data.message - } catch (error) { - return 'An error occurred while deleting the revision.' + if (result.data.error) { + throw new Error(result.data.error.message) } + + return result.data.message } async getRevision( @@ -57,16 +49,12 @@ export class RevisionManager extends AbstractService implements RevisionClientIn created_at: string updated_at: string } | null> { - try { - const result = await this.revisionApiService.getRevision(itemUuid.value, revisionUuid.value) + const result = await this.revisionApiService.getRevision(itemUuid.value, revisionUuid.value) - if (result.data.error) { - return null - } - - return result.data.revision - } catch (error) { - return null + if (result.data.error) { + throw new Error(result.data.error.message) } + + return result.data.revision } } diff --git a/packages/snjs/lib/Domain/UseCase/DeleteRevision/DeleteRevision.spec.ts b/packages/snjs/lib/Domain/UseCase/DeleteRevision/DeleteRevision.spec.ts index 9d06d88e9..38f6a46ff 100644 --- a/packages/snjs/lib/Domain/UseCase/DeleteRevision/DeleteRevision.spec.ts +++ b/packages/snjs/lib/Domain/UseCase/DeleteRevision/DeleteRevision.spec.ts @@ -46,4 +46,18 @@ describe('DeleteRevision', () => { expect(result.isFailed()).toBe(true) expect(result.getError()).toEqual('Could not delete revision: Given value is not a valid uuid: invalid') }) + + it('should fail if revision manager throws', async () => { + const useCase = createUseCase() + + revisionManager.deleteRevision = jest.fn().mockRejectedValue(new Error('error')) + + const result = await useCase.execute({ + itemUuid: '00000000-0000-0000-0000-000000000000', + revisionUuid: '00000000-0000-0000-0000-000000000000', + }) + + expect(result.isFailed()).toBe(true) + expect(result.getError()).toEqual('Could not delete revision: error') + }) }) diff --git a/packages/snjs/lib/Domain/UseCase/DeleteRevision/DeleteRevision.ts b/packages/snjs/lib/Domain/UseCase/DeleteRevision/DeleteRevision.ts index ba7b6cd93..7529f1e48 100644 --- a/packages/snjs/lib/Domain/UseCase/DeleteRevision/DeleteRevision.ts +++ b/packages/snjs/lib/Domain/UseCase/DeleteRevision/DeleteRevision.ts @@ -19,8 +19,12 @@ export class DeleteRevision implements UseCaseInterface { } const revisionUuid = revisionUuidOrError.getValue() - await this.revisionManager.deleteRevision(itemUuid, revisionUuid) + try { + await this.revisionManager.deleteRevision(itemUuid, revisionUuid) - return Result.ok() + return Result.ok() + } catch (error) { + return Result.fail(`Could not delete revision: ${(error as Error).message}`) + } } } diff --git a/packages/snjs/lib/Domain/UseCase/GetRevision/GetRevision.spec.ts b/packages/snjs/lib/Domain/UseCase/GetRevision/GetRevision.spec.ts index 30ae8996c..29b0106bf 100644 --- a/packages/snjs/lib/Domain/UseCase/GetRevision/GetRevision.spec.ts +++ b/packages/snjs/lib/Domain/UseCase/GetRevision/GetRevision.spec.ts @@ -155,4 +155,18 @@ describe('GetRevision', () => { expect(result.isFailed()).toBe(true) }) + + it('should fail if revision manager throws', async () => { + revisionManager.getRevision = jest.fn().mockRejectedValue(new Error('error')) + + const useCase = createUseCase() + + const result = await useCase.execute({ + itemUuid: '00000000-0000-0000-0000-000000000000', + revisionUuid: '00000000-0000-0000-0000-000000000000', + }) + + expect(result.isFailed()).toBe(true) + expect(result.getError()).toEqual('Could not get revision: error') + }) }) diff --git a/packages/snjs/lib/Domain/UseCase/GetRevision/GetRevision.ts b/packages/snjs/lib/Domain/UseCase/GetRevision/GetRevision.ts index 267722c7b..a3fb37248 100644 --- a/packages/snjs/lib/Domain/UseCase/GetRevision/GetRevision.ts +++ b/packages/snjs/lib/Domain/UseCase/GetRevision/GetRevision.ts @@ -29,8 +29,14 @@ export class GetRevision implements UseCaseInterface { } const revisionUuid = revisionUuidOrError.getValue() - const revision = await this.revisionManager.getRevision(itemUuid, revisionUuid) - if (revision === null) { + let revision + try { + revision = await this.revisionManager.getRevision(itemUuid, revisionUuid) + } catch (error) { + return Result.fail(`Could not get revision: ${(error as Error).message}`) + } + + if (!revision) { return Result.fail('Could not get revision: Revision not found') } diff --git a/packages/snjs/lib/Domain/UseCase/ListRevisions/ListRevisions.spec.ts b/packages/snjs/lib/Domain/UseCase/ListRevisions/ListRevisions.spec.ts index d54d6adbe..37640ba94 100644 --- a/packages/snjs/lib/Domain/UseCase/ListRevisions/ListRevisions.spec.ts +++ b/packages/snjs/lib/Domain/UseCase/ListRevisions/ListRevisions.spec.ts @@ -29,4 +29,15 @@ describe('ListRevisions', () => { expect(result.isFailed()).toBe(true) expect(result.getError()).toEqual('Could not list item revisions: Given value is not a valid uuid: invalid') }) + + it('should fail if revision manager throws', async () => { + const useCase = createUseCase() + + revisionManager.listRevisions = jest.fn().mockRejectedValue(new Error('error')) + + const result = await useCase.execute({ itemUuid: '00000000-0000-0000-0000-000000000000' }) + + expect(result.isFailed()).toBe(true) + expect(result.getError()).toEqual('Could not list item revisions: error') + }) }) diff --git a/packages/snjs/lib/Domain/UseCase/ListRevisions/ListRevisions.ts b/packages/snjs/lib/Domain/UseCase/ListRevisions/ListRevisions.ts index 419925903..e88cf7c25 100644 --- a/packages/snjs/lib/Domain/UseCase/ListRevisions/ListRevisions.ts +++ b/packages/snjs/lib/Domain/UseCase/ListRevisions/ListRevisions.ts @@ -15,8 +15,12 @@ export class ListRevisions implements UseCaseInterface> } const itemUuid = itemUuidOrError.getValue() - const revisions = await this.revisionManager.listRevisions(itemUuid) + try { + const revisions = await this.revisionManager.listRevisions(itemUuid) - return Result.ok(revisions) + return Result.ok(revisions) + } catch (error) { + return Result.fail(`Could not list item revisions: ${(error as Error).message}`) + } } } diff --git a/packages/snjs/mocha/history.test.js b/packages/snjs/mocha/history.test.js index 1866a85aa..bed7de3bb 100644 --- a/packages/snjs/mocha/history.test.js +++ b/packages/snjs/mocha/history.test.js @@ -5,7 +5,7 @@ import { createNoteParams } from './lib/Items.js' chai.use(chaiAsPromised) const expect = chai.expect -describe.skip('history manager', () => { +describe('history manager', () => { const largeCharacterChange = 25 const syncOptions = {