Skip to content

Commit

Permalink
PIMS-2026 BC Services Card & Azure IDIR (#166)
Browse files Browse the repository at this point in the history
  • Loading branch information
BradyMitch authored Sep 19, 2024
2 parents 445f8be + a25013d commit 4e5e5db
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 23 deletions.
27 changes: 26 additions & 1 deletion __tests__/__mocks__/user.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { OriginalSSOUser, SSOBCeIDUser, SSOGithubUser, SSOIdirUser, SSOUser } from '@/types';
import { IdentityProvider, OriginalSSOUser, SSOBCeIDUser, SSOGithubUser, SSOIdirUser, SSOUser } from '@/types';

// IDIR

Expand Down Expand Up @@ -106,3 +106,28 @@ export const mockSSOUserGitHub: SSOUser = {
last_name: 'User',
originalData: mockOriginalSSOUserGitHub,
};

export const mockOriginalSSOUserBcServicesCard: OriginalSSOUser = {
preferred_username: 'username@clientID',
email: 'composite@example.com',
display_name: 'Composite User',
scope: 'full',
identity_provider: 'clientID' as IdentityProvider,
given_name: 'Composite',
family_name: 'User',
}

export const mockSSOUserBcServicesCard: SSOUser = {
preferred_username: 'username@clientID',
email: 'composite@example.com',
display_name: 'Composite User',
scope: 'full',
identity_provider: 'clientID' as IdentityProvider,
guid: 'username',
username: 'username@clientID',
first_name: 'Composite',
last_name: 'User',
originalData: mockOriginalSSOUserBcServicesCard,
client_roles: [],
name: '',
};
8 changes: 8 additions & 0 deletions __tests__/unit/utils/normalizeUser.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ import { SSOUser } from '@/types';
import { normalizeUser } from '@/utils';
import {
mockOriginalSSOUserBCeID,
mockOriginalSSOUserBcServicesCard,
mockOriginalSSOUserGitHub,
mockOriginalSSOUserIDIR,
mockSSOUserBCeID,
mockSSOUserBcServicesCard,
mockSSOUserGitHub,
mockSSOUserIDIR,
} from '__tests__/__mocks__';
Expand Down Expand Up @@ -33,6 +35,12 @@ describe('User Normalization', () => {
expect(normalizedUser).toEqual(mockSSOUserGitHub);
});

// Test case: normalizes user data correctly for BC Services Card
it('normalizes user data correctly for BC Services Card', () => {
const normalizedUser: SSOUser = normalizeUser(mockOriginalSSOUserBcServicesCard);
expect(normalizedUser).toEqual(mockSSOUserBcServicesCard);
});

// Test case: normalizes user data correctly when userInfo properties are undefined
it('normalizes user data correctly when userInfo properties are undefined (IDIR)', () => {
const normalizedUser: SSOUser = normalizeUser({
Expand Down
16 changes: 14 additions & 2 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,11 @@ export type RefreshExpiryDialogProps = {
loginProps?: LoginProps;
};

export type IdirIdentityProvider = 'idir';
export type IdirIdentityProvider = 'idir'| 'azureidir';
export type GithubIdentityProvider = 'githubbcgov' | 'githubpublic';
export type BceidIdentityProvider = 'bceidbasic' | 'bceidbusiness' | 'bceidboth';
// BC Services Card uses SSO_CLIENT_ID as the provider.

export type IdentityProvider =
| IdirIdentityProvider
| BceidIdentityProvider
Expand Down Expand Up @@ -110,7 +112,17 @@ export type SSOGithubUser = {
last_name?: string;
};

export type OriginalSSOUser = BaseSSOUser & SSOIdirUser & SSOBCeIDUser & SSOGithubUser;
export type SSOBcServicesCardUser = {
given_name?: string;
family_name?: string;
}

export type OriginalSSOUser =
& BaseSSOUser
& SSOIdirUser
& SSOBCeIDUser
& SSOGithubUser
& SSOBcServicesCardUser;

export type SSOUser = BaseSSOUser & {
guid: string;
Expand Down
56 changes: 36 additions & 20 deletions src/utils/normalizeUser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,27 +13,43 @@ export const normalizeUser = (userInfo: OriginalSSOUser): SSOUser => {
} = userInfo;

// Normalize properties
let guid = userInfo?.idir_user_guid ?? '';
let username = userInfo?.idir_username ?? '';
let first_name = userInfo?.given_name ?? '';
let last_name = userInfo?.family_name ?? '';
let guid;
let username;
let first_name;
let last_name;

if (
identity_provider === 'bceidbasic' ||
identity_provider === 'bceidbusiness' ||
identity_provider === 'bceidboth'
) {
// BCeID
guid = userInfo?.bceid_user_guid ?? '';
username = userInfo?.bceid_username ?? '';
first_name = userInfo?.display_name.split(' ')[0];
last_name = userInfo?.display_name.split(' ')[1];
} else if (identity_provider === 'githubbcgov' || identity_provider === 'githubpublic') {
// GitHub
guid = userInfo?.github_id ?? '';
username = userInfo?.github_username ?? '';
first_name = userInfo?.display_name.split(' ')[0];
last_name = userInfo?.display_name.split(' ')[1];
switch (identity_provider) {
case 'idir':
case 'azureidir':
// IDIR
guid = userInfo?.idir_user_guid ?? '';
username = userInfo?.idir_username ?? '';
first_name = userInfo?.given_name ?? '';
last_name = userInfo?.family_name ?? '';
break;
case 'bceidbasic':
case 'bceidboth':
case 'bceidbusiness':
// BCeID
guid = userInfo?.bceid_user_guid ?? '';
username = userInfo?.bceid_username ?? '';
first_name = userInfo?.display_name.split(' ')[0] ?? '';
last_name = userInfo?.display_name.split(' ')[1] ?? '';
break;
case 'githubbcgov':
case 'githubpublic':
// GitHub
guid = userInfo?.github_id ?? '';
username = userInfo?.github_username ?? '';
first_name = userInfo?.display_name.split(' ')[0] ?? '';
last_name = userInfo?.display_name.split(' ')[1] ?? '';
break;
default:
guid = userInfo?.preferred_username.split('@').at(0) ?? '';
username = userInfo?.preferred_username ?? '';
first_name = userInfo?.given_name ?? '';
last_name = userInfo?.family_name ?? '';
break;
}

// Normalized user
Expand Down
2 changes: 2 additions & 0 deletions techdocs/docs/using-the-package/module-exports.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
IdirIdentityProvider, // Used for more efficient login.
GithubIdentityProvider, // Used for more efficient login.
BceidIdentityProvider, // Used for more efficient login.
// BC Services Card has no fixed identity provider. It uses SSO_CLIENT_ID.
IdentityProvider, // Combined type for identity providers.
HasRolesOptions, // Optional options parameter for hasRoles function of useSSO().
AuthService, // Type for useSSO().
Expand All @@ -24,5 +25,6 @@ import {
SSOIdirUser, // User types specific to Idir users.
SSOBCeIDUser, // User types specific to BCeID users.
SSOGithubUser, // User types specific to Github users.
SSOBcServicesCardUser, // User types specific to BC Services Card users.
} from '@bcgov/citz-imb-sso-react';
```

0 comments on commit 4e5e5db

Please sign in to comment.