chatusers.test.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. const { test } = require('@jest/globals');
  2. var request = require('supertest');
  3. request = request('http://127.0.0.1:8080');
  4. const WebSocket = require('ws');
  5. const fs = require('fs');
  6. const registerChat = require('./lib/chat').registerChat;
  7. const sendChatMessage = require('./lib/chat').sendChatMessage;
  8. const sendAdminRequest = require('./lib/admin').sendAdminRequest;
  9. const sendAdminPayload = require('./lib/admin').sendAdminPayload;
  10. const getAdminResponse = require('./lib/admin').getAdminResponse;
  11. const randomNumber = require('./lib/rand').randomNumber;
  12. const localIPAddressV4 = '127.0.0.1';
  13. const localIPAddressV6 = '::1';
  14. const testVisibilityMessage = {
  15. body: 'message ' + randomNumber(100),
  16. type: 'CHAT',
  17. };
  18. var userId;
  19. var accessToken;
  20. test('register a user', async (done) => {
  21. const registration = await registerChat();
  22. userId = registration.id;
  23. accessToken = registration.accessToken;
  24. done();
  25. });
  26. test('send a chat message', async (done) => {
  27. sendChatMessage(testVisibilityMessage, accessToken, done);
  28. });
  29. test('set the user as moderator', async (done) => {
  30. const res = await sendAdminPayload('chat/users/setmoderator', { userId: userId, isModerator: true });
  31. done();
  32. });
  33. test('verify user is a moderator', async (done) => {
  34. const response = await getAdminResponse('chat/users/moderators');
  35. const tokenCheck = response.body.filter((user) => user.id === userId);
  36. expect(tokenCheck).toHaveLength(1);
  37. done();
  38. });
  39. test('verify user list is populated', async (done) => {
  40. const ws = new WebSocket(
  41. `ws://localhost:8080/ws?accessToken=${accessToken}`,
  42. {
  43. origin: 'http://localhost:8080',
  44. }
  45. );
  46. ws.on('open', async function open() {
  47. const response = await getAdminResponse('chat/clients');
  48. expect(response.body.length).toBeGreaterThan(0);
  49. // Optionally, if GeoIP is configured, check the location property.
  50. if (fs.existsSync('../../../data/GeoLite2-City.mmdb')) {
  51. expect(response.body[0].geo.regionName).toBe('Localhost');
  52. }
  53. ws.close();
  54. });
  55. ws.on('error', function incoming(data) {
  56. console.error(data);
  57. ws.close();
  58. });
  59. ws.on('close', function incoming(data) {
  60. done();
  61. });
  62. });
  63. test('disable a user by admin', async (done) => {
  64. // To allow for visually being able to see the test hiding the
  65. // message add a short delay.
  66. await new Promise((r) => setTimeout(r, 1500));
  67. const ws = new WebSocket(
  68. `ws://localhost:8080/ws?accessToken=${accessToken}`,
  69. {
  70. origin: 'http://localhost:8080',
  71. }
  72. );
  73. const res = await sendAdminPayload('chat/users/setenabled', { userId: userId, enabled: false });
  74. await new Promise((r) => setTimeout(r, 1500));
  75. done();
  76. });
  77. test('verify user is disabled', async (done) => {
  78. const response = await getAdminResponse('chat/users/disabled');
  79. const tokenCheck = response.body.filter((user) => user.id === userId);
  80. expect(tokenCheck).toHaveLength(1);
  81. done();
  82. });
  83. test('verify messages from user are hidden', async (done) => {
  84. const response = await getAdminResponse('chat/messages');
  85. const message = response.body.filter((obj) => {
  86. return obj.user.id === userId;
  87. });
  88. expect(message[0].user.disabledAt).toBeTruthy();
  89. done();
  90. });
  91. test('re-enable a user by admin', async (done) => {
  92. const res = await sendAdminPayload('chat/users/setenabled', { userId: userId, enabled: true });
  93. done();
  94. });
  95. test('verify user is enabled', async (done) => {
  96. const response = await getAdminResponse('chat/users/disabled');
  97. const tokenCheck = response.body.filter((user) => user.id === userId);
  98. expect(tokenCheck).toHaveLength(0);
  99. done();
  100. });
  101. test('ban an ip address by admin', async (done) => {
  102. const resIPv4 = await sendAdminRequest('chat/users/ipbans/create', localIPAddressV4);
  103. const resIPv6 = await sendAdminRequest('chat/users/ipbans/create', localIPAddressV6);
  104. done();
  105. });
  106. test('verify IP address is blocked from the ban', async (done) => {
  107. const response = await getAdminResponse('chat/users/ipbans');
  108. expect(response.body).toHaveLength(2);
  109. expect(onlyLocalIPAddress(response.body)).toBe(true);
  110. done();
  111. });
  112. test('verify access is denied', async (done) => {
  113. await request.get(`/api/chat?accessToken=${accessToken}`).expect(401);
  114. done();
  115. });
  116. test('remove an ip address ban by admin', async (done) => {
  117. const resIPv4 = await sendAdminRequest('chat/users/ipbans/remove', localIPAddressV4);
  118. const resIPv6 = await sendAdminRequest('chat/users/ipbans/remove', localIPAddressV6);
  119. done();
  120. });
  121. test('verify IP address is no longer banned', async (done) => {
  122. const response = await getAdminResponse('chat/users/ipbans');
  123. expect(response.body).toHaveLength(0);
  124. done();
  125. });
  126. test('verify access is allowed after unban', async (done) => {
  127. await request.get(`/api/chat?accessToken=${accessToken}`).expect(200);
  128. done();
  129. });
  130. // This function expects the local address to be localIPAddressV4 & localIPAddressV6
  131. function onlyLocalIPAddress(banInfo) {
  132. for (let i = 0; i < banInfo.length; i++) {
  133. if ((banInfo[i].ipAddress != localIPAddressV4) && (banInfo[i].ipAddress != localIPAddressV6)) {
  134. return false
  135. }
  136. }
  137. return true
  138. }