@joystick.js/db-canary
Version:
JoystickDB - A minimalist database server for the Joystick framework
156 lines (107 loc) • 4.2 kB
JavaScript
import test from 'ava';
import { decode as decode_messagepack } from 'msgpackr';
import { send_success, send_error, send_message } from '../../../src/server/lib/send_response.js';
class MockSocket {
constructor() {
this.written_data = [];
}
write(data) {
this.written_data.push(data);
}
get_last_written() {
return this.written_data[this.written_data.length - 1];
}
get_decoded_last_written() {
const last_data = this.get_last_written();
if (last_data.length < 4) {
throw new Error('Invalid message format: too short');
}
const length = last_data.readUInt32BE(0);
const payload = last_data.slice(4);
if (payload.length !== length) {
throw new Error(`Invalid message format: expected ${length} bytes, got ${payload.length}`);
}
return decode_messagepack(payload);
}
}
test('send_success sends properly formatted success response', (t) => {
const mock_socket = new MockSocket();
const test_data = { user_id: 123, name: 'test' };
send_success(mock_socket, test_data);
const response = mock_socket.get_decoded_last_written();
t.is(response.ok, true);
t.deepEqual(response.data, test_data);
t.is(response.error, undefined);
});
test('send_success with empty data object', (t) => {
const mock_socket = new MockSocket();
send_success(mock_socket, {});
const response = mock_socket.get_decoded_last_written();
t.is(response.ok, true);
t.deepEqual(response.data, {});
});
test('send_success with no data parameter uses empty object', (t) => {
const mock_socket = new MockSocket();
send_success(mock_socket);
const response = mock_socket.get_decoded_last_written();
t.is(response.ok, true);
t.deepEqual(response.data, {});
});
test('send_error sends properly formatted error response', (t) => {
const mock_socket = new MockSocket();
const test_error = { message: 'Something went wrong', code: 500 };
send_error(mock_socket, test_error);
const response = mock_socket.get_decoded_last_written();
t.is(response.ok, false);
t.deepEqual(response.error, test_error);
t.is(response.data, undefined);
});
test('send_error with empty error object', (t) => {
const mock_socket = new MockSocket();
send_error(mock_socket, {});
const response = mock_socket.get_decoded_last_written();
t.is(response.ok, false);
t.deepEqual(response.error, {});
});
test('send_error with no error parameter uses empty object', (t) => {
const mock_socket = new MockSocket();
send_error(mock_socket);
const response = mock_socket.get_decoded_last_written();
t.is(response.ok, false);
t.deepEqual(response.error, {});
});
test('send_message sends message in data object', (t) => {
const mock_socket = new MockSocket();
const test_message = 'Operation completed successfully';
send_message(mock_socket, test_message);
const response = mock_socket.get_decoded_last_written();
t.is(response.ok, true);
t.deepEqual(response.data, { message: test_message });
t.is(response.error, undefined);
});
test('send_message with empty string', (t) => {
const mock_socket = new MockSocket();
send_message(mock_socket, '');
const response = mock_socket.get_decoded_last_written();
t.is(response.ok, true);
t.deepEqual(response.data, { message: '' });
});
test('send_message with no message parameter uses empty string', (t) => {
const mock_socket = new MockSocket();
send_message(mock_socket);
const response = mock_socket.get_decoded_last_written();
t.is(response.ok, true);
t.deepEqual(response.data, { message: '' });
});
test('all functions encode responses as messagepack', (t) => {
const mock_socket = new MockSocket();
send_success(mock_socket, { test: 'data' });
const success_data = mock_socket.get_last_written();
t.true(Buffer.isBuffer(success_data));
send_error(mock_socket, { test: 'error' });
const error_data = mock_socket.get_last_written();
t.true(Buffer.isBuffer(error_data));
send_message(mock_socket, 'test message');
const message_data = mock_socket.get_last_written();
t.true(Buffer.isBuffer(message_data));
});