-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Sending error in acknowledgement and e2e socket test
- Loading branch information
1 parent
d6a5fbe
commit 0f900be
Showing
5 changed files
with
199 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
import { Test, TestingModule } from '@nestjs/testing'; | ||
import { INestApplication } from '@nestjs/common'; | ||
import { AppModule } from '../src/app.module'; | ||
import { connectSocket, emitMessage } from './ws-client.helper'; | ||
import { Socket } from 'socket.io-client'; | ||
import { | ||
AuthenticationMessage, | ||
ES256KSigner, | ||
generateRandomKeyPair, | ||
setSettings, | ||
} from '@tonomy/tonomy-id-sdk'; | ||
// @ts-expect-error - cannot find module or its corresponding type declarations | ||
import { createJWK, toDid } from '@tonomy/tonomy-id-sdk/util'; | ||
|
||
setSettings({ | ||
blockchainUrl: 'http://localhost:8888', | ||
}); | ||
|
||
describe('CommunicationGateway (e2e)', () => { | ||
let app: INestApplication; | ||
let socket: Socket; | ||
|
||
beforeEach(async () => { | ||
const moduleFixture: TestingModule = await Test.createTestingModule({ | ||
imports: [AppModule], | ||
}).compile(); | ||
|
||
app = moduleFixture.createNestApplication(); | ||
app.listen(5000); | ||
|
||
socket = await connectSocket(); | ||
}); | ||
|
||
afterEach(async () => { | ||
await socket.disconnect(); | ||
await socket.close(); | ||
await app.close(); | ||
}); | ||
|
||
describe('login event', () => { | ||
it('succeeds for did:jwk message', async () => { | ||
const { privateKey, publicKey } = generateRandomKeyPair(); | ||
const signer = ES256KSigner(privateKey.data.array, true); | ||
const jwk = await createJWK(publicKey); | ||
const did = toDid(jwk); | ||
|
||
const issuer = { | ||
did, | ||
signer, | ||
alg: 'ES256K-R', | ||
}; | ||
const message = await AuthenticationMessage.signMessageWithoutRecipient( | ||
{ data: 'test' }, | ||
issuer, | ||
); | ||
|
||
const response = await emitMessage(socket, 'login', { message }); | ||
|
||
expect(response).toBeTruthy(); | ||
}); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
import { io, Socket } from 'socket.io-client'; | ||
import { HttpStatus } from '@nestjs/common'; | ||
import { WebsocketReturnType } from 'src/communication/communication.gateway'; | ||
|
||
export const SOCKET_TIMEOUT = 1000; | ||
|
||
export async function connectSocket(): Promise<Socket> { | ||
const socket = io('http://localhost:5000', { | ||
autoConnect: false, | ||
transports: ['websocket'], | ||
}); | ||
|
||
socket.connect(); | ||
let resolved = false; | ||
|
||
await new Promise<void>((resolve, reject) => { | ||
socket.on('connect', () => { | ||
resolved = true; | ||
resolve(); | ||
}); | ||
|
||
setTimeout(() => { | ||
if (resolved) return; | ||
reject(new Error('Websocket connection event timed out')); | ||
}, SOCKET_TIMEOUT); | ||
}); | ||
return socket; | ||
} | ||
|
||
export async function emitMessage( | ||
socket: Socket, | ||
event: string, | ||
body: any, | ||
): Promise<any> { | ||
const res: WebsocketReturnType = await new Promise((resolve, reject) => { | ||
socket | ||
.timeout(SOCKET_TIMEOUT) | ||
.emit(event, body, (error: any, response: any) => { | ||
if (error) { | ||
reject(error); | ||
return; | ||
} | ||
|
||
resolve(response); | ||
}); | ||
}); | ||
|
||
if (res.status !== HttpStatus.OK) { | ||
const err = new Error(res.error); | ||
|
||
// @ts-expect-error - code is not a property of Error | ||
err.code = res.status; | ||
throw err; | ||
} else { | ||
return res.details; | ||
} | ||
} | ||
|
||
// export async function emitMessage( | ||
// socket: Socket, | ||
// event: string, | ||
// body: any, | ||
// ): Promise<any> { | ||
// return await new Promise((resolve, reject) => { | ||
// let resolved = false; | ||
|
||
// const res = socket.emit(event, body, (response: any) => { | ||
// console.log('response', response); | ||
|
||
// if (response.error) { | ||
// reject(response.error); | ||
// return; | ||
// } | ||
|
||
// resolved = true; | ||
// resolve(response); | ||
// return; | ||
// }); | ||
|
||
// // console.log('res', res); | ||
|
||
// setTimeout(() => { | ||
// if (resolved) return; | ||
// reject(new Error('Websocket event timed out')); | ||
// }, 1000); | ||
// }); | ||
// } |