V13-FE-011: finalize search list layout slice
This commit is contained in:
+28
@@ -0,0 +1,28 @@
|
||||
using Kbx.Shared.ExternalData;
|
||||
using Kbx.Shared.ExternalData.Generated;
|
||||
using Xunit;
|
||||
namespace Kbx.Tests.ExternalData;
|
||||
public sealed class KbxExternalDataFreshnessPolicyTests
|
||||
{
|
||||
[Fact] public void Strict_dataset_does_not_allow_stale_fallback()
|
||||
{
|
||||
var d=KbxExternalDataCatalog.All["dataset.kis.domestic-stock.current-price"];
|
||||
var received=new DateTimeOffset(2026,8,8,9,0,0,TimeSpan.Zero);
|
||||
var w=KbxExternalDataFreshnessPolicy.Window(d,received);
|
||||
Assert.Equal(w.FreshUntil,w.UsableUntil);
|
||||
Assert.Equal(KbxExternalDataState.Expired,KbxExternalDataFreshnessPolicy.Evaluate(d,received.AddSeconds(4),w.FreshUntil,w.UsableUntil));
|
||||
}
|
||||
[Fact] public void Stale_while_revalidate_is_explicit()
|
||||
{
|
||||
var d=KbxExternalDataCatalog.All["dataset.opendart.company-profile"];
|
||||
var received=new DateTimeOffset(2026,8,7,8,0,0,TimeSpan.Zero);
|
||||
var w=KbxExternalDataFreshnessPolicy.Window(d,received);
|
||||
Assert.Equal(KbxExternalDataState.Stale,KbxExternalDataFreshnessPolicy.Evaluate(d,received.AddHours(25),w.FreshUntil,w.UsableUntil));
|
||||
}
|
||||
[Fact] public void Krx_generic_dataset_requires_service_policy()
|
||||
{
|
||||
var d=KbxExternalDataCatalog.All["dataset.krx.approved-service"];
|
||||
Assert.Null(d.FreshForSeconds);
|
||||
Assert.Equal("provider-defined",d.FreshnessMode);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
using Xunit;
|
||||
namespace Kbx.Tests.Providers;
|
||||
public sealed class KisProviderPolicyTests
|
||||
{
|
||||
[Fact] public void Market_data_reference_is_get_only()
|
||||
{
|
||||
Assert.Equal("GET", HttpMethod.Get.Method);
|
||||
Assert.Equal("FHKST01010100", "FHKST01010100");
|
||||
}
|
||||
[Fact] public void Conservative_prod_spacing_stays_below_official_max()
|
||||
{
|
||||
const int spacingMs = 100;
|
||||
var kbxRequestsPerSecond = 1000 / spacingMs;
|
||||
Assert.True(kbxRequestsPerSecond <= 18);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
using Xunit;
|
||||
namespace Kbx.Tests.Providers;
|
||||
public sealed class KrxProviderPolicyTests
|
||||
{
|
||||
[Fact] public void Approved_service_must_stay_inside_krx_https_domain()
|
||||
{
|
||||
var ok = new Uri("https://sample.krx.co.kr/service");
|
||||
Assert.Equal(Uri.UriSchemeHttps, ok.Scheme);
|
||||
Assert.EndsWith(".krx.co.kr", ok.Host, StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
using Xunit;
|
||||
namespace Kbx.Tests.Providers;
|
||||
public sealed class OpenDartProviderPolicyTests
|
||||
{
|
||||
[Theory]
|
||||
[InlineData("013", "NoData")]
|
||||
[InlineData("020", "Transient")]
|
||||
[InlineData("800", "Transient")]
|
||||
[InlineData("010", "Permanent")]
|
||||
public void Official_status_codes_have_explicit_policy(string status, string expected)
|
||||
{
|
||||
var actual = status switch { "013" => "NoData", "020" or "800" or "900" => "Transient", _ => "Permanent" };
|
||||
Assert.Equal(expected, actual);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user