< Summary

Information
Class: Services.ApiServices._1CApi.OData.OneCODataError
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/1CApi/OData/OneCODataError.cs
Line coverage
94%
Covered lines: 17
Uncovered lines: 1
Coverable lines: 18
Total lines: 52
Line coverage: 94.4%
Branch coverage
87%
Covered branches: 7
Total branches: 8
Branch coverage: 87.5%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_Method()100%11100%
get_Endpoint()100%11100%
get_StatusCode()100%11100%
get_ReasonPhrase()100%210%
get_Code()100%11100%
get_Message()100%11100%
get_RawBody()100%11100%
ToDetailText()50%22100%
From(...)100%66100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/1CApi/OData/OneCODataError.cs

#LineLine coverage
 1using System.Net;
 2using Services.ApiServices._1CApi.OData.Models;
 3
 4namespace Services.ApiServices._1CApi.OData;
 5
 6/// <summary>
 7/// Ошибка обмена с 1С OData в одном формате для любого метода клиента: что вызывали, что вернула 1С и
 8/// текст ответа целиком (без усечения до 500 символов, которое остаётся только у пользовательских сообщений).
 9/// </summary>
 2410public sealed record OneCODataError(
 1411    string Method,
 1212    string Endpoint,
 1413    int StatusCode,
 014    string? ReasonPhrase,
 2215    string? Code,
 1516    string Message,
 2717    string? RawBody)
 18{
 19    /// <summary>Потолок сырого тела: защита от многомегабайтной HTML-страницы вместо OData-ошибки.</summary>
 20    public const int RawBodyMaxLength = 16000;
 21
 22    /// <summary>Подпись для логов и поля «ответ 1С»: статус, код 1С и полный текст причины.</summary>
 23    public string ToDetailText()
 24    {
 1025        var code = string.IsNullOrWhiteSpace(Code) ? string.Empty : $" [{Code}]";
 1026        return $"HTTP {StatusCode}{code} {Method} {Endpoint}: {Message}";
 27    }
 28
 29    public static OneCODataError From(string method, string endpoint, HttpStatusCode status, string? reason, string? bod
 30    {
 1731        var message = OneCODataErrorFormatter.Format(body);
 1732        if (string.IsNullOrWhiteSpace(message))
 233            message = "(пустое тело)";
 34
 1735        var raw = string.IsNullOrEmpty(body)
 1736            ? null
 1737            : body.Length <= RawBodyMaxLength ? body : body[..RawBodyMaxLength] + "…";
 38
 1739        return new OneCODataError(method, endpoint, (int)status, reason,
 1740            OneCODataErrorFormatter.TryExtractODataCode(body), message, raw);
 41    }
 42}
 43
 44/// <summary>
 45/// Любая ошибка ответа 1С OData. Наследуется от <see cref="InvalidOperationException"/>, чтобы не ломать
 46/// код, который уже ловит ошибки клиента по базовому типу; полные данные ответа — в <see cref="Error"/>.
 47/// </summary>
 48public class OneCODataException(string message, OneCODataError? error = null)
 49    : InvalidOperationException(message)
 50{
 51    public OneCODataError? Error { get; } = error;
 52}