passport.test.js 3.9 KB

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