@@ -100,6 +100,27 @@ describe('ProvisionConfig', () => {
100100 } ) ;
101101 expect ( provisionConfig . ProvisionMode ) . toBe ( 'async' ) ;
102102 } ) ;
103+
104+ it ( 'should initialize correctly with drain mode config' , ( ) => {
105+ const inputsWithMode = {
106+ ...mockInputs ,
107+ props : {
108+ ...mockInputs . props ,
109+ provisionConfig : {
110+ defaultTarget : 10 ,
111+ alwaysAllocateCPU : false ,
112+ alwaysAllocateGPU : false ,
113+ scheduledActions : [ ] ,
114+ targetTrackingPolicies : [ ] ,
115+ mode : 'drain' ,
116+ } ,
117+ } ,
118+ } ;
119+
120+ provisionConfig = new ProvisionConfig ( inputsWithMode , mockOpts ) ;
121+
122+ expect ( provisionConfig . ProvisionMode ) . toBe ( 'drain' ) ;
123+ } ) ;
103124 } ) ;
104125
105126 describe ( 'before' , ( ) => {
@@ -350,12 +371,15 @@ describe('ProvisionConfig', () => {
350371 } ) ;
351372
352373 describe ( 'waitForProvisionReady' , ( ) => {
353- it ( 'should return immediately when target is 0' , async ( ) => {
374+ it ( 'should still call getFunctionProvisionConfig when target is 0 but loop exits early ' , async ( ) => {
354375 provisionConfig = new ProvisionConfig ( mockInputs , mockOpts ) ;
355376
356377 // Mock fcSdk
357378 const mockFcSdk = {
358- getFunctionProvisionConfig : jest . fn ( ) ,
379+ getFunctionProvisionConfig : jest . fn ( ) . mockImplementation ( ( ) => {
380+ // 返回模拟数据,但我们会验证它被调用了
381+ return Promise . resolve ( { current : 0 , target : 0 } ) ;
382+ } ) ,
359383 disableFunctionInvocation : jest . fn ( ) . mockResolvedValue ( undefined ) ,
360384 enableFunctionInvocation : jest . fn ( ) . mockResolvedValue ( undefined ) ,
361385 } ;
@@ -366,7 +390,8 @@ describe('ProvisionConfig', () => {
366390
367391 await ( provisionConfig as any ) . waitForProvisionReady ( 'LATEST' , { target : 0 } ) ;
368392
369- expect ( provisionConfig . fcSdk . getFunctionProvisionConfig ) . not . toHaveBeenCalled ( ) ;
393+ // 验证getFunctionProvisionConfig至少被调用了一次
394+ expect ( provisionConfig . fcSdk . getFunctionProvisionConfig ) . toHaveBeenCalled ( ) ;
370395 } ) ;
371396
372397 it ( 'should wait until current equals target' , async ( ) => {
@@ -474,6 +499,7 @@ describe('ProvisionConfig', () => {
474499
475500 // Mock fcSdk
476501 const mockFcSdk = {
502+ getFunctionProvisionConfig : jest . fn ( ) ,
477503 disableFunctionInvocation : jest . fn ( ) . mockResolvedValue ( undefined ) ,
478504 enableFunctionInvocation : jest . fn ( ) . mockResolvedValue ( undefined ) ,
479505 } ;
@@ -499,6 +525,7 @@ describe('ProvisionConfig', () => {
499525
500526 // Mock fcSdk
501527 const mockFcSdk = {
528+ getFunctionProvisionConfig : jest . fn ( ) ,
502529 disableFunctionInvocation : jest . fn ( ) . mockResolvedValue ( undefined ) ,
503530 enableFunctionInvocation : jest . fn ( ) . mockResolvedValue ( undefined ) ,
504531 } ;
@@ -518,6 +545,32 @@ describe('ProvisionConfig', () => {
518545 expect ( provisionConfig . fcSdk . enableFunctionInvocation ) . toHaveBeenCalledWith ( 'test-function' ) ;
519546 } ) ;
520547
548+ it ( 'should handle drain mode with target 0' , async ( ) => {
549+ provisionConfig = new ProvisionConfig ( mockInputs , mockOpts ) ;
550+ provisionConfig . ProvisionMode = 'drain' ;
551+
552+ // Mock fcSdk
553+ const mockFcSdk = {
554+ getFunctionProvisionConfig : jest . fn ( ) ,
555+ disableFunctionInvocation : jest . fn ( ) . mockResolvedValue ( undefined ) ,
556+ enableFunctionInvocation : jest . fn ( ) . mockResolvedValue ( undefined ) ,
557+ } ;
558+ Object . defineProperty ( provisionConfig , 'fcSdk' , {
559+ value : mockFcSdk ,
560+ writable : true ,
561+ } ) ;
562+
563+ await ( provisionConfig as any ) . waitForProvisionReady ( 'LATEST' , { target : 0 } ) ;
564+
565+ expect ( provisionConfig . fcSdk . disableFunctionInvocation ) . toHaveBeenCalledWith (
566+ 'test-function' ,
567+ true ,
568+ 'Fast scale-to-zero' ,
569+ ) ;
570+ expect ( sleepMock ) . toHaveBeenCalledWith ( 5 ) ;
571+ expect ( provisionConfig . fcSdk . enableFunctionInvocation ) . toHaveBeenCalledWith ( 'test-function' ) ;
572+ } ) ;
573+
521574 it ( 'should handle error retries in waitForProvisionReady' , async ( ) => {
522575 provisionConfig = new ProvisionConfig ( mockInputs , mockOpts ) ;
523576
@@ -753,6 +806,22 @@ describe('ProvisionConfig', () => {
753806 } ) ;
754807 } ) ;
755808
809+ it ( 'should keep target when defaultTarget does not exist' , ( ) => {
810+ provisionConfig = new ProvisionConfig ( mockInputs , mockOpts ) ;
811+
812+ const config = {
813+ target : 5 ,
814+ current : 5 ,
815+ functionArn : 'arn:xxx' ,
816+ } ;
817+
818+ const result = ( provisionConfig as any ) . sanitizeProvisionConfig ( config ) ;
819+
820+ expect ( result ) . toEqual ( {
821+ target : 5 ,
822+ } ) ;
823+ } ) ;
824+
756825 it ( 'should remove empty targetTrackingPolicies' , ( ) => {
757826 provisionConfig = new ProvisionConfig ( mockInputs , mockOpts ) ;
758827
0 commit comments