playwright/lib/gam.ts (66 lines of code) (raw):
import type { Page, Request, Response } from '@playwright/test';
const gamUrl = /https:\/\/securepubads\.g\.doubleclick\.net\/gampad\/ads/;
const getEncodedParamsFromRequest = (
request: Request,
paramName: string,
): URLSearchParams | null => {
const url = new URL(request.url());
const param = url.searchParams.get(paramName);
if (!param) return null;
const paramDecoded = decodeURIComponent(param);
const searchParams = new URLSearchParams(paramDecoded);
return searchParams;
};
const assertOnSlotFromRequest = (request: Request, expectedSlot: string) => {
const isURL = request.url().match(gamUrl);
if (!isURL) return false;
const searchParams = getEncodedParamsFromRequest(request, 'prev_scp');
if (searchParams === null) return false;
const slot = searchParams.get('slot');
if (slot !== expectedSlot) return false;
return true;
};
const waitForGAMRequestForSlot = (page: Page, slotExpected: string) => {
return page.waitForRequest((request) =>
assertOnSlotFromRequest(request, slotExpected),
);
};
const waitForGAMResponseForSlot = (page: Page, slotExpected: string) => {
return page.waitForResponse((response) =>
assertOnSlotFromRequest(response.request(), slotExpected),
);
};
const assertRequestParameter = (
request: Request,
name: string,
matcher: (value: string) => boolean,
isEncoded = false,
encodedParam = '',
): boolean => {
const url = new URL(request.url());
let params: URLSearchParams | null = url.searchParams;
if (isEncoded) {
params = getEncodedParamsFromRequest(request, encodedParam);
}
if (params === null) return false;
const paramValue = params.get(name);
if (paramValue === null) return false;
return matcher(paramValue);
};
const assertHeader = async (
reqres: Request | Response,
name: string,
matcher: (value: string) => boolean,
): Promise<boolean> => {
const headerValue = await reqres.headerValue(name);
if (headerValue === null) return false;
return matcher(headerValue);
};
export {
assertRequestParameter,
assertHeader,
gamUrl,
getEncodedParamsFromRequest,
waitForGAMRequestForSlot,
waitForGAMResponseForSlot,
};