|
|
@@ -26,6 +26,19 @@ public sealed class KosisSyncTests
|
|
|
ClassCode = classCode
|
|
|
};
|
|
|
|
|
|
+ private static AppSettings.KosisSection.KosisIndicator Unemployment(string classCode = "00") => new()
|
|
|
+ {
|
|
|
+ // Code 컬럼 MaxLength(40) — 테스트 고유화 접미사(GUID 32자)를 붙여도 넘지 않도록 짧은 접두사 사용 (운영 Code "UNEMPLOYMENT_RATE"=17자는 여유).
|
|
|
+ Code = $"UNEMP-{Guid.NewGuid():N}",
|
|
|
+ Name = "실업률",
|
|
|
+ OrgId = "101",
|
|
|
+ TblId = "DT_1DA7004S",
|
|
|
+ ItmId = "T80",
|
|
|
+ ObjL1 = "00",
|
|
|
+ Cycle = "M",
|
|
|
+ ClassCode = classCode
|
|
|
+ };
|
|
|
+
|
|
|
[TestMethod]
|
|
|
public async Task Upsert_CpiFixture_FiltersToNationalSeries_ThenIdempotent()
|
|
|
{
|
|
|
@@ -55,6 +68,27 @@ public sealed class KosisSyncTests
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ [TestMethod]
|
|
|
+ public async Task Upsert_EmploymentFixture_FiltersToNationalSeries_ByC1()
|
|
|
+ {
|
|
|
+ // 고용통계(DT_1DA7004S)는 고용률/실업률/취업자수가 한 표에 있고 itmId(T90/T80/T30)로 요청단에서 계열을 가른다.
|
|
|
+ // 지역(C1)은 ClassCode 로 고른다. fixture = 실업률(T80) 전국(00) 2행 + 서울(11) 1행 → ClassCode=00 이면 전국 2행만 적재.
|
|
|
+ var rows = KosisParser.Parse(File.ReadAllText(Path.Combine(FixtureRoot, "employment.json")));
|
|
|
+ var indicator = Unemployment();
|
|
|
+
|
|
|
+ using var db = TestDb.Create();
|
|
|
+ var (inserted, updated) = await KosisImport.UpsertAsync(db, indicator, rows, CancellationToken.None);
|
|
|
+ Assert.AreEqual(2, inserted, "ClassCode=00(전국) 계열만 → 2행 (서울 11 제외)");
|
|
|
+ Assert.AreEqual(0, updated);
|
|
|
+
|
|
|
+ var saved = await db.MacroIndicator.AsNoTracking().Where(c => c.Code == indicator.Code && c.Period == "202505").SingleAsync();
|
|
|
+ Assert.AreEqual(2.8m, saved.Value);
|
|
|
+ Assert.AreEqual("%", saved.Unit);
|
|
|
+
|
|
|
+ var count = await db.MacroIndicator.AsNoTracking().CountAsync(c => c.Code == indicator.Code);
|
|
|
+ Assert.AreEqual(2, count, "서울(11) 계열은 적재되지 않음");
|
|
|
+ }
|
|
|
+
|
|
|
[TestMethod]
|
|
|
public async Task Upsert_EmptyClassCode_AutoLocksToFirstSeries()
|
|
|
{
|