mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-08-11 01:03:51 +08:00
148 lines
4.9 KiB
TypeScript
148 lines
4.9 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
|
|
import {
|
|
qualifyTableDesignerCreateName,
|
|
extractTableDesignerCurrentSchema,
|
|
resolveInitialTableDesignerSchema,
|
|
resolveLoadedTableDesignerSchema,
|
|
resolveTableDesignerEditTarget,
|
|
resolveTableDesignerSchema,
|
|
resolveTableDesignerTableInfo,
|
|
} from './tableDesignerSchemaContext';
|
|
|
|
describe('tableDesignerSchemaContext', () => {
|
|
it.each(['postgres', 'kingbase'])('qualifies bare %s create names with the selected schema', (dbType) => {
|
|
expect(qualifyTableDesignerCreateName('users', 'sales', dbType)).toBe('sales.users');
|
|
});
|
|
|
|
it('keeps an explicitly qualified create name instead of replacing its schema', () => {
|
|
expect(qualifyTableDesignerCreateName('archive.users', 'sales', 'postgres')).toBe('archive.users');
|
|
});
|
|
|
|
it('uses the selected schema for PostgreSQL table edits instead of the database name', () => {
|
|
expect(resolveTableDesignerTableInfo({
|
|
dbType: 'postgres',
|
|
dbName: 'app_database',
|
|
tableName: 'users',
|
|
selectedSchema: 'sales',
|
|
})).toEqual({
|
|
schema: 'sales',
|
|
table: 'users',
|
|
qualifiedName: 'sales.users',
|
|
});
|
|
});
|
|
|
|
it('keeps an explicit edit schema instead of replacing it with the selected schema', () => {
|
|
expect(resolveTableDesignerTableInfo({
|
|
dbType: 'postgres',
|
|
dbName: 'app_database',
|
|
tableName: 'archive.users',
|
|
selectedSchema: 'sales',
|
|
})).toEqual({
|
|
schema: 'archive',
|
|
table: 'users',
|
|
qualifiedName: 'archive.users',
|
|
});
|
|
});
|
|
|
|
it('keeps explicit edit targets until the user actively switches schemas', () => {
|
|
expect(resolveTableDesignerEditTarget({
|
|
dbType: 'postgres',
|
|
dbName: 'app_database',
|
|
tableName: 'archive.users',
|
|
selectedSchema: 'sales',
|
|
schemaSelectionOverride: false,
|
|
}).qualifiedName).toBe('archive.users');
|
|
expect(resolveTableDesignerEditTarget({
|
|
dbType: 'postgres',
|
|
dbName: 'app_database',
|
|
tableName: 'archive.users',
|
|
selectedSchema: 'sales',
|
|
schemaSelectionOverride: true,
|
|
}).qualifiedName).toBe('sales.users');
|
|
});
|
|
|
|
it('extracts current_schema from the metadata query result', () => {
|
|
expect(extractTableDesignerCurrentSchema([{ schema_name: 'tenant' }])).toBe('tenant');
|
|
expect(extractTableDesignerCurrentSchema([{ current_schema: 'sales' }])).toBe('sales');
|
|
expect(extractTableDesignerCurrentSchema([])).toBe('');
|
|
});
|
|
|
|
it('resolves an explicit table schema before the remembered schema', () => {
|
|
expect(resolveTableDesignerSchema('archive.users', 'sales', 'kingbase')).toBe('archive');
|
|
});
|
|
|
|
it('does not guess public when a bare table has no selected schema', () => {
|
|
expect(resolveTableDesignerSchema('users', '', 'postgres')).toBe('');
|
|
expect(qualifyTableDesignerCreateName('users', '', 'postgres')).toBe('users');
|
|
});
|
|
|
|
it('prefers explicit and valid remembered schemas before the current schema', () => {
|
|
expect(resolveInitialTableDesignerSchema({
|
|
explicitSchema: 'archive',
|
|
rememberedSchema: 'sales',
|
|
currentSchema: 'tenant',
|
|
schemaNames: ['archive', 'sales', 'tenant'],
|
|
})).toBe('archive');
|
|
expect(resolveInitialTableDesignerSchema({
|
|
explicitSchema: '',
|
|
rememberedSchema: 'sales',
|
|
currentSchema: 'tenant',
|
|
schemaNames: ['sales', 'tenant'],
|
|
})).toBe('sales');
|
|
});
|
|
|
|
it('falls back to current_schema when the remembered schema no longer exists', () => {
|
|
expect(resolveInitialTableDesignerSchema({
|
|
explicitSchema: '',
|
|
rememberedSchema: 'removed',
|
|
currentSchema: 'tenant',
|
|
schemaNames: ['public', 'tenant'],
|
|
})).toBe('tenant');
|
|
expect(resolveInitialTableDesignerSchema({
|
|
explicitSchema: '',
|
|
rememberedSchema: 'sales',
|
|
currentSchema: '',
|
|
schemaNames: [],
|
|
})).toBe('sales');
|
|
});
|
|
|
|
it('ignores stale loads and preserves a selection made while schemas are loading', () => {
|
|
expect(resolveLoadedTableDesignerSchema({
|
|
requestSeq: 1,
|
|
currentRequestSeq: 2,
|
|
latestSelectedSchema: 'sales',
|
|
explicitSchema: '',
|
|
rememberedSchema: '',
|
|
currentSchema: 'tenant',
|
|
schemaNames: ['public', 'sales', 'tenant'],
|
|
})).toBeNull();
|
|
expect(resolveLoadedTableDesignerSchema({
|
|
requestSeq: 2,
|
|
currentRequestSeq: 2,
|
|
latestSelectedSchema: 'sales',
|
|
explicitSchema: '',
|
|
rememberedSchema: '',
|
|
currentSchema: 'tenant',
|
|
schemaNames: ['public', 'tenant'],
|
|
})).toEqual({
|
|
selectedSchema: 'sales',
|
|
schemaNames: ['sales', 'public', 'tenant'],
|
|
});
|
|
});
|
|
|
|
it('keeps non PostgreSQL-like table names unchanged', () => {
|
|
expect(qualifyTableDesignerCreateName('users', 'sales', 'mysql')).toBe('users');
|
|
expect(resolveTableDesignerTableInfo({
|
|
dbType: 'mysql',
|
|
dbName: 'app_database',
|
|
tableName: 'users',
|
|
selectedSchema: 'sales',
|
|
})).toEqual({
|
|
schema: 'app_database',
|
|
table: 'users',
|
|
qualifiedName: 'app_database.users',
|
|
});
|
|
});
|
|
});
|