mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-04-04 06:47:19 +02:00
126 lines
4.4 KiB
TypeScript
126 lines
4.4 KiB
TypeScript
|
|
import { Types } from 'mongoose';
|
||
|
|
import { filterAccessibleIdsBySharedLogic } from './format';
|
||
|
|
|
||
|
|
const id = () => new Types.ObjectId();
|
||
|
|
|
||
|
|
describe('filterAccessibleIdsBySharedLogic', () => {
|
||
|
|
const ownedA = id();
|
||
|
|
const ownedB = id();
|
||
|
|
const sharedC = id();
|
||
|
|
const sharedD = id();
|
||
|
|
const publicE = id();
|
||
|
|
const publicF = id();
|
||
|
|
|
||
|
|
// accessible = everything the ACL resolver says this user can see
|
||
|
|
const accessibleIds = [ownedA, ownedB, sharedC, sharedD];
|
||
|
|
const ownedPromptGroupIds = [ownedA, ownedB];
|
||
|
|
const publicPromptGroupIds = [publicE, publicF];
|
||
|
|
|
||
|
|
function toStrings(ids: Types.ObjectId[]) {
|
||
|
|
return ids.map((i) => i.toString()).sort();
|
||
|
|
}
|
||
|
|
|
||
|
|
describe('MY_PROMPTS (searchShared=false)', () => {
|
||
|
|
it('returns only owned IDs when ownedPromptGroupIds provided', async () => {
|
||
|
|
const result = await filterAccessibleIdsBySharedLogic({
|
||
|
|
accessibleIds,
|
||
|
|
searchShared: false,
|
||
|
|
searchSharedOnly: false,
|
||
|
|
publicPromptGroupIds,
|
||
|
|
ownedPromptGroupIds,
|
||
|
|
});
|
||
|
|
expect(toStrings(result)).toEqual(toStrings([ownedA, ownedB]));
|
||
|
|
});
|
||
|
|
|
||
|
|
it('legacy fallback: excludes public IDs when ownedPromptGroupIds omitted', async () => {
|
||
|
|
// accessible includes a public ID for this test
|
||
|
|
const accessible = [ownedA, ownedB, publicE];
|
||
|
|
const result = await filterAccessibleIdsBySharedLogic({
|
||
|
|
accessibleIds: accessible,
|
||
|
|
searchShared: false,
|
||
|
|
searchSharedOnly: false,
|
||
|
|
publicPromptGroupIds,
|
||
|
|
});
|
||
|
|
// Should exclude publicE, keep ownedA and ownedB
|
||
|
|
expect(toStrings(result)).toEqual(toStrings([ownedA, ownedB]));
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('SHARED_PROMPTS (searchSharedOnly=true)', () => {
|
||
|
|
it('returns accessible + public minus owned when ownedPromptGroupIds provided', async () => {
|
||
|
|
const result = await filterAccessibleIdsBySharedLogic({
|
||
|
|
accessibleIds,
|
||
|
|
searchShared: true,
|
||
|
|
searchSharedOnly: true,
|
||
|
|
publicPromptGroupIds,
|
||
|
|
ownedPromptGroupIds,
|
||
|
|
});
|
||
|
|
// Should include sharedC, sharedD, publicE, publicF (not ownedA, ownedB)
|
||
|
|
expect(toStrings(result)).toEqual(toStrings([sharedC, sharedD, publicE, publicF]));
|
||
|
|
});
|
||
|
|
|
||
|
|
it('deduplicates when an ID appears in both accessible and public', async () => {
|
||
|
|
const overlap = id();
|
||
|
|
const result = await filterAccessibleIdsBySharedLogic({
|
||
|
|
accessibleIds: [ownedA, overlap],
|
||
|
|
searchShared: true,
|
||
|
|
searchSharedOnly: true,
|
||
|
|
publicPromptGroupIds: [overlap, publicE],
|
||
|
|
ownedPromptGroupIds: [ownedA],
|
||
|
|
});
|
||
|
|
// overlap should appear once, not twice
|
||
|
|
expect(toStrings(result)).toEqual(toStrings([overlap, publicE]));
|
||
|
|
});
|
||
|
|
|
||
|
|
it('legacy fallback: returns intersection of public and accessible when ownedPromptGroupIds omitted', async () => {
|
||
|
|
// publicE is also accessible
|
||
|
|
const accessible = [ownedA, publicE];
|
||
|
|
const result = await filterAccessibleIdsBySharedLogic({
|
||
|
|
accessibleIds: accessible,
|
||
|
|
searchShared: true,
|
||
|
|
searchSharedOnly: true,
|
||
|
|
publicPromptGroupIds: [publicE, publicF],
|
||
|
|
});
|
||
|
|
// Only publicE is in both accessible and public
|
||
|
|
expect(toStrings(result)).toEqual(toStrings([publicE]));
|
||
|
|
});
|
||
|
|
|
||
|
|
it('legacy fallback: returns empty when no public IDs', async () => {
|
||
|
|
const result = await filterAccessibleIdsBySharedLogic({
|
||
|
|
accessibleIds,
|
||
|
|
searchShared: true,
|
||
|
|
searchSharedOnly: true,
|
||
|
|
publicPromptGroupIds: [],
|
||
|
|
});
|
||
|
|
expect(result).toEqual([]);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('ALL (searchShared=true, searchSharedOnly=false)', () => {
|
||
|
|
it('returns union of accessible + public, deduplicated', async () => {
|
||
|
|
const result = await filterAccessibleIdsBySharedLogic({
|
||
|
|
accessibleIds,
|
||
|
|
searchShared: true,
|
||
|
|
searchSharedOnly: false,
|
||
|
|
publicPromptGroupIds,
|
||
|
|
ownedPromptGroupIds,
|
||
|
|
});
|
||
|
|
expect(toStrings(result)).toEqual(
|
||
|
|
toStrings([ownedA, ownedB, sharedC, sharedD, publicE, publicF]),
|
||
|
|
);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('deduplicates overlapping IDs', async () => {
|
||
|
|
const overlap = id();
|
||
|
|
const result = await filterAccessibleIdsBySharedLogic({
|
||
|
|
accessibleIds: [ownedA, overlap],
|
||
|
|
searchShared: true,
|
||
|
|
searchSharedOnly: false,
|
||
|
|
publicPromptGroupIds: [overlap, publicE],
|
||
|
|
ownedPromptGroupIds,
|
||
|
|
});
|
||
|
|
expect(toStrings(result)).toEqual(toStrings([ownedA, overlap, publicE]));
|
||
|
|
});
|
||
|
|
});
|
||
|
|
});
|