- 产品状态:从Directus Schema获取Product的Status字段 - 视图字段:添加Status字段用于标示产品状态 - 测试方法:为Status字段添加单元测试
527 lines
11 KiB
TypeScript
527 lines
11 KiB
TypeScript
import { describe, test, expect } from 'vitest';
|
|
import {
|
|
toProductImageView,
|
|
toProductSpecView,
|
|
toProductSpecGroupView,
|
|
toProductQuestionView,
|
|
toProductDocumentView,
|
|
toProductView,
|
|
} from './productMapper';
|
|
|
|
/**
|
|
* 单元测试: toProductImageView
|
|
*/
|
|
describe('toProductImageView', () => {
|
|
const baseData: Array<ProductsProductImage> = [
|
|
{
|
|
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<ProductsProductImage> = [...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<ProductsProductImage> = [
|
|
{
|
|
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<ProductsProductImage> = [];
|
|
|
|
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: [],
|
|
});
|
|
});
|
|
});
|