@spinnaker/google 2026.3.2 → 2026.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/dist/autoscalingPolicy/GceAutoScalingFieldLayout.d.ts +2 -2
  2. package/dist/domain/loadBalancer.d.ts +6 -3
  3. package/dist/image/ImageSelect.d.ts +1 -1
  4. package/dist/index.js +159 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/loadBalancer/configure/common/gceLoadBalancerModels.d.ts +13 -2
  7. package/dist/loadBalancer/configure/http/GceHttpLoadBalancerEditor.d.ts +3 -0
  8. package/dist/loadBalancer/configure/http/GceHttpLoadBalancerModal.d.ts +1 -1
  9. package/dist/loadBalancer/configure/network/GceRegionalExternalNetworkLoadBalancerEditor.d.ts +30 -0
  10. package/dist/loadBalancer/configure/network/GceRegionalExternalNetworkLoadBalancerModal.d.ts +53 -0
  11. package/dist/loadBalancer/httpLoadBalancerUtils.service.d.ts +3 -1
  12. package/dist/serverGroup/configure/wizard/GceCloneServerGroupModal.d.ts +3 -0
  13. package/dist/serverGroup/configure/wizard/GceServerGroupWizard.types.d.ts +1 -0
  14. package/dist/serverGroup/configure/wizard/customInstance/CustomInstanceConfigurer.d.ts +1 -1
  15. package/dist/serverGroup/configure/wizard/customInstance/GceCustomInstanceBuilder.d.ts +2 -2
  16. package/dist/serverGroup/configure/wizard/pages/AdvancedSettings.d.ts +3 -0
  17. package/dist/serverGroup/configure/wizard/pages/GceServerGroupLoadBalancers.d.ts +1 -0
  18. package/dist/serverGroup/configure/wizard/pages/Policies.d.ts +21 -3
  19. package/dist/serverGroup/configure/wizard/pages/ServerGroupBasicSettings.d.ts +1 -0
  20. package/dist/serverGroup/configure/wizard/pages/ServerGroupCapacity.d.ts +1 -0
  21. package/dist/serverGroup/configure/wizard/pages/ServerGroupImageSettings.d.ts +1 -0
  22. package/dist/serverGroup/configure/wizard/pages/ServerGroupInstanceType.d.ts +1 -0
  23. package/dist/serverGroup/configure/wizard/zones/GceInstanceFlexibilityConfigurer.d.ts +2 -2
  24. package/dist/serverGroup/details/GceInstanceFlexibilityPolicyDetails.d.ts +2 -2
  25. package/dist/serverGroup/details/stateful/MarkDiskStatefulButton.d.ts +2 -2
  26. package/dist/serverGroup/details/stateful/UpdateBootImageButton.d.ts +2 -2
  27. package/package.json +5 -5
  28. package/src/autoHealingPolicy/GceAutoHealingPolicyEditor.spec.tsx +68 -52
  29. package/src/autoscalingPolicy/GceAutoscalingPolicyEditor.spec.tsx +43 -50
  30. package/src/autoscalingPolicy/GceAutoscalingPolicyEditor.tsx +1 -1
  31. package/src/autoscalingPolicy/GceAutoscalingPolicyWriter.spec.ts +1 -1
  32. package/src/domain/loadBalancer.ts +6 -3
  33. package/src/gce.module.spec.ts +132 -153
  34. package/src/instance/details/GceInstanceDetails.spec.tsx +86 -83
  35. package/src/loadBalancer/configure/choice/GceLoadBalancerChoiceModal.spec.tsx +162 -121
  36. package/src/loadBalancer/configure/choice/GceLoadBalancerChoiceModal.tsx +13 -1
  37. package/src/loadBalancer/configure/common/GceProxyLoadBalancerEditor.spec.tsx +47 -30
  38. package/src/loadBalancer/configure/common/GceProxyLoadBalancerEditor.tsx +2 -1
  39. package/src/loadBalancer/configure/common/GceProxyLoadBalancerModal.spec.tsx +85 -57
  40. package/src/loadBalancer/configure/common/gceLoadBalancerData.spec.ts +17 -16
  41. package/src/loadBalancer/configure/common/gceLoadBalancerModels.spec.ts +230 -5
  42. package/src/loadBalancer/configure/common/gceLoadBalancerModels.ts +186 -22
  43. package/src/loadBalancer/configure/common/gceLoadBalancerSubmission.spec.ts +298 -2
  44. package/src/loadBalancer/configure/common/gceLoadBalancerSubmission.ts +35 -5
  45. package/src/loadBalancer/configure/common/useGceLoadBalancerData.spec.tsx +37 -46
  46. package/src/loadBalancer/configure/http/GceHttpLoadBalancerEditor.spec.tsx +399 -58
  47. package/src/loadBalancer/configure/http/GceHttpLoadBalancerEditor.tsx +148 -41
  48. package/src/loadBalancer/configure/http/GceHttpLoadBalancerListenerEditor.spec.tsx +169 -36
  49. package/src/loadBalancer/configure/http/GceHttpLoadBalancerListenerEditor.tsx +80 -12
  50. package/src/loadBalancer/configure/http/GceHttpLoadBalancerModal.spec.tsx +224 -124
  51. package/src/loadBalancer/configure/http/GceHttpLoadBalancerModal.tsx +8 -2
  52. package/src/loadBalancer/configure/http/GceHttpLoadBalancerResourceEditors.spec.tsx +57 -22
  53. package/src/loadBalancer/configure/http/GceHttpLoadBalancerResourceEditors.tsx +21 -0
  54. package/src/loadBalancer/configure/http/GceHttpLoadBalancerRoutingEditor.spec.tsx +24 -20
  55. package/src/loadBalancer/configure/network/GceNetworkLoadBalancerEditor.spec.tsx +41 -32
  56. package/src/loadBalancer/configure/network/GceNetworkLoadBalancerModal.spec.tsx +35 -30
  57. package/src/loadBalancer/configure/network/GceRegionalExternalNetworkLoadBalancerEditor.spec.tsx +443 -0
  58. package/src/loadBalancer/configure/network/GceRegionalExternalNetworkLoadBalancerEditor.tsx +401 -0
  59. package/src/loadBalancer/configure/network/GceRegionalExternalNetworkLoadBalancerModal.spec.tsx +330 -0
  60. package/src/loadBalancer/configure/network/GceRegionalExternalNetworkLoadBalancerModal.tsx +348 -0
  61. package/src/loadBalancer/details/gceLoadBalancerDetails.spec.tsx +439 -35
  62. package/src/loadBalancer/details/gceLoadBalancerDetails.tsx +104 -21
  63. package/src/loadBalancer/httpLoadBalancerUtils.service.spec.ts +126 -0
  64. package/src/loadBalancer/httpLoadBalancerUtils.service.ts +27 -11
  65. package/src/loadBalancer/loadBalancer.setTransformer.spec.ts +165 -0
  66. package/src/loadBalancer/loadBalancer.setTransformer.ts +15 -2
  67. package/src/pipeline/stages/googleStageConfig.spec.js +22 -16
  68. package/src/securityGroup/configure/GceSecurityGroupModal.spec.tsx +177 -193
  69. package/src/securityGroup/configure/GceSecurityGroupModal.tsx +14 -2
  70. package/src/securityGroup/details/GceSecurityGroupDetails.spec.tsx +69 -78
  71. package/src/serverGroup/configure/serverGroupCommandBuilder.service.spec.js +35 -15
  72. package/src/serverGroup/configure/serverGroupConfiguration.service.js +7 -1
  73. package/src/serverGroup/configure/serverGroupConfiguration.service.spec.js +74 -4
  74. package/src/serverGroup/configure/wizard/GceCloneServerGroupModal.spec.tsx +593 -855
  75. package/src/serverGroup/configure/wizard/GceCloneServerGroupModal.tsx +120 -38
  76. package/src/serverGroup/configure/wizard/GceServerGroupWizard.types.ts +1 -0
  77. package/src/serverGroup/configure/wizard/GceServerGroupWizardPage.spec.tsx +53 -50
  78. package/src/serverGroup/configure/wizard/customInstance/GceCustomInstanceBuilder.spec.tsx +65 -49
  79. package/src/serverGroup/configure/wizard/hiddenMetadataKeys.value.js +1 -0
  80. package/src/serverGroup/configure/wizard/pages/AdvancedSettings.spec.tsx +101 -108
  81. package/src/serverGroup/configure/wizard/pages/AdvancedSettings.tsx +32 -28
  82. package/src/serverGroup/configure/wizard/pages/GceServerGroupFirewalls.spec.tsx +60 -59
  83. package/src/serverGroup/configure/wizard/pages/GceServerGroupLoadBalancers.spec.tsx +240 -114
  84. package/src/serverGroup/configure/wizard/pages/GceServerGroupLoadBalancers.tsx +152 -63
  85. package/src/serverGroup/configure/wizard/pages/Policies.spec.tsx +93 -48
  86. package/src/serverGroup/configure/wizard/pages/Policies.tsx +80 -55
  87. package/src/serverGroup/configure/wizard/pages/ServerGroupBasicSettings.spec.tsx +123 -94
  88. package/src/serverGroup/configure/wizard/pages/ServerGroupBasicSettings.tsx +24 -18
  89. package/src/serverGroup/configure/wizard/pages/ServerGroupCapacity.spec.tsx +152 -133
  90. package/src/serverGroup/configure/wizard/pages/ServerGroupCapacity.tsx +40 -37
  91. package/src/serverGroup/configure/wizard/pages/ServerGroupImageSettings.spec.tsx +66 -60
  92. package/src/serverGroup/configure/wizard/pages/ServerGroupImageSettings.tsx +8 -2
  93. package/src/serverGroup/configure/wizard/pages/ServerGroupInstanceType.spec.tsx +131 -101
  94. package/src/serverGroup/configure/wizard/pages/ServerGroupInstanceType.tsx +29 -28
  95. package/src/serverGroup/configure/wizard/zones/GceInstanceFlexibilityConfigurer.spec.tsx +104 -81
  96. package/src/serverGroup/details/GceInstanceFlexibilityPolicyDetails.spec.tsx +10 -11
  97. package/src/serverGroup/details/autoHealingPolicy/GceAutoHealingPolicyDetails.spec.tsx +51 -59
  98. package/src/serverGroup/details/autoHealingPolicy/modal/GceUpsertAutoHealingPolicyModal.spec.tsx +3 -3
  99. package/src/serverGroup/details/autoscalingPolicy/GceAutoscalingPolicyDetails.spec.tsx +49 -58
  100. package/src/serverGroup/details/autoscalingPolicy/modal/GceUpsertAutoscalingPolicyModal.spec.tsx +3 -3
  101. package/src/serverGroup/details/gceServerGroupDetails.spec.tsx +162 -141
  102. package/src/serverGroup/details/resize/GceResizeServerGroupModal.spec.tsx +102 -86
  103. package/src/serverGroup/details/resize/GceResizeServerGroupModal.tsx +4 -0
  104. package/src/serverGroup/details/rollback/GceRollbackServerGroupModal.spec.tsx +40 -31
  105. package/src/serverGroup/serverGroup.transformer.js +1 -0
  106. package/src/serverGroup/serverGroup.transformer.spec.js +48 -0
  107. package/src/validation/ApplicationNameValidator.spec.ts +1 -1
  108. /package/dist/{gce.logo2ae85d8704b1d6b8.png → gce.logoChI3w_A5.png} +0 -0
