< Summary

Information
Class: Orchestrator.Infrastructure.CompetitionResolver
Assembly: Orchestrator
File(s): /home/runner/work/KicktippAi/KicktippAi/src/Orchestrator/Infrastructure/CompetitionResolver.cs
Line coverage
100%
Covered lines: 34
Uncovered lines: 0
Coverable lines: 34
Total lines: 99
Line coverage: 100%
Branch coverage
93%
Covered branches: 15
Total branches: 16
Branch coverage: 93.7%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
ResolveCompetition(...)100%66100%
ResolveRuntimeMetadata(...)100%44100%
ToRepositoryCompetitionArgument(...)100%22100%
IsWorldCupCompetition(...)100%11100%
get_SupportedDevCommunities()100%11100%
IsDevCommunity(...)50%22100%
IsWorldCupCommunity(...)100%22100%

File(s)

/home/runner/work/KicktippAi/KicktippAi/src/Orchestrator/Infrastructure/CompetitionResolver.cs

#LineLine coverage
 1using EHonda.KicktippAi.Core;
 2
 3namespace Orchestrator.Infrastructure;
 4
 5public sealed record CompetitionRuntimeMetadata(
 6    string Competition,
 7    string PromptSource,
 8    string PromptName,
 9    string PromptLabel,
 10    string FallbackPromptModel);
 11
 12public static class CompetitionResolver
 13{
 114    private static readonly string[] KnownDevCommunities = ["ehonda-dev-wm26"];
 115    private static readonly string[] KnownWorldCupCommunities = ["ehonda-dev-wm26", "rabetrabauken2026", "ehonda-ai-aren
 16
 17    public const string LocalPromptSource = "local";
 18    public const string LangfusePromptSource = "langfuse";
 19    public const string WorldCupMatchPromptName = "kicktippai/wm26/predict-one-match";
 20    public const string WorldCupBonusPromptName = "kicktippai/wm26/predict-bonus";
 21    public const string DefaultWorldCupPromptLabel = "latest";
 22    public const string WorldCupFallbackPromptModel = "wm26";
 23
 24    public static string ResolveCompetition(
 25        string? competition,
 26        string? community = null,
 27        string? communityContext = null)
 28    {
 129        if (!string.IsNullOrWhiteSpace(competition))
 30        {
 131            return competition.Trim();
 32        }
 33
 134        if (IsWorldCupCommunity(community) || IsWorldCupCommunity(communityContext))
 35        {
 136            return CompetitionIds.FifaWorldCup2026;
 37        }
 38
 139        return CompetitionIds.Bundesliga2025_26;
 40    }
 41
 42    public static CompetitionRuntimeMetadata ResolveRuntimeMetadata(
 43        string? competition,
 44        string? community,
 45        string? communityContext,
 46        string? promptSource,
 47        string? langfusePromptName,
 48        string? langfusePromptLabel,
 49        bool bonusPrompt)
 50    {
 151        var resolvedCompetition = ResolveCompetition(competition, community, communityContext);
 152        var isWorldCup = string.Equals(resolvedCompetition, CompetitionIds.FifaWorldCup2026, StringComparison.OrdinalIgn
 153        var resolvedPromptSource = string.IsNullOrWhiteSpace(promptSource)
 154            ? isWorldCup ? LangfusePromptSource : LocalPromptSource
 155            : promptSource.Trim().ToLowerInvariant();
 56
 157        var defaultPromptName = bonusPrompt ? WorldCupBonusPromptName : WorldCupMatchPromptName;
 158        var promptName = string.IsNullOrWhiteSpace(langfusePromptName)
 159            ? isWorldCup ? defaultPromptName : string.Empty
 160            : langfusePromptName.Trim();
 61
 162        var promptLabel = string.IsNullOrWhiteSpace(langfusePromptLabel)
 163            ? isWorldCup ? DefaultWorldCupPromptLabel : string.Empty
 164            : langfusePromptLabel.Trim();
 65
 166        return new CompetitionRuntimeMetadata(
 167            resolvedCompetition,
 168            resolvedPromptSource,
 169            promptName,
 170            promptLabel,
 171            isWorldCup ? WorldCupFallbackPromptModel : string.Empty);
 72    }
 73
 74    public static string? ToRepositoryCompetitionArgument(string competition)
 75    {
 176        return string.Equals(competition, CompetitionIds.Bundesliga2025_26, StringComparison.OrdinalIgnoreCase)
 177            ? null
 178            : competition;
 79    }
 80
 81    public static bool IsWorldCupCompetition(string competition)
 82    {
 183        return string.Equals(competition, CompetitionIds.FifaWorldCup2026, StringComparison.OrdinalIgnoreCase);
 84    }
 85
 186    public static IReadOnlyList<string> SupportedDevCommunities => KnownDevCommunities;
 87
 88    public static bool IsDevCommunity(string? value)
 89    {
 190        return !string.IsNullOrWhiteSpace(value)
 191               && KnownDevCommunities.Contains(value.Trim(), StringComparer.OrdinalIgnoreCase);
 92    }
 93
 94    private static bool IsWorldCupCommunity(string? value)
 95    {
 196        return !string.IsNullOrWhiteSpace(value)
 197               && KnownWorldCupCommunities.Contains(value.Trim(), StringComparer.OrdinalIgnoreCase);
 98    }
 99}