mirror of
https://github.com/supabase/supabase.git
synced 2026-09-06 09:59:03 +08:00
Follow-up to #49131. For `AWS_NIMBUS` orgs, the new-project form's Region trigger could show a region that wasn't in the dropdown at all (e.g. "Southeast Asia (Singapore)" while the list only offered "East US (North Virginia)"). The geolocation-based default region (`useDefaultRegionQuery`) picked the nearest region from **all** AWS regions and seeded it into `dbRegion` unvalidated, ignoring the provider's restricted region list. **Changed:** - `getDefaultRegionOption` now computes the nearest region only over the provider's available regions (new `getDefaultRegionCandidateKeys` helper). The flag-based restricted pool (`defaultRegionRestrictedPool`) narrows within that set and is ignored if the intersection would be empty. - The form's default-region selection is extracted into `resolveDefaultDbRegion` (`ProjectCreation.utils.ts`): High Availability region first, then the recommended smart region, then the geolocated default — used only when the provider actually offers that region — falling back to the provider's static default. - `getAvailableRegions` takes an injectable `environment` param (same pattern as `getHighAvailabilityRegionCode`) so the prod-only Nimbus region list is unit-testable. **Added:** - Unit tests for `getDefaultRegionCandidateKeys` (provider clamping incl. Nimbus on prod, restricted-pool intersection, empty-intersection fallback), `getAvailableRegions` across environments, and `resolveDefaultDbRegion` (branch priority plus the fallback when the geolocated region isn't offered). ## To test - Emulate a Nimbus org locally by setting `"infra:cloud_providers": ["AWS_NIMBUS"]` in `apps/studio/hooks/custom-content/custom-content.json`, then open the new-project form: the Region trigger must show the same region the dropdown offers (locally that's only Southeast Asia (Singapore)). To reproduce the original mismatch path, stub `https://www.cloudflare.com/cdn-cgi/trace` to return `loc=US` — the trigger should still be clamped to the provider's region rather than showing a US region - Block or fail the Cloudflare trace request: the trigger should fall back to the provider's static default region, not sit blank or loading - Restore the normal provider list: the smart-region flow ("General regions" + "Specific regions" with Recommended badges) is unaffected — the geolocation request doesn't even fire on that path — and toggling High Availability still transitions the region list cleanly <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Summary by CodeRabbit - **Bug Fixes** - Region suggestions now respect the selected cloud provider and deployment environment. - Project creation avoids unavailable geolocated regions and falls back to a supported provider default. - Restricted region pools now fall back reliably to available provider regions. - AWS Nimbus selection reflects the active environment while preserving high-availability and smart-region behavior. - **Tests** - Added coverage for provider-specific, environment-specific, restricted, and fallback region selection scenarios. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Alaister Young <10985857+alaister@users.noreply.github.com>
42 lines
1.4 KiB
TypeScript
42 lines
1.4 KiB
TypeScript
import { AWS_REGIONS } from 'shared-data'
|
|
import { describe, expect, it } from 'vitest'
|
|
|
|
import { getDefaultRegionCandidateKeys } from './get-default-region-query'
|
|
|
|
describe('getDefaultRegionCandidateKeys', () => {
|
|
it('returns all AWS regions for the AWS provider', () => {
|
|
expect(getDefaultRegionCandidateKeys('AWS', undefined, 'prod')).toEqual(
|
|
Object.keys(AWS_REGIONS)
|
|
)
|
|
})
|
|
|
|
it.each([
|
|
['prod', ['EAST_US']],
|
|
['staging', ['SOUTHEAST_ASIA']],
|
|
['local', ['SOUTHEAST_ASIA']],
|
|
])('restricts AWS_NIMBUS to its only available region on %s', (environment, expectedKeys) => {
|
|
expect(getDefaultRegionCandidateKeys('AWS_NIMBUS', undefined, environment)).toEqual(
|
|
expectedKeys
|
|
)
|
|
})
|
|
|
|
it('narrows the provider regions to the restricted pool', () => {
|
|
expect(getDefaultRegionCandidateKeys('AWS', ['EAST_US', 'SOUTHEAST_ASIA'], 'prod')).toEqual([
|
|
'EAST_US',
|
|
'SOUTHEAST_ASIA',
|
|
])
|
|
})
|
|
|
|
it('never returns a region the provider does not offer, even if the restricted pool contains it', () => {
|
|
expect(
|
|
getDefaultRegionCandidateKeys('AWS_NIMBUS', ['EAST_US', 'SOUTHEAST_ASIA'], 'prod')
|
|
).toEqual(['EAST_US'])
|
|
})
|
|
|
|
it('ignores a restricted pool that excludes every provider region', () => {
|
|
expect(getDefaultRegionCandidateKeys('AWS_NIMBUS', ['SOUTHEAST_ASIA'], 'prod')).toEqual([
|
|
'EAST_US',
|
|
])
|
|
})
|
|
})
|