Files
MyGoNavi/frontend/src/components/tableDesignerSchemaContext.test.ts

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',
});
});
});