Files
atlas-seller-kit/apps/worker/test/ozon-product-import.test.mjs
2026-09-30 15:57:54 +08:00

126 lines
3.6 KiB
JavaScript

import assert from 'node:assert/strict';
import { test } from 'node:test';
import {
buildOzonProductImportPayload,
OzonProductImportPayloadError,
} from '../src/ozon-product-import.ts';
const defaultPackageSpec = {
length_mm: '240',
width_mm: '120',
height_mm: '60',
shipping_weight_g: '850',
status: 'confirmed',
};
function source(overrides = {}) {
return {
default_package_spec: defaultPackageSpec,
category: { description_category_id: '17028922', type_id: '91234' },
title: '测试商品',
description: '商品描述',
barcode: '1234567890123',
common_attributes: [
{ id: 85, complex_id: 0, values: [{ value: '品牌' }] },
],
variants: [
{
variant_id: 'sku-a',
offer_id: 'offer-a',
price: '199.90',
currency_code: 'RUB',
package_spec: {
length_mm: null,
width_mm: null,
height_mm: null,
shipping_weight_g: null,
status: null,
},
images: ['https://cdn.example.test/a.jpg'],
attributes: [
{ id: 8229, complex_id: 0, values: [{ value: '红色' }] },
],
},
],
...overrides,
};
}
test('按 SKU 将 SPU 默认包装规格展开为 Ozon items[]', () => {
const payload = buildOzonProductImportPayload(source());
assert.deepEqual(payload, {
items: [
{
offer_id: 'offer-a',
name: '测试商品',
description_category_id: 17028922,
type_id: 91234,
price: '199.90',
currency_code: 'RUB',
images: ['https://cdn.example.test/a.jpg'],
attributes: [
{ id: 85, complex_id: 0, values: [{ value: '品牌' }] },
{ id: 8229, complex_id: 0, values: [{ value: '红色' }] },
],
depth: 240,
width: 120,
height: 60,
dimension_unit: 'mm',
weight: 850,
weight_unit: 'g',
},
],
});
});
test('SKU 包装覆盖值优先于 SPU 默认值', () => {
const input = source();
input.variants[0].package_spec = {
length_mm: '300',
width_mm: '160',
height_mm: '70',
shipping_weight_g: '1000',
status: 'confirmed',
};
const payload = buildOzonProductImportPayload(input);
assert.deepEqual(
[
payload.items[0].depth,
payload.items[0].width,
payload.items[0].height,
payload.items[0].weight,
],
[300, 160, 70, 1000],
);
});
test('重量与尺寸可分别覆盖,未覆盖字段继续继承 SPU', () => {
const input = source();
input.variants[0].package_spec.shipping_weight_g = '920';
const item = buildOzonProductImportPayload(input).items[0];
assert.deepEqual(
[item.depth, item.width, item.height, item.weight],
[240, 120, 60, 920],
);
});
test('缺少有效包装规格时拒绝生成对应 SKU 的导入项', () => {
const input = source({
default_package_spec: {
...defaultPackageSpec,
shipping_weight_g: null,
},
});
assert.throws(
() => buildOzonProductImportPayload(input),
(error) =>
error instanceof OzonProductImportPayloadError &&
error.variantId === 'sku-a' &&
error.field === 'package_spec.shipping_weight_g',
);
});