Skip to content

Commit f983559

Browse files
committed
Stabilize PR tests and isolate live service checks
1 parent 2bd9abc commit f983559

3 files changed

Lines changed: 107 additions & 41 deletions

File tree

‎.github/workflows/Integration.yml‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,6 @@ jobs:
3131
- name: Test
3232
env:
3333
VSTEST_CONNECTION_TIMEOUT: '600'
34-
# BOM's live WDP backend intermittently returns HTTP 500 DatasourceError.
35-
# Keep offline BOM validation and all other tests in the PR gate.
36-
run: dotnet test -c Release --no-build --filter "TestCategory!=BOMIntegration"
34+
# Live provider outages and full-record download timeouts must not block PRs.
35+
# Keep deterministic download, parsing, validation, and numerical tests in the gate.
36+
run: dotnet test -c Release --no-build --filter "TestCategory!=LiveServiceIntegration"

‎Test_Numerics/Data/Time Series/Test_TimeSeriesDownload.cs‎

Lines changed: 39 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,17 @@ namespace Data.TimeSeriesAnalysis
1616
/// <summary>
1717
/// Provides integration and validation tests for the <see cref="TimeSeriesDownload"/> class,
1818
/// including downloads from the Canadian Hydrometric Monitoring Network (CHMN),
19-
/// the United States Geological Survey (USGS), and the Global Historical Climatology Network (GHCN).
19+
/// the United States Geological Survey (USGS), the Global Historical Climatology Network (GHCN),
20+
/// and the Australian Bureau of Meteorology (BOM).
2021
/// </summary>
2122
/// <remarks>
2223
/// <para>
24+
/// Live provider checks carry the <c>LiveServiceIntegration</c> category and are excluded from
25+
/// PR integration. Run them explicitly with
26+
/// <c>dotnet test -c Release --filter "TestCategory=LiveServiceIntegration"</c>.
27+
/// Offline request, parsing, and input-validation tests remain in the PR gate.
28+
/// </para>
29+
/// <para>
2330
/// <b> Authors: </b>
2431
/// <list type="bullet">
2532
/// <item>Haden Smith, USACE Risk Management Center, cole.h.smith@usace.army.mil</item>
@@ -887,7 +894,7 @@ public void RejectIPv6BindEndPoint_ReturnsNullForIPv4()
887894
/// <summary>
888895
/// Validates a full-period-of-record download for the CHMN Cold River station (flow).
889896
/// </summary>
890-
[TestMethod, TestCategory("Integration")]
897+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration")]
891898
public async Task CHMN_FullPor_ColdRiver_Flow()
892899
{
893900
if (!await ChmnAvailable()) return;
@@ -898,7 +905,7 @@ public async Task CHMN_FullPor_ColdRiver_Flow()
898905
/// <summary>
899906
/// Validates a full-period-of-record download for the CHMN Lillooet River station (flow).
900907
/// </summary>
901-
[TestMethod, TestCategory("Integration")]
908+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration")]
902909
public async Task CHMN_FullPor_Lillooet_Flow()
903910
{
904911
if (!await ChmnAvailable()) return;
@@ -909,7 +916,7 @@ public async Task CHMN_FullPor_Lillooet_Flow()
909916
/// <summary>
910917
/// Validates a full-period-of-record download for the CHMN Capilano River station (flow).
911918
/// </summary>
912-
[TestMethod, TestCategory("Integration")]
919+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration")]
913920
public async Task CHMN_FullPor_Capilano_Flow()
914921
{
915922
if (!await ChmnAvailable()) return;
@@ -920,7 +927,7 @@ public async Task CHMN_FullPor_Capilano_Flow()
920927
/// <summary>
921928
/// Tests flow unit conversions (cms ↔ cfs) for CHMN data.
922929
/// </summary>
923-
[TestMethod, TestCategory("Integration")]
930+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration")]
924931
public async Task CHMN_UnitConversion_Flow_CmsCfs()
925932
{
926933
if (!await ChmnAvailable()) return;
@@ -946,7 +953,7 @@ public async Task CHMN_UnitConversion_Flow_CmsCfs()
946953
/// <summary>
947954
/// Tests stage unit conversions (m ↔ ft) for CHMN data.
948955
/// </summary>
949-
[TestMethod, TestCategory("Integration")]
956+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration")]
950957
public async Task CHMN_UnitConversion_Stage_MFt()
951958
{
952959
if (!await ChmnAvailable()) return;
@@ -993,7 +1000,7 @@ await TimeSeriesDownload.FromCHMN(CHMN_1,
9931000
/// <summary>
9941001
/// Tests CHMN instantaneous discharge download (real-time 5-minute data).
9951002
/// </summary>
996-
[TestMethod, TestCategory("Integration")]
1003+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration")]
9971004
public async Task CHMN_InstantaneousDischarge_Works()
9981005
{
9991006
if (!await ChmnAvailable()) return;
@@ -1008,7 +1015,7 @@ public async Task CHMN_InstantaneousDischarge_Works()
10081015
/// <summary>
10091016
/// Tests CHMN instantaneous stage download (real-time 5-minute data).
10101017
/// </summary>
1011-
[TestMethod, TestCategory("Integration")]
1018+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration")]
10121019
public async Task CHMN_InstantaneousStage_Works()
10131020
{
10141021
if (!await ChmnAvailable()) return;
@@ -1023,7 +1030,7 @@ public async Task CHMN_InstantaneousStage_Works()
10231030
/// <summary>
10241031
/// Tests CHMN peak discharge download (annual instantaneous maximums).
10251032
/// </summary>
1026-
[TestMethod, TestCategory("Integration")]
1033+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration")]
10271034
public async Task CHMN_PeakDischarge_Works()
10281035
{
10291036
if (!await ChmnAvailable()) return;
@@ -1038,7 +1045,7 @@ public async Task CHMN_PeakDischarge_Works()
10381045
/// <summary>
10391046
/// Tests CHMN peak stage download (annual instantaneous maximums).
10401047
/// </summary>
1041-
[TestMethod, TestCategory("Integration")]
1048+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration")]
10421049
public async Task CHMN_PeakStage_Works()
10431050
{
10441051
if (!await ChmnAvailable()) return;
@@ -1371,7 +1378,7 @@ private static async Task VerifyUsgsInstantaneousDownloadIsIrregular(
13711378
/// <summary>
13721379
/// Tests full-period-of-record USGS daily discharge download.
13731380
/// </summary>
1374-
[TestMethod, TestCategory("Integration")]
1381+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration")]
13751382
public async Task USGS_FullPor_DailyDischarge()
13761383
{
13771384
if (!await UsgsAvailable()) return;
@@ -1383,7 +1390,7 @@ public async Task USGS_FullPor_DailyDischarge()
13831390
/// <summary>
13841391
/// Tests USGS daily stage download for correctness and continuity.
13851392
/// </summary>
1386-
[TestMethod, TestCategory("Integration")]
1393+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration")]
13871394
public async Task USGS_FullPor_DailyStage()
13881395
{
13891396
if (!await UsgsAvailable()) return;
@@ -1395,7 +1402,7 @@ public async Task USGS_FullPor_DailyStage()
13951402
/// <summary>
13961403
/// Tests USGS peak discharge data retrieval for non-daily data.
13971404
/// </summary>
1398-
[TestMethod, TestCategory("Integration")]
1405+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration")]
13991406
public async Task USGS_PeakDischarge_Works()
14001407
{
14011408
if (!await UsgsAvailable()) return;
@@ -1431,7 +1438,7 @@ await TimeSeriesDownload.FromUSGS(USGS_1,
14311438
/// <summary>
14321439
/// Tests USGS field measurement discharge data retrieval from the OGC API.
14331440
/// </summary>
1434-
[TestMethod, TestCategory("Integration")]
1441+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration")]
14351442
public async Task USGS_MeasuredDischarge_Works()
14361443
{
14371444
if (!await UsgsAvailable()) return;
@@ -1454,7 +1461,7 @@ public async Task USGS_MeasuredDischarge_Works()
14541461
/// <summary>
14551462
/// Tests USGS field measurement stage (gage height) data retrieval from the OGC API.
14561463
/// </summary>
1457-
[TestMethod, TestCategory("Integration")]
1464+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration")]
14581465
public async Task USGS_MeasuredStage_Works()
14591466
{
14601467
if (!await UsgsAvailable()) return;
@@ -1477,7 +1484,7 @@ public async Task USGS_MeasuredStage_Works()
14771484
/// <summary>
14781485
/// Tests USGS peak stage data retrieval.
14791486
/// </summary>
1480-
[TestMethod, TestCategory("Integration")]
1487+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration")]
14811488
public async Task USGS_PeakStage_Works()
14821489
{
14831490
if (!await UsgsAvailable()) return;
@@ -1493,7 +1500,7 @@ public async Task USGS_PeakStage_Works()
14931500
/// <summary>
14941501
/// Tests USGS instantaneous discharge download.
14951502
/// </summary>
1496-
[TestMethod, TestCategory("Integration")]
1503+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration")]
14971504
public async Task USGS_InstantaneousDischarge_Works()
14981505
{
14991506
if (!await UsgsAvailable()) return;
@@ -1508,7 +1515,7 @@ public async Task USGS_InstantaneousDischarge_Works()
15081515
/// <summary>
15091516
/// Tests USGS instantaneous stage download.
15101517
/// </summary>
1511-
[TestMethod, TestCategory("Integration")]
1518+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration")]
15121519
public async Task USGS_InstantaneousStage_Works()
15131520
{
15141521
if (!await UsgsAvailable()) return;
@@ -1652,7 +1659,7 @@ await TimeSeriesDownload.FromGHCN(
16521659
/// The ceiling guards against connection-establishment regressions: walking dead IPv6
16531660
/// addresses before IPv4 once made this download take minutes instead of seconds.
16541661
/// </remarks>
1655-
[TestMethod, TestCategory("Integration")]
1662+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration")]
16561663
[Timeout(60000, CooperativeCancellation = true)]
16571664
public async Task GHCN_FullPor_Precipitation()
16581665
{
@@ -1668,7 +1675,7 @@ public async Task GHCN_FullPor_Precipitation()
16681675
/// The ceiling guards against connection-establishment regressions: walking dead IPv6
16691676
/// addresses before IPv4 once made this download take minutes instead of seconds.
16701677
/// </remarks>
1671-
[TestMethod, TestCategory("Integration")]
1678+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration")]
16721679
[Timeout(60000, CooperativeCancellation = true)]
16731680
public async Task GHCN_FullPor_Snow()
16741681
{
@@ -1681,7 +1688,7 @@ public async Task GHCN_FullPor_Snow()
16811688
/// <summary>
16821689
/// Tests precipitation unit conversion between millimeters and inches.
16831690
/// </summary>
1684-
[TestMethod, TestCategory("Integration")]
1691+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration")]
16851692
public async Task GHCN_UnitConversion_Mm_In()
16861693
{
16871694
if (!await GhcnAvailable()) return;
@@ -1705,7 +1712,7 @@ public async Task GHCN_UnitConversion_Mm_In()
17051712
/// <summary>
17061713
/// Tests precipitation unit conversion between millimeters and centimeters.
17071714
/// </summary>
1708-
[TestMethod, TestCategory("Integration")]
1715+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration")]
17091716
public async Task GHCN_UnitConversion_Mm_Cm()
17101717
{
17111718
if (!await GhcnAvailable()) return;
@@ -1756,7 +1763,7 @@ await TimeSeriesDownload.FromGHCN(GHCN_1,
17561763
/// <summary>
17571764
/// Validates a full-period-of-record download for the BOM Cotter River station (discharge).
17581765
/// </summary>
1759-
[TestMethod, TestCategory("Integration"), TestCategory("BOMIntegration")]
1766+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration"), TestCategory("BOMIntegration")]
17601767
public async Task BOM_FullPor_CotterRiver_Discharge()
17611768
{
17621769
if (!await BomAvailable()) return;
@@ -1767,7 +1774,7 @@ public async Task BOM_FullPor_CotterRiver_Discharge()
17671774
/// <summary>
17681775
/// Validates a full-period-of-record download for the BOM Goodradigbee River station (discharge).
17691776
/// </summary>
1770-
[TestMethod, TestCategory("Integration"), TestCategory("BOMIntegration")]
1777+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration"), TestCategory("BOMIntegration")]
17711778
public async Task BOM_FullPor_Goodradigbee_Discharge()
17721779
{
17731780
if (!await BomAvailable()) return;
@@ -1778,7 +1785,7 @@ public async Task BOM_FullPor_Goodradigbee_Discharge()
17781785
/// <summary>
17791786
/// Validates a full-period-of-record download for the BOM Murray River station (stage).
17801787
/// </summary>
1781-
[TestMethod, TestCategory("Integration"), TestCategory("BOMIntegration")]
1788+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration"), TestCategory("BOMIntegration")]
17821789
public async Task BOM_FullPor_MurrayRiver_Stage()
17831790
{
17841791
if (!await BomAvailable()) return;
@@ -1789,7 +1796,7 @@ public async Task BOM_FullPor_MurrayRiver_Stage()
17891796
/// <summary>
17901797
/// Tests discharge unit conversions (cms ↔ cfs) for BOM data.
17911798
/// </summary>
1792-
[TestMethod, TestCategory("Integration"), TestCategory("BOMIntegration")]
1799+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration"), TestCategory("BOMIntegration")]
17931800
public async Task BOM_UnitConversion_Discharge_CmsCfs()
17941801
{
17951802
if (!await BomAvailable()) return;
@@ -1815,7 +1822,7 @@ public async Task BOM_UnitConversion_Discharge_CmsCfs()
18151822
/// <summary>
18161823
/// Tests stage unit conversions (m ↔ ft) for BOM data.
18171824
/// </summary>
1818-
[TestMethod, TestCategory("Integration"), TestCategory("BOMIntegration")]
1825+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration"), TestCategory("BOMIntegration")]
18191826
public async Task BOM_UnitConversion_Stage_MFt()
18201827
{
18211828
if (!await BomAvailable()) return;
@@ -1862,7 +1869,7 @@ await TimeSeriesDownload.FromABOM(BOM_1,
18621869
/// <summary>
18631870
/// Tests BOM with a windowed date range to verify date filtering works correctly.
18641871
/// </summary>
1865-
[TestMethod, TestCategory("Integration"), TestCategory("BOMIntegration")]
1872+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration"), TestCategory("BOMIntegration")]
18661873
public async Task BOM_WindowedDownload_Works()
18671874
{
18681875
if (!await BomAvailable()) return;
@@ -1887,7 +1894,7 @@ public async Task BOM_WindowedDownload_Works()
18871894
/// <summary>
18881895
/// Validates instantaneous discharge download from BOM.
18891896
/// </summary>
1890-
[TestMethod, TestCategory("Integration"), TestCategory("BOMIntegration")]
1897+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration"), TestCategory("BOMIntegration")]
18911898
public async Task BOM_InstantaneousDischarge_Works()
18921899
{
18931900
if (!await BomAvailable()) return;
@@ -1901,7 +1908,7 @@ public async Task BOM_InstantaneousDischarge_Works()
19011908
/// <summary>
19021909
/// Validates instantaneous stage download from BOM.
19031910
/// </summary>
1904-
[TestMethod, TestCategory("Integration"), TestCategory("BOMIntegration")]
1911+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration"), TestCategory("BOMIntegration")]
19051912
public async Task BOM_InstantaneousStage_Works()
19061913
{
19071914
if (!await BomAvailable()) return;
@@ -1915,7 +1922,7 @@ public async Task BOM_InstantaneousStage_Works()
19151922
/// <summary>
19161923
/// Validates daily precipitation download from BOM.
19171924
/// </summary>
1918-
[TestMethod, TestCategory("Integration"), TestCategory("BOMIntegration")]
1925+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration"), TestCategory("BOMIntegration")]
19191926
public async Task BOM_DailyPrecipitation_Works()
19201927
{
19211928
if (!await BomAvailable()) return;
@@ -1929,7 +1936,7 @@ public async Task BOM_DailyPrecipitation_Works()
19291936
/// <summary>
19301937
/// Tests precipitation unit conversions (mm ↔ inches) for BOM data.
19311938
/// </summary>
1932-
[TestMethod, TestCategory("Integration"), TestCategory("BOMIntegration")]
1939+
[TestMethod, TestCategory("Integration"), TestCategory("LiveServiceIntegration"), TestCategory("BOMIntegration")]
19331940
public async Task BOM_UnitConversion_Precip_MmIn()
19341941
{
19351942
if (!await BomAvailable()) return;

0 commit comments

Comments
 (0)