#include #include #include #include "api/DatasetLoadHandles.hpp" #include "net/FakeApiCall.hpp" using namespace geopro::data; using geopro::net::ApiBatch; using geopro::net::ApiResponse; using geopro::net::test::FakeApiCall; namespace { ApiResponse ok() { ApiResponse r; r.code = 200; r.httpStatus = 200; return r; } ApiResponse bad() { ApiResponse r; r.code = 500; r.httpStatus = 200; r.msg = QStringLiteral("boom"); return r; } auto isFailure = [](const ApiResponse& r) { return r.code != 200 || !r.rawError.isEmpty(); }; } TEST(DatasetLoadHandles, ChartLoadEmitsDoneOnSuccess) { auto* a = new FakeApiCall; auto* b = new FakeApiCall; auto* batch = new ApiBatch({a, b}, isFailure); bool parsed = false; auto* load = new ApiChartLoad(batch, [&](const QList& resps) { parsed = (resps.size() == 2); return ChartParts{}; }); QSignalSpy doneSpy(load, &ChartLoad::done); a->fire(ok()); b->fire(ok()); EXPECT_EQ(doneSpy.count(), 1); EXPECT_TRUE(parsed); } TEST(DatasetLoadHandles, ChartLoadEmitsFailedOnBatchFailure) { auto* a = new FakeApiCall; auto* b = new FakeApiCall; auto* batch = new ApiBatch({a, b}, isFailure); auto* load = new ApiChartLoad(batch, [](const QList&) { return ChartParts{}; }); QSignalSpy failSpy(load, &ChartLoad::failed); a->fire(bad()); EXPECT_EQ(failSpy.count(), 1); } TEST(DatasetLoadHandles, ChartLoadEmitsFailedWhenParseThrows) { auto* a = new FakeApiCall; auto* batch = new ApiBatch({a}, isFailure); auto* load = new ApiChartLoad(batch, [](const QList&) -> ChartParts { throw std::runtime_error("parse boom"); }); QSignalSpy doneSpy(load, &ChartLoad::done); QSignalSpy failSpy(load, &ChartLoad::failed); a->fire(ok()); // batch 成功 → parse 抛异常 → failed(emit done 已移出 try) EXPECT_EQ(doneSpy.count(), 0); EXPECT_EQ(failSpy.count(), 1); } TEST(DatasetLoadHandles, GridLoadAbortSuppressesLateDone) { auto* a = new FakeApiCall; auto* batch = new ApiBatch({a}, isFailure); auto* load = new ApiGridLoad(batch, [](const QList&) { return GridParts{}; }); QSignalSpy doneSpy(load, &GridLoad::done); load->abort(); a->fire(ok()); // 迟到 EXPECT_EQ(doneSpy.count(), 0); // batch.aborted_ + load.aborted_ 双闸门 }