test: gate the sqs e2e test on its feature and pin the ee ref

Review findings: without `sqs_trigger` the test built and ran against a
server with no listener, so it could only time out; the aws-sdk-sqs dev
dependency comes from `private`, which is why the old `#[ignore]` hid it.

Also bump ee-repo-ref.txt so CI compiles the EE companion branch (the unit
tests live there), drop a redundant set_var that raced other test threads,
and stop the drain loop defaulting absent attributes to zero, which let the
ack assertion pass on a broken response.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Alex Petric
2026-09-21 12:59:48 -04:00
co-authored by Claude Opus 5
parent 19aa56f96b
commit ee1de09a9e
2 changed files with 16 additions and 20 deletions
+1 -1
View File
@@ -1 +1 @@
5370ae3a95a3dc10171f72da74286a654996eee6
38699f705abb4e223d86e18b30d004aeaf589401
@@ -1,16 +1,10 @@
/*!
* End-to-end integration tests for Windmill trigger listeners.
*
* Each test is `#[ignore]` because it requires a running external service
* (MQTT broker, NATS server, Kafka broker, etc.). See individual test doc
* comments for setup instructions.
*
* Quick start — use the helper scripts in `tests/fixtures/`:
* ```bash
* ./tests/fixtures/start_all_triggers.sh # start all services
* ./tests/fixtures/start_all_triggers.sh oss # start OSS services only
* ./tests/fixtures/start_all_triggers.sh stop # tear down everything
* ```
* Most tests are `#[ignore]` because they need an external service (MQTT broker,
* NATS server, Kafka broker, ...) that nothing starts for them. `test_sqs_e2e` is
* the exception: CI runs a LocalStack service for it, so it is not ignored. See
* each test's doc comment for how to run it locally.
*
* The general pattern:
* 1. Insert a test script + trigger row + resource into the DB
@@ -720,16 +714,16 @@ async fn test_nats_e2e(db: Pool<Postgres>) -> anyhow::Result<()> {
/// cargo test --test trigger_e2e test_sqs_e2e \
/// --features sqs_trigger,enterprise,private -- --nocapture
/// ```
#[cfg(all(feature = "enterprise", feature = "private"))]
// `sqs_trigger` is what makes run_server spawn the SQS listener; the aws-sdk-sqs dev
// dependency arrives with `private`, so without this gate the test would build, run
// against a server that has no listener, and time out.
#[cfg(all(feature = "sqs_trigger", feature = "enterprise", feature = "private"))]
#[sqlx::test(migrations = "../migrations", fixtures("base"))]
async fn test_sqs_e2e(db: Pool<Postgres>) -> anyhow::Result<()> {
use aws_sdk_sqs::types::QueueAttributeName;
initialize_tracing().await;
// The SQS listener uses aws_config which respects AWS_ENDPOINT_URL for LocalStack.
std::env::set_var("AWS_ENDPOINT_URL", "http://localhost:4566");
let script_path = "f/test/sqs_e2e_handler";
insert_test_script(&db, script_path).await?;
@@ -788,7 +782,8 @@ async fn test_sqs_e2e(db: Pool<Postgres>) -> anyhow::Result<()> {
.await?;
let job = poll_for_trigger_job(&db, script_path, "sqs", Duration::from_secs(30)).await?;
// The handler script has no preprocessor, so the args are exactly the v1 payload.
// No preprocessor, so the args are the bare payload map with no `wm_trigger` extra.
// (SQS resolves to the V2 format here, but its v1 and v2 payload fns are identical.)
assert_eq!(
job.args.as_deref(),
Some(&json!({ "msg": "hello from sqs e2e test" })),
@@ -807,14 +802,15 @@ async fn test_sqs_e2e(db: Pool<Postgres>) -> anyhow::Result<()> {
.attribute_names(QueueAttributeName::ApproximateNumberOfMessagesNotVisible)
.send()
.await?;
let count = |name| {
// Both attributes are always returned when requested, so treating a missing or
// unparseable one as zero would let the assertion pass on a broken response.
let count = |name: QueueAttributeName| {
attrs
.attributes()
.and_then(|a| a.get(&name))
.map(String::as_str)
.unwrap_or("0")
.unwrap_or_else(|| panic!("SQS did not return {name:?}"))
.parse::<u32>()
.unwrap_or(0)
.expect("SQS returned a non-numeric message count")
};
let visible = count(QueueAttributeName::ApproximateNumberOfMessages);
let in_flight = count(QueueAttributeName::ApproximateNumberOfMessagesNotVisible);