mirror of
https://github.com/movie-web/providers.git
synced 2025-09-13 11:33:25 +00:00
93 lines
3.3 KiB
TypeScript
93 lines
3.3 KiB
TypeScript
import { ScrapeMedia } from '@/entrypoint/utils/media';
|
|
import { Embed, Sourcerer, SourcererEmbed } from '@/providers/base';
|
|
import { buildProviders } from '@/entrypoint/builder';
|
|
import { describe, expect, it } from 'vitest';
|
|
import { makeStandardFetcher } from '@/fetchers/standardFetch';
|
|
import { ProviderControls } from '@/entrypoint/controls';
|
|
import { NotFoundError } from '@/utils/errors';
|
|
import { targets } from '@/entrypoint/utils/targets';
|
|
import { getBuiltinEmbeds } from '@/entrypoint/providers';
|
|
import { makeSimpleProxyFetcher } from '@/fetchers/simpleProxy';
|
|
|
|
export type TestTypes = 'standard' | 'ip:standard' | 'proxied';
|
|
|
|
export interface TestSourceOptions {
|
|
source: Sourcerer;
|
|
testSuite: ScrapeMedia[];
|
|
types: TestTypes[];
|
|
debug?: boolean;
|
|
expect: {
|
|
embeds?: number;
|
|
streams?: number;
|
|
error?: boolean;
|
|
notfound?: boolean;
|
|
};
|
|
}
|
|
|
|
function makeBaseProviders() {
|
|
const builder = buildProviders().setTarget(targets.ANY).setFetcher(makeStandardFetcher(fetch));
|
|
const embeds = getBuiltinEmbeds();
|
|
embeds.forEach((embed) => builder.addEmbed(embed));
|
|
return builder;
|
|
}
|
|
|
|
export function testSource(ops: TestSourceOptions) {
|
|
if (ops.testSuite.length === 0) throw new Error('Test suite must have at least one test');
|
|
describe(`source:${ops.source.id}`, () => {
|
|
ops.testSuite.forEach((test) => {
|
|
describe(`test ${test.title}`, () => {
|
|
async function runTest(providers: ProviderControls) {
|
|
let hasNotFound = false;
|
|
let hasError = false;
|
|
let streamCount = 0;
|
|
let embedCount = 0;
|
|
let embeds = [];
|
|
try {
|
|
const result = await providers.runSourceScraper({
|
|
id: ops.source.id,
|
|
media: test,
|
|
});
|
|
if (ops.debug) console.log(result);
|
|
streamCount = (result.stream ?? []).length;
|
|
embedCount = result.embeds.length;
|
|
} catch (err) {
|
|
if (ops.debug) console.log(err);
|
|
if (err instanceof NotFoundError) hasNotFound = true;
|
|
else hasError = true;
|
|
}
|
|
expect(ops.expect.error ?? false).toBe(hasError);
|
|
expect(ops.expect.notfound ?? false).toBe(hasNotFound);
|
|
expect(ops.expect.streams ?? 0).toBe(streamCount);
|
|
expect(ops.expect.embeds ?? 0).toBe(embedCount);
|
|
}
|
|
|
|
if (ops.types.includes('standard')) {
|
|
it(`standard`, async () => {
|
|
const providers = makeBaseProviders().addSource(ops.source).build();
|
|
await runTest(providers);
|
|
});
|
|
}
|
|
|
|
if (ops.types.includes('ip:standard')) {
|
|
it(`standard:ip`, async () => {
|
|
const providers = makeBaseProviders().addSource(ops.source).enableConsistentIpForRequests().build();
|
|
await runTest(providers);
|
|
});
|
|
}
|
|
|
|
if (ops.types.includes('proxied')) {
|
|
it(`proxied`, async () => {
|
|
if (!process.env.MOVIE_WEB_PROXY_URL)
|
|
throw new Error('Cant use proxied test without setting MOVIE_WEB_PROXY_URL env');
|
|
const providers = makeBaseProviders()
|
|
.addSource(ops.source)
|
|
.setProxiedFetcher(makeSimpleProxyFetcher(process.env.MOVIE_WEB_PROXY_URL, fetch))
|
|
.build();
|
|
await runTest(providers);
|
|
});
|
|
}
|
|
});
|
|
});
|
|
});
|
|
}
|