Skip to main content

max / goingson

4.7 KB · 173 lines History Blame Raw
1 //! Integration tests for saved view repository operations.
2
3 use goingson_core::{
4 NewSavedView, Priority, ProjectId, SortDirection, SortField, TaskStatus, ViewFilters, ViewType,
5 };
6
7 use crate::test_utils::setup_test_state;
8
9 fn view(name: &str, view_type: ViewType, pinned: bool) -> NewSavedView {
10 NewSavedView {
11 name: name.to_string(),
12 view_type,
13 filters: ViewFilters::default(),
14 sort_by: None,
15 sort_order: Some(SortDirection::Asc),
16 is_pinned: Some(pinned),
17 }
18 }
19
20 #[tokio::test]
21 async fn create_and_list_saved_view() {
22 let (state, user_id) = setup_test_state().await;
23
24 let created = state
25 .saved_views
26 .create(user_id, view("My Tasks", ViewType::Tasks, false))
27 .await
28 .unwrap();
29 assert_eq!(created.name, "My Tasks");
30 assert_eq!(created.view_type, ViewType::Tasks);
31 assert!(!created.is_pinned);
32
33 let all = state.saved_views.list_all(user_id).await.unwrap();
34 assert_eq!(all.len(), 1);
35 assert_eq!(all[0].id, created.id);
36 }
37
38 #[tokio::test]
39 async fn list_pinned_filters_to_pinned_only() {
40 let (state, user_id) = setup_test_state().await;
41
42 state
43 .saved_views
44 .create(user_id, view("Pinned", ViewType::Tasks, true))
45 .await
46 .unwrap();
47 state
48 .saved_views
49 .create(user_id, view("Unpinned", ViewType::Emails, false))
50 .await
51 .unwrap();
52
53 let pinned = state.saved_views.list_pinned(user_id).await.unwrap();
54 assert_eq!(pinned.len(), 1);
55 assert_eq!(pinned[0].name, "Pinned");
56 assert_eq!(state.saved_views.list_all(user_id).await.unwrap().len(), 2);
57 }
58
59 #[tokio::test]
60 async fn delete_saved_view() {
61 let (state, user_id) = setup_test_state().await;
62
63 let created = state
64 .saved_views
65 .create(user_id, view("Temp", ViewType::Events, false))
66 .await
67 .unwrap();
68
69 assert!(state.saved_views.delete(created.id, user_id).await.unwrap());
70 assert!(
71 state
72 .saved_views
73 .get_by_id(created.id, user_id)
74 .await
75 .unwrap()
76 .is_none()
77 );
78 // Second delete finds nothing to remove.
79 assert!(!state.saved_views.delete(created.id, user_id).await.unwrap());
80 }
81
82 #[tokio::test]
83 async fn get_nonexistent_view_returns_none() {
84 let (state, user_id) = setup_test_state().await;
85
86 let fake_id = goingson_core::SavedViewId::from(uuid::Uuid::new_v4());
87 assert!(
88 state
89 .saved_views
90 .get_by_id(fake_id, user_id)
91 .await
92 .unwrap()
93 .is_none()
94 );
95 }
96
97 /// The view's filter payload is stored as JSON and the sort config as text columns.
98 /// Verify the full query payload survives a create -> fetch round-trip.
99 #[tokio::test]
100 async fn filters_and_sort_round_trip() {
101 let (state, user_id) = setup_test_state().await;
102
103 let project_id = ProjectId::new();
104 let filters = ViewFilters {
105 status: Some(vec![TaskStatus::Pending, TaskStatus::Started]),
106 priority: Some(vec![Priority::High]),
107 project_id: Some(project_id),
108 is_snoozed: Some(true),
109 is_waiting: Some(false),
110 ..Default::default()
111 };
112
113 let created = state
114 .saved_views
115 .create(
116 user_id,
117 NewSavedView {
118 name: "Complex".to_string(),
119 view_type: ViewType::Tasks,
120 filters: filters.clone(),
121 sort_by: Some(SortField::Urgency),
122 sort_order: Some(SortDirection::Desc),
123 is_pinned: Some(true),
124 },
125 )
126 .await
127 .unwrap();
128
129 let fetched = state
130 .saved_views
131 .get_by_id(created.id, user_id)
132 .await
133 .unwrap()
134 .unwrap();
135
136 assert_eq!(fetched.filters.status, filters.status);
137 assert_eq!(fetched.filters.priority, filters.priority);
138 assert_eq!(fetched.filters.project_id, Some(project_id));
139 assert_eq!(fetched.filters.is_snoozed, Some(true));
140 assert_eq!(fetched.filters.is_waiting, Some(false));
141 assert_eq!(fetched.sort_by, Some(SortField::Urgency));
142 assert_eq!(fetched.sort_order, SortDirection::Desc);
143 assert!(fetched.is_pinned);
144 }
145
146 #[tokio::test]
147 async fn toggle_pinned_flips_state() {
148 let (state, user_id) = setup_test_state().await;
149
150 let created = state
151 .saved_views
152 .create(user_id, view("Toggle", ViewType::Tasks, false))
153 .await
154 .unwrap();
155 assert!(!created.is_pinned);
156
157 let on = state
158 .saved_views
159 .toggle_pinned(created.id, user_id)
160 .await
161 .unwrap()
162 .unwrap();
163 assert!(on.is_pinned);
164
165 let off = state
166 .saved_views
167 .toggle_pinned(created.id, user_id)
168 .await
169 .unwrap()
170 .unwrap();
171 assert!(!off.is_pinned);
172 }
173