|
| 1 | +import { parse } from 'csv-parse/sync' |
| 2 | +import { stringify } from 'csv-stringify' |
| 3 | +import assert from 'node:assert' |
| 4 | +import { createReadStream, createWriteStream } from 'node:fs' |
| 5 | +import { readFile } from 'node:fs/promises' |
| 6 | +import path from 'node:path' |
| 7 | +import { |
| 8 | + // @ts-expect-error no typings |
| 9 | + compose |
| 10 | +} from 'node:stream' |
| 11 | +import test from 'node:test' |
| 12 | + |
| 13 | +import { parseXmlToCsvRows } from '../../src/index.js' |
| 14 | + |
| 15 | +test('parseXmlToCsvStreams #case2', async () => { |
| 16 | + const xmlReadable = createReadStream( |
| 17 | + path.join(process.cwd(), 'test/cases/case2.xml') |
| 18 | + ) |
| 19 | + |
| 20 | + const CASE2_CSV_FILE = path.join(process.cwd(), '__temp/output/case2.csv') |
| 21 | + |
| 22 | + async function* rowsFlatten(src: AsyncGenerator<string[][]>) { |
| 23 | + for await (const rows of src) { |
| 24 | + for (const row of rows) { |
| 25 | + yield row |
| 26 | + } |
| 27 | + } |
| 28 | + } |
| 29 | + |
| 30 | + const composeWriteStream = (fileName: string) => |
| 31 | + compose(rowsFlatten, stringify(), createWriteStream(fileName)) |
| 32 | + |
| 33 | + await parseXmlToCsvRows(xmlReadable, [ |
| 34 | + { |
| 35 | + writeable: composeWriteStream(CASE2_CSV_FILE), |
| 36 | + mapping: { |
| 37 | + collection: 'Корень', |
| 38 | + row: 'Корень/Элемент', |
| 39 | + colls: [ |
| 40 | + { |
| 41 | + name: 'Описание', |
| 42 | + valuePath: 'Корень/Элемент/Описание' |
| 43 | + } |
| 44 | + ] |
| 45 | + } |
| 46 | + } |
| 47 | + ]) |
| 48 | + |
| 49 | + const categoryCsvTxt = await readFile(CASE2_CSV_FILE, 'utf8') |
| 50 | + |
| 51 | + const categoryCsv = parse(categoryCsvTxt) |
| 52 | + |
| 53 | + assert.deepStrictEqual( |
| 54 | + categoryCsv, |
| 55 | + [ |
| 56 | + ['Описание'], |
| 57 | + [ |
| 58 | + '<p>Материал ЛДСП</p> <p><span>Угловое завершение может быть использовано со шкафами серии оптима комфорт</span><span></span></p> <p><span>Универсальные полки к Шкафу-купе «Оптима-2200»,</span><br><span>подходят ко всем шкафам-купе «Оптима» высотой 2м 20см, размещение слева или справа</span></p>' |
| 59 | + ], |
| 60 | + [ |
| 61 | + '<p><span>Гостиная Авангард — легкая, но вместе с тем, вместительная композиция в современном стиле.</span></p> <p><span>Поставляется в цвете дуб сонома.</span></p> <p><span>Роликовые направляющие.</span></p> <p><span>Петли без доводчика.</span></p> <p><span>Кромка пластик на видимых элементах.</span></p> <p><span></span></p> <p>Указана цена за комплект стенки с элементами перечисленными ниже.</p>' |
| 62 | + ], |
| 63 | + [ |
| 64 | + '<p style="font-size: 11.111111640930176px;"><span style="font-size: small; line-height: 15.600000381469727px;">Допустимая нагрузка: 110 кг (на одну персону).</span></p> <p style="font-size: 11.111111640930176px;"><span style="font-size: small; line-height: 15.600000381469727px;">Высота: около 170 мм.</span></p> <p style="font-size: 11.111111640930176px;"></p> <p style="font-size: 11.111111640930176px;"><span style="font-size: small; line-height: 15.600000381469727px; color: #008000;"><strong>Слои в матрасе снаружи внутрь:</strong></span></p> <p style="font-size: 11.111111640930176px;"><span style="font-size: small; line-height: 15.600000381469727px;"><strong>1) Ткань стеганная Жаккард.</strong></span></p> <p style="font-size: 11.111111640930176px;"><span style="font-size: small; line-height: 15.600000381469727px;">Жаккард. гладкая безворсовая ткань сложного плетения, в состав которой входят как синтетические, так и органические волокна. Своеобразный рельефный рисунок, который получается в результате сложного плетения на плотной ткани, напоминает своего рода гобелен. Жаккардовой тканью часто обтягивают матрасы для того, чтобы продлить срок его службы. К тому же применение особой пропитки специальными веществами позволяет избегать появления статического электричества, обеспечивая удобство и комфорт использования.</span></p> <p style="font-size: 11.111111640930176px;"><span style="font-size: small; line-height: 15.600000381469727px;"></span></p> <p style="font-size: 11.111111640930176px;"><strong style="font-size: 13.333333969116211px; line-height: 15.600000381469727px;">2) Пенополиуретан.</strong></p> <p style="font-size: 11.111111640930176px;"><span style="font-size: small; line-height: 15.600000381469727px;">Пенополиуретан, известный под торговым названием "поролон" - мягкая полиуретановая пена, состоящая на 90% из воздуха. Благодаря мелкоячеистой структуре поролон обладает хорошими показателями эластичности и воздухопроницаемости. Вместе с тем он не является долговечным (быстро теряет упругость, крошится), а также способен гореть с выделением вредных веществ.</span></p> <p style="font-size: 11.111111640930176px;"></p> <p style="font-size: 11.111111640930176px;"><span style="font-size: small; line-height: 15.600000381469727px;"><strong>2) Ватин - Хлопковое полотно.</strong></span></p> <p style="font-size: 11.111111640930176px;"><span style="font-size: small; line-height: 15.600000381469727px;">Хлопковое нетканое волокно (ватин), получаемое из натуральных хлопковых волокон, проходит специальную обработку, затем прессуется и прошивается нитками (холстопрошивное) либо пробивается иглами (иглопробивное) для прочности. Используется в матрасах как дополнительный гигиенический слой, обладающий антиаллергенностью, гигроскопичностью, хорошим пропусканием влаги и воздуха, теплосберегающими свойствами.</span></p> <p style="font-size: 11.111111640930176px;"></p> <p style="font-size: 11.111111640930176px;"><span style="font-size: small; line-height: 15.600000381469727px;"><strong>3) Изоляционная прослойка из термоволока. </strong></span></p> <p style="font-size: 11.111111640930176px;"></p> <p style="font-size: 11.111111640930176px;"><span style="font-size: small; line-height: 15.600000381469727px;"><strong>4) Пружинный блок Punktoflaex.</strong></span></p> <p style="font-size: 11.111111640930176px;"></p> <p style="font-size: 13px;">Цвет и текстура чехла может отличаться от фото и образца в магазине.<br>Размеры матраса имеют погрешность +-1,5 см.</p>' |
| 65 | + ] |
| 66 | + ], |
| 67 | + 'should contain csv' |
| 68 | + ) |
| 69 | +}) |
0 commit comments