summaryrefslogtreecommitdiff
path: root/spec/frontend/members/utils_spec.js
diff options
context:
space:
mode:
Diffstat (limited to 'spec/frontend/members/utils_spec.js')
-rw-r--r--spec/frontend/members/utils_spec.js232
1 files changed, 232 insertions, 0 deletions
diff --git a/spec/frontend/members/utils_spec.js b/spec/frontend/members/utils_spec.js
new file mode 100644
index 00000000000..7bbfddf8fc6
--- /dev/null
+++ b/spec/frontend/members/utils_spec.js
@@ -0,0 +1,232 @@
+import {
+ generateBadges,
+ isGroup,
+ isDirectMember,
+ isCurrentUser,
+ canRemove,
+ canResend,
+ canUpdate,
+ canOverride,
+ parseSortParam,
+ buildSortHref,
+} from '~/members/utils';
+import { DEFAULT_SORT } from '~/members/constants';
+import { member as memberMock, group, invite } from './mock_data';
+
+const DIRECT_MEMBER_ID = 178;
+const INHERITED_MEMBER_ID = 179;
+const IS_CURRENT_USER_ID = 123;
+const IS_NOT_CURRENT_USER_ID = 124;
+const URL_HOST = 'https://localhost/';
+
+describe('Members Utils', () => {
+ describe('generateBadges', () => {
+ it('has correct properties for each badge', () => {
+ const badges = generateBadges(memberMock, true);
+
+ badges.forEach(badge => {
+ expect(badge).toEqual(
+ expect.objectContaining({
+ show: expect.any(Boolean),
+ text: expect.any(String),
+ variant: expect.stringMatching(/muted|neutral|info|success|danger|warning/),
+ }),
+ );
+ });
+ });
+
+ it.each`
+ member | expected
+ ${memberMock} | ${{ show: true, text: "It's you", variant: 'success' }}
+ ${{ ...memberMock, user: { ...memberMock.user, blocked: true } }} | ${{ show: true, text: 'Blocked', variant: 'danger' }}
+ ${{ ...memberMock, user: { ...memberMock.user, twoFactorEnabled: true } }} | ${{ show: true, text: '2FA', variant: 'info' }}
+ `('returns expected output for "$expected.text" badge', ({ member, expected }) => {
+ expect(generateBadges(member, true)).toContainEqual(expect.objectContaining(expected));
+ });
+ });
+
+ describe('isGroup', () => {
+ test.each`
+ member | expected
+ ${group} | ${true}
+ ${memberMock} | ${false}
+ `('returns $expected', ({ member, expected }) => {
+ expect(isGroup(member)).toBe(expected);
+ });
+ });
+
+ describe('isDirectMember', () => {
+ test.each`
+ sourceId | expected
+ ${DIRECT_MEMBER_ID} | ${true}
+ ${INHERITED_MEMBER_ID} | ${false}
+ `('returns $expected', ({ sourceId, expected }) => {
+ expect(isDirectMember(memberMock, sourceId)).toBe(expected);
+ });
+ });
+
+ describe('isCurrentUser', () => {
+ test.each`
+ currentUserId | expected
+ ${IS_CURRENT_USER_ID} | ${true}
+ ${IS_NOT_CURRENT_USER_ID} | ${false}
+ `('returns $expected', ({ currentUserId, expected }) => {
+ expect(isCurrentUser(memberMock, currentUserId)).toBe(expected);
+ });
+ });
+
+ describe('canRemove', () => {
+ const memberCanRemove = {
+ ...memberMock,
+ canRemove: true,
+ };
+
+ test.each`
+ member | sourceId | expected
+ ${memberCanRemove} | ${DIRECT_MEMBER_ID} | ${true}
+ ${memberCanRemove} | ${INHERITED_MEMBER_ID} | ${false}
+ ${memberMock} | ${INHERITED_MEMBER_ID} | ${false}
+ `('returns $expected', ({ member, sourceId, expected }) => {
+ expect(canRemove(member, sourceId)).toBe(expected);
+ });
+ });
+
+ describe('canResend', () => {
+ test.each`
+ member | expected
+ ${invite} | ${true}
+ ${{ ...invite, invite: { ...invite.invite, canResend: false } }} | ${false}
+ `('returns $expected', ({ member, sourceId, expected }) => {
+ expect(canResend(member, sourceId)).toBe(expected);
+ });
+ });
+
+ describe('canUpdate', () => {
+ const memberCanUpdate = {
+ ...memberMock,
+ canUpdate: true,
+ };
+
+ test.each`
+ member | currentUserId | sourceId | expected
+ ${memberCanUpdate} | ${IS_NOT_CURRENT_USER_ID} | ${DIRECT_MEMBER_ID} | ${true}
+ ${memberCanUpdate} | ${IS_CURRENT_USER_ID} | ${DIRECT_MEMBER_ID} | ${false}
+ ${memberCanUpdate} | ${IS_CURRENT_USER_ID} | ${INHERITED_MEMBER_ID} | ${false}
+ ${memberMock} | ${IS_NOT_CURRENT_USER_ID} | ${DIRECT_MEMBER_ID} | ${false}
+ `('returns $expected', ({ member, currentUserId, sourceId, expected }) => {
+ expect(canUpdate(member, currentUserId, sourceId)).toBe(expected);
+ });
+ });
+
+ describe('canOverride', () => {
+ it('returns `false`', () => {
+ expect(canOverride(memberMock)).toBe(false);
+ });
+ });
+
+ describe('parseSortParam', () => {
+ beforeEach(() => {
+ delete window.location;
+ window.location = new URL(URL_HOST);
+ });
+
+ describe('when `sort` param is not present', () => {
+ it('returns default sort options', () => {
+ window.location.search = '';
+
+ expect(parseSortParam(['account'])).toEqual(DEFAULT_SORT);
+ });
+ });
+
+ describe('when field passed in `sortableFields` argument does not have `sort` key defined', () => {
+ it('returns default sort options', () => {
+ window.location.search = '?sort=source_asc';
+
+ expect(parseSortParam(['source'])).toEqual(DEFAULT_SORT);
+ });
+ });
+
+ describe.each`
+ sortParam | expected
+ ${'name_asc'} | ${{ sortByKey: 'account', sortDesc: false }}
+ ${'name_desc'} | ${{ sortByKey: 'account', sortDesc: true }}
+ ${'last_joined'} | ${{ sortByKey: 'granted', sortDesc: false }}
+ ${'oldest_joined'} | ${{ sortByKey: 'granted', sortDesc: true }}
+ ${'access_level_asc'} | ${{ sortByKey: 'maxRole', sortDesc: false }}
+ ${'access_level_desc'} | ${{ sortByKey: 'maxRole', sortDesc: true }}
+ ${'recent_sign_in'} | ${{ sortByKey: 'lastSignIn', sortDesc: false }}
+ ${'oldest_sign_in'} | ${{ sortByKey: 'lastSignIn', sortDesc: true }}
+ `('when `sort` query string param is `$sortParam`', ({ sortParam, expected }) => {
+ it(`returns ${JSON.stringify(expected)}`, async () => {
+ window.location.search = `?sort=${sortParam}`;
+
+ expect(parseSortParam(['account', 'granted', 'expires', 'maxRole', 'lastSignIn'])).toEqual(
+ expected,
+ );
+ });
+ });
+ });
+
+ describe('buildSortHref', () => {
+ beforeEach(() => {
+ delete window.location;
+ window.location = new URL(URL_HOST);
+ });
+
+ describe('when field passed in `sortBy` argument does not have `sort` key defined', () => {
+ it('returns an empty string', () => {
+ expect(
+ buildSortHref({
+ sortBy: 'source',
+ sortDesc: false,
+ filteredSearchBarTokens: [],
+ filteredSearchBarSearchParam: 'search',
+ }),
+ ).toBe('');
+ });
+ });
+
+ describe('when there are no filter params set', () => {
+ it('sets `sort` param', () => {
+ expect(
+ buildSortHref({
+ sortBy: 'account',
+ sortDesc: false,
+ filteredSearchBarTokens: [],
+ filteredSearchBarSearchParam: 'search',
+ }),
+ ).toBe(`${URL_HOST}?sort=name_asc`);
+ });
+ });
+
+ describe('when filter params are set', () => {
+ it('merges the `sort` param with the filter params', () => {
+ window.location.search = '?two_factor=enabled&with_inherited_permissions=exclude';
+
+ expect(
+ buildSortHref({
+ sortBy: 'account',
+ sortDesc: false,
+ filteredSearchBarTokens: ['two_factor', 'with_inherited_permissions'],
+ filteredSearchBarSearchParam: 'search',
+ }),
+ ).toBe(`${URL_HOST}?two_factor=enabled&with_inherited_permissions=exclude&sort=name_asc`);
+ });
+ });
+
+ describe('when search param is set', () => {
+ it('merges the `sort` param with the search param', () => {
+ window.location.search = '?search=foobar';
+
+ expect(
+ buildSortHref({
+ sortBy: 'account',
+ sortDesc: false,
+ filteredSearchBarTokens: ['two_factor', 'with_inherited_permissions'],
+ filteredSearchBarSearchParam: 'search',
+ }),
+ ).toBe(`${URL_HOST}?search=foobar&sort=name_asc`);
+ });
+ });
+ });
+});