@@ -1,18 +1,16 @@
1
- import { mount, shallow } from 'enzyme';
1
+ import { act, fireEvent, render, screen, waitFor, within } from '@testing-library/react';
2
2
  import React from 'react';
3
3
 
4
- import type { Action } from '@spinnaker/core';
5
4
  import {
6
5
  AccountService,
7
6
  ConfirmationModalService,
8
7
  Details,
9
- InstanceActions,
10
8
  InstanceReader,
11
9
  InstanceWriter,
12
10
  RecentHistoryService,
13
11
  } from '@spinnaker/core';
14
12
 
15
- import { GceInstanceDetailsComponent as GceInstanceDetails } from './GceInstanceDetails';
13
+ import { GceInstanceActionsComponent, GceInstanceDetailsComponent as GceInstanceDetails } from './GceInstanceDetails';
16
14
 
17
15
  describe('GceInstanceDetails', () => {
18
16
  function application(loadBalancers: any[] = []) {
@@ -57,35 +55,32 @@ describe('GceInstanceDetails', () => {
57
55
  };
58
56
  }
59
57
 
60
- function actionsFor(
58
+ function renderActionsFor(
61
59
  loadedInstance: any,
62
60
  app = application([networkLoadBalancer()]),
63
- stateService = { go: jasmine.createSpy('go'), includes: () => false },
64
- ): Action[] {
65
- const wrapper = shallow(
66
- <GceInstanceDetails
61
+ stateService = { go: vi.fn(), includes: () => false },
62
+ ) {
63
+ return render(
64
+ <GceInstanceActionsComponent
67
65
  app={app}
68
- initialInstance={loadedInstance}
66
+ instance={loadedInstance}
69
67
  router={{} as any}
70
68
  stateParams={{}}
71
69
  stateService={stateService as any}
72
70
  />,
73
71
  );
74
- const renderedActions = shallow(wrapper.find(Details.Header).prop('actions') as React.ReactElement);
75
- const actionMenu = renderedActions.is(InstanceActions) ? renderedActions : renderedActions.find(InstanceActions);
76
- const actions = actionMenu.exists() ? actionMenu.prop('actions') : [];
77
- renderedActions.unmount();
78
- wrapper.unmount();
79
- return actions;
80
72
  }
81
73
 
82
74
  function labelsFor(loadedInstance: any, app?: any): string[] {
83
- return actionsFor(loadedInstance, app).map(({ label }) => label);
75
+ const rendered = renderActionsFor(loadedInstance, app);
76
+ const labels = Array.from(rendered.container.querySelectorAll('li a')).map((action) => action.textContent || '');
77
+ rendered.unmount();
78
+ return labels;
84
79
  }
85
80
 
86
81
  it('finds instances through disabled server groups attached to load balancers', () => {
87
- spyOn(RecentHistoryService, 'addExtraDataToLatest');
88
- spyOn(InstanceReader, 'getInstanceDetails').and.returnValue(
82
+ vi.spyOn(RecentHistoryService, 'addExtraDataToLatest').mockReturnValue(undefined);
83
+ vi.spyOn(InstanceReader, 'getInstanceDetails').mockReturnValue(
89
84
  Promise.resolve(
90
85
  instance({
91
86
  networkInterfaces: [{ networkIP: '10.0.0.1' }],
@@ -108,7 +103,7 @@ describe('GceInstanceDetails', () => {
108
103
  }),
109
104
  ]);
110
105
 
111
- const wrapper = mount(
106
+ const rendered = render(
112
107
  <GceInstanceDetails
113
108
  app={app}
114
109
  instance={{ account: 'route-account', instanceId: 'instance-1', region: 'route-region' }}
@@ -119,21 +114,21 @@ describe('GceInstanceDetails', () => {
119
114
  );
120
115
 
121
116
  expect(InstanceReader.getInstanceDetails).toHaveBeenCalledWith('test-account', 'us-central1', 'instance-1');
122
- wrapper.unmount();
117
+ rendered.unmount();
123
118
  });
124
119
 
125
120
  it('clears actions on instance identity changes and ignores stale responses', async () => {
126
- spyOn(AccountService, 'challengeDestructiveActions').and.returnValue(Promise.resolve(false));
121
+ vi.spyOn(AccountService, 'challengeDestructiveActions').mockReturnValue(Promise.resolve(false));
127
122
  const oldRequest = deferred<any>();
128
123
  const newRequest = deferred<any>();
129
- spyOn(RecentHistoryService, 'addExtraDataToLatest');
130
- spyOn(Details, 'Header').and.callFake(({ actions, name }: any) => (
124
+ vi.spyOn(RecentHistoryService, 'addExtraDataToLatest').mockReturnValue(undefined);
125
+ vi.spyOn(Details, 'Header').mockImplementation(({ actions, name }: any) => (
131
126
  <div className="test-instance-header">
132
127
  {name}
133
128
  {actions}
134
129
  </div>
135
130
  ));
136
- spyOn(InstanceReader, 'getInstanceDetails').and.callFake(
131
+ vi.spyOn(InstanceReader, 'getInstanceDetails').mockImplementation(
137
132
  (_account: string, _region: string, instanceId: string) => {
138
133
  if (instanceId === 'instance-1') {
139
134
  return Promise.resolve(instance());
@@ -152,39 +147,39 @@ describe('GceInstanceDetails', () => {
152
147
  stateService={{} as any}
153
148
  />
154
149
  );
155
- const wrapper = mount(
150
+ const rendered = render(
156
151
  <RoutedDetails routedInstance={{ account: 'test-account', instanceId: 'instance-1', region: 'us-central1' }} />,
157
152
  );
158
- await settle();
159
- wrapper.update();
160
- expect(wrapper.find('.test-instance-header').text()).toContain('instance-1');
161
- expect(wrapper.find(InstanceActions).exists()).toBe(true);
153
+ await waitFor(() =>
154
+ expect(rendered.container.querySelector('.test-instance-header')).toHaveTextContent('instance-1'),
155
+ );
156
+ expect(within(rendered.container).getByText('Instance Actions')).toBeInTheDocument();
162
157
 
163
- wrapper.setProps({
164
- routedInstance: { account: 'test-account', instanceId: 'instance-2', region: 'us-central1' },
165
- });
166
- wrapper.update();
167
- expect(wrapper.find('.test-instance-header').exists()).toBe(false);
168
- expect(wrapper.find(InstanceActions).exists()).toBe(false);
158
+ rendered.rerender(
159
+ <RoutedDetails routedInstance={{ account: 'test-account', instanceId: 'instance-2', region: 'us-central1' }} />,
160
+ );
161
+ expect(rendered.container.querySelector('.test-instance-header')).not.toBeInTheDocument();
162
+ expect(within(rendered.container).queryByText('Instance Actions')).not.toBeInTheDocument();
169
163
 
170
- wrapper.setProps({
171
- routedInstance: { account: 'test-account', instanceId: 'instance-3', region: 'us-central1' },
172
- });
173
- wrapper.update();
174
- expect(wrapper.find('.test-instance-header').exists()).toBe(false);
175
- expect(wrapper.find(InstanceActions).exists()).toBe(false);
176
-
177
- oldRequest.resolve(instance({ id: 'instance-2', instanceId: 'instance-2', name: 'instance-2' }));
178
- await settle();
179
- wrapper.update();
180
- expect(wrapper.find('.test-instance-header').exists()).toBe(false);
181
- expect(wrapper.find(InstanceActions).exists()).toBe(false);
182
-
183
- newRequest.resolve(instance({ id: 'instance-3', instanceId: 'instance-3', name: 'instance-3' }));
184
- await settle();
185
- wrapper.update();
186
- expect(wrapper.find('.test-instance-header').text()).toContain('instance-3');
187
- wrapper.unmount();
164
+ rendered.rerender(
165
+ <RoutedDetails routedInstance={{ account: 'test-account', instanceId: 'instance-3', region: 'us-central1' }} />,
166
+ );
167
+ expect(rendered.container.querySelector('.test-instance-header')).not.toBeInTheDocument();
168
+ expect(within(rendered.container).queryByText('Instance Actions')).not.toBeInTheDocument();
169
+
170
+ await act(async () =>
171
+ oldRequest.resolve(instance({ id: 'instance-2', instanceId: 'instance-2', name: 'instance-2' })),
172
+ );
173
+ expect(rendered.container.querySelector('.test-instance-header')).not.toBeInTheDocument();
174
+ expect(within(rendered.container).queryByText('Instance Actions')).not.toBeInTheDocument();
175
+
176
+ await act(async () =>
177
+ newRequest.resolve(instance({ id: 'instance-3', instanceId: 'instance-3', name: 'instance-3' })),
178
+ );
179
+ await waitFor(() =>
180
+ expect(rendered.container.querySelector('.test-instance-header')).toHaveTextContent('instance-3'),
181
+ );
182
+ rendered.unmount();
188
183
  });
189
184
 
190
185
  it('shows discovery actions only for their historical health states', () => {
@@ -233,13 +228,13 @@ describe('GceInstanceDetails', () => {
233
228
  });
234
229
 
235
230
  it('passes only eligible network load balancer names to registration writers', () => {
236
- const confirmation = spyOn(ConfirmationModalService, 'confirm');
237
- const register = spyOn(InstanceWriter, 'registerInstanceWithLoadBalancer').and.returnValue(
238
- Promise.resolve({} as any),
239
- );
240
- const deregister = spyOn(InstanceWriter, 'deregisterInstanceFromLoadBalancer').and.returnValue(
241
- Promise.resolve({} as any),
242
- );
231
+ const confirmation = vi.spyOn(ConfirmationModalService, 'confirm').mockReturnValue(undefined);
232
+ const register = vi
233
+ .spyOn(InstanceWriter, 'registerInstanceWithLoadBalancer')
234
+ .mockReturnValue(Promise.resolve({} as any));
235
+ const deregister = vi
236
+ .spyOn(InstanceWriter, 'deregisterInstanceFromLoadBalancer')
237
+ .mockReturnValue(Promise.resolve({} as any));
243
238
  const app = application([
244
239
  networkLoadBalancer(),
245
240
  networkLoadBalancer({ loadBalancerType: 'HTTP', name: 'http-lb' }),
@@ -250,11 +245,17 @@ describe('GceInstanceDetails', () => {
250
245
  loadBalancers: ['network-lb', 'http-lb', 'other-network-lb'],
251
246
  });
252
247
 
253
- const actions = actionsFor(loadedInstance, app);
254
- actions.find(({ label }) => label === 'Register with Load Balancer')!.triggerAction();
255
- actions.find(({ label }) => label === 'Deregister from Load Balancer')!.triggerAction();
248
+ const rendered = renderActionsFor(loadedInstance, app);
249
+ fireEvent.click(within(rendered.container).getByText('Register with Load Balancer'));
250
+ fireEvent.click(within(rendered.container).getByText('Deregister from Load Balancer'));
256
251
  const reason = { reason: 'operator requested' };
257
- confirmation.calls.all().forEach(({ args }) => args[0].submitMethod(reason));
252
+ confirmation.mock.calls
253
+ .map((args, __i) => ({
254
+ args,
255
+ returnValue: confirmation.mock.results[__i].value,
256
+ invocationOrder: confirmation.mock.invocationCallOrder[__i],
257
+ }))
258
+ .forEach(({ args }) => args[0].submitMethod(reason));
258
259
 
259
260
  const eligibleInstance = { ...loadedInstance, loadBalancers: ['network-lb'] };
260
261
  expect(register).toHaveBeenCalledWith(eligibleInstance, app, reason);
@@ -271,15 +272,15 @@ describe('GceInstanceDetails', () => {
271
272
  });
272
273
 
273
274
  it('uses confirmation, account verification, task monitors, and exact GCE writer contracts', () => {
274
- const confirmation = spyOn(ConfirmationModalService, 'confirm');
275
- spyOn(InstanceWriter, 'terminateInstance').and.returnValue(Promise.resolve({} as any));
276
- spyOn(InstanceWriter, 'terminateInstanceAndShrinkServerGroup').and.returnValue(Promise.resolve({} as any));
277
- spyOn(InstanceWriter, 'rebootInstance').and.returnValue(Promise.resolve({} as any));
278
- spyOn(InstanceWriter, 'registerInstanceWithLoadBalancer').and.returnValue(Promise.resolve({} as any));
279
- spyOn(InstanceWriter, 'deregisterInstanceFromLoadBalancer').and.returnValue(Promise.resolve({} as any));
280
- spyOn(InstanceWriter, 'enableInstanceInDiscovery').and.returnValue(Promise.resolve({} as any));
281
- spyOn(InstanceWriter, 'disableInstanceInDiscovery').and.returnValue(Promise.resolve({} as any));
282
- const $state = { go: jasmine.createSpy('go'), includes: jasmine.createSpy('includes').and.returnValue(true) };
275
+ const confirmation = vi.spyOn(ConfirmationModalService, 'confirm').mockReturnValue(undefined);
276
+ vi.spyOn(InstanceWriter, 'terminateInstance').mockReturnValue(Promise.resolve({} as any));
277
+ vi.spyOn(InstanceWriter, 'terminateInstanceAndShrinkServerGroup').mockReturnValue(Promise.resolve({} as any));
278
+ vi.spyOn(InstanceWriter, 'rebootInstance').mockReturnValue(Promise.resolve({} as any));
279
+ vi.spyOn(InstanceWriter, 'registerInstanceWithLoadBalancer').mockReturnValue(Promise.resolve({} as any));
280
+ vi.spyOn(InstanceWriter, 'deregisterInstanceFromLoadBalancer').mockReturnValue(Promise.resolve({} as any));
281
+ vi.spyOn(InstanceWriter, 'enableInstanceInDiscovery').mockReturnValue(Promise.resolve({} as any));
282
+ vi.spyOn(InstanceWriter, 'disableInstanceInDiscovery').mockReturnValue(Promise.resolve({} as any));
283
+ const $state = { go: vi.fn(), includes: vi.fn().mockReturnValue(true) };
283
284
  const app = application([networkLoadBalancer()]);
284
285
  const loadedInstance = instance({
285
286
  health: [
@@ -289,15 +290,19 @@ describe('GceInstanceDetails', () => {
289
290
  ],
290
291
  });
291
292
 
292
- const actions = actionsFor(loadedInstance, app, $state);
293
- expect(actions.length).toBe(7);
294
- if (!actions.length) {
295
- return;
296
- }
297
- actions.forEach(({ triggerAction }) => triggerAction());
293
+ const rendered = renderActionsFor(loadedInstance, app, $state);
294
+ const actions = Array.from(rendered.container.querySelectorAll('li a'));
295
+ expect(actions).toHaveLength(7);
296
+ actions.forEach((action) => fireEvent.click(action));
298
297
 
299
298
  expect(confirmation).toHaveBeenCalledTimes(7);
300
- const confirmations = confirmation.calls.all().map(({ args }) => args[0]);
299
+ const confirmations = confirmation.mock.calls
300
+ .map((args, __i) => ({
301
+ args,
302
+ returnValue: confirmation.mock.results[__i].value,
303
+ invocationOrder: confirmation.mock.invocationCallOrder[__i],
304
+ }))
305
+ .map(({ args }) => args[0]);
301
306
  confirmations.forEach((params) => {
302
307
  expect(params.account).toBe('test-account');
303
308
  expect(params.askForReason).toBe(true);
@@ -341,8 +346,6 @@ describe('GceInstanceDetails', () => {
341
346
  });
342
347
  });
343
348
 
344
- const settle = () => new Promise((resolve) => setTimeout(resolve));
345
-
346
349
  function deferred<T>() {
347
350
  let resolve!: (value: T | PromiseLike<T>) => void;
348
351
  let reject!: (reason?: any) => void;