/
valzem
/
MatControl
Обзор
Документация
Войти
/
valzem
/
MatControl
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
tests/MatControl.Tests/ImportServiceTests.cs
240 строк
8 KB
MatControl Dev
Импорт в разделы, статус-бар, до двух МОЛ, правка списания, скиллы
07 авг 2026, 13:33
07 авг 2026, 13:33
b22f6a8
Код
Авторство
О чём код?
using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; using MatControl.Business; using MatControl.Data; using MatControl.Data.Repositories; using MatControl.Domain; using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging.Abstractions; using OfficeOpenXml; namespace MatControl.Tests; public class ImportServiceTests : IDisposable { private readonly string _dbPath; private readonly string _importDir; public ImportServiceTests() { _dbPath = Path.Combine(Path.GetTempPath(), $"matcontrol_import_{Guid.NewGuid():N}.db"); _importDir = Path.Combine(Path.GetTempPath(), $"matcontrol_import_dir_{Guid.NewGuid():N}"); Directory.CreateDirectory(_importDir); } private static MatControlDbContext CreateContext(string dbPath) { var options = new DbContextOptionsBuilder<MatControlDbContext>() .UseSqlite($"Data Source={dbPath}") .Options; return new MatControlDbContext(options); } private static async Task SeedMolAsync(MatControlDbContext context) { await DbInitializer.InitializeAsync(context); context.Employees.Add(new Employee { FullName = "Тест МОЛ", Position = "МОЛ", IsResponsible = true }); await context.SaveChangesAsync(); } [Fact] public async Task ImportAllAsync_LoadsEmployeesAssetsSupplies_AndDeduplicatesOnSecondRun() { using (var context = CreateContext(_dbPath)) { await SeedMolAsync(context); } CreatePhonebook(); CreateAssetsFile(); CreateSuppliesFile(); using (var context = CreateContext(_dbPath)) { var service = new ImportService( context, new EmployeeRepository(context), new AssetRepository(context), new SupplyRepository(context), new AssetMovementRepository(context), NullLogger<ImportService>.Instance); var first = await service.ImportAllAsync(_importDir); var second = await service.ImportAllAsync(_importDir); Assert.True(first.IsSuccess); Assert.True(second.IsSuccess); Assert.True(first.Value!.EmployeesProcessed >= 2); Assert.True(first.Value.AssetsProcessed >= 1); Assert.True(first.Value.SuppliesProcessed >= 1); Assert.Equal(0, second.Value!.EmployeesProcessed); Assert.Equal(0, second.Value.AssetsProcessed); Assert.Equal(0, second.Value.SuppliesProcessed); Assert.Equal(first.Value.EmployeesProcessed, second.Value.EmployeesSkipped); } using (var verify = CreateContext(_dbPath)) { Assert.True(await verify.Employees.CountAsync() >= 2); Assert.True(await verify.Assets.CountAsync() >= 1); Assert.True(await verify.Supplies.CountAsync() >= 1); var movementCount = await verify.AssetMovements.CountAsync(); Assert.True(movementCount >= 1); } } [Fact] public async Task ImportAssetsFromFileAsync_ImportsAssetsFromSelectedFile() { using (var context = CreateContext(_dbPath)) { await SeedMolAsync(context); } CreateAssetsFile(); using (var context = CreateContext(_dbPath)) { var service = new ImportService( context, new EmployeeRepository(context), new AssetRepository(context), new SupplyRepository(context), new AssetMovementRepository(context), NullLogger<ImportService>.Instance); var result = await service.ImportAssetsFromFileAsync( Path.Combine(_importDir, "ОС_101.34.xls"), "ОС_101.34"); Assert.True(result.IsSuccess); Assert.True(result.Value!.AssetsProcessed >= 1); } using (var verify = CreateContext(_dbPath)) { Assert.True(await verify.Assets.CountAsync() >= 1); } } [Fact] public async Task ImportSuppliesFromFileAsync_ImportsSuppliesFromSelectedFile() { using (var context = CreateContext(_dbPath)) { await SeedMolAsync(context); } CreateSuppliesFile(); using (var context = CreateContext(_dbPath)) { var service = new ImportService( context, new EmployeeRepository(context), new AssetRepository(context), new SupplyRepository(context), new AssetMovementRepository(context), NullLogger<ImportService>.Instance); var result = await service.ImportSuppliesFromFileAsync( Path.Combine(_importDir, "МЗ_105.36.xls")); Assert.True(result.IsSuccess); Assert.True(result.Value!.SuppliesProcessed >= 1); } using (var verify = CreateContext(_dbPath)) { Assert.True(await verify.Supplies.CountAsync() >= 1); } } private void CreatePhonebook() { var path = Path.Combine(_importDir, "Телефонный_справочник_Облкомтруда.docx"); using var document = WordprocessingDocument.Create(path, WordprocessingDocumentType.Document); var mainPart = document.AddMainDocumentPart(); mainPart.Document = new Document(); var body = mainPart.Document.AppendChild(new Body()); var table = body.AppendChild(new Table()); void AddRow(params string[] cells) { var row = new TableRow(); foreach (var cell in cells) { var run = new Run(new Text(cell)); var paragraph = new Paragraph(run); row.Append(new TableCell(paragraph)); } table.Append(row); } AddRow("Должность", "Ф.И.О.", "Ком.", "Тел."); AddRow("Консультант", "ИвановИванИванович", "1", "11-11"); AddRow("Главный специалист", "Петрова Анна Сергеевна", "2", "22-22"); AddRow("УПРАВЛЕНИЕ", ""); AddRow("Начальник", "СидоровСидорСидорович", "3", "33-33"); } private void CreateAssetsFile() { var path = Path.Combine(_importDir, "ОС_101.34.xls"); ExcelPackage.LicenseContext = LicenseContext.NonCommercial; using var package = new ExcelPackage(); var sheet = package.Workbook.Worksheets.Add("Лист_1"); sheet.Cells[9, 1].Value = "№ п/п"; sheet.Cells[9, 3].Value = "Основное средство"; sheet.Cells[9, 10].Value = "Инвентарный номер"; sheet.Cells[9, 13].Value = "Амортизационная группа"; sheet.Cells[9, 15].Value = "Дата принятия к учету"; sheet.Cells[9, 16].Value = "Состояние"; sheet.Cells[4, 20].Value = "Балансовая стоимость"; sheet.Cells[11, 1].Value = "1"; sheet.Cells[11, 3].Value = "МФУ Pantum M6700D"; sheet.Cells[11, 10].Value = "330283000127"; sheet.Cells[11, 15].Value = "18.06.2024"; sheet.Cells[11, 16].Value = "Введено в эксплуатацию"; sheet.Cells[11, 20].Value = "23432"; package.SaveAs(new FileInfo(path)); } private void CreateSuppliesFile() { var path = Path.Combine(_importDir, "МЗ_105.36.xls"); ExcelPackage.LicenseContext = LicenseContext.NonCommercial; using var package = new ExcelPackage(); var sheet = package.Workbook.Worksheets.Add("Лист_1"); sheet.Cells[1, 1].Value = "ИФО"; sheet.Cells[1, 2].Value = "Цена"; sheet.Cells[1, 3].Value = "Количество"; sheet.Cells[1, 4].Value = "Сумма"; sheet.Cells[4, 1].Value = "Батарейка GP Lithium CR2032, шт"; sheet.Cells[4, 2].Value = "185"; sheet.Cells[4, 3].Value = "3"; sheet.Cells[4, 4].Value = "555"; package.SaveAs(new FileInfo(path)); } public void Dispose() { SqliteConnection.ClearAllPools(); if (File.Exists(_dbPath)) { File.Delete(_dbPath); } if (Directory.Exists(_importDir)) { Directory.Delete(_importDir, true); } } }