Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion packages/ramps-controller/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Added

- Add `doNotUpdateState` option to `ExecuteRequestOptions` to allow external consumers to use controller methods without updating state ([#7708](https://github.com/MetaMask/core/pull/7708))
- Add `hydrateState()` method to fetch providers and tokens for user region ([#7707](https://github.com/MetaMask/core/pull/7707))
- Add `countries` state to RampsController with 24 hour TTL caching ([#7707](https://github.com/MetaMask/core/pull/7707))
- Add `SupportedActions` type for `{ buy: boolean; sell: boolean }` support info
- Add `SupportedActions` type for `{ buy: boolean; sell: boolean }` support info ([#7707](https://github.com/MetaMask/core/pull/7707))

### Changed

Expand Down
132 changes: 121 additions & 11 deletions packages/ramps-controller/src/RampsController.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import type {
RampsServiceGetProvidersAction,
RampsServiceGetPaymentMethodsAction,
} from './RampsService-method-action-types';
import { RequestStatus } from './RequestCache';
import { RequestStatus, createCacheKey } from './RequestCache';

describe('RampsController', () => {
describe('constructor', () => {
Expand All @@ -37,6 +37,7 @@ describe('RampsController', () => {
"providers": Array [],
"requests": Object {},
"selectedPaymentMethod": null,
"selectedToken": null,
"tokens": null,
"userRegion": null,
}
Expand Down Expand Up @@ -70,6 +71,7 @@ describe('RampsController', () => {
"providers": Array [],
"requests": Object {},
"selectedPaymentMethod": null,
"selectedToken": null,
"tokens": null,
"userRegion": null,
}
Expand Down Expand Up @@ -365,6 +367,24 @@ describe('RampsController', () => {
);
});
});

it('does not update state when doNotUpdateState is true', async () => {
await withController(async ({ controller, rootMessenger }) => {
rootMessenger.registerActionHandler(
'RampsService:getProviders',
async () => ({ providers: mockProviders }),
);

expect(controller.state.providers).toStrictEqual([]);

const result = await controller.getProviders('us', {
doNotUpdateState: true,
});

expect(result.providers).toStrictEqual(mockProviders);
expect(controller.state.providers).toStrictEqual([]);
});
});
});

describe('metadata', () => {
Expand All @@ -384,6 +404,7 @@ describe('RampsController', () => {
"providers": Array [],
"requests": Object {},
"selectedPaymentMethod": null,
"selectedToken": null,
"tokens": null,
"userRegion": null,
}
Expand All @@ -406,6 +427,7 @@ describe('RampsController', () => {
"preferredProvider": null,
"providers": Array [],
"selectedPaymentMethod": null,
"selectedToken": null,
"tokens": null,
"userRegion": null,
}
Expand All @@ -426,6 +448,7 @@ describe('RampsController', () => {
"countries": Array [],
"preferredProvider": null,
"providers": Array [],
"selectedToken": null,
"tokens": null,
"userRegion": null,
}
Expand All @@ -449,6 +472,7 @@ describe('RampsController', () => {
"providers": Array [],
"requests": Object {},
"selectedPaymentMethod": null,
"selectedToken": null,
"tokens": null,
"userRegion": null,
}
Expand Down Expand Up @@ -1028,6 +1052,42 @@ describe('RampsController', () => {
expect(callCount).toBe(1);
});
});

it('does not update state when doNotUpdateState is true', async () => {
await withController(async ({ controller, rootMessenger }) => {
rootMessenger.registerActionHandler(
'RampsService:getCountries',
async () => mockCountries,
);

expect(controller.state.countries).toStrictEqual([]);

const countries = await controller.getCountries({
doNotUpdateState: true,
});

expect(countries).toStrictEqual(mockCountries);
expect(controller.state.countries).toStrictEqual([]);
});
});

it('still updates request cache when doNotUpdateState is true', async () => {
await withController(async ({ controller, rootMessenger }) => {
rootMessenger.registerActionHandler(
'RampsService:getCountries',
async () => mockCountries,
);

await controller.getCountries({ doNotUpdateState: true });

const cacheKey = createCacheKey('getCountries', []);
const requestState = controller.getRequestState(cacheKey);

expect(requestState).toBeDefined();
expect(requestState?.status).toBe(RequestStatus.SUCCESS);
expect(requestState?.data).toStrictEqual(mockCountries);
});
});
});

describe('init', () => {
Expand Down Expand Up @@ -1315,7 +1375,7 @@ describe('RampsController', () => {

await controller.setUserRegion('US');
await new Promise((resolve) => setTimeout(resolve, 50));
await controller.getPaymentMethods({
await controller.getPaymentMethods(undefined, {
assetId: 'eip155:1/slip44:60',
provider: '/providers/test',
});
Expand Down Expand Up @@ -2338,6 +2398,24 @@ describe('RampsController', () => {
expect(callCount).toBe(2);
});
});

it('does not update state when doNotUpdateState is true', async () => {
await withController(async ({ controller, rootMessenger }) => {
rootMessenger.registerActionHandler(
'RampsService:getTokens',
async () => mockTokens,
);

expect(controller.state.tokens).toBeNull();

const tokens = await controller.getTokens('us', 'buy', {
doNotUpdateState: true,
});

expect(tokens).toStrictEqual(mockTokens);
expect(controller.state.tokens).toBeNull();
});
});
});

describe('getPaymentMethods', () => {
Expand Down Expand Up @@ -2382,7 +2460,7 @@ describe('RampsController', () => {
mockPaymentMethod1,
);

await controller.getPaymentMethods({
await controller.getPaymentMethods(undefined, {
assetId: 'eip155:1/slip44:60',
provider: '/providers/stripe',
});
Expand Down Expand Up @@ -2428,7 +2506,7 @@ describe('RampsController', () => {
removedPaymentMethod,
);

await controller.getPaymentMethods({
await controller.getPaymentMethods(undefined, {
assetId: 'eip155:1/slip44:60',
provider: '/providers/stripe',
});
Expand Down Expand Up @@ -2462,7 +2540,7 @@ describe('RampsController', () => {

expect(controller.state.selectedPaymentMethod).toBeNull();

await controller.getPaymentMethods({
await controller.getPaymentMethods(undefined, {
assetId: 'eip155:1/slip44:60',
provider: '/providers/stripe',
});
Expand Down Expand Up @@ -2494,7 +2572,7 @@ describe('RampsController', () => {

expect(controller.state.paymentMethods).toStrictEqual([]);

await controller.getPaymentMethods({
await controller.getPaymentMethods(undefined, {
assetId: 'eip155:1/slip44:60',
provider: '/providers/stripe',
});
Expand All @@ -2510,7 +2588,7 @@ describe('RampsController', () => {
it('throws error when region is not provided and userRegion is not set', async () => {
await withController(async ({ controller }) => {
await expect(
controller.getPaymentMethods({
controller.getPaymentMethods(undefined, {
assetId: 'eip155:1/slip44:60',
provider: '/providers/stripe',
}),
Expand Down Expand Up @@ -2544,7 +2622,7 @@ describe('RampsController', () => {
},
);

await controller.getPaymentMethods({
await controller.getPaymentMethods(undefined, {
assetId: 'eip155:1/slip44:60',
provider: '/providers/stripe',
});
Expand Down Expand Up @@ -2579,7 +2657,7 @@ describe('RampsController', () => {
},
async ({ controller }) => {
await expect(
controller.getPaymentMethods({
controller.getPaymentMethods(undefined, {
assetId: 'eip155:1/slip44:60',
provider: '/providers/stripe',
}),
Expand All @@ -2589,6 +2667,38 @@ describe('RampsController', () => {
},
);
});

it('does not update state when doNotUpdateState is true', async () => {
await withController(
{
options: {
state: {
userRegion: createMockUserRegion('us'),
},
},
},
async ({ controller, rootMessenger }) => {
rootMessenger.registerActionHandler(
'RampsService:getPaymentMethods',
async () => mockPaymentMethodsResponse,
);

expect(controller.state.paymentMethods).toStrictEqual([]);

const response = await controller.getPaymentMethods(undefined, {
assetId: 'eip155:1/slip44:60',
provider: '/providers/stripe',
doNotUpdateState: true,
});

expect(response.payments).toStrictEqual([
mockPaymentMethod1,
mockPaymentMethod2,
]);
expect(controller.state.paymentMethods).toStrictEqual([]);
},
);
});
});

describe('setSelectedPaymentMethod', () => {
Expand Down Expand Up @@ -2663,7 +2773,7 @@ describe('RampsController', () => {
);

// Should not throw
controller.triggerGetPaymentMethods({
controller.triggerGetPaymentMethods(undefined, {
assetId: 'eip155:1/slip44:60',
provider: '/providers/stripe',
});
Expand All @@ -2682,7 +2792,7 @@ describe('RampsController', () => {
await withController(async ({ controller }) => {
// Should not throw even when getPaymentMethods would fail (no region)
expect(() => {
controller.triggerGetPaymentMethods({
controller.triggerGetPaymentMethods(undefined, {
assetId: 'eip155:1/slip44:60',
provider: '/providers/stripe',
});
Expand Down
Loading
Loading