site.test.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. import request from 'supertest';
  2. import express from 'express';
  3. import { jest } from '@jest/globals';
  4. import site from '../site';
  5. import { MemoryBackend } from '../store/backends';
  6. jest.mock('nanoid', () => {
  7. let count = 0;
  8. return {
  9. customAlphabet: () =>
  10. jest.fn(() => {
  11. return 'nanoid_' + count++;
  12. }),
  13. };
  14. });
  15. describe('Site endpoint tests', () => {
  16. let query;
  17. let storeBackend;
  18. let onSiteCreation;
  19. let onSiteUpdate;
  20. let lastConfirm;
  21. beforeEach(() => {
  22. onSiteCreation = jest.fn(({ confirmPath }) => {
  23. lastConfirm = confirmPath;
  24. });
  25. onSiteUpdate = jest.fn(({ confirmPath }) => {
  26. lastConfirm = confirmPath;
  27. });
  28. storeBackend = MemoryBackend();
  29. const app = express();
  30. app.use(express.json());
  31. app.use(
  32. site({
  33. configFile: './site.json',
  34. storeBackend,
  35. onSiteCreation,
  36. onSiteUpdate,
  37. serverUrl: '',
  38. })
  39. );
  40. query = request(app);
  41. });
  42. it('should create a site', async () => {
  43. const result = await query
  44. .post('/_register/')
  45. .send({
  46. siteId: 'test',
  47. owner: 'test@yopmail.com',
  48. name: 'Site test',
  49. emailFrom: 'from@ricochet.net',
  50. extraData: 'data',
  51. })
  52. .expect(200);
  53. expect(result.body).toEqual(
  54. expect.objectContaining({
  55. name: 'Site test',
  56. owner: 'test@yopmail.com',
  57. emailFrom: 'from@ricochet.net',
  58. })
  59. );
  60. expect(typeof result.body.key).toBe('string');
  61. expect(result.body.key.length).toBe(44);
  62. expect(result.body.token).toBeUndefined();
  63. expect(result.body.extraData).toBe(undefined);
  64. expect(onSiteCreation).toHaveBeenCalled();
  65. expect(onSiteUpdate).not.toHaveBeenCalled();
  66. expect(lastConfirm).toEqual(
  67. expect.stringContaining('/_register/test/confirm/')
  68. );
  69. const sites = await storeBackend.list('_site');
  70. expect(sites.length).toBe(0);
  71. const pending = await storeBackend.list('_pending');
  72. expect(pending.length).toBe(1);
  73. await query.get(lastConfirm).expect(200);
  74. const sitesAfter = await storeBackend.list('_site');
  75. expect(sitesAfter.length).toBe(1);
  76. expect(sitesAfter[0]).toEqual(
  77. expect.objectContaining({
  78. name: 'Site test',
  79. owner: 'test@yopmail.com',
  80. emailFrom: 'from@ricochet.net',
  81. })
  82. );
  83. const pendingAfter = await storeBackend.list('_pending');
  84. expect(pendingAfter.length).toBe(0);
  85. // We can't confirm twice
  86. await query.get(lastConfirm).expect(403);
  87. });
  88. it('should not create an existing site', async () => {
  89. await storeBackend.save('_site', 'mytestsite', {
  90. owner: 'test@yopmail',
  91. name: 'Site test',
  92. emailFrom: 'from@ricochet.net',
  93. key: 'mykey',
  94. });
  95. await query
  96. .post('/_register')
  97. .send({
  98. siteId: 'mytestsite',
  99. owner: 'test@yopmail',
  100. name: 'Site test',
  101. emailFrom: 'from@ricochet.net',
  102. })
  103. .expect(403);
  104. });
  105. it('should not create a site with bad characters', async () => {
  106. await query
  107. .post('/_register/')
  108. .send({
  109. siteId: 'toto4+',
  110. owner: 'test@yopmail',
  111. name: 'Site test',
  112. emailFrom: 'from@ricochet.net',
  113. })
  114. .expect(400);
  115. await query
  116. .post('/_register/')
  117. .send({
  118. siteId: 'toto4é',
  119. owner: 'test@yopmail',
  120. name: 'Site test',
  121. emailFrom: 'from@ricochet.net',
  122. })
  123. .expect(400);
  124. await query
  125. .post('/_register/')
  126. .send({
  127. siteId: '_toto',
  128. owner: 'test@yopmail',
  129. name: 'Site test',
  130. emailFrom: 'from@ricochet.net',
  131. })
  132. .expect(400);
  133. await query
  134. .post('/_register/')
  135. .send({
  136. siteId: 'toto-titi',
  137. owner: 'test@yopmail',
  138. name: 'Site test',
  139. emailFrom: 'from@ricochet.net',
  140. })
  141. .expect(400);
  142. });
  143. it('should not update a missing site', async () => {
  144. await query
  145. .patch('/_register/mytestsite')
  146. .send({
  147. owner: 'test@yopmail',
  148. name: 'Site test',
  149. emailFrom: 'from@ricochet.net',
  150. })
  151. .expect(404);
  152. });
  153. it('should update an existing site', async () => {
  154. await storeBackend.save('_site', 'mytestsite', {
  155. owner: 'test@yopmail',
  156. name: 'Site test',
  157. emailFrom: 'from@ricochet.net',
  158. key: 'mykey',
  159. });
  160. const result = await query
  161. .patch('/_register/mytestsite')
  162. .send({
  163. owner: 'falseOwner@mail.com', // We shouldn't be able to modify that
  164. name: 'New name',
  165. emailFrom: 'from2@ricochet.net',
  166. token: 'falseToken',
  167. key: 'falseKey',
  168. })
  169. .expect(200);
  170. expect(result.body.token).toBeUndefined();
  171. expect(result.body.key).toBeUndefined();
  172. expect(lastConfirm).toEqual(
  173. expect.stringContaining('/_register/mytestsite/confirm/')
  174. );
  175. const pending = await storeBackend.list('_pending');
  176. expect(pending.length).toBe(1);
  177. await query.get(lastConfirm).expect(200);
  178. const pendingAfter = await storeBackend.list('_pending');
  179. expect(pendingAfter.length).toBe(0);
  180. const sites = await storeBackend.list('_site');
  181. expect(sites.length).toBe(1);
  182. expect(sites[0]).toEqual(
  183. expect.objectContaining({
  184. _id: 'mytestsite',
  185. name: 'New name',
  186. owner: 'test@yopmail',
  187. emailFrom: 'from2@ricochet.net',
  188. key: 'mykey',
  189. })
  190. );
  191. // We can't confirm twice
  192. await query.get(lastConfirm).expect(403);
  193. });
  194. });