@v4fire/client
Version:
V4Fire client core library
153 lines (116 loc) • 4.36 kB
text/typescript
/*!
* V4Fire Client Core
* https://github.com/V4Fire/Client
*
* Released under the MIT license
* https://github.com/V4Fire/Client/blob/master/LICENSE
*/
import type { JSHandle, Cookie } from 'playwright';
import type * as Cookies from 'core/cookies';
import test from 'tests/config/unit/test';
import Utils from 'tests/helpers/utils';
test.describe('core/cookies', () => {
let
cookie: JSHandle<typeof Cookies>;
test.beforeEach(async ({demoPage, page}) => {
await demoPage.goto();
cookie = await Utils.import(page, 'core/cookies');
});
test.describe('`get`', () => {
test.beforeEach(async () => {
await cookie.evaluate((ctx) => ctx.set('testCookie', 'testCookieVal'));
});
test('returns a cookie value', async () => {
const
testVal = await cookie.evaluate((ctx) => ctx.get('testCookie'));
test.expect(testVal).toBe('testCookieVal');
});
test('returns `undefined` when trying to get a value of the non-existent cookie', async () => {
const
testVal = await cookie.evaluate((ctx) => ctx.get('unreachableCookie'));
test.expect(testVal).toBeUndefined();
});
});
test.describe('`has`', () => {
test.beforeEach(async () => {
await cookie.evaluate((ctx) => ctx.set('testCookie', 'testCookieVal'));
});
test('returns `true` if the cookie exists', async () => {
const
testVal = await cookie.evaluate((ctx) => ctx.has('testCookie'));
test.expect(testVal).toBe(true);
});
test('returns `false` if the cookie does not exist', async () => {
const
testVal = await cookie.evaluate((ctx) => ctx.has('unreachableCookie'));
test.expect(testVal).toBe(false);
});
});
test.describe('`set`', () => {
test('simple usage', async ({page}) => {
await cookie.evaluate((ctx) => ctx.set('testCookie', 'testCookieVal'));
const
testVal = await page.evaluate(() => document.cookie);
test.expect(testVal.includes('testCookie=testCookieVal')).toBeTruthy();
});
test('set multiply cookies', async ({context, page}) => {
const
cookiesNames = ['testCookie', 'testCookie2'];
await cookie.evaluate((ctx, cookiesNames) => ctx.set(cookiesNames[0], 'testCookieVal'), cookiesNames);
await cookie.evaluate((ctx, cookiesNames) => ctx.set(cookiesNames[1], 'testCookieVal2'), cookiesNames);
const
cookies = await context.cookies(page.url()),
targetCookies = cookies.filter((el) => cookiesNames.includes(el.name));
test.expect(targetCookies).toEqual([
createCookie(),
createCookie({
name: 'testCookie2',
value: 'testCookieVal2'
})
]);
});
test('with the `path` option provided', async ({page, context}) => {
await cookie.evaluate((ctx) => ctx.set('testCookie', 'testCookieVal', {path: '/test'}));
const
origin = await page.evaluate(() => location.origin),
cookies = await context.cookies(`${origin}/test`);
test.expect(cookies.filter((el) => el.name === 'testCookie')).toEqual([createCookie({path: '/test'})]);
});
test('with the `expires` option provided', async ({page, context}) => {
const expires = await page.evaluate(() => {
globalThis._expDate = new Date(Date.now() + 86400e3);
return Math.floor(globalThis._expDate.getTime() / 1000);
});
await cookie.evaluate((ctx) => ctx.set('testCookie', 'testCookieVal', {expires: globalThis._expDate}));
const
cookies = await context.cookies(page.url());
test.expect(cookies.filter((el) => el.name === 'testCookie')).toEqual([createCookie({expires})]);
});
});
test.describe('`remove`', () => {
test('removes a cookie', async ({context, page}) => {
await cookie.evaluate((ctx) => ctx.set('testCookie', 'testCookieVal'));
const
cookies = await context.cookies(page.url());
test.expect(cookies.find((el) => el.name === 'testCookie')).toBeTruthy();
await cookie.evaluate((ctx) => ctx.remove('testCookie'));
const
cookiesAfterRemove = await context.cookies(page.url());
test.expect(cookiesAfterRemove.find((el) => el.name === 'testCookie')).toBeFalsy();
test.expect(cookiesAfterRemove.length).toBe(cookies.length - 1);
});
});
function createCookie(params: Dictionary = {}): Cookie {
return {
sameSite: 'Lax',
name: 'testCookie',
value: 'testCookieVal',
domain: 'localhost',
path: '/',
expires: -1,
httpOnly: false,
secure: false,
...params
};
}
});