const mockLoggerDebug = jest.fn();

jest.mock('../../../utils/logger', () => ({
  logger: {
    debug: mockLoggerDebug,
    info: jest.fn(),
    warn: jest.fn(),
    error: jest.fn(),
  },
}));

jest.mock('../../../queue', () => ({
  translationQueue: {
    add: jest.fn(),
    process: jest.fn(),
    on: jest.fn(),
    isReady: jest.fn(),
    close: jest.fn(),
  },
}));

import type { NextFunction, Request, Response } from 'express';
import { transformWordPressJobPayload } from '../../../middleware/payloadTransform';
import { jobSubmitSchema } from '../../../routes/jobs';

describe('WordPress segmented Site Content payload transform', () => {
  it('maps the canonical snake-case contract without losing correlation fields', () => {
    const body = {
      resource_type: 'site_content',
      contract_version: 1,
      source_language: 'en',
      target_language: 'he',
      source_revision: 'a'.repeat(64),
      attempt_token: 'b'.repeat(64),
      segments: [{ id: `seg_${'A'.repeat(32)}`, text: 'Heading', context: {} }],
      callback_url: 'https://site.example.test/callback',
      callback_secret: 'c'.repeat(64),
      client_job_id: 'site-content-41',
    };
    const req = { body } as unknown as Request;
    const next = jest.fn();

    transformWordPressJobPayload(req, {} as Response, next as NextFunction);

    expect(next).toHaveBeenCalledTimes(1);
    expect(jobSubmitSchema.parse(req.body)).toMatchObject({
      resourceType: 'site_content',
      contractVersion: 1,
      sourceLang: 'en',
      targetLang: 'he',
      sourceRevision: 'a'.repeat(64),
      attemptToken: 'b'.repeat(64),
      clientJobId: 'site-content-41',
    });
  });

  it('keeps unknown and conflicting fields visible so strict validation rejects them', () => {
    const req = {
      body: {
        resource_type: 'site_content',
        resourceType: 'site_content',
        contract_version: 1,
        source_language: 'en',
        target_language: 'he',
        source_revision: 'a'.repeat(64),
        attempt_token: 'b'.repeat(64),
        segments: [{ id: `seg_${'A'.repeat(32)}`, text: 'Heading', context: {} }],
        callback_url: 'https://site.example.test/callback',
        callback_secret: 'c'.repeat(64),
        client_job_id: 'site-content-41',
        unexpected: true,
        'private source text as a field name': true,
      },
    } as unknown as Request;

    transformWordPressJobPayload(req, {} as Response, jest.fn());

    expect(() => jobSubmitSchema.parse(req.body)).toThrow();
    expect(JSON.stringify(mockLoggerDebug.mock.calls)).not.toContain('private source text');
  });
});
