Чистая логика вынесена в Application для тестируемости и используется контроллерами: - MovingAverageCost.Compute (скользящее среднее себестоимости) ← SuppliesController.Post - RetailPaymentValidator.IsSufficient (достаточность оплаты) ← RetailSalesController.Post Тесты: - MovingAverageCost: первая приёмка, средневзвешенное, округление до 4 знаков, totalQty=0. - RetailPaymentValidator: ровно/переплата/недоплата, округление до 2 знаков. - StockService.ApplyMovement (SQLite in-memory): материализация Stock+движение, инкремент, отрицательное списание, throw без tenant. - Мультитенантный query-filter AppDbContext: tenant видит своё; чужой не видит; SuperAdmin без override — всё; с override — только выбранную оргу. Все 23 зелёные. EF8 SQLite поддерживает ToJson (EmployeeRole.Permissions). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
14 lines
498 B
C#
14 lines
498 B
C#
using foodmarket.Application.Common.Tenancy;
|
|
|
|
namespace foodmarket.UnitTests.Support;
|
|
|
|
/// <summary>Подменяемый ITenantContext для тестов: значения задаются напрямую,
|
|
/// без HttpContext/JWT.</summary>
|
|
public sealed class FakeTenantContext : ITenantContext
|
|
{
|
|
public Guid? OrganizationId { get; set; }
|
|
public bool IsAuthenticated { get; set; } = true;
|
|
public bool IsSuperAdmin { get; set; }
|
|
public bool IsTenantOverride { get; set; }
|
|
}
|