#![allow(unused)]
use lambda_appsync::{appsync_operation, AppsyncError};
lambda_appsync::make_types!("schema.graphql");
lambda_appsync::make_operation!("schema.graphql");
lambda_appsync::make_handlers!();
#[appsync_operation(query(players))]
async fn get_players() -> Result<Vec<Player>, AppsyncError> {
Ok(vec![])
}
#[appsync_operation(query(player))]
async fn get_player(id: lambda_appsync::ID) -> Result<Option<Player>, AppsyncError> {
let _ = id;
Ok(None)
}
mod extra_derives {
lambda_appsync::make_types!(
"schema.graphql",
derive = Team: Default,
derive = Player: PartialEq,
);
#[test]
fn team_has_default_derive() {
let team: Team = Default::default();
assert_eq!(team, Team::Rust);
}
#[test]
fn player_has_partial_eq_derive() {
let id = lambda_appsync::ID::new();
let p1 = Player {
id,
name: "Alice".to_string(),
team: Team::Rust,
};
let p2 = Player {
id,
name: "Alice".to_string(),
team: Team::Rust,
};
let p3 = Player {
id: lambda_appsync::ID::new(),
name: "Bob".to_string(),
team: Team::Python,
};
assert_eq!(p1, p2);
assert_ne!(p1, p3);
}
#[test]
fn default_traits_still_present_alongside_extra_derives() {
let player = Player {
id: lambda_appsync::ID::new(),
name: "Test".to_string(),
team: Team::Js,
};
let cloned = player.clone();
assert_eq!(cloned.name, player.name);
let json = lambda_appsync::serde_json::to_value(&player).unwrap();
assert_eq!(json["name"], "Test");
}
}
mod no_default_traits {
lambda_appsync::make_types!(
"schema.graphql",
default_traits = Player: false,
derive = Player: Debug,
);
#[test]
fn player_has_only_debug() {
let player = Player {
id: lambda_appsync::ID::new(),
name: "DebugOnly".to_string(),
team: Team::Rust,
};
let debug_str = format!("{:?}", player);
assert!(debug_str.contains("DebugOnly"));
}
}
mod type_module_test {
mod types {
lambda_appsync::make_types!("schema.graphql");
}
lambda_appsync::make_operation!("schema.graphql", type_module = types,);
#[test]
fn operation_enum_is_accessible() {
let op = Operation::Query(QueryField::Players);
match op {
Operation::Query(QueryField::Players) => {}
_ => panic!("Unexpected operation variant"),
}
}
#[test]
fn mutation_field_enum_is_accessible() {
let op = Operation::Mutation(MutationField::CreatePlayer);
match op {
Operation::Mutation(MutationField::CreatePlayer) => {}
_ => panic!("Unexpected mutation variant"),
}
}
#[test]
fn subscription_field_enum_is_accessible() {
let op = Operation::Subscription(SubscriptionField::OnCreatePlayer);
match op {
Operation::Subscription(SubscriptionField::OnCreatePlayer) => {}
_ => panic!("Unexpected subscription variant"),
}
}
}
mod operation_type_test {
mod ops {
lambda_appsync::make_types!("schema.graphql");
lambda_appsync::make_operation!("schema.graphql");
}
lambda_appsync::make_handlers!(operation_type = ops::Operation,);
#[tokio::test]
async fn service_fn_dispatches_correctly_with_custom_operation_type() {
let event = lambda_appsync::serde_json::json!([{
"info": {
"fieldName": "players",
"parentTypeName": "Query",
"variables": {},
"selectionSetList": ["id", "name", "team"],
"selectionSetGraphQL": "{id name team}"
},
"arguments": {},
"identity": null,
"request": null,
"source": null
}]);
let lambda_event =
lambda_appsync::lambda_runtime::LambdaEvent::new(event, Default::default());
let response = DefaultHandlers::service_fn(lambda_event).await.unwrap();
let response_value = lambda_appsync::serde_json::to_value(response).unwrap();
assert_eq!(response_value[0]["errorType"], "Unimplemented");
}
}
mod non_batch_with_operation_type {
mod ops {
lambda_appsync::make_types!("schema.graphql");
lambda_appsync::make_operation!("schema.graphql");
}
lambda_appsync::make_handlers!(batch = false, operation_type = ops::Operation,);
#[tokio::test]
async fn non_batch_service_fn_returns_single_response() {
use lambda_appsync::AppsyncResponse;
let event = lambda_appsync::serde_json::json!({
"info": {
"fieldName": "players",
"parentTypeName": "Query",
"variables": {},
"selectionSetList": ["id", "name", "team"],
"selectionSetGraphQL": "{id name team}"
},
"arguments": {},
"identity": null,
"request": null,
"source": null
});
let lambda_event =
lambda_appsync::lambda_runtime::LambdaEvent::new(event, Default::default());
let response: AppsyncResponse = DefaultHandlers::service_fn(lambda_event).await.unwrap();
let value = lambda_appsync::serde_json::to_value(&response).unwrap();
assert_eq!(value["errorType"], "Unimplemented");
}
}
#[tokio::test]
async fn composable_flow_handles_query() {
let event = lambda_appsync::serde_json::json!([{
"info": {
"fieldName": "player",
"parentTypeName": "Query",
"variables": {},
"selectionSetList": ["id", "name", "team"],
"selectionSetGraphQL": "{id name team}"
},
"arguments": {
"id": lambda_appsync::ID::new().to_string()
},
"identity": null,
"request": null,
"source": null
}]);
let lambda_event = lambda_appsync::lambda_runtime::LambdaEvent::new(event, Default::default());
let response = DefaultHandlers::service_fn(lambda_event).await.unwrap();
let response_value = lambda_appsync::serde_json::to_value(response).unwrap();
assert!(response_value[0]["data"].is_null());
}
#[tokio::test]
async fn composable_flow_unimplemented_returns_error() {
let event = lambda_appsync::serde_json::json!([{
"info": {
"fieldName": "setGameStatus",
"parentTypeName": "Mutation",
"variables": {},
"selectionSetList": [],
"selectionSetGraphQL": ""
},
"arguments": {},
"identity": null,
"request": null,
"source": null
}]);
let lambda_event = lambda_appsync::lambda_runtime::LambdaEvent::new(event, Default::default());
let response = DefaultHandlers::service_fn(lambda_event).await.unwrap();
let response_value = lambda_appsync::serde_json::to_value(response).unwrap();
assert_eq!(response_value[0]["errorType"], "Unimplemented");
}
#[tokio::test]
async fn composable_flow_get_players_returns_empty_array() {
let event = lambda_appsync::serde_json::json!([{
"info": {
"fieldName": "players",
"parentTypeName": "Query",
"variables": {},
"selectionSetList": ["id", "name", "team"],
"selectionSetGraphQL": "{id name team}"
},
"arguments": {},
"identity": null,
"request": null,
"source": null
}]);
let lambda_event = lambda_appsync::lambda_runtime::LambdaEvent::new(event, Default::default());
let response = DefaultHandlers::service_fn(lambda_event).await.unwrap();
let response_value = lambda_appsync::serde_json::to_value(response).unwrap();
assert!(response_value[0].get("data").is_some_and(|v| v.is_array()));
}