@@ -21,7 +21,11 @@ const MOCK_INCOMPLETE_POLLS = 2;
2121
2222export type DeployApiMockOptions = {
2323 failValidateCloning ?: boolean ;
24+ /** Simulates HTTP 402 unsupported_subscription_plan_features with this feature list. */
25+ failValidateCloningUnsupportedFeatures ?: string [ ] ;
2426 failCreateProductionInstance ?: boolean ;
27+ /** Simulates HTTP 400 production_instance_exists. */
28+ failCreateProductionInstanceExists ?: boolean ;
2529 failDnsVerification ?: boolean ;
2630 failOAuthSave ?: boolean ;
2731} ;
@@ -31,7 +35,9 @@ export type DeployTestFlags = {
3135 testFailProductionInstanceCheck ?: boolean ;
3236 testFailDomainLookup ?: boolean ;
3337 testFailValidateCloning ?: boolean ;
38+ testFailValidateCloningUnsupportedFeatures ?: string [ ] ;
3439 testFailCreateProductionInstance ?: boolean ;
40+ testFailCreateProductionInstanceExists ?: boolean ;
3541 testFailDnsVerification ?: boolean ;
3642 testFailOAuthSave ?: boolean ;
3743} ;
@@ -47,7 +53,9 @@ export function resolveTestDeployFlags(options: {
4753 testFailProductionInstanceCheck ?: boolean ;
4854 testFailDomainLookup ?: boolean ;
4955 testFailValidateCloning ?: boolean ;
56+ testFailValidateCloningUnsupportedFeatures ?: string [ ] ;
5057 testFailCreateProductionInstance ?: boolean ;
58+ testFailCreateProductionInstanceExists ?: boolean ;
5159 testFailDnsVerification ?: boolean ;
5260 testFailOAuthSave ?: boolean ;
5361} ) : DeployTestFlags {
@@ -56,7 +64,9 @@ export function resolveTestDeployFlags(options: {
5664 testFailProductionInstanceCheck : options . testFailProductionInstanceCheck === true ,
5765 testFailDomainLookup : options . testFailDomainLookup === true ,
5866 testFailValidateCloning : options . testFailValidateCloning === true ,
67+ testFailValidateCloningUnsupportedFeatures : options . testFailValidateCloningUnsupportedFeatures ,
5968 testFailCreateProductionInstance : options . testFailCreateProductionInstance === true ,
69+ testFailCreateProductionInstanceExists : options . testFailCreateProductionInstanceExists === true ,
6070 testFailDnsVerification : options . testFailDnsVerification === true ,
6171 testFailOAuthSave : options . testFailOAuthSave === true ,
6272 } ;
@@ -105,12 +115,31 @@ export function _resetDeployStatusMock(): void {
105115 configureMockDeployApi ( ) ;
106116}
107117
118+ function simulatedSpecificFailure (
119+ status : number ,
120+ code : string ,
121+ message : string ,
122+ meta ?: Record < string , unknown > ,
123+ ) : PlapiError {
124+ const body = JSON . stringify ( {
125+ errors : [ { code, message, ...( meta ? { meta } : { } ) } ] ,
126+ } ) ;
127+ return PlapiError . fromBody ( status , body , "clerk deploy mock" ) ;
128+ }
129+
108130export const mockDeployApi : DeployApi = {
109131 async createProductionInstance ( _applicationId , params ) {
110132 await simulateServerLatency ( ) ;
111133 if ( mockOptions . failCreateProductionInstance ) {
112134 throw simulatedDeployApiFailure ( "production instance creation" ) ;
113135 }
136+ if ( mockOptions . failCreateProductionInstanceExists ) {
137+ throw simulatedSpecificFailure (
138+ 400 ,
139+ "production_instance_exists" ,
140+ "You can only have one production instance." ,
141+ ) ;
142+ }
114143 return {
115144 instance_id : MOCK_PRODUCTION_INSTANCE_ID ,
116145 environment_type : "production" ,
@@ -129,6 +158,14 @@ export const mockDeployApi: DeployApi = {
129158 if ( mockOptions . failValidateCloning ) {
130159 throw simulatedDeployApiFailure ( "cloning validation" ) ;
131160 }
161+ if ( mockOptions . failValidateCloningUnsupportedFeatures ) {
162+ throw simulatedSpecificFailure (
163+ 402 ,
164+ "unsupported_subscription_plan_features" ,
165+ "Unsupported plan features" ,
166+ { unsupported_features : mockOptions . failValidateCloningUnsupportedFeatures } ,
167+ ) ;
168+ }
132169 } ,
133170
134171 async getDeployStatus ( applicationId , envOrInsId ) {
0 commit comments