kt-template-online-api/test/modules/qqbot/message-push/qqbot-message-push-persistence.spec.ts

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