Ctrl K
ComunidadGuías…

__tests__/watch-profile.test.js

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
/**
 * The watchers' own browser: the watch copy is cloned from the login profile once (lock files left
 * behind, profile.json carried over), reused afterwards, and its cookies are topped up from the login
 * browser. Temp dirs, fake contexts, no Chromium.
 */
import { describe, it, expect } from 'vitest';
import fs from 'node:fs';
import os from 'node:os';
import path from 'node:path';
import { ensureWatchProfile, syncCookies, watchName } from '../src/watchProfile.js';

const tmp = () => fs.mkdtempSync(path.join(os.tmpdir(), 'wp-'));

describe('watch profile', () => {
  it('names the copy once, never twice', () => {
    expect(watchName('facebook')).toBe('facebook-watch');
    expect(watchName('facebook-watch')).toBe('facebook-watch');
  });

  it('clones the login profile without its lock files, carries profile.json, and reuses the copy', () => {
    const dir = tmp(); const src = path.join(dir, 'facebook');
    fs.mkdirSync(path.join(src, 'Default'), { recursive: true });
    fs.writeFileSync(path.join(src, 'Default', 'Cookies'), 'jar');
    fs.writeFileSync(path.join(src, 'SingletonLock'), 'x'); fs.writeFileSync(path.join(src, 'lockfile'), 'x'); fs.writeFileSync(path.join(src, 'DevToolsActivePort'), '1');
    fs.writeFileSync(path.join(src, 'profile.json'), JSON.stringify({ timezone: 'Europe/Amsterdam' }));
    const name = ensureWatchProfile(dir, 'facebook');
    expect(name).toBe('facebook-watch');
    const dst = path.join(dir, name);
    expect(fs.readFileSync(path.join(dst, 'Default', 'Cookies'), 'utf8')).toBe('jar');
    expect(fs.existsSync(path.join(dst, 'SingletonLock'))).toBe(false); expect(fs.existsSync(path.join(dst, 'lockfile'))).toBe(false); expect(fs.existsSync(path.join(dst, 'DevToolsActivePort'))).toBe(false);
    expect(JSON.parse(fs.readFileSync(path.join(dst, 'profile.json'), 'utf8')).timezone).toBe('Europe/Amsterdam');
    // the copy is the copy's own from now on: a change in the login profile does not overwrite it
    fs.writeFileSync(path.join(src, 'Default', 'Cookies'), 'newer');
    expect(ensureWatchProfile(dir, 'facebook')).toBe('facebook-watch');
    expect(fs.readFileSync(path.join(dst, 'Default', 'Cookies'), 'utf8')).toBe('jar');
  });

  it('makes an empty copy when there is nothing to clone', () => {
    const dir = tmp();
    expect(ensureWatchProfile(dir, 'linkedin')).toBe('linkedin-watch');
    expect(fs.existsSync(path.join(dir, 'linkedin-watch'))).toBe(true);
  });

  it('tops the copy up with the login browser\'s cookies, minus the fields addCookies refuses', async () => {
    const added = [];
    const from = { cookies: async () => [{ name: 'c_user', value: '1', domain: '.facebook.com', path: '/', expires: -1, httpOnly: true, secure: true, sameSite: 'None', sameParty: false, priority: 'Medium', sourceScheme: 'Secure', sourcePort: 443 }] };
    const to = { addCookies: async (cs) => { added.push(...cs); } };
    expect(await syncCookies(from, to)).toBe(1);
    expect(added[0]).toEqual({ name: 'c_user', value: '1', domain: '.facebook.com', path: '/', expires: -1, httpOnly: true, secure: true, sameSite: 'None' });
    expect(await syncCookies(null, to)).toBe(0);
    expect(await syncCookies({ cookies: async () => [] }, to)).toBe(0);
  });
});