spikard 0.5.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/README.md +674 -674
- data/ext/spikard_rb/Cargo.toml +17 -17
- data/ext/spikard_rb/extconf.rb +13 -10
- data/ext/spikard_rb/src/lib.rs +6 -6
- data/lib/spikard/app.rb +405 -405
- data/lib/spikard/background.rb +27 -27
- data/lib/spikard/config.rb +396 -396
- data/lib/spikard/converters.rb +13 -13
- data/lib/spikard/handler_wrapper.rb +113 -113
- data/lib/spikard/provide.rb +214 -214
- data/lib/spikard/response.rb +173 -173
- data/lib/spikard/schema.rb +243 -243
- data/lib/spikard/sse.rb +111 -111
- data/lib/spikard/streaming_response.rb +44 -44
- data/lib/spikard/testing.rb +256 -256
- data/lib/spikard/upload_file.rb +131 -131
- data/lib/spikard/version.rb +5 -5
- data/lib/spikard/websocket.rb +59 -59
- data/lib/spikard.rb +43 -43
- data/sig/spikard.rbs +366 -366
- data/vendor/crates/spikard-bindings-shared/Cargo.toml +63 -63
- data/vendor/crates/spikard-bindings-shared/examples/config_extraction.rs +132 -132
- data/vendor/crates/spikard-bindings-shared/src/config_extractor.rs +752 -752
- data/vendor/crates/spikard-bindings-shared/src/conversion_traits.rs +194 -194
- data/vendor/crates/spikard-bindings-shared/src/di_traits.rs +246 -246
- data/vendor/crates/spikard-bindings-shared/src/error_response.rs +401 -401
- data/vendor/crates/spikard-bindings-shared/src/handler_base.rs +238 -238
- data/vendor/crates/spikard-bindings-shared/src/lib.rs +24 -24
- data/vendor/crates/spikard-bindings-shared/src/lifecycle_base.rs +292 -292
- data/vendor/crates/spikard-bindings-shared/src/lifecycle_executor.rs +616 -616
- data/vendor/crates/spikard-bindings-shared/src/response_builder.rs +305 -305
- data/vendor/crates/spikard-bindings-shared/src/test_client_base.rs +248 -248
- data/vendor/crates/spikard-bindings-shared/src/validation_helpers.rs +351 -351
- data/vendor/crates/spikard-bindings-shared/tests/comprehensive_coverage.rs +454 -454
- data/vendor/crates/spikard-bindings-shared/tests/error_response_edge_cases.rs +383 -383
- data/vendor/crates/spikard-bindings-shared/tests/handler_base_integration.rs +280 -280
- data/vendor/crates/spikard-core/Cargo.toml +40 -40
- data/vendor/crates/spikard-core/src/bindings/mod.rs +3 -3
- data/vendor/crates/spikard-core/src/bindings/response.rs +133 -133
- data/vendor/crates/spikard-core/src/debug.rs +127 -127
- data/vendor/crates/spikard-core/src/di/container.rs +702 -702
- data/vendor/crates/spikard-core/src/di/dependency.rs +273 -273
- data/vendor/crates/spikard-core/src/di/error.rs +118 -118
- data/vendor/crates/spikard-core/src/di/factory.rs +534 -534
- data/vendor/crates/spikard-core/src/di/graph.rs +506 -506
- data/vendor/crates/spikard-core/src/di/mod.rs +192 -192
- data/vendor/crates/spikard-core/src/di/resolved.rs +405 -405
- data/vendor/crates/spikard-core/src/di/value.rs +281 -281
- data/vendor/crates/spikard-core/src/errors.rs +69 -69
- data/vendor/crates/spikard-core/src/http.rs +415 -415
- data/vendor/crates/spikard-core/src/lib.rs +29 -29
- data/vendor/crates/spikard-core/src/lifecycle.rs +1186 -1186
- data/vendor/crates/spikard-core/src/metadata.rs +389 -389
- data/vendor/crates/spikard-core/src/parameters.rs +2525 -2525
- data/vendor/crates/spikard-core/src/problem.rs +344 -344
- data/vendor/crates/spikard-core/src/request_data.rs +1154 -1154
- data/vendor/crates/spikard-core/src/router.rs +510 -510
- data/vendor/crates/spikard-core/src/schema_registry.rs +183 -183
- data/vendor/crates/spikard-core/src/type_hints.rs +304 -304
- data/vendor/crates/spikard-core/src/validation/error_mapper.rs +696 -688
- data/vendor/crates/spikard-core/src/validation/mod.rs +457 -457
- data/vendor/crates/spikard-http/Cargo.toml +62 -64
- data/vendor/crates/spikard-http/examples/sse-notifications.rs +148 -148
- data/vendor/crates/spikard-http/examples/websocket-chat.rs +92 -92
- data/vendor/crates/spikard-http/src/auth.rs +296 -296
- data/vendor/crates/spikard-http/src/background.rs +1860 -1860
- data/vendor/crates/spikard-http/src/bindings/mod.rs +3 -3
- data/vendor/crates/spikard-http/src/bindings/response.rs +1 -1
- data/vendor/crates/spikard-http/src/body_metadata.rs +8 -8
- data/vendor/crates/spikard-http/src/cors.rs +1005 -1005
- data/vendor/crates/spikard-http/src/debug.rs +128 -128
- data/vendor/crates/spikard-http/src/di_handler.rs +1668 -1668
- data/vendor/crates/spikard-http/src/handler_response.rs +901 -901
- data/vendor/crates/spikard-http/src/handler_trait.rs +838 -830
- data/vendor/crates/spikard-http/src/handler_trait_tests.rs +290 -290
- data/vendor/crates/spikard-http/src/lib.rs +534 -534
- data/vendor/crates/spikard-http/src/lifecycle/adapter.rs +230 -230
- data/vendor/crates/spikard-http/src/lifecycle.rs +1193 -1193
- data/vendor/crates/spikard-http/src/middleware/mod.rs +560 -540
- data/vendor/crates/spikard-http/src/middleware/multipart.rs +912 -912
- data/vendor/crates/spikard-http/src/middleware/urlencoded.rs +513 -513
- data/vendor/crates/spikard-http/src/middleware/validation.rs +768 -735
- data/vendor/crates/spikard-http/src/openapi/mod.rs +309 -309
- data/vendor/crates/spikard-http/src/openapi/parameter_extraction.rs +535 -535
- data/vendor/crates/spikard-http/src/openapi/schema_conversion.rs +1363 -1363
- data/vendor/crates/spikard-http/src/openapi/spec_generation.rs +665 -665
- data/vendor/crates/spikard-http/src/query_parser.rs +793 -793
- data/vendor/crates/spikard-http/src/response.rs +720 -720
- data/vendor/crates/spikard-http/src/server/handler.rs +1650 -1650
- data/vendor/crates/spikard-http/src/server/lifecycle_execution.rs +234 -234
- data/vendor/crates/spikard-http/src/server/mod.rs +1593 -1502
- data/vendor/crates/spikard-http/src/server/request_extraction.rs +789 -770
- data/vendor/crates/spikard-http/src/server/routing_factory.rs +629 -599
- data/vendor/crates/spikard-http/src/sse.rs +1409 -1409
- data/vendor/crates/spikard-http/src/testing/form.rs +52 -52
- data/vendor/crates/spikard-http/src/testing/multipart.rs +64 -60
- data/vendor/crates/spikard-http/src/testing/test_client.rs +311 -283
- data/vendor/crates/spikard-http/src/testing.rs +406 -377
- data/vendor/crates/spikard-http/src/websocket.rs +1404 -1375
- data/vendor/crates/spikard-http/tests/background_behavior.rs +832 -832
- data/vendor/crates/spikard-http/tests/common/handlers.rs +309 -309
- data/vendor/crates/spikard-http/tests/common/mod.rs +26 -26
- data/vendor/crates/spikard-http/tests/di_integration.rs +192 -192
- data/vendor/crates/spikard-http/tests/doc_snippets.rs +5 -5
- data/vendor/crates/spikard-http/tests/lifecycle_execution.rs +1093 -1093
- data/vendor/crates/spikard-http/tests/multipart_behavior.rs +656 -656
- data/vendor/crates/spikard-http/tests/server_config_builder.rs +314 -314
- data/vendor/crates/spikard-http/tests/sse_behavior.rs +620 -620
- data/vendor/crates/spikard-http/tests/websocket_behavior.rs +663 -663
- data/vendor/crates/spikard-rb/Cargo.toml +48 -48
- data/vendor/crates/spikard-rb/build.rs +199 -199
- data/vendor/crates/spikard-rb/src/background.rs +63 -63
- data/vendor/crates/spikard-rb/src/config/mod.rs +5 -5
- data/vendor/crates/spikard-rb/src/config/server_config.rs +285 -285
- data/vendor/crates/spikard-rb/src/conversion.rs +554 -554
- data/vendor/crates/spikard-rb/src/di/builder.rs +100 -100
- data/vendor/crates/spikard-rb/src/di/mod.rs +375 -375
- data/vendor/crates/spikard-rb/src/handler.rs +618 -618
- data/vendor/crates/spikard-rb/src/integration/mod.rs +3 -3
- data/vendor/crates/spikard-rb/src/lib.rs +1806 -1810
- data/vendor/crates/spikard-rb/src/lifecycle.rs +275 -275
- data/vendor/crates/spikard-rb/src/metadata/mod.rs +5 -5
- data/vendor/crates/spikard-rb/src/metadata/route_extraction.rs +442 -447
- data/vendor/crates/spikard-rb/src/runtime/mod.rs +5 -5
- data/vendor/crates/spikard-rb/src/runtime/server_runner.rs +324 -324
- data/vendor/crates/spikard-rb/src/server.rs +305 -308
- data/vendor/crates/spikard-rb/src/sse.rs +231 -231
- data/vendor/crates/spikard-rb/src/testing/client.rs +538 -551
- data/vendor/crates/spikard-rb/src/testing/mod.rs +7 -7
- data/vendor/crates/spikard-rb/src/testing/sse.rs +143 -143
- data/vendor/crates/spikard-rb/src/testing/websocket.rs +608 -635
- data/vendor/crates/spikard-rb/src/websocket.rs +377 -374
- metadata +15 -1
|
@@ -1,192 +1,192 @@
|
|
|
1
|
-
#![allow(clippy::pedantic, clippy::nursery, clippy::all)]
|
|
2
|
-
//! Integration tests for Dependency Injection system
|
|
3
|
-
//!
|
|
4
|
-
//! These tests verify that the DI system integrates correctly with the HTTP handler pipeline.
|
|
5
|
-
//! More complex DI features (factories, dependencies, cleanup) are tested in unit tests.
|
|
6
|
-
|
|
7
|
-
#![cfg(feature = "di")]
|
|
8
|
-
|
|
9
|
-
mod common;
|
|
10
|
-
|
|
11
|
-
use axum::body::Body;
|
|
12
|
-
use axum::http::{Request, Response, StatusCode};
|
|
13
|
-
use spikard_core::di::{DependencyContainer, ValueDependency};
|
|
14
|
-
use spikard_http::{DependencyInjectingHandler, Handler, HandlerResult, RequestData};
|
|
15
|
-
use std::collections::HashMap;
|
|
16
|
-
use std::future::Future;
|
|
17
|
-
use std::pin::Pin;
|
|
18
|
-
use std::sync::Arc;
|
|
19
|
-
|
|
20
|
-
/// Test handler that accesses injected dependencies
|
|
21
|
-
struct DependencyAccessHandler {
|
|
22
|
-
dependency_name: String,
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
impl Handler for DependencyAccessHandler {
|
|
26
|
-
fn call(
|
|
27
|
-
&self,
|
|
28
|
-
_request: Request<Body>,
|
|
29
|
-
request_data: RequestData,
|
|
30
|
-
) -> Pin<Box<dyn Future<Output = HandlerResult> + Send + '_>> {
|
|
31
|
-
let dependency_name = self.dependency_name.clone();
|
|
32
|
-
|
|
33
|
-
Box::pin(async move {
|
|
34
|
-
if let Some(deps) = &request_data.dependencies {
|
|
35
|
-
if let Some(value) = deps.get::<String>(&dependency_name) {
|
|
36
|
-
let response = Response::builder()
|
|
37
|
-
.status(StatusCode::OK)
|
|
38
|
-
.body(Body::from(format!("Dependency value: {}", *value)))
|
|
39
|
-
.unwrap();
|
|
40
|
-
Ok(response)
|
|
41
|
-
} else {
|
|
42
|
-
Err((
|
|
43
|
-
StatusCode::INTERNAL_SERVER_ERROR,
|
|
44
|
-
format!("Dependency '{}' not found", dependency_name),
|
|
45
|
-
))
|
|
46
|
-
}
|
|
47
|
-
} else {
|
|
48
|
-
Err((
|
|
49
|
-
StatusCode::INTERNAL_SERVER_ERROR,
|
|
50
|
-
"No dependencies attached".to_string(),
|
|
51
|
-
))
|
|
52
|
-
}
|
|
53
|
-
})
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
#[tokio::test]
|
|
58
|
-
async fn test_di_value_injection() {
|
|
59
|
-
let mut container = DependencyContainer::new();
|
|
60
|
-
container
|
|
61
|
-
.register(
|
|
62
|
-
"config".to_string(),
|
|
63
|
-
Arc::new(ValueDependency::new("config", "test_config_value".to_string())),
|
|
64
|
-
)
|
|
65
|
-
.unwrap();
|
|
66
|
-
|
|
67
|
-
let handler = Arc::new(DependencyAccessHandler {
|
|
68
|
-
dependency_name: "config".to_string(),
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
let di_handler = DependencyInjectingHandler::new(handler, Arc::new(container), vec!["config".to_string()]);
|
|
72
|
-
|
|
73
|
-
let request = Request::builder().body(Body::empty()).unwrap();
|
|
74
|
-
let request_data = RequestData {
|
|
75
|
-
path_params: Arc::new(HashMap::new()),
|
|
76
|
-
query_params: serde_json::Value::Null,
|
|
77
|
-
validated_params: None,
|
|
78
|
-
raw_query_params: Arc::new(HashMap::new()),
|
|
79
|
-
body: serde_json::Value::Null,
|
|
80
|
-
raw_body: None,
|
|
81
|
-
headers: Arc::new(HashMap::new()),
|
|
82
|
-
cookies: Arc::new(HashMap::new()),
|
|
83
|
-
method: "GET".to_string(),
|
|
84
|
-
path: "/".to_string(),
|
|
85
|
-
#[cfg(feature = "di")]
|
|
86
|
-
dependencies: None,
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
let result = di_handler.call(request, request_data).await;
|
|
90
|
-
|
|
91
|
-
let response = match result {
|
|
92
|
-
Ok(r) => r,
|
|
93
|
-
Err((status, msg)) => {
|
|
94
|
-
panic!("Expected Ok, got Err({:?}, {})", status, msg);
|
|
95
|
-
}
|
|
96
|
-
};
|
|
97
|
-
assert_eq!(response.status(), StatusCode::OK);
|
|
98
|
-
|
|
99
|
-
use http_body_util::BodyExt;
|
|
100
|
-
let body_bytes = response.into_body().collect().await.unwrap().to_bytes();
|
|
101
|
-
let body_str = String::from_utf8(body_bytes.to_vec()).unwrap();
|
|
102
|
-
assert_eq!(body_str, "Dependency value: test_config_value");
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
#[tokio::test]
|
|
106
|
-
async fn test_di_missing_dependency_error() {
|
|
107
|
-
let container = DependencyContainer::new();
|
|
108
|
-
|
|
109
|
-
let handler = Arc::new(DependencyAccessHandler {
|
|
110
|
-
dependency_name: "database".to_string(),
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
let di_handler = DependencyInjectingHandler::new(handler, Arc::new(container), vec!["database".to_string()]);
|
|
114
|
-
|
|
115
|
-
let request = Request::builder().body(Body::empty()).unwrap();
|
|
116
|
-
let request_data = RequestData {
|
|
117
|
-
path_params: Arc::new(HashMap::new()),
|
|
118
|
-
query_params: serde_json::Value::Null,
|
|
119
|
-
validated_params: None,
|
|
120
|
-
raw_query_params: Arc::new(HashMap::new()),
|
|
121
|
-
body: serde_json::Value::Null,
|
|
122
|
-
raw_body: None,
|
|
123
|
-
headers: Arc::new(HashMap::new()),
|
|
124
|
-
cookies: Arc::new(HashMap::new()),
|
|
125
|
-
method: "GET".to_string(),
|
|
126
|
-
path: "/".to_string(),
|
|
127
|
-
#[cfg(feature = "di")]
|
|
128
|
-
dependencies: None,
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
let result = di_handler.call(request, request_data).await;
|
|
132
|
-
|
|
133
|
-
assert!(result.is_ok());
|
|
134
|
-
let response = result.unwrap();
|
|
135
|
-
assert_eq!(response.status(), StatusCode::INTERNAL_SERVER_ERROR);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
#[tokio::test]
|
|
139
|
-
async fn test_di_multiple_value_dependencies() {
|
|
140
|
-
let mut container = DependencyContainer::new();
|
|
141
|
-
|
|
142
|
-
container
|
|
143
|
-
.register(
|
|
144
|
-
"config".to_string(),
|
|
145
|
-
Arc::new(ValueDependency::new("config", "config_value".to_string())),
|
|
146
|
-
)
|
|
147
|
-
.unwrap();
|
|
148
|
-
|
|
149
|
-
container
|
|
150
|
-
.register(
|
|
151
|
-
"cache_url".to_string(),
|
|
152
|
-
Arc::new(ValueDependency::new("cache_url", "redis://localhost".to_string())),
|
|
153
|
-
)
|
|
154
|
-
.unwrap();
|
|
155
|
-
|
|
156
|
-
let handler = Arc::new(DependencyAccessHandler {
|
|
157
|
-
dependency_name: "cache_url".to_string(),
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
let di_handler = DependencyInjectingHandler::new(handler, Arc::new(container), vec!["cache_url".to_string()]);
|
|
161
|
-
|
|
162
|
-
let request = Request::builder().body(Body::empty()).unwrap();
|
|
163
|
-
let request_data = RequestData {
|
|
164
|
-
path_params: Arc::new(HashMap::new()),
|
|
165
|
-
query_params: serde_json::Value::Null,
|
|
166
|
-
validated_params: None,
|
|
167
|
-
raw_query_params: Arc::new(HashMap::new()),
|
|
168
|
-
body: serde_json::Value::Null,
|
|
169
|
-
raw_body: None,
|
|
170
|
-
headers: Arc::new(HashMap::new()),
|
|
171
|
-
cookies: Arc::new(HashMap::new()),
|
|
172
|
-
method: "GET".to_string(),
|
|
173
|
-
path: "/".to_string(),
|
|
174
|
-
#[cfg(feature = "di")]
|
|
175
|
-
dependencies: None,
|
|
176
|
-
};
|
|
177
|
-
|
|
178
|
-
let result = di_handler.call(request, request_data).await;
|
|
179
|
-
|
|
180
|
-
let response = match result {
|
|
181
|
-
Ok(r) => r,
|
|
182
|
-
Err((status, msg)) => {
|
|
183
|
-
panic!("Expected Ok, got Err({:?}, {})", status, msg);
|
|
184
|
-
}
|
|
185
|
-
};
|
|
186
|
-
assert_eq!(response.status(), StatusCode::OK);
|
|
187
|
-
|
|
188
|
-
use http_body_util::BodyExt;
|
|
189
|
-
let body_bytes = response.into_body().collect().await.unwrap().to_bytes();
|
|
190
|
-
let body_str = String::from_utf8(body_bytes.to_vec()).unwrap();
|
|
191
|
-
assert_eq!(body_str, "Dependency value: redis://localhost");
|
|
192
|
-
}
|
|
1
|
+
#![allow(clippy::pedantic, clippy::nursery, clippy::all)]
|
|
2
|
+
//! Integration tests for Dependency Injection system
|
|
3
|
+
//!
|
|
4
|
+
//! These tests verify that the DI system integrates correctly with the HTTP handler pipeline.
|
|
5
|
+
//! More complex DI features (factories, dependencies, cleanup) are tested in unit tests.
|
|
6
|
+
|
|
7
|
+
#![cfg(feature = "di")]
|
|
8
|
+
|
|
9
|
+
mod common;
|
|
10
|
+
|
|
11
|
+
use axum::body::Body;
|
|
12
|
+
use axum::http::{Request, Response, StatusCode};
|
|
13
|
+
use spikard_core::di::{DependencyContainer, ValueDependency};
|
|
14
|
+
use spikard_http::{DependencyInjectingHandler, Handler, HandlerResult, RequestData};
|
|
15
|
+
use std::collections::HashMap;
|
|
16
|
+
use std::future::Future;
|
|
17
|
+
use std::pin::Pin;
|
|
18
|
+
use std::sync::Arc;
|
|
19
|
+
|
|
20
|
+
/// Test handler that accesses injected dependencies
|
|
21
|
+
struct DependencyAccessHandler {
|
|
22
|
+
dependency_name: String,
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
impl Handler for DependencyAccessHandler {
|
|
26
|
+
fn call(
|
|
27
|
+
&self,
|
|
28
|
+
_request: Request<Body>,
|
|
29
|
+
request_data: RequestData,
|
|
30
|
+
) -> Pin<Box<dyn Future<Output = HandlerResult> + Send + '_>> {
|
|
31
|
+
let dependency_name = self.dependency_name.clone();
|
|
32
|
+
|
|
33
|
+
Box::pin(async move {
|
|
34
|
+
if let Some(deps) = &request_data.dependencies {
|
|
35
|
+
if let Some(value) = deps.get::<String>(&dependency_name) {
|
|
36
|
+
let response = Response::builder()
|
|
37
|
+
.status(StatusCode::OK)
|
|
38
|
+
.body(Body::from(format!("Dependency value: {}", *value)))
|
|
39
|
+
.unwrap();
|
|
40
|
+
Ok(response)
|
|
41
|
+
} else {
|
|
42
|
+
Err((
|
|
43
|
+
StatusCode::INTERNAL_SERVER_ERROR,
|
|
44
|
+
format!("Dependency '{}' not found", dependency_name),
|
|
45
|
+
))
|
|
46
|
+
}
|
|
47
|
+
} else {
|
|
48
|
+
Err((
|
|
49
|
+
StatusCode::INTERNAL_SERVER_ERROR,
|
|
50
|
+
"No dependencies attached".to_string(),
|
|
51
|
+
))
|
|
52
|
+
}
|
|
53
|
+
})
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
#[tokio::test]
|
|
58
|
+
async fn test_di_value_injection() {
|
|
59
|
+
let mut container = DependencyContainer::new();
|
|
60
|
+
container
|
|
61
|
+
.register(
|
|
62
|
+
"config".to_string(),
|
|
63
|
+
Arc::new(ValueDependency::new("config", "test_config_value".to_string())),
|
|
64
|
+
)
|
|
65
|
+
.unwrap();
|
|
66
|
+
|
|
67
|
+
let handler = Arc::new(DependencyAccessHandler {
|
|
68
|
+
dependency_name: "config".to_string(),
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
let di_handler = DependencyInjectingHandler::new(handler, Arc::new(container), vec!["config".to_string()]);
|
|
72
|
+
|
|
73
|
+
let request = Request::builder().body(Body::empty()).unwrap();
|
|
74
|
+
let request_data = RequestData {
|
|
75
|
+
path_params: Arc::new(HashMap::new()),
|
|
76
|
+
query_params: serde_json::Value::Null,
|
|
77
|
+
validated_params: None,
|
|
78
|
+
raw_query_params: Arc::new(HashMap::new()),
|
|
79
|
+
body: serde_json::Value::Null,
|
|
80
|
+
raw_body: None,
|
|
81
|
+
headers: Arc::new(HashMap::new()),
|
|
82
|
+
cookies: Arc::new(HashMap::new()),
|
|
83
|
+
method: "GET".to_string(),
|
|
84
|
+
path: "/".to_string(),
|
|
85
|
+
#[cfg(feature = "di")]
|
|
86
|
+
dependencies: None,
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
let result = di_handler.call(request, request_data).await;
|
|
90
|
+
|
|
91
|
+
let response = match result {
|
|
92
|
+
Ok(r) => r,
|
|
93
|
+
Err((status, msg)) => {
|
|
94
|
+
panic!("Expected Ok, got Err({:?}, {})", status, msg);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
assert_eq!(response.status(), StatusCode::OK);
|
|
98
|
+
|
|
99
|
+
use http_body_util::BodyExt;
|
|
100
|
+
let body_bytes = response.into_body().collect().await.unwrap().to_bytes();
|
|
101
|
+
let body_str = String::from_utf8(body_bytes.to_vec()).unwrap();
|
|
102
|
+
assert_eq!(body_str, "Dependency value: test_config_value");
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
#[tokio::test]
|
|
106
|
+
async fn test_di_missing_dependency_error() {
|
|
107
|
+
let container = DependencyContainer::new();
|
|
108
|
+
|
|
109
|
+
let handler = Arc::new(DependencyAccessHandler {
|
|
110
|
+
dependency_name: "database".to_string(),
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
let di_handler = DependencyInjectingHandler::new(handler, Arc::new(container), vec!["database".to_string()]);
|
|
114
|
+
|
|
115
|
+
let request = Request::builder().body(Body::empty()).unwrap();
|
|
116
|
+
let request_data = RequestData {
|
|
117
|
+
path_params: Arc::new(HashMap::new()),
|
|
118
|
+
query_params: serde_json::Value::Null,
|
|
119
|
+
validated_params: None,
|
|
120
|
+
raw_query_params: Arc::new(HashMap::new()),
|
|
121
|
+
body: serde_json::Value::Null,
|
|
122
|
+
raw_body: None,
|
|
123
|
+
headers: Arc::new(HashMap::new()),
|
|
124
|
+
cookies: Arc::new(HashMap::new()),
|
|
125
|
+
method: "GET".to_string(),
|
|
126
|
+
path: "/".to_string(),
|
|
127
|
+
#[cfg(feature = "di")]
|
|
128
|
+
dependencies: None,
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
let result = di_handler.call(request, request_data).await;
|
|
132
|
+
|
|
133
|
+
assert!(result.is_ok());
|
|
134
|
+
let response = result.unwrap();
|
|
135
|
+
assert_eq!(response.status(), StatusCode::INTERNAL_SERVER_ERROR);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
#[tokio::test]
|
|
139
|
+
async fn test_di_multiple_value_dependencies() {
|
|
140
|
+
let mut container = DependencyContainer::new();
|
|
141
|
+
|
|
142
|
+
container
|
|
143
|
+
.register(
|
|
144
|
+
"config".to_string(),
|
|
145
|
+
Arc::new(ValueDependency::new("config", "config_value".to_string())),
|
|
146
|
+
)
|
|
147
|
+
.unwrap();
|
|
148
|
+
|
|
149
|
+
container
|
|
150
|
+
.register(
|
|
151
|
+
"cache_url".to_string(),
|
|
152
|
+
Arc::new(ValueDependency::new("cache_url", "redis://localhost".to_string())),
|
|
153
|
+
)
|
|
154
|
+
.unwrap();
|
|
155
|
+
|
|
156
|
+
let handler = Arc::new(DependencyAccessHandler {
|
|
157
|
+
dependency_name: "cache_url".to_string(),
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
let di_handler = DependencyInjectingHandler::new(handler, Arc::new(container), vec!["cache_url".to_string()]);
|
|
161
|
+
|
|
162
|
+
let request = Request::builder().body(Body::empty()).unwrap();
|
|
163
|
+
let request_data = RequestData {
|
|
164
|
+
path_params: Arc::new(HashMap::new()),
|
|
165
|
+
query_params: serde_json::Value::Null,
|
|
166
|
+
validated_params: None,
|
|
167
|
+
raw_query_params: Arc::new(HashMap::new()),
|
|
168
|
+
body: serde_json::Value::Null,
|
|
169
|
+
raw_body: None,
|
|
170
|
+
headers: Arc::new(HashMap::new()),
|
|
171
|
+
cookies: Arc::new(HashMap::new()),
|
|
172
|
+
method: "GET".to_string(),
|
|
173
|
+
path: "/".to_string(),
|
|
174
|
+
#[cfg(feature = "di")]
|
|
175
|
+
dependencies: None,
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
let result = di_handler.call(request, request_data).await;
|
|
179
|
+
|
|
180
|
+
let response = match result {
|
|
181
|
+
Ok(r) => r,
|
|
182
|
+
Err((status, msg)) => {
|
|
183
|
+
panic!("Expected Ok, got Err({:?}, {})", status, msg);
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
assert_eq!(response.status(), StatusCode::OK);
|
|
187
|
+
|
|
188
|
+
use http_body_util::BodyExt;
|
|
189
|
+
let body_bytes = response.into_body().collect().await.unwrap().to_bytes();
|
|
190
|
+
let body_str = String::from_utf8(body_bytes.to_vec()).unwrap();
|
|
191
|
+
assert_eq!(body_str, "Dependency value: redis://localhost");
|
|
192
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
#![allow(clippy::pedantic, clippy::nursery, clippy::all)]
|
|
2
|
-
//! Ensure documented Rust DI snippet stays compiling.
|
|
3
|
-
|
|
4
|
-
#[cfg(feature = "di")]
|
|
5
|
-
doc_comment::doctest!("../../../docs/snippets/rust/dependency_injection.md");
|
|
1
|
+
#![allow(clippy::pedantic, clippy::nursery, clippy::all)]
|
|
2
|
+
//! Ensure documented Rust DI snippet stays compiling.
|
|
3
|
+
|
|
4
|
+
#[cfg(feature = "di")]
|
|
5
|
+
doc_comment::doctest!("../../../docs/snippets/rust/dependency_injection.md");
|