acl.integ.ts 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. import type { MockInstance } from 'vitest';
  2. import { aclService } from './acl';
  3. import { configManager } from './config-manager';
  4. describe('AclService', () => {
  5. test("has consts 'isLabeledStatement'", () => {
  6. expect(aclService.labels.SECURITY_RESTRICT_GUEST_MODE_DENY).toBe('Deny');
  7. expect(aclService.labels.SECURITY_RESTRICT_GUEST_MODE_READONLY).toBe(
  8. 'Readonly',
  9. );
  10. expect(aclService.labels.SECURITY_REGISTRATION_MODE_OPEN).toBe('Open');
  11. expect(aclService.labels.SECURITY_REGISTRATION_MODE_RESTRICTED).toBe(
  12. 'Restricted',
  13. );
  14. expect(aclService.labels.SECURITY_REGISTRATION_MODE_CLOSED).toBe('Closed');
  15. });
  16. });
  17. describe('AclService test', () => {
  18. const initialEnv = process.env;
  19. beforeAll(async () => {
  20. await configManager.loadConfigs();
  21. });
  22. afterEach(() => {
  23. process.env = initialEnv;
  24. });
  25. describe('isAclEnabled()', () => {
  26. test('to be false when FORCE_WIKI_MODE is undefined', async () => {
  27. delete process.env.FORCE_WIKI_MODE;
  28. // reload
  29. await configManager.loadConfigs();
  30. const result = aclService.isAclEnabled();
  31. const wikiMode = configManager.getConfig('security:wikiMode');
  32. expect(wikiMode).toBe(undefined);
  33. expect(result).toBe(true);
  34. });
  35. test('to be false when FORCE_WIKI_MODE is dummy string', async () => {
  36. process.env.FORCE_WIKI_MODE = 'dummy string';
  37. // reload
  38. await configManager.loadConfigs();
  39. const result = aclService.isAclEnabled();
  40. const wikiMode = configManager.getConfig('security:wikiMode');
  41. expect(wikiMode).toBe('dummy string');
  42. expect(result).toBe(true);
  43. });
  44. test('to be true when FORCE_WIKI_MODE=private', async () => {
  45. process.env.FORCE_WIKI_MODE = 'private';
  46. // reload
  47. await configManager.loadConfigs();
  48. const result = aclService.isAclEnabled();
  49. const wikiMode = configManager.getConfig('security:wikiMode');
  50. expect(wikiMode).toBe('private');
  51. expect(result).toBe(true);
  52. });
  53. test('to be false when FORCE_WIKI_MODE=public', async () => {
  54. process.env.FORCE_WIKI_MODE = 'public';
  55. // reload
  56. await configManager.loadConfigs();
  57. const result = aclService.isAclEnabled();
  58. const wikiMode = configManager.getConfig('security:wikiMode');
  59. expect(wikiMode).toBe('public');
  60. expect(result).toBe(false);
  61. });
  62. });
  63. describe('isWikiModeForced()', () => {
  64. test('to be false when FORCE_WIKI_MODE is undefined', async () => {
  65. delete process.env.FORCE_WIKI_MODE;
  66. // reload
  67. await configManager.loadConfigs();
  68. const result = aclService.isWikiModeForced();
  69. const wikiMode = configManager.getConfig('security:wikiMode');
  70. expect(wikiMode).toBe(undefined);
  71. expect(result).toBe(false);
  72. });
  73. test('to be false when FORCE_WIKI_MODE is dummy string', async () => {
  74. process.env.FORCE_WIKI_MODE = 'dummy string';
  75. // reload
  76. await configManager.loadConfigs();
  77. const result = aclService.isWikiModeForced();
  78. const wikiMode = configManager.getConfig('security:wikiMode');
  79. expect(wikiMode).toBe('dummy string');
  80. expect(result).toBe(false);
  81. });
  82. test('to be true when FORCE_WIKI_MODE=private', async () => {
  83. process.env.FORCE_WIKI_MODE = 'private';
  84. // reload
  85. await configManager.loadConfigs();
  86. const result = aclService.isWikiModeForced();
  87. const wikiMode = configManager.getConfig('security:wikiMode');
  88. expect(wikiMode).toBe('private');
  89. expect(result).toBe(true);
  90. });
  91. test('to be false when FORCE_WIKI_MODE=public', async () => {
  92. process.env.FORCE_WIKI_MODE = 'public';
  93. // reload
  94. await configManager.loadConfigs();
  95. const result = aclService.isWikiModeForced();
  96. const wikiMode = configManager.getConfig('security:wikiMode');
  97. expect(wikiMode).toBe('public');
  98. expect(result).toBe(true);
  99. });
  100. });
  101. describe('isGuestAllowedToRead()', () => {
  102. let getConfigSpy: MockInstance<typeof configManager.getConfig>;
  103. beforeEach(async () => {
  104. // prepare spy for ConfigManager.getConfig
  105. getConfigSpy = vi.spyOn(configManager, 'getConfig');
  106. });
  107. test('to be false when FORCE_WIKI_MODE=private', async () => {
  108. process.env.FORCE_WIKI_MODE = 'private';
  109. // reload
  110. await configManager.loadConfigs();
  111. const result = aclService.isGuestAllowedToRead();
  112. const wikiMode = configManager.getConfig('security:wikiMode');
  113. expect(wikiMode).toBe('private');
  114. expect(getConfigSpy).not.toHaveBeenCalledWith(
  115. 'security:restrictGuestMode',
  116. );
  117. expect(result).toBe(false);
  118. });
  119. test('to be true when FORCE_WIKI_MODE=public', async () => {
  120. process.env.FORCE_WIKI_MODE = 'public';
  121. // reload
  122. await configManager.loadConfigs();
  123. const result = aclService.isGuestAllowedToRead();
  124. const wikiMode = configManager.getConfig('security:wikiMode');
  125. expect(wikiMode).toBe('public');
  126. expect(getConfigSpy).not.toHaveBeenCalledWith(
  127. 'security:restrictGuestMode',
  128. );
  129. expect(result).toBe(true);
  130. });
  131. /* eslint-disable indent */
  132. describe.each`
  133. restrictGuestMode | expected
  134. ${undefined} | ${false}
  135. ${'Deny'} | ${false}
  136. ${'Readonly'} | ${true}
  137. ${'Open'} | ${false}
  138. ${'Restricted'} | ${false}
  139. ${'closed'} | ${false}
  140. `('to be $expected', ({ restrictGuestMode, expected }) => {
  141. test(`when FORCE_WIKI_MODE is undefined and 'security:restrictGuestMode' is '${restrictGuestMode}`, async () => {
  142. // reload
  143. await configManager.loadConfigs();
  144. // setup mock implementation
  145. getConfigSpy.mockImplementation((key) => {
  146. if (key === 'security:restrictGuestMode') {
  147. return restrictGuestMode;
  148. }
  149. if (key === 'security:wikiMode') {
  150. return undefined;
  151. }
  152. throw new Error('Unexpected behavior.');
  153. });
  154. const result = aclService.isGuestAllowedToRead();
  155. expect(getConfigSpy).toHaveBeenCalledTimes(2);
  156. expect(getConfigSpy).toHaveBeenCalledWith('security:wikiMode');
  157. expect(getConfigSpy).toHaveBeenCalledWith('security:restrictGuestMode');
  158. expect(result).toBe(expected);
  159. });
  160. });
  161. });
  162. });