refactor(dynamic): extend Rabbit AMQP protocol emulator with exchange/queue management, publisher confirms, nack/reject handling, and enhanced test coverage

This commit is contained in:
elipeter 2026-05-27 13:42:23 -05:00
parent fd5e1f3e89
commit 030b054843
4 changed files with 667 additions and 37 deletions

View file

@ -101,6 +101,13 @@ fn make_spec_with_adapter(
spec
}
fn assert_extra_file_contains(files: &[(String, String)], path: &str, needle: &str, context: &str) {
assert!(
files.iter().any(|(p, c)| p == path && c.contains(needle)),
"{context} must stage {path} containing {needle:?}; got {files:?}"
);
}
// ── Supported-set assertions ──────────────────────────────────────────────────
#[test]
@ -354,6 +361,129 @@ fn message_handler_java_rabbit_tries_real_client_before_fallbacks() {
);
}
#[test]
fn message_handler_real_client_runtime_deps_are_staged_from_adapter() {
let py_kafka = lang::emit(&make_spec_with_adapter(
Lang::Python,
"orders",
"handler",
entry_file("kafka_python"),
"kafka-python",
))
.expect("emit kafka-python");
assert_extra_file_contains(
&py_kafka.extra_files,
"requirements.txt",
"kafka-python",
"kafka-python",
);
let py_pubsub = lang::emit(&make_spec_with_adapter(
Lang::Python,
"projects/p/subscriptions/s",
"callback",
entry_file("pubsub_python"),
"pubsub-python",
))
.expect("emit pubsub-python");
assert_extra_file_contains(
&py_pubsub.extra_files,
"requirements.txt",
"google-cloud-pubsub",
"pubsub-python",
);
let py_rabbit = lang::emit(&make_spec_with_adapter(
Lang::Python,
"work",
"on_message",
entry_file("rabbit_python"),
"rabbit-python",
))
.expect("emit rabbit-python");
assert_extra_file_contains(
&py_rabbit.extra_files,
"requirements.txt",
"pika",
"rabbit-python",
);
let node_sqs = lang::emit(&make_spec_with_adapter(
Lang::JavaScript,
"jobs",
"handler",
entry_file("sqs_node"),
"sqs-node",
))
.expect("emit sqs-node");
assert_extra_file_contains(
&node_sqs.extra_files,
"package.json",
"@aws-sdk/client-sqs",
"sqs-node",
);
let java_kafka = lang::emit(&make_spec_with_adapter(
Lang::Java,
"orders",
"onMessage",
entry_file("kafka_java"),
"kafka-java",
))
.expect("emit kafka-java");
assert_extra_file_contains(
&java_kafka.extra_files,
"pom.xml",
"kafka-clients",
"kafka-java",
);
let java_rabbit = lang::emit(&make_spec_with_adapter(
Lang::Java,
"work",
"onMessage",
entry_file("rabbit_java"),
"rabbit-java",
))
.expect("emit rabbit-java");
assert_extra_file_contains(
&java_rabbit.extra_files,
"pom.xml",
"amqp-client",
"rabbit-java",
);
let go_pubsub = lang::emit(&make_spec_with_adapter(
Lang::Go,
"my-sub",
"OnMessage",
entry_file("pubsub_go"),
"pubsub-go",
))
.expect("emit pubsub-go");
assert_extra_file_contains(
&go_pubsub.extra_files,
"go.mod",
"cloud.google.com/go/pubsub",
"pubsub-go",
);
let go_nats = lang::emit(&make_spec_with_adapter(
Lang::Go,
"events",
"OnMessage",
entry_file("nats_go"),
"nats-go",
))
.expect("emit nats-go");
assert_extra_file_contains(
&go_nats.extra_files,
"go.mod",
"github.com/nats-io/nats.go",
"nats-go",
);
}
#[test]
fn message_handler_go_pubsub_tries_real_client_before_fallbacks() {
let spec = make_spec_with_adapter(

View file

@ -752,8 +752,33 @@ fn graphql_resolver_js_harness_carries_sentinel_and_field() {
let h = lang::emit(&spec).expect("emit ok");
assert!(h.source.contains("__NYX_GRAPHQL_RESOLVER__"));
assert!(h.source.contains("\"resolveUser\""));
assert!(h.source.contains("_nyxTryApolloServer"));
assert!(h.source.contains("require('@apollo/server')"));
assert!(h.source.contains("_nyxTryGraphqlJs"));
assert!(h.source.contains("require('graphql')"));
assert!(
h.source.find("_nyxTryApolloServer").unwrap() < h.source.find("_nyxTryGraphqlJs").unwrap(),
"Apollo Server should run before the GraphQL.js fallback"
);
}
#[test]
fn graphql_resolver_js_apollo_stages_runtime_deps() {
let spec = framework_bound_spec(
Lang::JavaScript,
EvEntryKind::GraphQLResolver {
type_name: "Query".into(),
field: "user".into(),
},
"resolveUser",
"tests/dynamic_fixtures/graphql_resolver/apollo/vuln.js",
"graphql-apollo",
);
let h = lang::emit(&spec).expect("emit ok");
let package = extra_file_content(&h.extra_files, "package.json");
assert!(package.contains("\"@apollo/server\""));
assert!(package.contains("\"apollo-server\""));
assert!(package.contains("\"graphql\""));
}
#[test]