Skip to content

Commit

Permalink
Add the ability to pass login options to test user generate methods (#…
Browse files Browse the repository at this point in the history
…310)

* Add the ability to pass login options to test user generate methods

* Fix delivery method
  • Loading branch information
dorsha authored Dec 27, 2023
1 parent a3ce8d2 commit d1cf2c7
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 20 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1125,6 +1125,7 @@ const { code } = await descopeClient.management.user.generateOTPForTestUser(
'desmond@descope.com',
);
// Now you can verify the code is valid (using descopeClient.auth.*.verify for example)
// LoginOptions can be provided to set custom claims to the generated jwt.

// Same as OTP, magic link can be generated for test user, for example:
const { link } = await descopeClient.management.user.generateMagicLinkForTestUser(
Expand Down
60 changes: 53 additions & 7 deletions lib/management/user.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { SdkResponse, UserResponse } from '@descope/core-js-sdk';
import { LoginOptions, SdkResponse, UserResponse } from '@descope/core-js-sdk';
import withManagement from '.';
import apiPaths from './paths';
import { mockCoreSdk, mockHttpClient } from './testutils';
Expand Down Expand Up @@ -1071,12 +1071,47 @@ describe('Management User', () => {
};
mockHttpClient.post.mockResolvedValue(httpResponse);

const loginOptions: LoginOptions = {
stepup: true,
};
const resp: SdkResponse<GenerateOTPForTestResponse> =
await management.user.generateOTPForTestUser('sms', 'some-id', loginOptions);

expect(mockHttpClient.post).toHaveBeenCalledWith(
apiPaths.user.generateOTPForTest,
{ loginId: 'some-id', deliveryMethod: 'sms', loginOptions },
{ token: 'key' },
);

expect(resp).toEqual({
code: 200,
data: mockResponse,
ok: true,
response: httpResponse,
});
});

