@@ -32,8 +32,27 @@ const mockValidateCloning = mock();
3232const mockGetDeployStatus = mock ( ) ;
3333const mockRetrySSL = mock ( ) ;
3434const mockRetryMail = mock ( ) ;
35+ const mockConfigureMockDeployApi = mock ( ) ;
3536const mockDomainConnectUrl = mock ( ) ;
3637
38+ type DeployApiMockOptions = {
39+ failValidateCloning ?: boolean ;
40+ failCreateProductionInstance ?: boolean ;
41+ failDnsVerification ?: boolean ;
42+ failOAuthSave ?: boolean ;
43+ } ;
44+
45+ let mockDeployApiOptions : DeployApiMockOptions = { } ;
46+
47+ function configureMockDeployApi ( options : DeployApiMockOptions = { } ) {
48+ mockConfigureMockDeployApi ( options ) ;
49+ mockDeployApiOptions = { ...options } ;
50+ }
51+
52+ function simulatedDeployApiFailure ( step : string ) : Error {
53+ return new Error ( `Simulated deploy failure: ${ step } .` ) ;
54+ }
55+
3756mock . module ( "@inquirer/prompts" , ( ) => ( {
3857 ...promptsStubs ,
3958 select : ( ...args : unknown [ ] ) => mockSelect ( ...args ) ,
@@ -55,15 +74,46 @@ mock.module("../../lib/plapi.ts", () => ({
5574 fetchInstanceConfig : ( ...args : unknown [ ] ) => mockFetchInstanceConfig ( ...args ) ,
5675 fetchApplication : ( ...args : unknown [ ] ) => mockFetchApplication ( ...args ) ,
5776 listApplicationDomains : ( ...args : unknown [ ] ) => mockListApplicationDomains ( ...args ) ,
58- } ) ) ;
59-
60- mock . module ( "./api.ts" , ( ) => ( {
6177 createProductionInstance : ( ...args : unknown [ ] ) => mockCreateProductionInstance ( ...args ) ,
6278 validateCloning : ( ...args : unknown [ ] ) => mockValidateCloning ( ...args ) ,
6379 getDeployStatus : ( ...args : unknown [ ] ) => mockGetDeployStatus ( ...args ) ,
80+ patchInstanceConfig : ( ...args : unknown [ ] ) => mockPatchInstanceConfig ( ...args ) ,
6481 retryApplicationDomainSSL : ( ...args : unknown [ ] ) => mockRetrySSL ( ...args ) ,
6582 retryApplicationDomainMail : ( ...args : unknown [ ] ) => mockRetryMail ( ...args ) ,
66- patchInstanceConfig : ( ...args : unknown [ ] ) => mockPatchInstanceConfig ( ...args ) ,
83+ } ) ) ;
84+
85+ mock . module ( "./api.ts" , ( ) => ( {
86+ configureMockDeployApi,
87+ createProductionInstance : ( ...args : unknown [ ] ) => {
88+ const result = mockCreateProductionInstance ( ...args ) ;
89+ if ( mockDeployApiOptions . failCreateProductionInstance ) {
90+ throw simulatedDeployApiFailure ( "production instance creation" ) ;
91+ }
92+ return result ;
93+ } ,
94+ validateCloning : ( ...args : unknown [ ] ) => {
95+ const result = mockValidateCloning ( ...args ) ;
96+ if ( mockDeployApiOptions . failValidateCloning ) {
97+ throw simulatedDeployApiFailure ( "cloning validation" ) ;
98+ }
99+ return result ;
100+ } ,
101+ getDeployStatus : ( ...args : unknown [ ] ) => {
102+ const result = mockGetDeployStatus ( ...args ) ;
103+ if ( mockDeployApiOptions . failDnsVerification ) {
104+ throw simulatedDeployApiFailure ( "DNS verification" ) ;
105+ }
106+ return result ;
107+ } ,
108+ retryApplicationDomainSSL : ( ...args : unknown [ ] ) => mockRetrySSL ( ...args ) ,
109+ retryApplicationDomainMail : ( ...args : unknown [ ] ) => mockRetryMail ( ...args ) ,
110+ patchInstanceConfig : ( ...args : unknown [ ] ) => {
111+ const result = mockPatchInstanceConfig ( ...args ) ;
112+ if ( mockDeployApiOptions . failOAuthSave ) {
113+ throw simulatedDeployApiFailure ( "OAuth credential save" ) ;
114+ }
115+ return result ;
116+ } ,
67117} ) ) ;
68118
69119mock . module ( "./domain-connect.ts" , ( ) => ( {
@@ -188,6 +238,8 @@ describe("deploy", () => {
188238 mockGetDeployStatus . mockReset ( ) ;
189239 mockRetrySSL . mockReset ( ) ;
190240 mockRetryMail . mockReset ( ) ;
241+ mockConfigureMockDeployApi . mockReset ( ) ;
242+ mockDeployApiOptions = { } ;
191243 mockDomainConnectUrl . mockReset ( ) ;
192244 consoleSpy ?. mockRestore ( ) ;
193245 stderrSpy ?. mockRestore ( ) ;
@@ -900,6 +952,9 @@ describe("deploy", () => {
900952 expect ( mockValidateCloning ) . toHaveBeenCalledWith ( "app_xyz789" , {
901953 clone_instance_id : "ins_dev_123" ,
902954 } ) ;
955+ expect ( mockConfigureMockDeployApi ) . toHaveBeenCalledWith (
956+ expect . objectContaining ( { failValidateCloning : true } ) ,
957+ ) ;
903958 expect ( mockCreateProductionInstance ) . not . toHaveBeenCalled ( ) ;
904959 } ) ;
905960
@@ -918,6 +973,9 @@ describe("deploy", () => {
918973 home_url : "example.com" ,
919974 clone_instance_id : "ins_dev_123" ,
920975 } ) ;
976+ expect ( mockConfigureMockDeployApi ) . toHaveBeenCalledWith (
977+ expect . objectContaining ( { failCreateProductionInstance : true } ) ,
978+ ) ;
921979 } ) ;
922980
923981 test ( "--test-fail-dns-verification simulates DNS verification failure" , async ( ) => {
@@ -941,6 +999,9 @@ describe("deploy", () => {
941999 ) ;
9421000
9431001 expect ( mockGetDeployStatus ) . toHaveBeenCalledWith ( "app_xyz789" , "ins_prod_mock" ) ;
1002+ expect ( mockConfigureMockDeployApi ) . toHaveBeenCalledWith (
1003+ expect . objectContaining ( { failDnsVerification : true } ) ,
1004+ ) ;
9441005 expect ( mockPatchInstanceConfig ) . not . toHaveBeenCalled ( ) ;
9451006 } ) ;
9461007
@@ -970,6 +1031,9 @@ describe("deploy", () => {
9701031 client_secret : "google-secret" ,
9711032 } ,
9721033 } ) ;
1034+ expect ( mockConfigureMockDeployApi ) . toHaveBeenCalledWith (
1035+ expect . objectContaining ( { failOAuthSave : true } ) ,
1036+ ) ;
9731037 } ) ;
9741038
9751039 test ( "plain deploy resumes DNS verification from live API state" , async ( ) => {
0 commit comments