import { describe, test, expect } from 'vitest'; import { toProductImageView, toProductSpecView, toProductSpecGroupView, toProductQuestionView, toProductDocumentView, toProductView, } from './productMapper'; /** * 单元测试: toProductImageView */ describe('toProductImageView', () => { const baseData: Array = [ { id: 1, product_images_id: { id: 1, image: { id: 'rand-om__-uuid-1234', }, translations: [ { id: 1, caption: 'Image Caption', }, ], }, }, { id: 2, product_images_id: { id: 2, image: { id: 'rand-om__-uuid-5678', }, translations: [ { id: 2, caption: 'Image Caption 2', }, ], }, }, ]; test('convert raw data to ProductImageView correctly', () => { const rawData: Array = [...baseData]; expect(toProductImageView(rawData)).toEqual([ { id: '1', image: 'rand-om__-uuid-1234', caption: 'Image Caption', }, { id: '2', image: 'rand-om__-uuid-5678', caption: 'Image Caption 2', }, ]); }); test('convert raw data with missing translations', () => { const rawData: Array = [ { id: 1, product_images_id: { id: 1, image: { id: 'rand-om__-uuid-1234', }, translations: [], }, }, ]; expect(toProductImageView(rawData)).toEqual([ { id: '1', image: 'rand-om__-uuid-1234', caption: '', }, ]); }); test('convert empty array to empty ProductImageView array', () => { const rawData: Array = []; expect(toProductImageView(rawData)).toEqual([]); }); test('convert input with wrong type to default value', () => { const rawData: string[] = ['1', '2']; expect(toProductImageView(rawData)).toEqual([ { id: '1', image: '', caption: '', }, { id: '2', image: '', caption: '', }, ]); }); }); /** * 单元测试: toProductSpecView */ describe('toProductSpecView', () => { const baseData: ProductSpec[] = [ { id: 1, translations: [ { id: 1, key: 'key 1', value: 'value 1', }, ], }, { id: 2, translations: [ { id: 2, key: 'key 2', value: 'value 2', }, ], }, ]; test('convert raw data to ProductSpecView correctly', () => { const rawData: ProductSpec[] = [...baseData]; expect(toProductSpecView(rawData)).toEqual([ { id: '1', key: 'key 1', value: 'value 1', }, { id: '2', key: 'key 2', value: 'value 2', }, ]); }); test('convert raw data with missing translations', () => { const rawData: ProductSpec[] = [{ id: 1, translations: [] }]; expect(toProductSpecView(rawData)).toEqual([ { id: '1', key: '', value: '', }, ]); }); test('convert empty input to empty array', () => { const rawData: ProductSpec[] = []; expect(toProductSpecView(rawData)).toEqual([]); }); test('convert input with wrong type to default value', () => { const rawData: string[] = ['1', '2']; expect(toProductSpecView(rawData)).toEqual([ { id: '1', key: '', value: '', }, { id: '2', key: '', value: '', }, ]); }); }); /** * 单元测试: toProductSpecGroupView */ describe('toProductSpecGroupView', () => { test('convert raw data to ProductSpecGroupView correctly', () => { const rawData: ProductSpecGroup[] = [ { id: 1, translations: [{ id: 1, name: 'Group Name' }], specs: [ { id: 1, translations: [{ id: 1, key: 'Key1', value: 'Value1' }] }, { id: 2, translations: [{ id: 2, key: 'Key2', value: 'Value2' }] }, ], }, ]; expect(toProductSpecGroupView(rawData)).toEqual([ { id: '1', name: 'Group Name', specs: [ { id: '1', key: 'Key1', value: 'Value1' }, { id: '2', key: 'Key2', value: 'Value2' }, ], }, ]); }); test('convert raw data with missing translations', () => { const rawData: ProductSpecGroup[] = [ { id: 1, translations: [], specs: [], }, ]; expect(toProductSpecGroupView(rawData)).toEqual([ { id: '1', name: '', specs: [], }, ]); }); test('convert input with wrong type to default value', () => { const rawData: string[] = ['1', '2']; expect(toProductSpecGroupView(rawData)).toEqual([ { id: '1', name: '', specs: [], }, { id: '2', name: '', specs: [], }, ]); }); test('convert empty ar ray to empty ProductSpecGroupView array', () => { const rawData: ProductSpec[] = []; expect(toProductSpecGroupView(rawData)).toEqual([]); }); }); /** * 单元测试: toProductQuestionView */ describe('toProductQuestionView', () => { test('convert raw data to ProductQuestionView correctly', () => { const rawData: ProductsQuestion[] = [ { id: 1, questions_id: { id: 1, translations: [ { id: 1, title: 'Question Title', content: 'Question Content', }, ], }, }, ]; expect(toProductQuestionView(rawData)).toEqual([ { id: '1', title: 'Question Title', content: 'Question Content', }, ]); }); test('convert raw data with missing translations', () => { const rawData: ProductsQuestion[] = [ { id: 1, questions_id: { id: 1, translations: [], }, }, ]; expect(toProductQuestionView(rawData)).toEqual([ { id: '1', title: '', content: '', }, ]); }); test('convert empty array to empty ProductQuestionView array', () => { const rawData: ProductsQuestion[] = []; expect(toProductQuestionView(rawData)).toEqual([]); }); test('convert input with wrong type to default value', () => { const rawData: string[] = ['1', '2']; expect(toProductQuestionView(rawData)).toEqual([ { id: '1', title: '', content: '', }, { id: '2', title: '', content: '', }, ]); }); }); /** * 单元测试: toProductDocumentView */ describe('toProductDocumentView', () => { test('convert raw data to ProductDocumentView correctly', () => { const rawData: ProductsProductDocument[] = [ { id: 1, product_documents_id: { id: 1, file: { id: 'rand-om__-uuid-1234', filesize: 1000, filename_download: 'doc1.pdf', }, type: { id: 1, translations: [ { id: 1, name: 'manual', }, ], }, translations: [ { id: 1, title: 'Document Title 1', }, ], }, }, ]; expect(toProductDocumentView(rawData)).toEqual([ { id: '1', fileId: 'rand-om__-uuid-1234', filename: 'doc1.pdf', title: 'Document Title 1', type: { id: '1', name: 'manual', }, size: 1000, url: '/api/assets/rand-om__-uuid-1234', }, ]); }); test('convert raw data with missing translations', () => { const rawData: ProductsProductDocument[] = [ { id: 1, product_documents_id: { id: 1, file: { id: 'rand-om__-uuid-1234', filesize: 1000, filename_download: 'doc1.pdf', }, translations: [], }, }, ]; expect(toProductDocumentView(rawData)).toEqual([ { id: '1', fileId: 'rand-om__-uuid-1234', filename: 'doc1.pdf', title: '', type: { id: '-1', name: '', }, size: 1000, url: '/api/assets/rand-om__-uuid-1234', }, ]); }); test('convert empty array to empty ProductDocumentView array', () => { const rawData: ProductsProductDocument[] = []; expect(toProductDocumentView(rawData)).toEqual([]); }); test('convert input with wrong type to default value', () => { const rawData: string[] = ['1', '2']; expect(toProductDocumentView(rawData)).toEqual([ { id: '1', fileId: '', filename: '', title: '', size: 0, type: { id: '-1', name: '', }, url: '', }, { id: '2', fileId: '', filename: '', title: '', size: 0, type: { id: '-1', name: '', }, url: '', }, ]); }); }); /** * 单元测试: toProductView */ describe('toProductView', () => { const baseData: Product = { id: 1, status: 'in-production', translations: [ { id: 1, name: 'Product Name', summary: 'Product Summary', description: 'Product Description', }, ], }; test('convert raw data to ProductView correctly', () => { const rawData: Product = { ...baseData, }; expect(toProductView(rawData)).toEqual({ id: '1', status: 'in-production', name: 'Product Name', summary: 'Product Summary', description: 'Product Description', images: [], documents: [], faqs: [], specs: [], }); }); test('convert raw data with missing translations', () => { const rawData: Product = { ...baseData, translations: [], }; expect(toProductView(rawData)).toEqual({ id: '1', status: 'in-production', name: '', summary: '', description: '', images: [], documents: [], faqs: [], specs: [], }); }); test('conert raw data with missing status', () => { const rawData: Product = { ...baseData, status: undefined, }; expect(toProductView(rawData)).toEqual({ id: '1', status: 'discontinued', name: 'Product Name', summary: 'Product Summary', description: 'Product Description', images: [], documents: [], faqs: [], specs: [], }); }); });