84 lines
3.7 KiB
TypeScript
84 lines
3.7 KiB
TypeScript
import { getMetadataArgsStorage } from 'typeorm';
|
|
import {
|
|
QQBOT_CORE_ENTITIES,
|
|
} from '../../../../src/modules/qqbot/core/qqbot-core.module';
|
|
import { QqbotMessageDelivery } from '../../../../src/modules/qqbot/core/infrastructure/persistence/message-push/qqbot-message-delivery.entity';
|
|
import { QqbotMessageEvent } from '../../../../src/modules/qqbot/core/infrastructure/persistence/message-push/qqbot-message-event.entity';
|
|
import { QqbotMessagePublishBinding } from '../../../../src/modules/qqbot/core/infrastructure/persistence/message-push/qqbot-message-publish-binding.entity';
|
|
import { QqbotMessagePublishTarget } from '../../../../src/modules/qqbot/core/infrastructure/persistence/message-push/qqbot-message-publish-target.entity';
|
|
import { QqbotMessageSubscription } from '../../../../src/modules/qqbot/core/infrastructure/persistence/message-push/qqbot-message-subscription.entity';
|
|
import { QqbotMessageTemplate } from '../../../../src/modules/qqbot/core/infrastructure/persistence/message-push/qqbot-message-template.entity';
|
|
|
|
const messagePushEntities = [
|
|
QqbotMessageSubscription,
|
|
QqbotMessageTemplate,
|
|
QqbotMessagePublishBinding,
|
|
QqbotMessagePublishTarget,
|
|
QqbotMessageEvent,
|
|
QqbotMessageDelivery,
|
|
];
|
|
|
|
const expectedColumns = {
|
|
qqbot_message_delivery: [
|
|
'id', 'message_event_id', 'publish_target_id', 'binding_id',
|
|
'subscription_id', 'self_id', 'target_type', 'target_id', 'template_id',
|
|
'template_content', 'variable_snapshot', 'rendered_message', 'status',
|
|
'attempt_count', 'next_attempt_at', 'processing_lease_until',
|
|
'send_log_id', 'last_error_code', 'last_error_message', 'expires_at',
|
|
'create_time', 'update_time',
|
|
],
|
|
qqbot_message_event: [
|
|
'id', 'event_id', 'source_key', 'resource_key', 'occurred_at', 'payload',
|
|
'fanout_status', 'fanout_attempt_count', 'next_fanout_at',
|
|
'fanout_lease_until', 'last_error_code', 'last_error_message',
|
|
'create_time', 'update_time',
|
|
],
|
|
qqbot_message_publish_binding: [
|
|
'id', 'subscription_id', 'account_id', 'self_id', 'template_id',
|
|
'active_key', 'enabled', 'is_deleted', 'create_time', 'update_time',
|
|
],
|
|
qqbot_message_publish_target: [
|
|
'id', 'binding_id', 'target_type', 'target_id', 'target_name',
|
|
'active_key', 'enabled', 'is_deleted', 'create_time', 'update_time',
|
|
],
|
|
qqbot_message_subscription: [
|
|
'id', 'name', 'source_key', 'source_config', 'source_config_digest',
|
|
'active_key', 'enabled', 'remark', 'is_deleted', 'create_time',
|
|
'update_time',
|
|
],
|
|
qqbot_message_template: [
|
|
'id', 'name', 'source_key', 'content', 'enabled', 'remark',
|
|
'is_deleted', 'create_time', 'update_time',
|
|
],
|
|
} as const;
|
|
|
|
/** Reads the table name declared by a TypeORM entity. */
|
|
const tableNameOf = (entity: object) =>
|
|
getMetadataArgsStorage().tables.find((table) => table.target === entity)
|
|
?.name;
|
|
|
|
/** Reads the database column names declared by a TypeORM entity. */
|
|
const columnNamesOf = (entity: object) =>
|
|
getMetadataArgsStorage()
|
|
.columns.filter((column) => column.target === entity)
|
|
.map((column) => `${column.options.name || column.propertyName}`);
|
|
|
|
describe('QQBot message-push persistence contract', () => {
|
|
it('registers the six message-push entities in QQBot Core', () => {
|
|
expect(QQBOT_CORE_ENTITIES).toEqual(
|
|
expect.arrayContaining(messagePushEntities),
|
|
);
|
|
});
|
|
|
|
it('maps every required message-push column with string Snowflake IDs', () => {
|
|
for (const entity of messagePushEntities) {
|
|
const tableName = tableNameOf(entity);
|
|
|
|
expect(tableName).toBeTruthy();
|
|
expect(columnNamesOf(entity)).toEqual(
|
|
expect.arrayContaining([...expectedColumns[tableName as keyof typeof expectedColumns]]),
|
|
);
|
|
}
|
|
});
|
|
});
|