From e8a8909ecb4cce8bb3484ce6058d6e019e5125f7 Mon Sep 17 00:00:00 2001 From: mrjvs Date: Wed, 17 Jan 2024 21:15:56 +0100 Subject: [PATCH] Add better embed testing + add everything --- src/__test__/providers/embedUtils.ts | 90 ++++++++++++++++++ src/__test__/providers/embeds.test.ts | 113 +++++++++++++++++++++-- src/__test__/providers/providerUtils.ts | 85 ++--------------- src/__test__/providers/providers.test.ts | 70 ++++++++++++++ 4 files changed, 273 insertions(+), 85 deletions(-) create mode 100644 src/__test__/providers/embedUtils.ts diff --git a/src/__test__/providers/embedUtils.ts b/src/__test__/providers/embedUtils.ts new file mode 100644 index 0000000..3ba88a3 --- /dev/null +++ b/src/__test__/providers/embedUtils.ts @@ -0,0 +1,90 @@ +import { buildProviders } from "@/entrypoint/builder"; +import { ScrapeMedia } from "@/entrypoint/utils/media"; +import { targets } from "@/entrypoint/utils/targets"; +import { makeStandardFetcher } from "@/fetchers/standardFetch"; +import { Embed, Sourcerer, SourcererEmbed } from "@/providers/base"; +import { TestTypes } from "./providerUtils"; +import { describe, expect, it } from "vitest"; +import { ProviderControls } from "@/entrypoint/controls"; +import { makeSimpleProxyFetcher } from "@/fetchers/simpleProxy"; + +export interface TestEmbedOptions { + embed: Embed; + source: Sourcerer; + testSuite: ScrapeMedia[]; + types: TestTypes[]; + debug?: boolean; + expect: { + embeds: number; + streams?: number; + error?: boolean; + } +} + +function makeBaseEmbedProviders() { + const builder = buildProviders() + .setTarget(targets.ANY) + .setFetcher(makeStandardFetcher(fetch)); + return builder; +} + +export function testEmbed(ops: TestEmbedOptions) { + if (ops.testSuite.length === 0) throw new Error("Test suite must have at least one test"); + describe(`embed:${ops.source.id}:${ops.embed.id}`, () => { + ops.testSuite.forEach((test) => { + describe(`test ${test.title}`, async () => { + async function gatherEmbeds(providers: ProviderControls): Promise { + const results = await providers.runSourceScraper({ + id: ops.source.id, + media: test, + }) + if (results.embeds.length !== ops.expect.embeds) throw new Error(`Embeds don't match expected amount of embeds (${ops.source.id}, ${ops.embed.id}, got ${results.embeds.length} but expected ${ops.expect.embeds})`); + return results.embeds; + } + + async function runTest(providers: ProviderControls, embedUrl: string) { + let hasError = false; + let streamCount = 0; + try { + const result = await providers.runEmbedScraper({ + id: ops.embed.id, + url: embedUrl, + }) + if (ops.debug) console.log(result); + streamCount = (result.stream ?? []).length; + } catch (err) { + if (ops.debug) console.log(err); + hasError = true; + } + expect(ops.expect.error ?? false).toBe(hasError); + expect(ops.expect.streams ?? 0).toBe(streamCount); + } + + for (const t of ops.types) { + const builder = makeBaseEmbedProviders().addSource(ops.source).addEmbed(ops.embed); + if (t === 'standard') {} + else if (t === 'ip:standard') + builder.enableConsistentIpForRequests(); + else if (t === 'proxied') { + if (!process.env.MOVIE_WEB_PROXY_URL) + throw new Error("Cant use proxied test without setting MOVIE_WEB_PROXY_URL env"); + builder.setProxiedFetcher(makeSimpleProxyFetcher(process.env.MOVIE_WEB_PROXY_URL, fetch)); + } + const providers = builder.build(); + try { + const embeds = await gatherEmbeds(providers); + embeds.forEach((embed, i) => { + it(`${t} - embed ${i}`, async () => { + await runTest(providers, embed.url); + }) + }) + } catch (err) { + it(`${t} - embed ??`, () => { + throw new Error("Failed to get streams: " + err); + }) + } + } + }) + }) + }) +} diff --git a/src/__test__/providers/embeds.test.ts b/src/__test__/providers/embeds.test.ts index 5775a91..d9d1d23 100644 --- a/src/__test__/providers/embeds.test.ts +++ b/src/__test__/providers/embeds.test.ts @@ -1,17 +1,118 @@ -import { febboxMp4Scraper } from "@/providers/embeds/febbox/mp4"; -import { testEmbed } from "./providerUtils"; import dotenv from 'dotenv'; +import { febboxMp4Scraper } from "@/providers/embeds/febbox/mp4"; +import { testEmbed } from "./embedUtils"; +import { showboxScraper } from "@/providers/sources/showbox"; +import { testMedia } from "./testMedia"; +import { flixhqScraper } from "@/providers/sources/flixhq"; +import { upcloudScraper } from "@/providers/embeds/upcloud"; +import { goMoviesScraper } from "@/providers/sources/gomovies"; +import { smashyStreamScraper } from "@/providers/sources/smashystream"; +import { smashyStreamDScraper } from "@/providers/embeds/smashystream/dued"; +import { vidsrcembedScraper } from '@/providers/embeds/vidsrc'; +import { vidsrcScraper } from '@/providers/sources/vidsrc'; +import { vidSrcToScraper } from '@/providers/sources/vidsrcto'; +import { vidplayScraper } from '@/providers/embeds/vidplay'; +import { fileMoonScraper } from '@/providers/embeds/filemoon'; +import { zoechipScraper } from '@/providers/sources/zoechip'; +import { mixdropScraper } from '@/providers/embeds/mixdrop'; dotenv.config(); testEmbed({ embed: febboxMp4Scraper, - testUrls: [ - '/show/16448/1/1', - '/movie/27769//' - ], + source: showboxScraper, + testSuite: [testMedia.arcane, testMedia.hamilton], types: ['standard', 'proxied'], expect: { + embeds: 1, + streams: 1, + } +}) + +testEmbed({ + embed: upcloudScraper, + source: flixhqScraper, + testSuite: [testMedia.arcane, testMedia.hamilton], + types: ['standard', 'proxied'], + expect: { + embeds: 1, + streams: 1, + } +}) + +testEmbed({ + embed: upcloudScraper, + source: goMoviesScraper, + testSuite: [testMedia.arcane, testMedia.hamilton], + types: ['standard', 'proxied'], + expect: { + embeds: 1, + streams: 1, + } +}) + +testEmbed({ + embed: smashyStreamDScraper, + source: smashyStreamScraper, + testSuite: [testMedia.arcane, testMedia.hamilton], + types: ['standard', 'proxied'], + expect: { + embeds: 1, + streams: 1, + } +}) + +testEmbed({ + embed: vidsrcembedScraper, + source: vidsrcScraper, + testSuite: [testMedia.arcane, testMedia.hamilton], + types: ['standard', 'proxied'], + expect: { + embeds: 1, + streams: 1, + } +}) + +testEmbed({ + embed: vidplayScraper, + source: vidSrcToScraper, + testSuite: [testMedia.arcane, testMedia.hamilton], + types: ['standard', 'proxied'], + expect: { + embeds: 1, + streams: 1, + } +}) + +testEmbed({ + embed: fileMoonScraper, + source: vidSrcToScraper, + testSuite: [testMedia.arcane, testMedia.hamilton], + types: ['standard', 'proxied'], + expect: { + embeds: 1, + streams: 1, + } +}) + +testEmbed({ + embed: upcloudScraper, + source: zoechipScraper, + testSuite: [testMedia.arcane, testMedia.hamilton], + types: ['standard', 'proxied'], + expect: { + embeds: 2, + streams: 1, + } +}) + +testEmbed({ + embed: mixdropScraper, + source: zoechipScraper, + testSuite: [testMedia.arcane, testMedia.hamilton], + types: ['standard', 'proxied'], + expect: { + embeds: 2, streams: 1, } }) diff --git a/src/__test__/providers/providerUtils.ts b/src/__test__/providers/providerUtils.ts index 65fe710..f5d126c 100644 --- a/src/__test__/providers/providerUtils.ts +++ b/src/__test__/providers/providerUtils.ts @@ -1,5 +1,5 @@ import { ScrapeMedia } from "@/entrypoint/utils/media"; -import { Embed, Sourcerer } from "@/providers/base"; +import { Embed, Sourcerer, SourcererEmbed } from "@/providers/base"; import { buildProviders } from "@/entrypoint/builder"; import { describe, expect, it } from "vitest"; import { makeStandardFetcher } from "@/fetchers/standardFetch"; @@ -24,41 +24,26 @@ export interface TestSourceOptions { } } -export interface TestEmbedOptions { - embed: Embed; - testUrls: string[]; - types: TestTypes[]; - debug?: boolean; - expect: { - streams?: number; - error?: boolean; - } -} - function makeBaseProviders() { - const builder = makeBaseEmbedProviders(); - const embeds = getBuiltinEmbeds(); - embeds.forEach(embed => builder.addEmbed(embed)); - return builder; -} - -function makeBaseEmbedProviders() { 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, i) => { - describe(`test ${i}`, () => { + 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, @@ -115,61 +100,3 @@ export function testSource(ops: TestSourceOptions) { }) }) } - -export function testEmbed(ops: TestEmbedOptions) { - if (ops.testUrls.length === 0) throw new Error("Test urls must have at least one url"); - describe(`embed:${ops.embed.id}`, () => { - ops.testUrls.forEach((test, i) => { - describe(`test ${i}`, () => { - async function runTest(providers: ProviderControls) { - let hasError = false; - let streamCount = 0; - try { - const result = await providers.runEmbedScraper({ - id: ops.embed.id, - url: test, - }) - if (ops.debug) console.log(result); - streamCount = (result.stream ?? []).length; - } catch (err) { - if (ops.debug) console.log(err); - hasError = true; - } - expect(ops.expect.error ?? false).toBe(hasError); - expect(ops.expect.streams ?? 0).toBe(streamCount); - } - - if (ops.types.includes('standard')) { - it(`standard`, async () => { - const providers = makeBaseEmbedProviders() - .addEmbed(ops.embed) - .build(); - await runTest(providers); - }) - } - - if (ops.types.includes('ip:standard')) { - it(`standard:ip`, async () => { - const providers = makeBaseEmbedProviders() - .addEmbed(ops.embed) - .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 = makeBaseEmbedProviders() - .addEmbed(ops.embed) - .setProxiedFetcher(makeSimpleProxyFetcher(process.env.MOVIE_WEB_PROXY_URL, fetch)) - .build(); - await runTest(providers); - }) - } - }); - }) - }) -} diff --git a/src/__test__/providers/providers.test.ts b/src/__test__/providers/providers.test.ts index 0f29dc1..ecac090 100644 --- a/src/__test__/providers/providers.test.ts +++ b/src/__test__/providers/providers.test.ts @@ -3,6 +3,13 @@ import { lookmovieScraper } from "@/providers/sources/lookmovie"; import { testMedia } from "./testMedia"; import { showboxScraper } from "@/providers/sources/showbox"; import dotenv from 'dotenv'; +import { flixhqScraper } from "@/providers/sources/flixhq"; +import { goMoviesScraper } from "@/providers/sources/gomovies"; +import { smashyStreamScraper } from "@/providers/sources/smashystream"; +import { vidsrcScraper } from "@/providers/sources/vidsrc"; +import { vidSrcToScraper } from "@/providers/sources/vidsrcto"; +import { zoechipScraper } from "@/providers/sources/zoechip"; +import { remotestreamScraper } from "@/providers/sources/remotestream"; dotenv.config(); @@ -23,3 +30,66 @@ testSource({ embeds: 1, } }) + +testSource({ + source: flixhqScraper, + testSuite: [testMedia.arcane, testMedia.hamilton], + types: ['standard', 'proxied'], + expect: { + embeds: 1, + } +}) + +testSource({ + source: goMoviesScraper, + testSuite: [testMedia.arcane, testMedia.hamilton], + types: ['standard', 'proxied'], + expect: { + embeds: 1, + } +}) + +testSource({ + source: smashyStreamScraper, + testSuite: [testMedia.arcane, testMedia.hamilton], + types: ['standard', 'proxied'], + expect: { + embeds: 1, + } +}) + +testSource({ + source: vidsrcScraper, + testSuite: [testMedia.arcane, testMedia.hamilton], + types: ['standard', 'proxied'], + expect: { + embeds: 1, + } +}) + +testSource({ + source: vidSrcToScraper, + testSuite: [testMedia.arcane, testMedia.hamilton], + types: ['standard', 'proxied'], + expect: { + embeds: 2, + } +}) + +testSource({ + source: zoechipScraper, + testSuite: [testMedia.arcane, testMedia.hamilton], + types: ['standard', 'proxied'], + expect: { + embeds: 3, + } +}) + +testSource({ + source: remotestreamScraper, + testSuite: [testMedia.arcane, testMedia.hamilton], + types: ['standard', 'proxied'], + expect: { + streams: 1, + } +})