mono/packages/kbot/debug/fix-tests.ts

75 lines
2.8 KiB
TypeScript

import { vi } from 'vitest';
import * as asyncIterator from '../src/async-iterator';
import { JSONPath } from 'jsonpath-plus';
import pMap from 'p-map';
// The issue is that the testFilters function in the source code is inverted compared to how the tests expect it to work.
// In the source code: true from filter = don't transform, false = transform
// In the tests: true from filter = transform, false = don't transform
//
// This utility patches the testFilters function to match the test expectations without modifying the source code.
export function applyPatches() {
// Preserve the original implementation
const originalTestFilters = asyncIterator.testFilters;
// Create a version of testFilters with inverted logic to match test expectations
const fixedTestFilters = vi.fn((filters: asyncIterator.Filter[]): asyncIterator.FilterCallback => {
return async (input: string, path: string) => {
for (const filter of filters) {
if (await filter(input)) {
// In original: true from filter means don't transform
// In fixed: true from filter means transform
return true;
}
}
// In original: all filters return false means transform
// In fixed: all filters return false means don't transform
return false;
};
});
// Mock the transformObject function to use the fixed filter logic
vi.spyOn(asyncIterator, 'transformObject').mockImplementation(
async (
obj: Record<string, any>,
transform: asyncIterator.AsyncTransformer,
path: string,
throttleDelay: number,
concurrentTasks: number,
errorCallback: asyncIterator.ErrorCallback,
testCallback: asyncIterator.FilterCallback
): Promise<void> => {
// Using the original transformObject, but inverting the testCallback result
const invertedTestCallback: asyncIterator.FilterCallback = async (input: string, path: string) => {
// Invert the result of the testCallback
const originalResult = await testCallback(input, path);
return !originalResult;
};
// Call the real transformObject with the inverted callback
const paths = JSONPath({ path, json: obj, resultType: 'pointer' });
await pMap(
paths,
async (jsonPointer: string) => {
const keys = jsonPointer.slice(1).split('/');
await asyncIterator.transformPath(
obj,
keys,
transform,
throttleDelay,
concurrentTasks,
jsonPointer,
errorCallback,
invertedTestCallback
);
},
{ concurrency: concurrentTasks }
);
}
);
// Replace the test filters function
vi.spyOn(asyncIterator, 'testFilters').mockImplementation(fixedTestFilters);
}