Skip to main content

reinhardt_test/
viewsets.rs

1//! Test ViewSet implementations for testing
2//!
3//! This module provides reusable ViewSet implementations for testing purposes.
4//! These ViewSets are part of the reinhardt-test crate and can be used across
5//! different test scenarios in the Reinhardt framework.
6
7use async_trait::async_trait;
8use reinhardt_http::{Request, Response, Result};
9use reinhardt_views::viewsets::middleware::{CompositeMiddleware, ViewSetMiddleware};
10use reinhardt_views::viewsets::{Action, ViewSet};
11use std::sync::Arc;
12
13/// Test ViewSet with configurable middleware support
14#[derive(Debug, Clone)]
15pub struct TestViewSet {
16	basename: String,
17	login_required: bool,
18	required_permissions: Vec<String>,
19}
20
21impl TestViewSet {
22	pub fn new(basename: impl Into<String>) -> Self {
23		Self {
24			basename: basename.into(),
25			login_required: false,
26			required_permissions: Vec::new(),
27		}
28	}
29
30	pub fn with_login_required(mut self, login_required: bool) -> Self {
31		self.login_required = login_required;
32		self
33	}
34
35	pub fn with_permissions(mut self, permissions: Vec<String>) -> Self {
36		self.required_permissions = permissions;
37		self
38	}
39
40	/// Convert ViewSet to Handler with action mapping
41	pub fn as_view(self) -> reinhardt_views::viewsets::builder::ViewSetBuilder<Self> {
42		reinhardt_views::viewsets::builder::ViewSetBuilder::new(self)
43	}
44}
45
46#[async_trait]
47impl ViewSet for TestViewSet {
48	fn get_basename(&self) -> &str {
49		&self.basename
50	}
51
52	async fn dispatch(&self, _request: Request, _action: Action) -> Result<Response> {
53		// Simple test implementation that always returns success
54		let mut response = Response::new(hyper::StatusCode::OK);
55		response.body = "Test response".into();
56		Ok(response)
57	}
58
59	fn get_middleware(&self) -> Option<Arc<dyn ViewSetMiddleware>> {
60		if self.login_required || !self.required_permissions.is_empty() {
61			let mut composite = CompositeMiddleware::new();
62
63			if self.login_required {
64				composite = composite.with_authentication(true);
65			}
66
67			if !self.required_permissions.is_empty() {
68				composite = composite.with_permissions(self.required_permissions.clone());
69			}
70
71			Some(Arc::new(composite))
72		} else {
73			None
74		}
75	}
76
77	fn requires_login(&self) -> bool {
78		self.login_required
79	}
80
81	fn get_required_permissions(&self) -> Vec<String> {
82		self.required_permissions.clone()
83	}
84}
85
86/// Simple ViewSet for testing without middleware
87#[derive(Debug, Clone)]
88pub struct SimpleViewSet {
89	basename: String,
90}
91
92impl SimpleViewSet {
93	pub fn new(basename: impl Into<String>) -> Self {
94		Self {
95			basename: basename.into(),
96		}
97	}
98}
99
100#[async_trait]
101impl ViewSet for SimpleViewSet {
102	fn get_basename(&self) -> &str {
103		&self.basename
104	}
105
106	async fn dispatch(&self, _request: Request, _action: Action) -> Result<Response> {
107		let mut response = Response::new(hyper::StatusCode::OK);
108		response.body = "Simple response".into();
109		Ok(response)
110	}
111}