Files
cargoxx/tests/nixpkgs_probe_parse.cpp

82 lines
2.7 KiB
C++

#include <catch2/catch_test_macros.hpp>
import cargoxx.resolver;
import cargoxx.util;
import std;
using cargoxx::resolver::parse_nix_eval_json;
using cargoxx::util::ErrorCode;
TEST_CASE("parse_nix_eval_json extracts version and outPath", "[resolver][nixpkgs]") {
constexpr std::string_view input = R"({
"version": "3.7.0",
"path": "/nix/store/abc-simdjson-3.7.0"
})";
auto r = parse_nix_eval_json("simdjson", input);
REQUIRE(r.has_value());
REQUIRE(r->attr == "simdjson");
REQUIRE(r->version == "3.7.0");
REQUIRE(r->out_path == "/nix/store/abc-simdjson-3.7.0");
}
TEST_CASE("parse_nix_eval_json accepts an empty version field",
"[resolver][nixpkgs]") {
constexpr std::string_view input = R"({
"version": "",
"path": "/nix/store/xyz-foo"
})";
auto r = parse_nix_eval_json("foo", input);
REQUIRE(r.has_value());
REQUIRE(r->version.empty());
REQUIRE(r->out_path == "/nix/store/xyz-foo");
}
TEST_CASE("parse_nix_eval_json fails when outPath is missing",
"[resolver][nixpkgs]") {
constexpr std::string_view input = R"({"version": "1.0"})";
auto r = parse_nix_eval_json("foo", input);
REQUIRE_FALSE(r.has_value());
REQUIRE(r.error().code == ErrorCode::ResolutionNetworkError);
}
TEST_CASE("parse_nix_eval_json fails on garbage input", "[resolver][nixpkgs]") {
auto r = parse_nix_eval_json("foo", "not-json-at-all");
REQUIRE_FALSE(r.has_value());
REQUIRE(r.error().code == ErrorCode::ResolutionNetworkError);
}
TEST_CASE("parse_nix_eval_json fails on a non-object root",
"[resolver][nixpkgs]") {
auto r = parse_nix_eval_json("foo", "[]");
REQUIRE_FALSE(r.has_value());
REQUIRE(r.error().code == ErrorCode::ResolutionNetworkError);
}
TEST_CASE("parse_nix_eval_json captures dev_path when present",
"[resolver][nixpkgs]") {
constexpr std::string_view input = R"({
"version": "21.1.8",
"path": "/nix/store/abc-llvm-21.1.8",
"dev_path": "/nix/store/def-llvm-21.1.8-dev"
})";
auto r = parse_nix_eval_json("libllvm", input);
REQUIRE(r.has_value());
REQUIRE(r->out_path == "/nix/store/abc-llvm-21.1.8");
REQUIRE(r->dev_path == "/nix/store/def-llvm-21.1.8-dev");
}
TEST_CASE("parse_nix_eval_json leaves dev_path empty for single-output packages",
"[resolver][nixpkgs]") {
constexpr std::string_view input = R"({
"version": "2.12.2",
"path": "/nix/store/xyz-hello-2.12.2",
"dev_path": ""
})";
auto r = parse_nix_eval_json("hello", input);
REQUIRE(r.has_value());
REQUIRE(r->out_path == "/nix/store/xyz-hello-2.12.2");
REQUIRE(r->dev_path.empty());
}