/
valzem
/
MatControl
Обзор
Документация
Войти
/
valzem
/
MatControl
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
tests/MatControl.Tests/ExcelImporterTests.cs
138 строк
5 KB
MatControl Dev
Этап 2-3: импорт данных (docx/xls) и главное окно с навигацией
07 авг 2026, 10:05
07 авг 2026, 10:05
7a1b80a
Код
Авторство
О чём код?
using System.Data; using MatControl.Data.Import; using MatControl.Domain; namespace MatControl.Tests; public class ExcelImporterTests { private static DataTable BuildAssetTable() { var table = new DataTable(); for (var i = 0; i < 25; i++) { table.Columns.Add($"C{i}"); } void AddRow(params string[] values) { var row = table.NewRow(); for (var i = 0; i < values.Length; i++) { row[i] = values[i]; } table.Rows.Add(row); } AddRow("Счет", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "Балансовая стоимость", "Количество", "Сумма амортизации", "", "Остаточная стоимость", "Стоимость первоначальная"); AddRow("№ п/п", "", "Основное средство", "", "", "", "", "", "", "Инвентарный номер", "ОКОФ", "", "Амортизационная группа", "Способ", "Дата принятия к учету", "Состояние", "Срок", "Мес. норма", "Износ, %"); AddRow("1", "", "МФУ Pantum M6700D", "", "", "", "", "", "", "330283000127", "330.28.23.23", "", "2", "100%", "18.06.2024", "Введено в эксплуатацию", "36", "2,778", "100", "23432", "1", "23432", "", "0", "23432"); AddRow("2", "", "Принтер HP LJ 1018", "", "", "", "", "", "", "13100169001", "320.26.2", "", "3", "100%", "03.02.2016", "Введено в эксплуатацию", "60", "1,667", "100", "3900", "1", "3900", "", "0", "3900"); AddRow("Итого"); return table; } [Fact] public void ParseAssetTable_ReadsValidRows() { var table = BuildAssetTable(); var result = ExcelImporter.ParseAssetTable(table, "ОС_101.34"); Assert.Equal(2, result.Count); Assert.Equal("330283000127", result[0].InventoryNumber); Assert.Equal("МФУ Pantum M6700D", result[0].Name); Assert.Equal(2024, result[0].YearInUse); Assert.Equal(AssetState.Рабочее, result[0].State); Assert.Equal(23432m, result[0].Price); } [Fact] public void ParseAssetTable_GeneratesPlaceholderNumber_WhenMissing() { var table = BuildAssetTable(); table.Rows[2]["C9"] = string.Empty; var result = ExcelImporter.ParseAssetTable(table, "ОС_101.34"); Assert.Equal("ОС_101.34-001", result[0].InventoryNumber); } [Fact] public void ParseAssetTable_StopsAtItogo() { var table = BuildAssetTable(); table.Rows[4]["C0"] = "Итого"; table.Rows[4]["C2"] = "Лишняя строка"; var result = ExcelImporter.ParseAssetTable(table, "ОС_101.34"); Assert.Equal(2, result.Count); } [Fact] public void ParseAssetTable_ParsesCommaDecimalPrice() { var table = BuildAssetTable(); table.Rows[3]["C19"] = "12345,67"; var result = ExcelImporter.ParseAssetTable(table, "ОС_101.34"); Assert.Equal(12345.67m, result[1].Price); } private static DataTable BuildSupplyTable() { var table = new DataTable(); table.Columns.Add("C0"); table.Columns.Add("C1"); table.Columns.Add("C2"); table.Columns.Add("C3"); void AddRow(params string[] values) { var row = table.NewRow(); for (var i = 0; i < values.Length; i++) { row[i] = values[i]; } table.Rows.Add(row); } AddRow("ИФО", "Цена", "Количество", "Сумма"); AddRow("МОЛ", "", "", ""); AddRow("Служебный ИФО(для переноса)", "", "305", "179532,8"); AddRow("Батарейка GP Lithium CR2032, шт", "185", "3", "555"); AddRow("Блок питания ACCORD ACC-350W-12, 350Вт, 120мм, шт", "731,6", "5", "3658"); AddRow("Жесткий диск 600GB 3,5\"Hot-Swap", "16367", "1", "16367"); AddRow("Итого", "", "305", "179532,8"); return table; } [Fact] public void ParseSupplyTable_RecalculatesTotalSum() { var table = BuildSupplyTable(); var result = ExcelImporter.ParseSupplyTable(table); Assert.Equal(3, result.Count); Assert.Equal(555m, result[0].TotalSum); Assert.Equal(3658m, result[1].TotalSum); Assert.Equal(16367m, result[2].TotalSum); Assert.Equal("Батарейка GP Lithium CR2032, шт", result[0].Name); } [Fact] public void ParseSupplyTable_SkipsNonProductRows() { var table = BuildSupplyTable(); var result = ExcelImporter.ParseSupplyTable(table); Assert.DoesNotContain(result, s => s.Name.Contains("ИФО")); Assert.DoesNotContain(result, s => s.Name.Contains("МОЛ")); } }