@@ -78,22 +78,89 @@ pub enum Error {
7878}
7979
8080#[ cfg( test) ]
81- pub async fn setup_db ( ) -> DatabaseHandler {
82- use sqlx:: migrate:: Migrator ;
83- static MIGRATOR : Migrator = sqlx:: migrate!( ) ;
81+ pub mod db_test {
82+ use std:: collections:: HashSet ;
8483
85- let db = DatabaseHandler :: new ( "sqlite://" ) . await . unwrap ( ) ;
86- MIGRATOR . run ( db. conn ( ) ) . await . unwrap ( ) ;
84+ use super :: * ;
85+ use crate :: {
86+ ApplyIf as _,
87+ metadata:: { Metadata , property:: Property as _, * } ,
88+ } ;
89+ use chrono:: { TimeDelta , Utc } ;
90+
91+ pub async fn fill_db ( amount : usize , db : & DatabaseHandler ) {
92+ let test_data = generate_test_metadata ( amount) ;
93+
94+ for el in test_data {
95+ el. write_to_db ( db) . await . expect ( "writing test data" ) ;
96+ }
97+ }
98+
99+ pub fn generate_test_metadata ( count : usize ) -> Vec < Metadata > {
100+ let base_time = Utc :: now ( ) ;
101+ let ides = [ "VSCode" , "IntelliJ" , "Sublime" , "Vim" ] ;
102+ let categories = [ "Web" , "CLI" , "GUI" , "Embedded" , "AI" ] ;
103+ let languages = [ "Rust" , "Python" , "JavaScript" , "Go" , "C++" ] ;
104+ let build_systems = [ "Cargo" , "Make" , "CMake" , "NPM" , "Bazel" ] ;
105+
106+ ( 0 ..count)
107+ . map ( |i| {
108+ let offset = TimeDelta :: try_days ( i as i64 ) . unwrap ( ) ;
109+
110+ Metadata :: builder ( )
111+ . title ( & format ! ( "Test Project {}" , i + 1 ) )
112+ . directory ( "." )
113+ . apply_if (
114+ Some ( categories[ i % categories. len ( ) ] ) ,
115+ MetadataBuilder :: add_category,
116+ )
117+ . add_language ( Language :: with_version (
118+ languages[ i % languages. len ( ) ] ,
119+ & format ! ( "1.{}" , i) ,
120+ ) )
121+ . apply_if (
122+ ( i % 2 == 0 ) . then_some ( Ide :: new ( ides[ i % ides. len ( ) ] ) ) ,
123+ MetadataBuilder :: preffered_ide,
124+ )
125+ . add_build_system ( BuildSystem :: with_version (
126+ build_systems[ i % build_systems. len ( ) ] ,
127+ & format ! ( "2.{}" , i) ,
128+ ) )
129+ . apply_if (
130+ ( i % 3 == 0 ) . then_some ( "Sample description" ) ,
131+ MetadataBuilder :: description,
132+ )
133+ . apply_if (
134+ ( i % 4 == 0 ) . then_some ( "https://github.com/example/project" ) ,
135+ MetadataBuilder :: repository_url,
136+ )
137+ . created ( base_time - offset)
138+ . updated ( base_time)
139+ . build ( )
140+ . expect ( "Should generate valid metadata" )
141+ } )
142+ . collect ( )
143+ }
87144
88- db
145+ #[ test]
146+ fn test_generated_metadata ( ) {
147+ let test_data = generate_test_metadata ( 5 ) ;
148+ assert_eq ! ( test_data. len( ) , 5 ) ;
149+
150+ let ids: HashSet < Uuid > = test_data. iter ( ) . map ( |m| m. id ) . collect ( ) ;
151+ assert_eq ! ( ids. len( ) , 5 ) ;
152+ }
89153}
90154
91155#[ cfg( test) ]
92156mod test {
93- use super :: * ;
157+ use sqlx:: SqlitePool ;
158+
159+ use crate :: database:: { DatabaseHandler , db_test:: fill_db} ;
94160
95- #[ tokio:: test]
96- async fn setup_test_db ( ) {
97- setup_db ( ) . await ;
161+ #[ sqlx:: test]
162+ async fn setup_test_db ( conn : SqlitePool ) {
163+ let db = DatabaseHandler :: with_conn ( conn) ;
164+ fill_db ( 25 , & db) . await ;
98165 }
99166}
0 commit comments