Skip to content

Commit

Permalink
testing framework (#168)
Browse files Browse the repository at this point in the history
* testing framework

* update test for TestModeGetIdTokenMethod

* update test for TestModeGetIdTokenMethod

* Simplify implementation for testMode

Co-authored-by: harry <harry>
Co-authored-by: Ian K Smith <smithki707@gmail.com>
  • Loading branch information
harryEth and smithki authored Mar 15, 2021
1 parent b4ffeaa commit 05921f4
Show file tree
Hide file tree
Showing 15 changed files with 703 additions and 609 deletions.
3 changes: 3 additions & 0 deletions packages/provider/src/core/sdk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ export interface MagicSDKAdditionalConfiguration<
| 'ko';
network?: EthNetworkConfiguration;
extensions?: TExt;
testMode?: boolean;
}

export class SDKBase {
Expand All @@ -146,6 +147,7 @@ export class SDKBase {

protected readonly endpoint: string;
protected readonly parameters: string;
public readonly testMode: boolean;

/**
* Contains methods for starting a Magic SDK authentication flow.
Expand Down Expand Up @@ -175,6 +177,7 @@ export class SDKBase {
}

const { defaultEndpoint, version } = SDKEnvironment;
this.testMode = !!options?.testMode;
this.endpoint = createURL(options?.endpoint ?? defaultEndpoint).origin;

// Prepare built-in modules
Expand Down
12 changes: 8 additions & 4 deletions packages/provider/src/modules/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,10 @@ export class AuthModule extends BaseModule {
*/
public loginWithMagicLink(configuration: LoginWithMagicLinkConfiguration) {
const { email, showUI = true, redirectURI } = configuration;
const requestPayload = createJsonRpcRequestPayload(MagicPayloadMethod.LoginWithMagicLink, [
{ email, showUI, redirectURI },
]);
const requestPayload = createJsonRpcRequestPayload(
this.sdk.testMode ? MagicPayloadMethod.LoginWithMagicLinkTestMode : MagicPayloadMethod.LoginWithMagicLink,
[{ email, showUI, redirectURI }],
);
return this.request<string | null, LoginWithMagicLinkEvents>(requestPayload);
}

Expand All @@ -44,7 +45,10 @@ export class AuthModule extends BaseModule {
window.history.replaceState(null, '', urlWithoutQuery);
}

const requestPayload = createJsonRpcRequestPayload(MagicPayloadMethod.LoginWithCredential, [credentialResolved]);
const requestPayload = createJsonRpcRequestPayload(
this.sdk.testMode ? MagicPayloadMethod.LoginWithCredentialTestMode : MagicPayloadMethod.LoginWithCredential,
[credentialResolved],
);

return this.request<string | null>(requestPayload);
}
Expand Down
27 changes: 21 additions & 6 deletions packages/provider/src/modules/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,38 +19,53 @@ type UpdateEmailEvents = {
export class UserModule extends BaseModule {
/** */
public getIdToken(configuration?: GetIdTokenConfiguration) {
const requestPayload = createJsonRpcRequestPayload(MagicPayloadMethod.GetIdToken, [configuration]);
const requestPayload = createJsonRpcRequestPayload(
this.sdk.testMode ? MagicPayloadMethod.GetIdTokenTestMode : MagicPayloadMethod.GetIdToken,
[configuration],
);
return this.request<string>(requestPayload);
}

/** */
public generateIdToken(configuration?: GenerateIdTokenConfiguration) {
const requestPayload = createJsonRpcRequestPayload(MagicPayloadMethod.GenerateIdToken, [configuration]);
const requestPayload = createJsonRpcRequestPayload(
this.sdk.testMode ? MagicPayloadMethod.GenerateIdTokenTestMode : MagicPayloadMethod.GenerateIdToken,
[configuration],
);
return this.request<string>(requestPayload);
}

/** */
public getMetadata() {
const requestPayload = createJsonRpcRequestPayload(MagicPayloadMethod.GetMetadata);
const requestPayload = createJsonRpcRequestPayload(
this.sdk.testMode ? MagicPayloadMethod.GetMetadataTestMode : MagicPayloadMethod.GetMetadata,
);
return this.request<MagicUserMetadata>(requestPayload);
}

/** */
public updateEmail(configuration: UpdateEmailConfiguration) {
const { email, showUI = true } = configuration;
const requestPayload = createJsonRpcRequestPayload(MagicPayloadMethod.UpdateEmail, [{ email, showUI }]);
const requestPayload = createJsonRpcRequestPayload(
this.sdk.testMode ? MagicPayloadMethod.UpdateEmailTestMode : MagicPayloadMethod.UpdateEmail,
[{ email, showUI }],
);
return this.request<string | null, UpdateEmailEvents>(requestPayload);
}

/** */
public isLoggedIn() {
const requestPayload = createJsonRpcRequestPayload(MagicPayloadMethod.IsLoggedIn);
const requestPayload = createJsonRpcRequestPayload(
this.sdk.testMode ? MagicPayloadMethod.IsLoggedInTestMode : MagicPayloadMethod.IsLoggedIn,
);
return this.request<boolean>(requestPayload);
}

/** */
public logout() {
const requestPayload = createJsonRpcRequestPayload(MagicPayloadMethod.Logout);
const requestPayload = createJsonRpcRequestPayload(
this.sdk.testMode ? MagicPayloadMethod.LogoutTestMode : MagicPayloadMethod.Logout,
);
return this.request<boolean>(requestPayload);
}
}
4 changes: 4 additions & 0 deletions packages/provider/test/factories.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,7 @@ export const TestMagicSDK = createSDK(SDKBase, {
export function createMagicSDK(endpoint = MAGIC_RELAYER_FULL_URL) {
return new TestMagicSDK(TEST_API_KEY, { endpoint });
}

export function createMagicSDKTestMode(endpoint = MAGIC_RELAYER_FULL_URL) {
return new TestMagicSDK(TEST_API_KEY, { endpoint, testMode: true });
}
10 changes: 10 additions & 0 deletions packages/provider/test/spec/core/sdk/constructor.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,16 @@ test.serial('Initialize `MagicSDK` with custom locale', (t) => {
assertModuleInstanceTypes(t, magic);
});

test.serial('Initialize `MagicSDK` with test mode', (t) => {
const magic = new TestMagicSDK(TEST_API_KEY, { testMode: true });

t.is(magic.apiKey, TEST_API_KEY);
t.is((magic as any).endpoint, MAGIC_RELAYER_FULL_URL);
t.true(magic.auth instanceof AuthModule);
t.true(magic.user instanceof UserModule);
t.true(magic.rpcProvider instanceof RPCProviderModule);
});

class NoopExtNoConfig extends Extension<'noop'> {
name = 'noop' as const;
helloWorld() {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import test from 'ava';
import sinon from 'sinon';
import { getPayloadIdStub, mockSDKEnvironmentConstant } from '../../../mocks';
import { BaseModule } from '../../../../src/modules/base-module';
import { createMagicSDK } from '../../../factories';
import { createMagicSDK, createMagicSDKTestMode } from '../../../factories';

test.beforeEach((t) => {
browserEnv.restore();
Expand Down Expand Up @@ -70,3 +70,18 @@ test.serial('If no parameter is given & platform target is NOT "web", credential
t.is(requestPayload.method, 'magic_auth_login_with_credential');
t.deepEqual(requestPayload.params, ['']);
});

test.serial('If `testMode` is enabled, testing-specific RPC method is used', async (t) => {
const magic = createMagicSDKTestMode();

const idStub = getPayloadIdStub();
idStub.returns(456);

await magic.auth.loginWithCredential('helloworld');

const requestPayload = (magic.user as any).request.args[0][0];
t.is(requestPayload.jsonrpc, '2.0');
t.is(requestPayload.id, 456);
t.is(requestPayload.method, 'magic_auth_login_with_credential_testing_mode');
t.deepEqual(requestPayload.params, ['helloworld']);
});
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import test from 'ava';
import sinon from 'sinon';
import { getPayloadIdStub } from '../../../mocks';
import { BaseModule } from '../../../../src/modules/base-module';
import { createMagicSDK } from '../../../factories';
import { createMagicSDK, createMagicSDKTestMode } from '../../../factories';

test.beforeEach((t) => {
browserEnv.restore();
Expand Down Expand Up @@ -56,3 +56,18 @@ test.serial('Generates JSON RPC request payload with `redirectURI` parameter', a
t.is(requestPayload.method, 'magic_auth_login_with_magic_link');
t.deepEqual(requestPayload.params, [{ email: 'test', showUI: true, redirectURI: 'helloworld' }]);
});

test.serial('If `testMode` is enabled, testing-specific RPC method is used', async (t) => {
const magic = createMagicSDKTestMode();

const idStub = getPayloadIdStub();
idStub.returns(456);

await magic.auth.loginWithMagicLink({ email: 'test' });

const requestPayload = (magic.user as any).request.args[0][0];
t.is(requestPayload.jsonrpc, '2.0');
t.is(requestPayload.id, 456);
t.is(requestPayload.method, 'magic_login_with_magic_link_testing_mode');
t.deepEqual(requestPayload.params, [{ email: 'test', showUI: true, redirectURI: undefined }]);
});
17 changes: 16 additions & 1 deletion packages/provider/test/spec/modules/user/generateIdToken.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import browserEnv from '@ikscodes/browser-env';
import test from 'ava';
import sinon from 'sinon';
import { getPayloadIdStub } from '../../../mocks';
import { createMagicSDK } from '../../../factories';
import { createMagicSDK, createMagicSDKTestMode } from '../../../factories';
import { BaseModule } from '../../../../src/modules/base-module';

test.beforeEach((t) => {
Expand Down Expand Up @@ -54,3 +54,18 @@ test.serial('Accepts an `attachment` parameter', async (t) => {
t.is(requestPayload.method, 'magic_auth_generate_id_token');
t.deepEqual(requestPayload.params, [{ attachment: 'hello world' }]);
});

test.serial('If `testMode` is enabled, testing-specific RPC method is used', async (t) => {
const magic = createMagicSDKTestMode();

const idStub = getPayloadIdStub();
idStub.returns(999);

magic.user.generateIdToken();

/* Assertion */
const requestPayload = (magic.user as any).request.args[0][0];
t.is(requestPayload.id, 999);
t.is(requestPayload.method, 'magic_auth_generate_id_token_testing_mode');
t.deepEqual(requestPayload.params, [undefined]);
});
17 changes: 16 additions & 1 deletion packages/provider/test/spec/modules/user/getIdToken.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import browserEnv from '@ikscodes/browser-env';
import test from 'ava';
import sinon from 'sinon';
import { getPayloadIdStub } from '../../../mocks';
import { createMagicSDK } from '../../../factories';
import { createMagicSDK, createMagicSDKTestMode } from '../../../factories';
import { BaseModule } from '../../../../src/modules/base-module';

test.beforeEach((t) => {
Expand Down Expand Up @@ -39,3 +39,18 @@ test.serial('Accepts a `lifespan` parameter', async (t) => {
t.is(requestPayload.method, 'magic_auth_get_id_token');
t.deepEqual(requestPayload.params, [{ lifespan: 900 }]);
});

test.serial('If `testMode` is enabled, testing-specific RPC method is used', async (t) => {
const magic = createMagicSDKTestMode();

const idStub = getPayloadIdStub();
idStub.returns(999);

magic.user.getIdToken();

/* Assertion */
const requestPayload = (magic.user as any).request.args[0][0];
t.is(requestPayload.id, 999);
t.is(requestPayload.method, 'magic_auth_get_id_token_testing_mode');
t.deepEqual(requestPayload.params, [undefined]);
});
17 changes: 16 additions & 1 deletion packages/provider/test/spec/modules/user/getMetadata.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import browserEnv from '@ikscodes/browser-env';
import test from 'ava';
import sinon from 'sinon';
import { getPayloadIdStub } from '../../../mocks';
import { createMagicSDK } from '../../../factories';
import { createMagicSDK, createMagicSDKTestMode } from '../../../factories';
import { BaseModule } from '../../../../src/modules/base-module';

test.beforeEach((t) => {
Expand All @@ -24,3 +24,18 @@ test('Generate JSON RPC request payload with method `magic_auth_get_metadata`',
t.is(requestPayload.method, 'magic_auth_get_metadata');
t.deepEqual(requestPayload.params, []);
});

test.serial('If `testMode` is enabled, testing-specific RPC method is used', async (t) => {
const magic = createMagicSDKTestMode();

const idStub = getPayloadIdStub();
idStub.returns(999);

magic.user.getMetadata();

/* Assertion */
const requestPayload = (magic.user as any).request.args[0][0];
t.is(requestPayload.id, 999);
t.is(requestPayload.method, 'magic_auth_get_metadata_testing_mode');
t.deepEqual(requestPayload.params, []);
});
17 changes: 16 additions & 1 deletion packages/provider/test/spec/modules/user/isLoggedIn.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import browserEnv from '@ikscodes/browser-env';
import test from 'ava';
import sinon from 'sinon';
import { getPayloadIdStub } from '../../../mocks';
import { createMagicSDK } from '../../../factories';
import { createMagicSDK, createMagicSDKTestMode } from '../../../factories';
import { BaseModule } from '../../../../src/modules/base-module';

test.beforeEach((t) => {
Expand All @@ -24,3 +24,18 @@ test(' Generate JSON RPC request payload with method `magic_auth_is_logged_in`',
t.is(requestPayload.method, 'magic_auth_is_logged_in');
t.deepEqual(requestPayload.params, []);
});

test.serial('If `testMode` is enabled, testing-specific RPC method is used', async (t) => {
const magic = createMagicSDKTestMode();

const idStub = getPayloadIdStub();
idStub.returns(999);

magic.user.isLoggedIn();

/* Assertion */
const requestPayload = (magic.user as any).request.args[0][0];
t.is(requestPayload.id, 999);
t.is(requestPayload.method, 'magic_auth_is_logged_in_testing_mode');
t.deepEqual(requestPayload.params, []);
});
17 changes: 16 additions & 1 deletion packages/provider/test/spec/modules/user/logout.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import browserEnv from '@ikscodes/browser-env';
import test from 'ava';
import sinon from 'sinon';
import { getPayloadIdStub } from '../../../mocks';
import { createMagicSDK } from '../../../factories';
import { createMagicSDK, createMagicSDKTestMode } from '../../../factories';
import { BaseModule } from '../../../../src/modules/base-module';

test.beforeEach((t) => {
Expand All @@ -24,3 +24,18 @@ test('Generate JSON RPC request payload with method `magic_auth_logout`', async
t.is(requestPayload.method, 'magic_auth_logout');
t.deepEqual(requestPayload.params, []);
});

test.serial('If `testMode` is enabled, testing-specific RPC method is used', async (t) => {
const magic = createMagicSDKTestMode();

const idStub = getPayloadIdStub();
idStub.returns(999);

magic.user.logout();

/* Assertion */
const requestPayload = (magic.user as any).request.args[0][0];
t.is(requestPayload.id, 999);
t.is(requestPayload.method, 'magic_auth_logout_testing_mode');
t.deepEqual(requestPayload.params, []);
});
17 changes: 16 additions & 1 deletion packages/provider/test/spec/modules/user/updateEmail.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import browserEnv from '@ikscodes/browser-env';
import test from 'ava';
import sinon from 'sinon';
import { getPayloadIdStub } from '../../../mocks';
import { createMagicSDK } from '../../../factories';
import { createMagicSDK, createMagicSDKTestMode } from '../../../factories';
import { BaseModule } from '../../../../src/modules/base-module';

test.beforeEach((t) => {
Expand Down Expand Up @@ -39,3 +39,18 @@ test.serial('Accepts a `showUI` parameter', async (t) => {
t.is(requestPayload.method, 'magic_auth_update_email');
t.deepEqual(requestPayload.params, [{ email: 'test', showUI: false }]);
});

test.serial('If `testMode` is enabled, testing-specific RPC method is used', async (t) => {
const magic = createMagicSDKTestMode();

const idStub = getPayloadIdStub();
idStub.returns(888);

await magic.user.updateEmail({ email: 'test', showUI: false });

const requestPayload = (magic.user as any).request.args[0][0];
t.is(requestPayload.jsonrpc, '2.0');
t.is(requestPayload.id, 888);
t.is(requestPayload.method, 'magic_auth_update_email_testing_mode');
t.deepEqual(requestPayload.params, [{ email: 'test', showUI: false }]);
});
8 changes: 8 additions & 0 deletions packages/types/src/core/json-rpc-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,12 @@ export enum MagicPayloadMethod {
IsLoggedIn = 'magic_auth_is_logged_in',
Logout = 'magic_auth_logout',
UpdateEmail = 'magic_auth_update_email',
LoginWithMagicLinkTestMode = 'magic_login_with_magic_link_testing_mode',
LoginWithCredentialTestMode = 'magic_auth_login_with_credential_testing_mode',
GetIdTokenTestMode = 'magic_auth_get_id_token_testing_mode',
GenerateIdTokenTestMode = 'magic_auth_generate_id_token_testing_mode',
GetMetadataTestMode = 'magic_auth_get_metadata_testing_mode',
IsLoggedInTestMode = 'magic_auth_is_logged_in_testing_mode',
LogoutTestMode = 'magic_auth_logout_testing_mode',
UpdateEmailTestMode = 'magic_auth_update_email_testing_mode',
}
Loading

0 comments on commit 05921f4

Please sign in to comment.