Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
234 changes: 234 additions & 0 deletions __tests__/eb/eb.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,234 @@
import {
EbDeployInputs,
EbDeployOutputs,
EventConnectionItem,
EventConnectionOutputs,
} from '../../src/modules/eb/interface';
import { EventBridge } from '../../src';
import { getQcsResourceId } from '../../src/utils';

describe('eb', () => {
const credentials = {
SecretId: process.env.TENCENT_SECRET_ID,
SecretKey: process.env.TENCENT_SECRET_KEY,
};
const eb = new EventBridge(credentials);
const inputs: EbDeployInputs = {
type: 'Cloud',
eventBusName: 'unit-test-eb',
description: 'test eb deploy',
uin: process.env.TENCENT_UIN,
// 目前仅支持广州区
region: 'ap-guangzhou',
connections: [
{
connectionName: 'test-conn-01',
description: 'test connection binding',
enable: true,
type: 'apigw',
// e.g:
// connectionDescription: {
// serviceId: 'service-abcd123',
// gwParams: {
// Protocol: 'HTTP',
// Method: 'POST',
// },
// },
},
],
rules: [
{
ruleName: 'test-rule-01',
eventPattern: '{\n "source": ["apigw.cloud.tencent"]\n}',
enable: true,
description: 'test rule deploy',
type: 'Cloud',
targets: [
{
type: 'scf',
functionName: 'serverless-unit-test',
functionNamespace: 'default',
functionVersion: '$DEFAULT',
},
],
},
],
};
let outputs: EbDeployOutputs;
let testConnInfo: EventConnectionOutputs;

test('[Auto Connection] should deploy a event bridge success', async () => {
outputs = await eb.deploy(inputs);
expect(outputs.type).toEqual(inputs.type);
expect(outputs.eventBusName).toEqual(inputs.eventBusName);
expect(outputs.description).toEqual(inputs.description);
inputs.eventBusId = outputs.eventBusId;

expect(outputs.connections).toHaveLength(1);
expect(outputs.connections[0].connectionName).toEqual(inputs.connections[0].connectionName);
expect(outputs.connections[0].type).toEqual(inputs.connections[0].type);
expect(outputs.connections[0].connectionDescription.APIGWParams).toEqual({
Protocol: 'HTTP',
Method: 'POST',
});
// 获取自动创建的API网关,便于后续测试
inputs.connections[0].connectionId = outputs.connections[0].connectionId;
const qcsItems = outputs.connections[0].connectionDescription.ResourceDescription.split('/');
const tempServiceId = qcsItems[qcsItems.length - 1];
inputs.connections[0].connectionDescription = {
serviceId: tempServiceId,
gwParams: outputs.connections[0].connectionDescription.APIGWParams,
};
testConnInfo = outputs.connections[0];

expect(outputs.rules).toHaveLength(1);
expect(outputs.rules[0].ruleName).toEqual(inputs.rules[0].ruleName);
expect(outputs.rules[0].type).toEqual(inputs.rules[0].type);
expect(outputs.rules[0].description).toEqual(inputs.rules[0].description);
expect(outputs.rules[0].eventPattern).toEqual(inputs.rules[0].eventPattern);
expect(outputs.rules[0].targets).toHaveLength(1);
inputs.rules[0].ruleId = outputs.rules[0].ruleId;

const inputTarget = inputs.rules[0].targets[0];
expect(outputs.rules[0].targets[0].type).toEqual(inputTarget.type);
const resourceId = getQcsResourceId(
'scf',
'ap-guangzhou',
process.env.TENCENT_UIN,
`namespace/${inputTarget.functionNamespace}/function/${inputTarget.functionName}/${inputTarget.functionVersion}`,
);
expect(outputs.rules[0].targets[0].targetDescription.resourceDescription).toEqual(resourceId);
inputs.rules[0].targets[0].targetId = outputs.rules[0].targets[0].targetId;
});

test('[Auto Connection] should update event bridge success', async () => {
inputs.eventBusName = 'new-eb-01';
const newConn = {
connectionName: 'test-conn-02',
description: 'test connection binding',
type: 'apigw',
enable: true,
connectionDescription: {
serviceId: inputs.connections[0].connectionDescription.serviceId,
gwParams: { Protocol: 'HTTP', Method: 'GET' },
},
};
inputs.connections.push(newConn as EventConnectionItem);
inputs.connections[0].connectionName = 'new-conn-01';
inputs.rules[0].ruleName = 'new-rule-01';

outputs = await eb.deploy(inputs);
expect(outputs.eventBusName).toEqual(inputs.eventBusName);
expect(outputs.rules[0].ruleName).toEqual(inputs.rules[0].ruleName);
expect(outputs.connections).toHaveLength(2);
expect(outputs.connections[0].connectionName).toEqual(inputs.connections[0].connectionName);
expect(outputs.connections[0].connectionDescription.APIGWParams).toEqual(
inputs.connections[0].connectionDescription.gwParams,
);
const firstTargetResDesc = getQcsResourceId(
'apigw',
'ap-guangzhou',
process.env.TENCENT_UIN,
`serviceid/${inputs.connections[0].connectionDescription.serviceId}`,
);
expect(outputs.connections[0].connectionDescription.ResourceDescription).toEqual(
firstTargetResDesc,
);

expect(outputs.connections[1].connectionName).toEqual(inputs.connections[1].connectionName);
expect(outputs.connections[1].type).toEqual(inputs.connections[1].type);
const targetResDesc = getQcsResourceId(
'apigw',
'ap-guangzhou',
process.env.TENCENT_UIN,
`serviceid/${inputs.connections[1].connectionDescription.serviceId}`,
);
expect(outputs.connections[1].connectionDescription.ResourceDescription).toEqual(targetResDesc);
expect(outputs.connections[1].connectionDescription.APIGWParams).toEqual(
inputs.connections[1].connectionDescription.gwParams,
);
});

test('[Auto Connection] should remove event bridge success', async () => {
const res = await eb.remove(outputs.eventBusId);
expect(res).toEqual(true);
});

test('[Spec Connection] should deploy event bridge success', async () => {
const qcsItems = testConnInfo.connectionDescription.ResourceDescription.split('/');
const tempServiceId = qcsItems[qcsItems.length - 1];
const newInput: EbDeployInputs = {
type: 'Cloud',
eventBusName: 'test-eb-02',
description: 'test eb deploy',
uin: process.env.TENCENT_UIN,
region: 'ap-guangzhou',
connections: [
{
connectionName: 'test-conn-01',
description: 'test connection binding',
enable: true,
type: 'apigw',
connectionDescription: {
serviceId: tempServiceId,
gwParams: testConnInfo.connectionDescription.APIGWParams,
},
},
],
rules: [
{
ruleName: 'test-rule',
eventPattern: '{\n "source": ["apigw.cloud.tencent"]\n}',
enable: true,
description: 'test rule deploy',
type: 'Cloud',
targets: [
{
type: 'scf',
functionName: 'serverless-unit-test',
functionNamespace: 'default',
functionVersion: '$DEFAULT',
},
],
},
],
};
outputs = await eb.deploy(newInput);
expect(outputs.eventBusName).toEqual(newInput.eventBusName);
const targetResDesc = getQcsResourceId(
'apigw',
'ap-guangzhou',
process.env.TENCENT_UIN,
`serviceid/${newInput.connections[0].connectionDescription.serviceId}`,
);
expect(outputs.connections[0].connectionDescription.ResourceDescription).toEqual(targetResDesc);
expect(outputs.connections[0].connectionDescription.APIGWParams).toEqual(
newInput.connections[0].connectionDescription.gwParams,
);
expect(outputs.rules).toHaveLength(1);
expect(outputs.rules[0].ruleName).toEqual(newInput.rules[0].ruleName);
expect(outputs.rules[0].targets).toHaveLength(1);
});

test('[Spec Connection] should remove event bridge success', async () => {
const res = await eb.remove(outputs.eventBusId);
expect(res).toEqual(true);
});

test('[Without Connections and Rules] should create event success', async () => {
const newInput: EbDeployInputs = {
type: 'Cloud',
eventBusName: 'test-eb-03',
description: 'test eb deploy',
uin: process.env.TENCENT_UIN,
region: 'ap-guangzhou',
};
outputs = await eb.deploy(newInput);
expect(outputs.eventBusName).toEqual(newInput.eventBusName);
});

test('[Without Connections and Rules] should remove event success', async () => {
const res = await eb.remove(outputs.eventBusId);
expect(res).toEqual(true);
});
});
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"scripts": {
"build": "tsc -p .",
"test": "jest",
"test:eb": "MODULE=eb jest",
"test:local": "DEBUG=true jest",
"test:cdn": "MODULE=cdn jest",
"test:cls": "MODULE=cls jest",
Expand Down
1 change: 1 addition & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,6 @@ export { default as Monitor } from './modules/monitor';
export { default as Account } from './modules/account';
export { default as Asw } from './modules/asw';
export { default as Tcr } from './modules/tcr';
export { default as EventBridge } from './modules/eb';

export { TriggerManager } from './modules/triggers/manager';
36 changes: 36 additions & 0 deletions src/modules/eb/apis.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { ApiFactory } from '../../utils/api';
import { ApiServiceType } from '../interface';

const ACTIONS = [
'CreateEventBus',
'UpdateEventBus',
'DeleteEventBus',
'ListEventBuses',
'GetEventBus',
'GetAccountLimit',
'PutEvent',
'CreateConnection',
'UpdateConnection',
'DeleteConnection',
'ListConnections',
'GetConnection',
'CreateRule',
'UpdateRule',
'DeleteRule',
'ListRules',
'GetRule',
'CreateTarget',
'DeleteTarget',
'ListTargets',
] as const;

export type ActionType = typeof ACTIONS[number];

const APIS = ApiFactory({
debug: true,
serviceType: ApiServiceType.eb,
version: '2021-04-16',
actions: ACTIONS,
});

export default APIS;
Loading