diff --git a/package.json b/package.json index 55e9d56..5ec8f5f 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "author": "botlabs", "license": "BSD-4-Clause", "scripts": { - "build": "tsc && cp -r src/assets dist", + "build": "tsc -b ./tsconfig.build.json && cp -r src/assets dist", "format": "prettier --write \"src/**/*.ts\"", "start": "export NODE_ENV=dev-local; export SECRET=s3cr3t; export FAUCET_ACCOUNT=0xcdfd6024d2b0eba27d54cc92a44cd9a627c69b2dbda15ed7e58085425119ae03; ts-node -r tsconfig-paths/register src/main.ts", "start:dev": "nodemon", @@ -67,8 +67,14 @@ ], "rootDir": "src", "testRegex": ".spec.ts$", - "transform": { - "^.+\\.(t|j)s$": "ts-jest" + "preset": "ts-jest/presets/js-with-ts", + "transformIgnorePatterns": [ + "/node_modules/(?!@polkadot|@babel/runtime/helpers/esm/)" + ], + "globals": { + "ts-jest": { + "tsConfig": "./tsconfig.spec.json" + } }, "coverageDirectory": "../coverage", "testEnvironment": "node" diff --git a/src/contacts/contacts.module.spec.ts b/src/contacts/contacts.module.spec.ts index f32155f..c28acf6 100644 --- a/src/contacts/contacts.module.spec.ts +++ b/src/contacts/contacts.module.spec.ts @@ -253,10 +253,10 @@ describe('Contact Module', () => { .mockReturnValue({ exec: async (): Promise => [] }) public static findOne = jest .fn() - .mockReturnValue({ exec: async (): Promise => null }) + .mockReturnValue({ exec: async () => null }) public static replaceOne = jest .fn() - .mockReturnValue({ exec: async (): Promise => {} }) + .mockReturnValue({ exec: async (): Promise => undefined }) public static deleteMany = jest.fn().mockReturnValue({ exec: async () => { return @@ -346,7 +346,7 @@ describe('Contact Module', () => { it('queries database and converts match', async () => { const findOneSpy = jest .spyOn(contactsService['contactModel'], 'findOne') - .mockReturnValue({ exec: async (): Promise => null }) + .mockReturnValue({ exec: async () => null }) expect(await contactsService.findByAddress(address)).toEqual( Optional.ofNullable(null) ) diff --git a/src/ctypes/ctypes.module.spec.ts b/src/ctypes/ctypes.module.spec.ts index 802e1da..4b9ab10 100644 --- a/src/ctypes/ctypes.module.spec.ts +++ b/src/ctypes/ctypes.module.spec.ts @@ -228,7 +228,7 @@ describe('CType Module', () => { .mockReturnValue({ exec: async () => [] as CTypeDB[] }) public static findOne = jest .fn() - .mockReturnValue({ exec: async (): Promise => null }) + .mockReturnValue({ exec: async () => null }) public static deleteMany = jest.fn().mockReturnValue({ exec: async (): Promise => { return @@ -318,7 +318,7 @@ describe('CType Module', () => { .spyOn(ctypesService['cTypeDBModel'], 'findOne') .mockImplementation(() => { return { - exec: async (): Promise => null, + exec: async () => null, } }) diff --git a/src/messaging/messaging.module.spec.ts b/src/messaging/messaging.module.spec.ts index 7f77d4f..c2e51cf 100644 --- a/src/messaging/messaging.module.spec.ts +++ b/src/messaging/messaging.module.spec.ts @@ -84,7 +84,7 @@ describe('Messaging Module', () => { 'layer donor village public cruel caution learn bronze fish come embrace hurt', { signingKeyPairType: 'ed25519' } ) - receiverSignature = receiverIdentity.signStr(encryptedMessage.messageId) + receiverSignature = receiverIdentity.signStr(encryptedMessage.messageId!) }) describe('removeMessage', () => { it('removes a message for an id from the service', async () => { @@ -184,11 +184,11 @@ describe('Messaging Module', () => { it('sets messageId, receival Date and calls messagingService.add for valid message', async () => { const uuidv4Spy = jest .spyOn(Controller, 'uuidv4') - .mockReturnValue(encryptedMessage.messageId) + .mockReturnValue(encryptedMessage.messageId!) const nowSpy = jest .spyOn(Date, 'now') - .mockReturnValue(encryptedMessage.receivedAt) + .mockReturnValue(encryptedMessage.receivedAt!) const addSpy = jest .spyOn(messagesService, 'add') .mockResolvedValue(undefined) @@ -208,49 +208,37 @@ describe('Messaging Module', () => { }) }) it('throws BadRequestException on invalid message', async () => { - const noSender: IEncryptedMessage = { - ...encryptedMessage, - senderAddress: null, - } - const noReceiver: IEncryptedMessage = { - ...encryptedMessage, - receiverAddress: null, - } - const noNonce: IEncryptedMessage = { ...encryptedMessage, nonce: null } - const noMessage: IEncryptedMessage = { - ...encryptedMessage, - ciphertext: null, - } - const noHash: IEncryptedMessage = { ...encryptedMessage, hash: null } - const noSignature: IEncryptedMessage = { - ...encryptedMessage, - signature: null, - } + const { senderAddress, ...noSender } = encryptedMessage + const { receiverAddress, ...noReceiver } = encryptedMessage + const { nonce, ...noNonce } = encryptedMessage + const { ciphertext, ...noMessage } = encryptedMessage + const { hash, ...noHash } = encryptedMessage + const { signature, ...noSignature } = encryptedMessage - await expect(messagesController.sendMessage(noSender)).rejects.toThrow( - BadRequestException - ) - await expect(messagesController.sendMessage(noReceiver)).rejects.toThrow( - BadRequestException - ) - await expect(messagesController.sendMessage(noNonce)).rejects.toThrow( - BadRequestException - ) - await expect(messagesController.sendMessage(noMessage)).rejects.toThrow( - BadRequestException - ) - await expect(messagesController.sendMessage(noHash)).rejects.toThrow( - BadRequestException - ) - await expect(messagesController.sendMessage(noSignature)).rejects.toThrow( - BadRequestException - ) + await expect( + messagesController.sendMessage(noSender as IEncryptedMessage) + ).rejects.toThrow(BadRequestException) + await expect( + messagesController.sendMessage(noReceiver as IEncryptedMessage) + ).rejects.toThrow(BadRequestException) + await expect( + messagesController.sendMessage(noNonce as IEncryptedMessage) + ).rejects.toThrow(BadRequestException) + await expect( + messagesController.sendMessage(noMessage as IEncryptedMessage) + ).rejects.toThrow(BadRequestException) + await expect( + messagesController.sendMessage(noHash as IEncryptedMessage) + ).rejects.toThrow(BadRequestException) + await expect( + messagesController.sendMessage(noSignature as IEncryptedMessage) + ).rejects.toThrow(BadRequestException) }) }) class MessageModel { public static findOne = jest.fn().mockReturnValue({ - exec: async (): Promise => { + exec: async () => { return null }, }) @@ -263,9 +251,7 @@ describe('Messaging Module', () => { }, }) public static deleteMany = jest.fn().mockReturnValue({ - exec: (): Promise => { - return - }, + exec: async (): Promise => undefined, }) public static save = jest .fn() @@ -327,7 +313,7 @@ describe('Messaging Module', () => { const findOneSpy = jest .spyOn(messagingService['messageModel'], 'findOne') .mockReturnValue({ - exec: async (): Promise => { + exec: async () => { return null }, }) @@ -437,7 +423,7 @@ describe('Messaging Module', () => { return }, }) - await messagingService.remove(encryptedMessage.messageId) + await messagingService.remove(encryptedMessage.messageId!) expect(deleteOneSpy).toHaveBeenCalledTimes(1) expect(deleteOneSpy).toHaveBeenCalledWith({ messageId: encryptedMessage.messageId, diff --git a/test/contacts.e2e-spec.ts b/test/contacts.e2e-spec.ts index 94f8b73..c65c413 100644 --- a/test/contacts.e2e-spec.ts +++ b/test/contacts.e2e-spec.ts @@ -152,10 +152,10 @@ describe('contacts endpoint (e2e)', () => { }) it('rejects if address missing', async () => { - const corruptedContact: Contact = { + const corruptedContact = { ...contactA, publicIdentity: { ...contactA.publicIdentity, address: undefined }, - } + } as unknown as Contact await request(app.getHttpServer()) .post(`/contacts`) .send(corruptedContact) @@ -165,13 +165,13 @@ describe('contacts endpoint (e2e)', () => { }) it('rejects if boxPublicKeyAsHex missing', async () => { - const corruptedContact: Contact = { + const corruptedContact = { ...contactA, publicIdentity: { ...contactA.publicIdentity, boxPublicKeyAsHex: undefined, }, - } + } as unknown as Contact await request(app.getHttpServer()) .post(`/contacts`) .send(corruptedContact) @@ -181,12 +181,11 @@ describe('contacts endpoint (e2e)', () => { }) it('rejects if name missing', async () => { - const corruptedContact: Contact = { + const corruptedContact = { ...contactA, metaData: { - name: undefined, }, - } + } as Contact await request(app.getHttpServer()) .post(`/contacts`) .send(corruptedContact) diff --git a/test/jest-e2e.json b/test/jest-e2e.json index e9d912f..77f6b7f 100644 --- a/test/jest-e2e.json +++ b/test/jest-e2e.json @@ -3,7 +3,13 @@ "rootDir": ".", "testEnvironment": "node", "testRegex": ".e2e-spec.ts$", - "transform": { - "^.+\\.(t|j)s$": "ts-jest" + "preset": "ts-jest/presets/js-with-ts", + "transformIgnorePatterns": [ + "/node_modules/(?!@polkadot|@babel/runtime/helpers/esm/)" + ], + "globals": { + "ts-jest": { + "tsConfig": "./tsconfig.spec.json" + } } } diff --git a/test/messaging.e2e-spec.ts b/test/messaging.e2e-spec.ts index 5db1caa..32aaf5b 100644 --- a/test/messaging.e2e-spec.ts +++ b/test/messaging.e2e-spec.ts @@ -3,6 +3,7 @@ import { Test } from '@nestjs/testing' import { Identity } from '@kiltprotocol/core' import { MessageBodyType, IEncryptedMessage } from '@kiltprotocol/types' import Message from '@kiltprotocol/messaging' +import { Crypto } from '@kiltprotocol/utils' import supertest from 'supertest' import { MessagingService } from '../src/messaging/interfaces/messaging.interfaces' import { MessagingModule } from '../src/messaging/messaging.module' @@ -48,9 +49,9 @@ describe('messaging (e2e)', () => { message = new Message( { type: MessageBodyType.REQUEST_TERMS, - content: { cTypeHash: 'CTYPEHASH' }, + content: { cTypeHash: Crypto.hashStr('CTYPEHASH') }, }, - sender, + sender.getPublicIdentity(), recipient.getPublicIdentity() ) }) @@ -66,7 +67,7 @@ describe('messaging (e2e)', () => { }) it('accepts valid send request', async () => { - const encrypted = message.encrypt() + const encrypted = message.encrypt(sender, recipient.getPublicIdentity()) await request .post(`/messaging`) .send(encrypted) @@ -86,7 +87,7 @@ describe('messaging (e2e)', () => { }) it('returns message id & timestamp', async () => { - const encrypted = message.encrypt() + const encrypted = message.encrypt(sender, recipient.getPublicIdentity()) await request .post(`/messaging`) .send(encrypted) @@ -106,7 +107,7 @@ describe('messaging (e2e)', () => { }) it('shows message in sent & inbox after sending', async () => { - const encrypted = message.encrypt() + const encrypted = message.encrypt(sender, recipient.getPublicIdentity()) function responseContainsSentMessage( response: supertest.Response ): void { @@ -144,8 +145,9 @@ describe('messaging (e2e)', () => { }) it('rejects request with missing sender address', async () => { - const encrypted = message.encrypt() - encrypted.senderAddress = undefined + const encrypted = message.encrypt(sender, recipient.getPublicIdentity()) + // @ts-ignore + delete encrypted.senderAddress return request .post(`/messaging`) .send(encrypted) @@ -156,8 +158,9 @@ describe('messaging (e2e)', () => { }) it('rejects request with missing recipient address', async () => { - const encrypted = message.encrypt() - encrypted.receiverAddress = undefined + const encrypted = message.encrypt(sender, recipient.getPublicIdentity()) + // @ts-ignore + delete encrypted.receiverAddress return request .post(`/messaging`) .send(encrypted) @@ -168,8 +171,9 @@ describe('messaging (e2e)', () => { }) it('rejects request with missing nonce', async () => { - const encrypted = message.encrypt() - encrypted.nonce = undefined + const encrypted = message.encrypt(sender, recipient.getPublicIdentity()) + // @ts-ignore + delete encrypted.nonce return request .post(`/messaging`) .send(encrypted) @@ -178,8 +182,9 @@ describe('messaging (e2e)', () => { }) it('rejects request with missing message body', async () => { - const encrypted = message.encrypt() - encrypted.ciphertext = undefined + const encrypted = message.encrypt(sender, recipient.getPublicIdentity()) + // @ts-ignore + delete encrypted.ciphertext return request .post(`/messaging`) .send(encrypted) @@ -188,8 +193,9 @@ describe('messaging (e2e)', () => { }) it('rejects request with missing hash', async () => { - const encrypted = message.encrypt() - encrypted.hash = undefined + const encrypted = message.encrypt(sender, recipient.getPublicIdentity()) + // @ts-ignore + delete encrypted.hash return request .post(`/messaging`) .send(encrypted) @@ -198,8 +204,9 @@ describe('messaging (e2e)', () => { }) it('rejects request with missing signature', async () => { - const encrypted = message.encrypt() - encrypted.signature = undefined + const encrypted = message.encrypt(sender, recipient.getPublicIdentity()) + // @ts-ignore + delete encrypted.signature return request .post(`/messaging`) .send(encrypted) @@ -214,9 +221,9 @@ describe('messaging (e2e)', () => { let message2: IEncryptedMessage beforeEach(async () => { - message1 = message.encrypt() + message1 = message.encrypt(sender, recipient.getPublicIdentity()) message1.messageId = 'id1' - message2 = message.encrypt() + message2 = message.encrypt(sender, recipient.getPublicIdentity()) message2.messageId = 'id2' await messagingService.removeAll() await messagingService.add(message1) @@ -295,12 +302,12 @@ describe('messaging (e2e)', () => { it('lists incoming messages', async () => { await request.get(`/messaging/inbox/${recipient.address}`).expect(200, []) const message1: IEncryptedMessage = { - ...message.encrypt(), + ...message.encrypt(sender, recipient.getPublicIdentity()), messageId: 'id1', receivedAt: Date.now(), } const message2: IEncryptedMessage = { - ...message.encrypt(), + ...message.encrypt(sender, recipient.getPublicIdentity()), messageId: 'id2', receivedAt: Date.now(), } @@ -336,12 +343,12 @@ describe('messaging (e2e)', () => { it('lists outgoing messages', async () => { const message1: IEncryptedMessage = { - ...message.encrypt(), + ...message.encrypt(sender, recipient.getPublicIdentity()), messageId: 'id1', receivedAt: Date.now(), } const message2: IEncryptedMessage = { - ...message.encrypt(), + ...message.encrypt(sender, recipient.getPublicIdentity()), messageId: 'id2', receivedAt: Date.now(), } @@ -369,7 +376,7 @@ describe('messaging (e2e)', () => { it('send -> receive -> decrypt -> delete', async () => { await messagingService.removeAll() - const encrypted = message.encrypt() + const encrypted = message.encrypt(sender, recipient.getPublicIdentity()) const messageId: string = await request .post(`/messaging`) .send(encrypted) diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 0000000..2685325 --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "exclude": [ + "dist", + "node_modules", + "**/*.spec.ts", + "**/*.e2e-spec.ts" + ] +} diff --git a/tsconfig.json b/tsconfig.json index f68ab2f..ed84228 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,18 +8,22 @@ "allowSyntheticDefaultImports": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, - "target": "es6", + "target": "es2020", "sourceMap": true, "outDir": "./dist", "baseUrl": "./", "esModuleInterop": true, - "resolveJsonModule": true + "resolveJsonModule": true, + "lib": ["es2020"], + "strict": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true }, "include": [ "src/**/*" ], "exclude": [ + "dist", "node_modules", - "**/*.spec.ts" ] } diff --git a/tsconfig.spec.json b/tsconfig.spec.json index 3939be9..59838bc 100644 --- a/tsconfig.spec.json +++ b/tsconfig.spec.json @@ -1,7 +1,6 @@ { - "extends": "tsconfig.json", + "extends": "./tsconfig.json", "compilerOptions": { - "types": ["jest", "node"] + "allowJs": true }, - "include": ["**/*.spec.ts", "**/*.d.ts"] }