Skip to content

Commit b49dfc4

Browse files
committed
fix tests
1 parent b73e3d9 commit b49dfc4

File tree

17 files changed

+149
-139
lines changed

17 files changed

+149
-139
lines changed

packages/@aws-cdk/toolkit-lib/lib/toolkit/toolkit.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ export class Toolkit extends CloudAssemblySourceBuilder implements AsyncDisposab
155155
const bootstrapEnvironments = await environments.getEnvironments();
156156
const source = options.source ?? BootstrapSource.default();
157157
const parameters = options.parameters;
158-
const bootstrapper = new Bootstrapper(source, { ioHost: ioHelper, action: 'bootstrap' });
158+
const bootstrapper = new Bootstrapper(source, ioHelper);
159159
const sdkProvider = await this.sdkProvider('bootstrap');
160160
const limit = pLimit(20);
161161

@@ -281,7 +281,7 @@ export class Toolkit extends CloudAssemblySourceBuilder implements AsyncDisposab
281281
}
282282

283283
const deployments = await this.deploymentsForAction('deploy');
284-
const migrator = new ResourceMigrator({ deployments, ioHost: ioHelper, action });
284+
const migrator = new ResourceMigrator({ deployments, ioHelper });
285285

286286
await migrator.tryMigrateResources(stackCollection, options);
287287

@@ -511,7 +511,7 @@ export class Toolkit extends CloudAssemblySourceBuilder implements AsyncDisposab
511511
if (options.traceLogs) {
512512
// deploy calls that originate from watch will come with their own cloudWatchLogMonitor
513513
const cloudWatchLogMonitor = options.cloudWatchLogMonitor ?? new CloudWatchLogEventMonitor();
514-
const foundLogGroupsResult = await findCloudWatchLogGroups(await this.sdkProvider('deploy'), { ioHost: ioHelper, action }, stack);
514+
const foundLogGroupsResult = await findCloudWatchLogGroups(await this.sdkProvider('deploy'), ioHelper, stack);
515515
cloudWatchLogMonitor.addLogGroups(
516516
foundLogGroupsResult.env,
517517
foundLogGroupsResult.sdk,
@@ -543,7 +543,7 @@ export class Toolkit extends CloudAssemblySourceBuilder implements AsyncDisposab
543543
stack,
544544
...stack.dependencies.filter(x => cxapi.AssetManifestArtifact.isAssetManifestArtifact(x)),
545545
]);
546-
const workGraph = new WorkGraphBuilder({ ioHost: ioHelper, action }, prebuildAssets).build(stacksAndTheirAssetManifests);
546+
const workGraph = new WorkGraphBuilder(ioHelper, prebuildAssets).build(stacksAndTheirAssetManifests);
547547

