passport.test.js 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. const { getInstance } = require('../setup-crowi');
  2. describe('PassportService test', () => {
  3. let crowi;
  4. beforeEach(async() => {
  5. crowi = await getInstance();
  6. });
  7. describe('verifySAMLResponseByABLCRule()', () => {
  8. let getConfigSpy;
  9. let extractAttributesFromSAMLResponseSpy;
  10. beforeEach(async() => {
  11. // prepare spy for ConfigManager.getConfig
  12. getConfigSpy = jest.spyOn(crowi.configManager, 'getConfig');
  13. // prepare spy for extractAttributesFromSAMLResponse method
  14. extractAttributesFromSAMLResponseSpy = jest.spyOn(crowi.passportService, 'extractAttributesFromSAMLResponse');
  15. });
  16. /* eslint-disable indent */
  17. let i = 0;
  18. describe.each`
  19. conditionId | departments | positions | ruleStr | expected
  20. ${i++} | ${undefined} | ${undefined} | ${' '} | ${true}
  21. ${i++} | ${undefined} | ${undefined} | ${'Department: A'} | ${false}
  22. ${i++} | ${[]} | ${['Leader']} | ${'Position'} | ${true}
  23. ${i++} | ${[]} | ${['Leader']} | ${'Position: Leader'} | ${true}
  24. ${i++} | ${['A']} | ${[]} | ${'Department: A || Department: B && Position: Leader'} | ${true}
  25. ${i++} | ${['B']} | ${['Leader']} | ${'Department: A || Department: B && Position: Leader'} | ${true}
  26. ${i++} | ${['A', 'C']} | ${['Leader']} | ${'Department: A || Department: B && Position: Leader'} | ${true}
  27. ${i++} | ${['B', 'C']} | ${['Leader']} | ${'Department: A || Department: B && Position: Leader'} | ${true}
  28. ${i++} | ${[]} | ${[]} | ${'Department: A || Department: B && Position: Leader'} | ${false}
  29. ${i++} | ${['C']} | ${['Leader']} | ${'Department: A || Department: B && Position: Leader'} | ${false}
  30. ${i++} | ${['A']} | ${['Leader']} | ${'(Department: A || Department: B) && Position: Leader'} | ${true}
  31. ${i++} | ${['B']} | ${['Leader']} | ${'(Department: A || Department: B) && Position: Leader'} | ${true}
  32. ${i++} | ${['C']} | ${['Leader']} | ${'(Department: A || Department: B) && Position: Leader'} | ${false}
  33. ${i++} | ${['A', 'B']} | ${[]} | ${'(Department: A || Department: B) && Position: Leader'} | ${false}
  34. ${i++} | ${['A']} | ${[]} | ${'Department: A NOT Position: Leader'} | ${true}
  35. ${i++} | ${['A']} | ${['Leader']} | ${'Department: A NOT Position: Leader'} | ${false}
  36. ${i++} | ${[]} | ${['Leader']} | ${'Department: A OR (Position NOT Position: User)'} | ${true}
  37. ${i++} | ${[]} | ${['User']} | ${'Department: A OR (Position NOT Position: User)'} | ${false}
  38. `('to be $expected under rule="$ruleStr"', ({
  39. conditionId, departments, positions, ruleStr, expected,
  40. }) => {
  41. test(`when conditionId=${conditionId}`, async() => {
  42. const responseMock = {};
  43. // setup mock implementation
  44. getConfigSpy.mockImplementation((ns, key) => {
  45. if (ns === 'crowi' && key === 'security:passport-saml:ABLCRule') {
  46. return ruleStr;
  47. }
  48. throw new Error('Unexpected behavior.');
  49. });
  50. extractAttributesFromSAMLResponseSpy.mockImplementation((response) => {
  51. if (response !== responseMock) {
  52. throw new Error('Unexpected args.');
  53. }
  54. return {
  55. Department: departments,
  56. Position: positions,
  57. };
  58. });
  59. const result = crowi.passportService.verifySAMLResponseByABLCRule(responseMock);
  60. expect(result).toBe(expected);
  61. });
  62. });
  63. });
  64. });