dataset-import.test.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import assert from 'node:assert/strict';
  2. import test from 'node:test';
  3. import {
  4. extractImportRecords,
  5. type ImportDataset,
  6. } from '../src/modules/domestic-voc/services/dataset-import.service.js';
  7. test('dataset import extraction preserves full daily operating metrics', () => {
  8. const dataset = {
  9. caseName: 'Demashi',
  10. platform: 'jd',
  11. products: [{
  12. platform: 'jd',
  13. productId: '1001',
  14. productKey: 'jd:1001',
  15. role: 'own',
  16. brand: 'Demashi',
  17. title: 'Product',
  18. model: 'Model',
  19. category1: 'A',
  20. category2: 'B',
  21. category3: 'C',
  22. source: 'case-file',
  23. trend: [{
  24. date: '2026-07-23',
  25. gmv: 120,
  26. soldUnits: 3,
  27. transactionOrders: 2,
  28. transactionCustomers: 2,
  29. impressions: 100,
  30. clicks: 20,
  31. refundAmount: 10,
  32. }],
  33. }],
  34. mappingGroups: [],
  35. relations: [],
  36. } as unknown as ImportDataset;
  37. const records = extractImportRecords(dataset);
  38. assert.equal(records.products.length, 1);
  39. assert.equal(records.metrics.length, 1);
  40. assert.equal(records.metrics[0]?.impressions, 100);
  41. assert.equal(records.metrics[0]?.clicks, 20);
  42. assert.equal(records.metrics[0]?.refundAmount, 10);
  43. });
  44. test('dataset import creates explicit relation stubs for missing mapping products', () => {
  45. const dataset = {
  46. caseName: 'Demashi',
  47. platform: 'jd',
  48. products: [],
  49. mappingGroups: [{
  50. ownProductId: 'own-1',
  51. ownProductKey: 'jd:own-1',
  52. model: 'DM-1',
  53. category: 'Kitchen',
  54. competitors: [],
  55. }],
  56. relations: [{
  57. relationKey: 'jd:own-1:competitor-1',
  58. ownProductKey: 'jd:own-1',
  59. ownProductId: 'own-1',
  60. competitorProductKey: 'jd:competitor-1',
  61. competitorProductId: 'competitor-1',
  62. competitorBrand: 'Competitor',
  63. category: 'Kitchen',
  64. }],
  65. } as unknown as ImportDataset;
  66. const records = extractImportRecords(dataset);
  67. assert.equal(records.products.length, 2);
  68. assert.deepEqual(records.products.map((product) => product.role), ['own', 'competitor']);
  69. assert.ok(records.products.every((product) => product.source === 'relation_stub'));
  70. });