548548
// Unless we are running with '--force', skip already published assets
549549
if (!options.force) {

packages/aws-cdk/lib/api/work-graph/work-graph-builder.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export class WorkGraphBuilder {
2929
private readonly prebuildAssets: boolean,
3030
private readonly idPrefix = '',
3131
) {
32-
this.graph = new WorkGraph({}, { ioHelper });
32+
this.graph = new WorkGraph({}, ioHelper);
3333
this.ioHelper = ioHelper;
3434
}
3535

packages/aws-cdk/lib/api/work-graph/work-graph.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@ import { parallelPromises } from '../../util';
66

77
export type Concurrency = number | Record<WorkNode['type'], number>;
88

9-
export interface WorkGraphProps {
10-
ioHelper: IoHelper;
11-
}
12-
139
export class WorkGraph {
1410
public readonly nodes: Record<string, WorkNode>;
1511
private readonly readyPool: Array<WorkNode> = [];
@@ -18,9 +14,9 @@ export class WorkGraph {
1814

1915
public error?: Error;
2016

21-
public constructor(nodes: Record<string, WorkNode>, props: WorkGraphProps) {
17+
public constructor(nodes: Record<string, WorkNode>, ioHelper: IoHelper) {
2218
this.nodes = { ...nodes };
23-
this.ioHelper = props.ioHelper;
19+
this.ioHelper = ioHelper;
2420
}
2521

2622
public addNodes(...nodes: WorkNode[]) {
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { IIoHost, IoMessage, IoMessageLevel, IoRequest } from "../../../@aws-cdk/tmp-toolkit-helpers/src/api/io";
2+
import { isMessageRelevantForLevel } from "../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private";
3+
4+
/**
5+
* A test implementation of IIoHost that does nothing but can by spied on.
6+
* Optionally set a level to filter out all irrelevant messages.
7+
* Optionally set a approval level.
8+
*/
9+
export class TestIoHost implements IIoHost {
10+
public readonly notifySpy: jest.Mock<any, any, any>;
11+
public readonly requestSpy: jest.Mock<any, any, any>;
12+
13+
constructor(public level: IoMessageLevel = 'info') {
14+
this.notifySpy = jest.fn();
15+
this.requestSpy = jest.fn();
16+
}
17+
18+
public async notify<T>(msg: IoMessage<T>): Promise<void> {
19+
if (isMessageRelevantForLevel(msg, this.level)) {
20+
this.notifySpy(msg);
21+
}
22+
}
23+
24+
public async requestResponse<T, U>(msg: IoRequest<T, U>): Promise<U> {
25+
if (isMessageRelevantForLevel(msg, this.level)) {
26+
this.requestSpy(msg);
27+
}
28+
return msg.defaultResponse;
29+
}
30+
}

packages/aws-cdk/test/api/_helpers/hotswap-test-setup.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import {
1414
setDefaultSTSMocks,
1515
} from '../../util/mock-sdk';
1616
import { FakeCloudformationStack } from './fake-cloudformation-stack';
17+
import { TestIoHost } from '../../_helpers/test-io-host';
18+
import { asIoHelper } from '../../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private';
1719

1820
const STACK_NAME = 'withouterrors';
1921
export const STACK_ID = 'stackId';
@@ -23,11 +25,7 @@ let currentCfnStack: FakeCloudformationStack;
2325
const currentCfnStackResources: StackResourceSummary[] = [];
2426
let stackTemplates: { [stackName: string]: any };
2527
let currentNestedCfnStackResources: { [stackName: string]: StackResourceSummary[] };
26-
27-
let mockMsg: IoMessaging = {
28-
ioHost: CliIoHost.instance(),
29-
action: 'deploy',
30-
};
28+
let ioHost = new TestIoHost();
3129

3230
export function setupHotswapTests(): HotswapMockSdkProvider {
3331
restoreSdkMocksToDefault();
@@ -148,6 +146,6 @@ export class HotswapMockSdkProvider extends MockSdkProvider {
148146
hotswapPropertyOverrides?: HotswapPropertyOverrides,
149147
): Promise<SuccessfulDeployStackResult | undefined> {
150148
let hotswapProps = hotswapPropertyOverrides || new HotswapPropertyOverrides();
151-
return deployments.tryHotswapDeployment(this, mockMsg, assetParams, currentCfnStack, stackArtifact, hotswapMode, hotswapProps);
149+
return deployments.tryHotswapDeployment(this, asIoHelper(ioHost, 'deploy'), assetParams, currentCfnStack, stackArtifact, hotswapMode, hotswapProps);
152150
}
153151
}

packages/aws-cdk/test/api/bootstrap/bootstrap.test.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ import { parse } from 'yaml';
1313
import { Bootstrapper } from '../../../lib/api/bootstrap';
1414
import { legacyBootstrapTemplate } from '../../../lib/api/bootstrap/legacy-template';
1515
import { deserializeStructure, serializeStructure, toYAML } from '../../../lib/util';
16-
import { CliIoHost } from '../../../lib/toolkit/cli-io-host';
1716
import { MockSdkProvider, mockCloudFormationClient, restoreSdkMocksToDefault } from '../../util/mock-sdk';
17+
import { TestIoHost } from '../../_helpers/test-io-host';
18+
import { asIoHelper } from '../../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private';
1819

1920
const env = {
2021
account: '123456789012',
@@ -31,9 +32,12 @@ jest.mock('../../../lib/api/deployments/checks', () => ({
3132
let sdk: MockSdkProvider;
3233
let changeSetTemplate: any | undefined;
3334
let bootstrapper: Bootstrapper;
35+
let ioHost = new TestIoHost();
36+
let ioHelper = asIoHelper(ioHost, 'bootstrap');
37+
3438
beforeEach(() => {
3539
sdk = new MockSdkProvider();
36-
bootstrapper = new Bootstrapper({ source: 'legacy' }, { ioHost: CliIoHost.instance(), action: 'bootstrap' });
40+
bootstrapper = new Bootstrapper({ source: 'legacy' }, ioHelper);
3741
mockCloudFormationClient.reset();
3842
restoreSdkMocksToDefault();
3943
// First two calls, no stacks exist (first is for version checking, second is in deploy-stack.ts)

packages/aws-cdk/test/api/bootstrap/bootstrap2.test.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,28 @@ import {
1010
MockSdkProvider,
1111
restoreSdkMocksToDefault, setDefaultSTSMocks,
1212
} from '../../util/mock-sdk';
13-
import { CliIoHost } from '../../../lib/toolkit/cli-io-host';
13+
import { IIoHost } from '../../../lib/toolkit/cli-io-host';
14+
import { asIoHelper } from '../../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private';
1415

1516
const mockDeployStack = jest.spyOn(deployStack, 'deployStack');
1617

1718
let bootstrapper: Bootstrapper;
1819
let stderrMock: jest.SpyInstance;
20+
let ioHost: IIoHost = {
21+
notify: jest.fn().mockImplementation((msg) => {
22+
process.stderr.write(msg.message + '\n');
23+
}),
24+
requestResponse: jest.fn().mockImplementation((msg) => {
25+
process.stderr.write(msg.message + '\n');
26+
return msg.defaultResponses
27+
}),
28+
};
29+
let ioHelper = asIoHelper(ioHost, 'bootstrap');
1930

2031
beforeEach(() => {
21-
CliIoHost.instance().isCI = false;
22-
bootstrapper = new Bootstrapper({ source: 'default' }, { ioHost: CliIoHost.instance(), action: 'bootstrap' });
32+
jest.mocked(ioHost.notify).mockClear();
33+
jest.mocked(ioHost.requestResponse).mockClear();
34+
bootstrapper = new Bootstrapper({ source: 'default' }, ioHelper);
2335
stderrMock = jest.spyOn(process.stderr, 'write').mockImplementation(() => {
2436
return true;
2537
});

packages/aws-cdk/test/api/deployments/assets.test.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,25 @@ import { AssetManifestBuilder } from '../../../lib/api/deployments';
66
import { EnvironmentResources, EnvironmentResourcesRegistry } from '../../../lib/api/environment';
77
import { MockSdk } from '../../util/mock-sdk';
88
import { MockToolkitInfo } from '../../util/mock-toolkitinfo';
9-
import { CliIoHost, IoMessaging } from '../../../lib/toolkit/cli-io-host';
9+
import { TestIoHost } from '../../_helpers/test-io-host';
10+
import { asIoHelper } from '../../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private';
1011

1112
let assets: AssetManifestBuilder;
1213
let envRegistry: EnvironmentResourcesRegistry;
1314
let envResources: EnvironmentResources;
1415
let toolkitMock: ReturnType<typeof MockToolkitInfo.setup>;
15-
let mockMsg: IoMessaging = { ioHost: CliIoHost.instance(), action: 'deploy' };
16+
let ioHost = new TestIoHost();
17+
let ioHelper = asIoHelper(ioHost, 'deploy');
1618

1719
beforeEach(() => {
20+
ioHost.notifySpy.mockClear();
21+
ioHost.requestSpy.mockClear();
22+
1823
assets = new AssetManifestBuilder();
1924
envRegistry = new EnvironmentResourcesRegistry();
2025

2126
const sdk = new MockSdk();
22-
envResources = envRegistry.for({ account: '11111111', region: 'us-nowhere', name: 'aws://11111111/us-nowhere' }, sdk, mockMsg);
27+
envResources = envRegistry.for({ account: '11111111', region: 'us-nowhere', name: 'aws://11111111/us-nowhere' }, sdk, ioHelper);
2328
toolkitMock = MockToolkitInfo.setup();
2429
});
2530

@@ -44,7 +49,7 @@ describe('file assets', () => {
4449
]);
4550

4651
// WHEN
47-
const params = await addMetadataAssetsToManifest(mockMsg, stack, assets, envResources);
52+
const params = await addMetadataAssetsToManifest(ioHelper, stack, assets, envResources);
4853

4954
// THEN
5055
expect(params).toEqual({
@@ -83,7 +88,7 @@ describe('file assets', () => {
8388
]);
8489

8590
// WHEN
86-
await addMetadataAssetsToManifest(mockMsg, stack, assets, envResources);
91+
await addMetadataAssetsToManifest(ioHelper, stack, assets, envResources);
8792

8893
// THEN
8994
expect(assets.toManifest('.').entries).toEqual([
@@ -111,7 +116,7 @@ describe('file assets', () => {
111116
]);
112117

113118
// WHEN
114-
const params = await addMetadataAssetsToManifest(mockMsg, stack, assets, envResources, ['SomeStackSomeResource4567']);
119+
const params = await addMetadataAssetsToManifest(ioHelper, stack, assets, envResources, ['SomeStackSomeResource4567']);
115120

116121
// THEN
117122
expect(params).toEqual({
@@ -137,7 +142,7 @@ describe('docker assets', () => {
137142
mockFn(envResources.prepareEcrRepository).mockResolvedValue({ repositoryUri: 'docker.uri' });
138143

139144
// WHEN
140-
const params = await addMetadataAssetsToManifest(mockMsg, stack, assets, envResources);
145+
const params = await addMetadataAssetsToManifest(ioHelper, stack, assets, envResources);
141146

142147
// THEN
143148
expect(envResources.prepareEcrRepository).toHaveBeenCalledWith('cdk/stack-construct-abc123');
@@ -170,7 +175,7 @@ describe('docker assets', () => {
170175
},
171176
]);
172177

173-
await expect(addMetadataAssetsToManifest(mockMsg, stack, assets, envResources)).rejects.toThrow('Invalid Docker image asset');
178+
await expect(addMetadataAssetsToManifest(ioHelper, stack, assets, envResources)).rejects.toThrow('Invalid Docker image asset');
174179
});
175180

176181
test('no parameter and repo/tag name (new)', async () => {
@@ -189,7 +194,7 @@ describe('docker assets', () => {
189194
mockFn(envResources.prepareEcrRepository).mockResolvedValue({ repositoryUri: 'docker.uri' });
190195

191196
// WHEN
192-
const params = await addMetadataAssetsToManifest(mockMsg, stack, assets, envResources);
197+
const params = await addMetadataAssetsToManifest(ioHelper, stack, assets, envResources);
193198

194199
// THEN
195200
expect(envResources.prepareEcrRepository).toHaveBeenCalledWith('reponame');
@@ -222,7 +227,7 @@ describe('docker assets', () => {
222227
]);
223228

224229
// WHEN
225-
const params = await addMetadataAssetsToManifest(mockMsg, stack, assets, envResources, ['SomeStackSomeResource4567']);
230+
const params = await addMetadataAssetsToManifest(ioHelper, stack, assets, envResources, ['SomeStackSomeResource4567']);
226231

227232
// THEN
228233
expect(params).toEqual({

packages/aws-cdk/test/api/deployments/checks.test.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
import { DescribeStacksCommand, StackStatus } from '@aws-sdk/client-cloudformation';
22
import { determineAllowCrossAccountAssetPublishing, getBootstrapStackInfo } from '../../../lib/api/deployments/checks';
3-
import { CliIoHost, IoMessaging } from '../../../lib/toolkit/cli-io-host';
43
import { mockCloudFormationClient, MockSdk } from '../../util/mock-sdk';
4+
import { TestIoHost } from '../../_helpers/test-io-host';
5+
import { asIoHelper } from '../../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private';
56

6-
let mockMsg: IoMessaging = {
7-
ioHost: CliIoHost.instance(),
8-
action: 'deploy',
9-
};
7+
let ioHelper = asIoHelper(new TestIoHost(), 'deploy');
108

119
describe('determineAllowCrossAccountAssetPublishing', () => {
1210
it('should return true when hasStagingBucket is false', async () => {
@@ -20,7 +18,7 @@ describe('determineAllowCrossAccountAssetPublishing', () => {
2018
}],
2119
});
2220

23-
const result = await determineAllowCrossAccountAssetPublishing(mockSDK, mockMsg);
21+
const result = await determineAllowCrossAccountAssetPublishing(mockSDK, ioHelper);
2422
expect(result).toBe(true);
2523
});
2624

@@ -38,7 +36,7 @@ describe('determineAllowCrossAccountAssetPublishing', () => {
3836
}],
3937
});
4038

41-
const result = await determineAllowCrossAccountAssetPublishing(mockSDK, mockMsg);
39+
const result = await determineAllowCrossAccountAssetPublishing(mockSDK, ioHelper);
4240
expect(result).toBe(true);
4341
});
4442

@@ -57,23 +55,23 @@ describe('determineAllowCrossAccountAssetPublishing', () => {
5755
}],
5856
});
5957

60-
const result = await determineAllowCrossAccountAssetPublishing(mockSDK, mockMsg);
58+
const result = await determineAllowCrossAccountAssetPublishing(mockSDK, ioHelper);
6159
expect(result).toBe(true);
6260
});
6361

6462
it('should return true if looking up the bootstrap stack fails', async () => {
6563
const mockSDK = new MockSdk();
6664
mockCloudFormationClient.on(DescribeStacksCommand).rejects(new Error('Could not read bootstrap stack'));
6765

68-
const result = await determineAllowCrossAccountAssetPublishing(mockSDK, mockMsg);
66+
const result = await determineAllowCrossAccountAssetPublishing(mockSDK, ioHelper);
6967
expect(result).toBe(true);
7068
});
7169

7270
it('should return true if looking up the bootstrap stack fails', async () => {
7371
const mockSDK = new MockSdk();
7472
mockCloudFormationClient.on(DescribeStacksCommand).rejects(new Error('Could not read bootstrap stack'));
7573

76-
const result = await determineAllowCrossAccountAssetPublishing(mockSDK, mockMsg);
74+
const result = await determineAllowCrossAccountAssetPublishing(mockSDK, ioHelper);
7775
expect(result).toBe(true);
7876
});
7977

@@ -91,7 +89,7 @@ describe('determineAllowCrossAccountAssetPublishing', () => {
9189
}],
9290
});
9391

94-
const result = await determineAllowCrossAccountAssetPublishing(mockSDK, mockMsg);
92+
const result = await determineAllowCrossAccountAssetPublishing(mockSDK, ioHelper);
9593
expect(result).toBe(false);
9694
});
9795
});

packages/aws-cdk/test/api/deployments/cloudformation-deployments.test.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import { CloudFormationStack, createChangeSet, Deployments } from '../../../lib/
1616
import { deployStack } from '../../../lib/api/deployments/deploy-stack';
1717
import { HotswapMode } from '../../../lib/api/hotswap/common';
1818
import { ToolkitInfo } from '../../../lib/api/toolkit-info';
19-
import { CliIoHost } from '../../../lib/toolkit/cli-io-host';
2019
import { testStack } from '../../util';
2120
import {
2221
mockBootstrapStack,
@@ -28,6 +27,8 @@ import {
2827
setDefaultSTSMocks,
2928
} from '../../util/mock-sdk';
3029
import { FakeCloudformationStack } from '../_helpers/fake-cloudformation-stack';
30+
import { TestIoHost } from '../../_helpers/test-io-host';
31+
import { asIoHelper } from '../../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private';
3132

3233
jest.mock('../../../lib/api/deployments/deploy-stack');
3334
jest.mock('../../../lib/api/deployments/asset-publishing');
@@ -37,11 +38,16 @@ let sdk: MockSdk;
3738
let deployments: Deployments;
3839
let mockToolkitInfoLookup: jest.Mock;
3940
let currentCfnStackResources: { [key: string]: StackResourceSummary[] };
41+
let ioHost = new TestIoHost();
42+
let ioHelper = asIoHelper(ioHost, 'deploy');
43+
4044
beforeEach(() => {
4145
jest.resetAllMocks();
4246
sdkProvider = new MockSdkProvider();
4347
sdk = new MockSdk();
44-
deployments = new Deployments({ sdkProvider, ioHost: CliIoHost.instance(), action: 'deploy' });
48+
ioHost.notifySpy.mockClear();
49+
ioHost.requestSpy.mockClear();
50+
deployments = new Deployments({ sdkProvider, ioHelper });
4551

4652
currentCfnStackResources = {};
4753
restoreSdkMocksToDefault();
@@ -1151,7 +1157,7 @@ test('tags are passed along to create change set', async () => {
11511157
}
11521158

11531159
await createChangeSet(
1154-
{ ioHost: CliIoHost.instance(), action: 'deploy' },
1160+
ioHelper,
11551161
{
11561162
stack: stack,
11571163
cfn: new MockSdk().cloudFormation(),

0 commit comments

Comments
 (0)