import { describe, it, expect } from 'vitest'; import { classifyTryOnError, TryOnRejectedError, isTryOnErrorCode } from './tryOnErrors'; describe('try-on rejection policy', () => { it.each([ ['photo_body_hidden', 'photoBodyHidden', false, true], ['content_refused', 'refused', false, false], ['generation_refused', 'refused', false, false], ['quality_failed', 'qualityFailed', true, false], ['bad_image', 'unreadableImage', false, true], ] as const)('%s has localized recovery', (code, messageKey, retryable, photoProblem) => { expect(isTryOnErrorCode(code)).toBe(true); expect(classifyTryOnError(new TryOnRejectedError(code))).toEqual({messageKey, retryable, photoProblem}); }); it('honors a backend hard stop without making refusals retryable', () => { expect(classifyTryOnError(new TryOnRejectedError('quality_failed', false)).retryable).toBe(false); expect(classifyTryOnError(new TryOnRejectedError('content_refused', true)).retryable).toBe(false); expect(isTryOnErrorCode('private evaluator text')).toBe(false); }); it.each([ ['Try-on refused (flagged)', 'refused', false], ['Failed to fetch image', 'imageLoad', true], ['Could not load image', 'imageLoad', true], ['Failed to fetch', 'network', true], ['Network offline', 'network', true], ['request timed out', 'timeout', true], ['API error: 504', 'server', true], ['job failed', 'processingFailed', true], ['secret internal message', 'unexpected', true], ])('classifies legacy %s', (message, messageKey, retryable) => { expect(classifyTryOnError(new Error(message))).toMatchObject({messageKey, retryable}); }); it('never exposes unknown values', () => { expect(classifyTryOnError(null).messageKey).toBe('unexpected'); }); });