it('should send the correct request and receive correct response when passing embedded delivery method', async () => {
const mockResponse = { loginId: 'some-id', code: '123456' };
const httpResponse = {
ok: true,
json: () => mockResponse,
clone: () => ({
json: () => Promise.resolve(mockResponse),
}),
status: 200,
};
mockHttpClient.post.mockResolvedValue(httpResponse);

const loginOptions: LoginOptions = {
stepup: true,
};
const resp: SdkResponse<GenerateOTPForTestResponse> =
await management.user.generateOTPForTestUser('sms', 'some-id');
await management.user.generateOTPForTestUser('Embedded', 'some-id', loginOptions);

expect(mockHttpClient.post).toHaveBeenCalledWith(
apiPaths.user.generateOTPForTest,
{ loginId: 'some-id', deliveryMethod: 'sms' },
{ loginId: 'some-id', deliveryMethod: 'Embedded', loginOptions },
{ token: 'key' },
);

Expand All @@ -1102,12 +1137,20 @@ describe('Management User', () => {
};
mockHttpClient.post.mockResolvedValue(httpResponse);

const loginOptions: LoginOptions = {
stepup: true,
};
const resp: SdkResponse<GenerateMagicLinkForTestResponse> =
await management.user.generateMagicLinkForTestUser('email', 'some-id', 'some-uri');
await management.user.generateMagicLinkForTestUser(
'email',
'some-id',
'some-uri',
loginOptions,
);

expect(mockHttpClient.post).toHaveBeenCalledWith(
apiPaths.user.generateMagicLinkForTest,
{ loginId: 'some-id', deliveryMethod: 'email', URI: 'some-uri' },
{ loginId: 'some-id', deliveryMethod: 'email', URI: 'some-uri', loginOptions },
{ token: 'key' },
);

Expand Down Expand Up @@ -1137,12 +1180,15 @@ describe('Management User', () => {
};
mockHttpClient.post.mockResolvedValue(httpResponse);

const loginOptions: LoginOptions = {
stepup: true,
};
const resp: SdkResponse<GenerateEnchantedLinkForTestResponse> =
await management.user.generateEnchantedLinkForTestUser('some-id', 'some-uri');
await management.user.generateEnchantedLinkForTestUser('some-id', 'some-uri', loginOptions);

expect(mockHttpClient.post).toHaveBeenCalledWith(
apiPaths.user.generateEnchantedLinkForTest,
{ loginId: 'some-id', URI: 'some-uri' },
{ loginId: 'some-id', URI: 'some-uri', loginOptions },
{ token: 'key' },
);

Expand Down
20 changes: 13 additions & 7 deletions lib/management/user.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { DeliveryMethod, SdkResponse, transformResponse, UserResponse } from '@descope/core-js-sdk';
import { SdkResponse, transformResponse, UserResponse, LoginOptions } from '@descope/core-js-sdk';
import {
ProviderTokenResponse,
AssociatedTenant,
Expand All @@ -11,7 +11,7 @@ import {
User,
InviteBatchResponse,
} from './types';
import { CoreSdk } from '../types';
import { CoreSdk, DeliveryMethodForTestUser } from '../types';
import apiPaths from './paths';

type SingleUserResponse = {
Expand Down Expand Up @@ -509,16 +509,18 @@ const withUser = (sdk: CoreSdk, managementKey?: string) => ({
*
* @param deliveryMethod optional DeliveryMethod
* @param loginId login ID of a test user
* @param loginOptions optional LoginOptions - can be provided to set custom claims to the generated jwt.
* @returns GenerateOTPForTestResponse which includes the loginId and the OTP code
*/
generateOTPForTestUser: (
deliveryMethod: DeliveryMethod,
deliveryMethod: DeliveryMethodForTestUser,
loginId: string,
loginOptions?: LoginOptions,
): Promise<SdkResponse<GenerateOTPForTestResponse>> =>
transformResponse<GenerateOTPForTestResponse>(
sdk.httpClient.post(
apiPaths.user.generateOTPForTest,
{ deliveryMethod, loginId },
{ deliveryMethod, loginId, loginOptions },
{ token: managementKey },
),
(data) => data,
Expand All @@ -533,17 +535,19 @@ const withUser = (sdk: CoreSdk, managementKey?: string) => ({
* @param deliveryMethod optional DeliveryMethod
* @param loginId login ID of a test user
* @param uri optional redirect uri which will be used instead of any global configuration.
* @param loginOptions optional LoginOptions - can be provided to set custom claims to the generated jwt.
* @returns GenerateMagicLinkForTestResponse which includes the loginId and the magic link
*/
generateMagicLinkForTestUser: (
deliveryMethod: DeliveryMethod,
deliveryMethod: DeliveryMethodForTestUser,
loginId: string,
uri: string,
loginOptions?: LoginOptions,
): Promise<SdkResponse<GenerateMagicLinkForTestResponse>> =>
transformResponse<GenerateMagicLinkForTestResponse>(
sdk.httpClient.post(
apiPaths.user.generateMagicLinkForTest,
{ deliveryMethod, loginId, URI: uri },
{ deliveryMethod, loginId, URI: uri, loginOptions },
{ token: managementKey },
),
(data) => data,
Expand All @@ -557,16 +561,18 @@ const withUser = (sdk: CoreSdk, managementKey?: string) => ({
*
* @param loginId login ID of a test user
* @param uri optional redirect uri which will be used instead of any global configuration.
* @param loginOptions optional LoginOptions - can be provided to set custom claims to the generated jwt.
* @returns GenerateEnchantedLinkForTestResponse which includes the loginId, the enchanted link and the pendingRef
*/
generateEnchantedLinkForTestUser: (
loginId: string,
uri: string,
loginOptions?: LoginOptions,
): Promise<SdkResponse<GenerateEnchantedLinkForTestResponse>> =>
transformResponse<GenerateEnchantedLinkForTestResponse>(
sdk.httpClient.post(
apiPaths.user.generateEnchantedLinkForTest,
{ loginId, URI: uri },
{ loginId, URI: uri, loginOptions },
{ token: managementKey },
),
(data) => data,
Expand Down
3 changes: 2 additions & 1 deletion lib/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import createSdk from '@descope/core-js-sdk';
import createSdk, { DeliveryMethod } from '@descope/core-js-sdk';

type Head<T extends ReadonlyArray<any>> = T extends readonly [] ? never : T[0];

Expand All @@ -21,3 +21,4 @@ export interface AuthenticationInfo {
export type CreateCoreSdk = typeof createSdk;
export type CoreSdkConfig = Head<Parameters<CreateCoreSdk>>;
export type CoreSdk = ReturnType<CreateCoreSdk>;
export type DeliveryMethodForTestUser = DeliveryMethod | 'Embedded';
8 changes: 4 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@
"typescript": "^4.6.4"
},
"dependencies": {
"@descope/core-js-sdk": "2.4.0",
"@descope/core-js-sdk": "2.5.1",
"cross-fetch": "^4.0.0",
"jose": "4.15.4",
"tslib": "^1.14.1"
Expand Down

0 comments on commit d1cf2c7

Please sign in to comment.