< Summary

Information
Class: Services.DocumentationServices.FunctionInventoryMetadata
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/DocumentationServices/FunctionInventoryMetadata.cs
Line coverage
100%
Covered lines: 38
Uncovered lines: 0
Coverable lines: 38
Total lines: 63
Line coverage: 100%
Branch coverage
100%
Covered branches: 8
Total branches: 8
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
BuildActionId(...)100%11100%
InferUserStory(...)100%22100%
InferExpectedBehavior(...)100%22100%
InferHttpMethod(...)100%44100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/DocumentationServices/FunctionInventoryMetadata.cs

#LineLine coverage
 1namespace Services.DocumentationServices;
 2
 3/// <summary>
 4/// Шаблоны user story и expected behavior для реестра function-inventory.
 5/// Дублирует логику <c>Scripts/generate-function-inventory.py</c>.
 6/// </summary>
 7public static class FunctionInventoryMetadata
 8{
 19    private static readonly IReadOnlyDictionary<string, string> StoryTemplates =
 110        new Dictionary<string, string>(StringComparer.Ordinal)
 111        {
 112            ["Orders"] = "Как менеджер заказов, я хочу {action}, чтобы управлять списком заказов Ozon.",
 113            ["Transaction"] = "Как оператор, я хочу {action}, чтобы просматривать журнал транзакций.",
 114            ["BitrixStock"] = "Как менеджер остатков, я хочу {action}, чтобы синхронизировать склад Ozon ↔ Bitrix.",
 115            ["BackgroundJobs"] = "Как администратор, я хочу {action}, чтобы настраивать автоматические фоновые задания."
 116            ["TransactionJobs"] = "Как администратор, я хочу {action}, чтобы управлять автоматической обработкой транзак
 117            ["Labels"] = "Как логист, я хочу {action}, чтобы печатать этикетки Ozon.",
 118            ["WarehouseStock"] = "Как кладовщик, я хочу {action}, чтобы сверять остатки со Google Sheets.",
 119            ["AccessProfiles"] = "Как администратор, я хочу {action}, чтобы настроить профиль доступа пользователя.",
 120            ["User"] = "Как администратор, я хочу {action}, чтобы управлять учётными записями.",
 121            ["Catalog"] = "Как бухгалтер, я хочу {action}, чтобы просмотреть справочник 1С Fresh через OData.",
 122            ["Document"] = "Как бухгалтер, я хочу {action}, чтобы просмотреть документ 1С Fresh через OData.",
 123        };
 24
 125    private static readonly IReadOnlyDictionary<string, string> ExpectedByAction =
 126        new Dictionary<string, string>(StringComparer.Ordinal)
 127        {
 128            ["Index"] = "Возвращает HTML-страницу со списком; требует авторизации; применяет RLS где настроено.",
 129            ["Create"] = "GET — форма создания; POST — сохранение с валидацией и редиректом на список.",
 130            ["Edit"] = "GET — форма редактирования по id; POST — обновление записи.",
 131            ["Delete"] = "POST — удаление по id с antiforgery; редирект или JSON-ответ.",
 132            ["Details"] = "GET — детальная карточка сущности по id; 404 если не найдено.",
 133        };
 34
 135    private static readonly HashSet<string> DefaultPostActions = new(StringComparer.Ordinal)
 136    {
 137        "Create", "Edit", "Delete", "Update", "Save", "Submit",
 138    };
 39
 40    public static string BuildActionId(string area, string controller, string action) =>
 141        $"{area}:{controller}:{action}";
 42
 43    public static string InferUserStory(string controller, string action)
 44    {
 345        if (StoryTemplates.TryGetValue(controller, out var template))
 246            return template.Replace("{action}", action.ToLowerInvariant(), StringComparison.Ordinal);
 47
 148        return $"Как пользователь системы, я хочу выполнить {controller}/{action}, чтобы получить ожидаемый результат.";
 49    }
 50
 51    public static string InferExpectedBehavior(string action) =>
 352        ExpectedByAction.TryGetValue(action, out var expected)
 353            ? expected
 354            : "HTTP-ответ согласно коду action; ошибки — через ModelState, NotFound или JSON error.";
 55
 56    public static string InferHttpMethod(string? explicitVerb, string action)
 57    {
 458        if (!string.IsNullOrWhiteSpace(explicitVerb))
 259            return explicitVerb;
 60
 261        return DefaultPostActions.Contains(action) ? "POST" : "GET";
 62    }
 63}