fix: 保留插件配置空字符串值
This commit is contained in:
parent
9d0935897b
commit
167a4bba6c
@ -48,7 +48,7 @@ export class QqbotConfigService {
|
|||||||
const record = await this.configRepository.findOne({
|
const record = await this.configRepository.findOne({
|
||||||
where: { configKey },
|
where: { configKey },
|
||||||
});
|
});
|
||||||
return record?.configValue || undefined;
|
return record?.configValue ?? undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -27,16 +27,9 @@ describe('QQBot plugin host bridge', () => {
|
|||||||
SAMPLE_TOKEN: 'token-1',
|
SAMPLE_TOKEN: 'token-1',
|
||||||
SAMPLE_EMPTY: undefined,
|
SAMPLE_EMPTY: undefined,
|
||||||
};
|
};
|
||||||
const configService = {
|
const configService = new QqbotConfigService(
|
||||||
/**
|
createConfigRepository(configValues),
|
||||||
* Reads the fixture config value requested by a plugin host call.
|
);
|
||||||
* @param configKey - Package-owned config key from the host call arguments.
|
|
||||||
* @returns Stored fixture value or `undefined` when the key is absent.
|
|
||||||
*/
|
|
||||||
getConfigValue: jest.fn(
|
|
||||||
async (configKey: string) => configValues[configKey],
|
|
||||||
),
|
|
||||||
} as unknown as QqbotConfigService;
|
|
||||||
const dictService = {
|
const dictService = {
|
||||||
getDictByKey: jest.fn(),
|
getDictByKey: jest.fn(),
|
||||||
getDictItemsByKey: jest.fn(),
|
getDictItemsByKey: jest.fn(),
|
||||||
@ -84,6 +77,23 @@ describe('QQBot plugin host bridge', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('preserves configured empty string values in config snapshots', async () => {
|
||||||
|
configValues.SAMPLE_EMPTY = '';
|
||||||
|
|
||||||
|
await expect(
|
||||||
|
bridge.handleHostCall(createDescriptor(), {
|
||||||
|
args: { keys: ['SAMPLE_EMPTY'] },
|
||||||
|
method: 'getConfigMany',
|
||||||
|
pluginKey: 'sample',
|
||||||
|
}),
|
||||||
|
).resolves.toEqual({
|
||||||
|
ok: true,
|
||||||
|
value: {
|
||||||
|
SAMPLE_EMPTY: '',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('rejects JSON reads that try to escape the package root', async () => {
|
it('rejects JSON reads that try to escape the package root', async () => {
|
||||||
await expect(
|
await expect(
|
||||||
bridge.handleHostCall(createDescriptor(), {
|
bridge.handleHostCall(createDescriptor(), {
|
||||||
@ -195,3 +205,32 @@ describe('QQBot plugin host bridge', () => {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a minimal config repository that lets QqbotConfigService read fixture values through its real raw-value method.
|
||||||
|
* @param values - Config key/value fixture; absent keys behave like missing records.
|
||||||
|
* @returns Repository-shaped fixture used by QqbotConfigService in host bridge tests.
|
||||||
|
*/
|
||||||
|
function createConfigRepository(
|
||||||
|
values: Record<string, string | undefined>,
|
||||||
|
): ConstructorParameters<typeof QqbotConfigService>[0] {
|
||||||
|
/**
|
||||||
|
* Finds one QQBot config fixture using the TypeORM `where.configKey` query shape.
|
||||||
|
* @param query - TypeORM-style lookup object produced by QqbotConfigService.
|
||||||
|
* @returns Fixture record with the stored config value, or `null` when the key is not present.
|
||||||
|
*/
|
||||||
|
const findOne = async (query: { where?: { configKey?: string } }) => {
|
||||||
|
const configKey = query.where?.configKey;
|
||||||
|
if (
|
||||||
|
!configKey ||
|
||||||
|
!Object.prototype.hasOwnProperty.call(values, configKey)
|
||||||
|
) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return { configValue: values[configKey] };
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
findOne: jest.fn(findOne),
|
||||||
|
} as unknown as ConstructorParameters<typeof QqbotConfigService>[0];
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user