UNPKG

serverless-multi-regions

Version:

Deploy an API Gateway service in multiple regions with a global CloudFront distribution and health checks

263 lines (220 loc) 9.22 kB
const Plugin = require('../index') function createServerlessStub() { return { service: { custom: { dns: { domainName: 'somedomain.example.com' } } } } } describe('Plugin', () => { it('can be created with basic settings', () => { const serverless = createServerlessStub() const options = { stage: 'staging' } const plugin = new Plugin(serverless, options) expect(plugin.serverless).toBe(serverless) expect(plugin.options).toBe(options) }) it('will return assigned regional domain name from build', () => { const serverless = createServerlessStub() serverless.service.custom.dns.regionalDomainName = 'regional.domainname.com' const options = { stage: 'staging' } const plugin = new Plugin(serverless, options) var regionalDomainName = plugin.buildRegionalDomainName(['test', 'thing', 'com']) expect(regionalDomainName).toBe('regional.domainname.com') }) it('will build regional domain name', () => { const serverless = createServerlessStub() const options = { stage: 'staging' } const plugin = new Plugin(serverless, options) var regionalDomainName = plugin.buildRegionalDomainName(['test', 'thing', 'com']) expect(regionalDomainName).toBe('test-staging.thing.com') }) it('will setup api regional domain settings from explicit settings', async () => { const serverless = { service: { custom: { dns: { regionalDomainName: 'regional.domainname.com', 'us-east-1': { acmCertificateArn: 'test-certificate' } } } } } const options = { stage: 'staging', region: 'us-east-1' } const plugin = new Plugin(serverless, options) plugin.regionalDomainName = 'regional.domainname.com' const resources = { Resources: { ApiRegionalDomainName: { Properties: {} } } } await plugin.prepareApiRegionalDomainSettings(resources) expect(resources.Resources.ApiRegionalDomainName.Properties.DomainName).toBe( 'regional.domainname.com' ) expect(resources.Resources.ApiRegionalDomainName.Properties.RegionalCertificateArn).toBe( 'test-certificate' ) }) it('will retrieve certificate if not set', async () => { const serverless = createServerlessStub() const options = { stage: 'staging', region: 'us-east-1' } const plugin = new Plugin(serverless, options) plugin.getCertArnFromHostName = () => { return Promise.resolve('test-cert-arn') } const resources = { Resources: { ApiRegionalDomainName: { Properties: {} } } } await plugin.prepareApiRegionalDomainSettings(resources) expect(resources.Resources.ApiRegionalDomainName.Properties.RegionalCertificateArn).toBe( 'test-cert-arn' ) }) it('will set API regional base path defaults', async () => { const serverless = createServerlessStub() const options = { stage: 'staging', region: 'us-east-1' } const plugin = new Plugin(serverless, options) const resources = { Resources: { ApiGatewayStubDeployment: { Properties: {} }, ApiRegionalBasePathMapping: { Properties: {} } } } await plugin.prepareApiRegionalBasePathMapping(resources) expect(resources.Resources.ApiGatewayStubDeployment.DependsOn).toBe( 'ApiGatewayMethodProxyVarAny' ) expect(resources.Resources.ApiGatewayStubDeployment.Properties.StageName).toBe('staging') expect(resources.Resources.ApiRegionalBasePathMapping.Properties.Stage).toBe('staging') }) it('will set API Gateway Stub DependsOn', async () => { const serverless = createServerlessStub() serverless.service.custom.gatewayMethodDependency = 'SomeMethodToDependOn' const options = { stage: 'staging', region: 'us-east-1' } const plugin = new Plugin(serverless, options) const resources = { Resources: { ApiGatewayStubDeployment: { Properties: {} }, ApiRegionalBasePathMapping: { Properties: {} } } } await plugin.prepareApiRegionalBasePathMapping(resources) expect(resources.Resources.ApiGatewayStubDeployment.DependsOn).toBe('SomeMethodToDependOn') }) it('will set API regional endpoint', async () => { const serverless = createServerlessStub() const options = { stage: 'staging', region: 'us-east-1' } const plugin = new Plugin(serverless, options) plugin.hostName = 'example.com' const resources = { Resources: { ApiRegionalEndpointRecord: { Properties: {} } }, Outputs: { RegionalEndpoint: { Value: { ['Fn::Join']: ['', '', ''] } } } } await plugin.prepareApiRegionalEndpointRecord(resources) expect(resources.Resources.ApiRegionalEndpointRecord.Properties.HostedZoneName).toBe( 'example.com.' ) expect(resources.Resources.ApiRegionalEndpointRecord.Properties.HostedZoneId).toBeUndefined() expect(resources.Resources.ApiRegionalEndpointRecord.Properties.Region).toBe('us-east-1') expect(resources.Resources.ApiRegionalEndpointRecord.Properties.SetIdentifier).toBe('us-east-1') }) it('will set API regional endpoint hosted zone ID if present', async () => { const serverless = createServerlessStub() serverless.service.custom.dns.hostedZoneId = 'test-hosted-zone-id' const options = { stage: 'staging', region: 'us-east-1' } const plugin = new Plugin(serverless, options) plugin.hostName = 'example.com' const resources = { Resources: { ApiRegionalEndpointRecord: { Properties: {} } }, Outputs: { RegionalEndpoint: { Value: { ['Fn::Join']: ['', '', ''] } } } } await plugin.prepareApiRegionalEndpointRecord(resources) expect(resources.Resources.ApiRegionalEndpointRecord.Properties.HostedZoneName).toBeUndefined() expect(resources.Resources.ApiRegionalEndpointRecord.Properties.HostedZoneId).toBe( 'test-hosted-zone-id' ) expect(resources.Resources.ApiRegionalEndpointRecord.Properties.Region).toBe('us-east-1') expect(resources.Resources.ApiRegionalEndpointRecord.Properties.SetIdentifier).toBe('us-east-1') }) it('will set API regional health check to default', async () => { const serverless = createServerlessStub() const options = { stage: 'staging', region: 'us-east-1' } const plugin = new Plugin(serverless, options) const resources = { Resources: { ApiRegionalEndpointRecord: { Properties: {} }, ApiRegionalHealthCheck: { Properties: { HealthCheckConfig: {} } } } } await plugin.prepareApiRegionalHealthCheck(resources) expect(resources.Resources.ApiRegionalEndpointRecord.Properties.HealthCheckId).toBeUndefined() expect( resources.Resources.ApiRegionalHealthCheck.Properties.HealthCheckConfig.ResourcePath ).toBe('/staging/healthcheck') }) it('will set API regional health check to specified path', async () => { const serverless = createServerlessStub() serverless.service.custom.dns.healthCheckResourcePath = '/test/resource/path' const options = { stage: 'staging', region: 'us-east-1' } const plugin = new Plugin(serverless, options) const resources = { Resources: { ApiRegionalEndpointRecord: { Properties: {} }, ApiRegionalHealthCheck: { Properties: { HealthCheckConfig: {} } } } } await plugin.prepareApiRegionalHealthCheck(resources) expect(resources.Resources.ApiRegionalEndpointRecord.Properties.HealthCheckId).toBeUndefined() expect( resources.Resources.ApiRegionalHealthCheck.Properties.HealthCheckConfig.ResourcePath ).toBe('/test/resource/path') }) it('will set API regional health check ID to specified value', async () => { const serverless = createServerlessStub() serverless.service.custom.dns['us-east-1'] = { healthCheckId: 'test-health-check-id' } const options = { stage: 'staging', region: 'us-east-1' } const plugin = new Plugin(serverless, options) const resources = { Resources: { ApiRegionalEndpointRecord: { Properties: {} }, ApiRegionalHealthCheck: { Properties: { HealthCheckConfig: {} } } } } await plugin.prepareApiRegionalHealthCheck(resources) expect(resources.Resources.ApiRegionalEndpointRecord.Properties.HealthCheckId).toBe( 'test-health-check-id' ) expect(resources.Resources.ApiRegionalHealthCheck).toBeUndefined() }) it('will api regional failover settings from explicit settings', async () => { const serverless = { service: { custom: { dns: { 'us-east-1': { failover: 'PRIMARY' } } } } } const options = { stage: 'staging', region: 'us-east-1' } const plugin = new Plugin(serverless, options) plugin.regionalDomainName = 'regional.domainname.com' const resources = { Resources: { ApiRegionalEndpointRecord: { Properties: {} } }, Outputs: { RegionalEndpoint: { Value: { ['Fn::Join']: ['', '', ''] } } } } await plugin.prepareApiRegionalEndpointRecord(resources) expect(resources.Resources.ApiRegionalEndpointRecord.Properties.Failover).toBe('PRIMARY') }) })