← back to Dw Gemini Skip TK11321

test/owner-review-policy.test.js

63 lines

'use strict';
const test = require('node:test');
const assert = require('node:assert/strict');
const { OwnerReviewPolicy, permitsActivation, confirmedReviewRecord, OWNER_REASON } = require('../lib/owner-review-policy');
const entry = { shopify_id: 'gid://shopify/Product/1', dw_sku: 'DWTEST-1', queue_vendor: 'Vendor', live_vendor: 'Vendor', title: 'Design', manufacturer_code: 'ABC', primary_image_url: 'https://cdn.example/swatch.jpg' };
const configuration = (entries = [entry]) => ({ schema_version: 1, mode: 'owner-authorized-cohort-no-gemini', ticket: 'TK-11321', approved_by: 'Steve', authorization: 'skip gemeni and go', entries, historical_blocked_ids: [] });
const input = () => ({ product: { id: entry.shopify_id, vendor: 'Vendor', title: 'Design', images: { nodes: [{ url: entry.primary_image_url }] }, variants: { nodes: [{ sku: entry.dw_sku }] }, metafields: { nodes: [{ namespace: 'internal', key: 'settlement_hold', value: JSON.stringify({ verdict: 'HELD', reason: 'vision-http-429', by: 'dw-rotation-activator' }) }] } }, dwSku: entry.dw_sku, vendor: 'Vendor', manufacturerCode: 'ABC', plainTexture: false, lockOk: true });
function previous(i, value) { i.product.metafields.nodes[0].value = JSON.stringify(value); return i; }

test('explicit owner authorization skips review without inventing a PASS', () => {
  const result = new OwnerReviewPolicy(configuration()).evaluate(input());
  assert.equal(result.verdict, 'SKIPPED_BY_OWNER'); assert.equal(result.review_performed, false);
  assert.equal(result.cost, 0); assert.equal(permitsActivation(result), true);
});
test('existing BLOCK and historical BLOCK remain blocked, including plain textures', () => {
  const i = previous(input(), { verdict: 'BLOCK', reason: 'fullPartA+partB', by: 'dw-rotation-activator' });
  i.plainTexture = true;
  assert.equal(new OwnerReviewPolicy(configuration()).evaluate(i).verdict, 'BLOCK');
  const c = configuration(); c.historical_blocked_ids = [entry.shopify_id];
  assert.equal(new OwnerReviewPolicy(c).evaluate(input()).verdict, 'BLOCK');
});
test('unknown, malformed or non-provider holds cannot be waived', () => {
  for (const value of [{ verdict: 'HELD', reason: 'no-image', by: 'dw-rotation-activator' },
    { verdict: 'HELD', reason: 'vision-http-429', by: 'someone-else' }, { verdict: 'NEEDS REVIEW' }])
    assert.equal(permitsActivation(new OwnerReviewPolicy(configuration()).evaluate(previous(input(), value))), false);
  const i = input(); i.product.metafields.nodes[0].value = 'invalid json';
  assert.equal(permitsActivation(new OwnerReviewPolicy(configuration()).evaluate(i)), false);
});
test('title, image, vendor, manufacturer and SKU drift require new review', () => {
  const changes = [i => i.product.title += ' changed', i => i.product.vendor = 'AI Store',
    i => i.vendor = 'Other', i => i.manufacturerCode = 'OTHER', i => i.dwSku = 'OTHER',
    i => i.product.images.nodes[0].url += '?changed', i => i.product.variants.nodes[0].sku = 'OTHER'];
  for (const change of changes) { const i = input(); change(i); assert.equal(permitsActivation(new OwnerReviewPolicy(configuration()).evaluate(i)), false); }
});
test('non-cohort products and failed binding lock remain held without network calls', () => {
  assert.equal(permitsActivation(new OwnerReviewPolicy(configuration([])).evaluate(input())), false);
  const i = input(); i.lockOk = false;
  assert.equal(permitsActivation(new OwnerReviewPolicy(configuration()).evaluate(i)), false);
});
test('existing plain texture rule still works; owner record retries are idempotent', () => {
  const texture = input(); texture.plainTexture = true;
  assert.equal(new OwnerReviewPolicy(configuration([])).evaluate(texture).verdict, 'PASS');
  const retry = previous(input(), { verdict: 'SKIPPED_BY_OWNER', reason: OWNER_REASON, by: 'dw-rotation-activator' });
  assert.equal(new OwnerReviewPolicy(configuration()).evaluate(retry).verdict, 'SKIPPED_BY_OWNER');
});
test('missing authority, duplicate IDs and incomplete records fail startup', () => {
  const c = configuration(); c.authorization = 'something else';
  assert.throws(() => new OwnerReviewPolicy(c));
  assert.throws(() => new OwnerReviewPolicy(configuration([entry, entry])));
  assert.throws(() => new OwnerReviewPolicy(configuration([{ ...entry, primary_image_url: '' }])));
});
test('a bare skipped verdict is never enough to activate', () => {
  for (const result of [{ verdict: 'SKIPPED_BY_OWNER' }, { verdict: 'HELD' }, { verdict: 'BLOCK' }, null])
    assert.equal(permitsActivation(result), false);
});
test('authorization metafield must be confirmed before publishing', () => {
  assert.equal(confirmedReviewRecord({ status: 200, json: { data: { metafieldsSet: { userErrors: [] } } } }), true);
  for (const response of [{ status: 429 }, { status: 200, json: {} },
    { status: 200, json: { errors: [{}], data: { metafieldsSet: { userErrors: [] } } } },
    { status: 200, json: { data: { metafieldsSet: { userErrors: [{ message: 'denied' }] } } } }])
    assert.equal(confirmedReviewRecord(response), false);
});