< Summary

Information
Class: Orchestrator.Infrastructure.CompetitionRuntimeMetadata
Assembly: Orchestrator
File(s): /home/runner/work/KicktippAi/KicktippAi/src/Orchestrator/Infrastructure/CompetitionResolver.cs
Line coverage
100%
Covered lines: 6
Uncovered lines: 0
Coverable lines: 6
Total lines: 99
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%

File(s)

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

#LineLine coverage
 1using EHonda.KicktippAi.Core;
 2
 3namespace Orchestrator.Infrastructure;
 4
 15public sealed record CompetitionRuntimeMetadata(
 16    string Competition,
 17    string PromptSource,
 18    string PromptName,
 19    string PromptLabel,
 110    string FallbackPromptModel);
 11
 12public static class CompetitionResolver
 13{
 14    private static readonly string[] KnownDevCommunities = ["ehonda-dev-wm26"];
 15    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    {
 29        if (!string.IsNullOrWhiteSpace(competition))
 30        {
 31            return competition.Trim();
 32        }
 33
 34        if (IsWorldCupCommunity(community) || IsWorldCupCommunity(communityContext))
 35        {
 36            return CompetitionIds.FifaWorldCup2026;
 37        }
 38
 39        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    {
 51        var resolvedCompetition = ResolveCompetition(competition, community, communityContext);
 52        var isWorldCup = string.Equals(resolvedCompetition, CompetitionIds.FifaWorldCup2026, StringComparison.OrdinalIgn
 53        var resolvedPromptSource = string.IsNullOrWhiteSpace(promptSource)
 54            ? isWorldCup ? LangfusePromptSource : LocalPromptSource
 55            : promptSource.Trim().ToLowerInvariant();
 56
 57        var defaultPromptName = bonusPrompt ? WorldCupBonusPromptName : WorldCupMatchPromptName;
 58        var promptName = string.IsNullOrWhiteSpace(langfusePromptName)
 59            ? isWorldCup ? defaultPromptName : string.Empty
 60            : langfusePromptName.Trim();
 61
 62        var promptLabel = string.IsNullOrWhiteSpace(langfusePromptLabel)
 63            ? isWorldCup ? DefaultWorldCupPromptLabel : string.Empty
 64            : langfusePromptLabel.Trim();
 65
 66        return new CompetitionRuntimeMetadata(
 67            resolvedCompetition,
 68            resolvedPromptSource,
 69            promptName,
 70            promptLabel,
 71            isWorldCup ? WorldCupFallbackPromptModel : string.Empty);
 72    }
 73
 74    public static string? ToRepositoryCompetitionArgument(string competition)
 75    {
 76        return string.Equals(competition, CompetitionIds.Bundesliga2025_26, StringComparison.OrdinalIgnoreCase)
 77            ? null
 78            : competition;
 79    }
 80
 81    public static bool IsWorldCupCompetition(string competition)
 82    {
 83        return string.Equals(competition, CompetitionIds.FifaWorldCup2026, StringComparison.OrdinalIgnoreCase);
 84    }
 85
 86    public static IReadOnlyList<string> SupportedDevCommunities => KnownDevCommunities;
 87
 88    public static bool IsDevCommunity(string? value)
 89    {
 90        return !string.IsNullOrWhiteSpace(value)
 91               && KnownDevCommunities.Contains(value.Trim(), StringComparer.OrdinalIgnoreCase);
 92    }
 93
 94    private static bool IsWorldCupCommunity(string? value)
 95    {
 96        return !string.IsNullOrWhiteSpace(value)
 97               && KnownWorldCupCommunities.Contains(value.Trim(), StringComparer.OrdinalIgnoreCase);
 98    }
 99}