@@ -466,6 +466,96 @@ mod tests {
466466 constraints: vec![ ] ,
467467 indexes: vec![ ] ,
468468 } ) ]
469+ #[ case( "pk_and_fk_together" , {
470+ use vespertide_core:: schema:: foreign_key:: { ForeignKeyDef , ForeignKeySyntax } ;
471+ use vespertide_core:: schema:: reference:: ReferenceAction ;
472+ let mut table = TableDef {
473+ name: "article_user" . into( ) ,
474+ columns: vec![
475+ ColumnDef {
476+ name: "article_id" . into( ) ,
477+ r#type: ColumnType :: Simple ( SimpleColumnType :: Uuid ) ,
478+ nullable: false ,
479+ default : None ,
480+ comment: None ,
481+ primary_key: Some ( PrimaryKeySyntax :: Bool ( true ) ) ,
482+ unique: None ,
483+ index: Some ( vespertide_core:: StrOrBoolOrArray :: Bool ( true ) ) ,
484+ foreign_key: Some ( ForeignKeySyntax :: Object ( ForeignKeyDef {
485+ ref_table: "article" . into( ) ,
486+ ref_columns: vec![ "id" . into( ) ] ,
487+ on_delete: Some ( ReferenceAction :: Cascade ) ,
488+ on_update: None ,
489+ } ) ) ,
490+ } ,
491+ ColumnDef {
492+ name: "user_id" . into( ) ,
493+ r#type: ColumnType :: Simple ( SimpleColumnType :: Uuid ) ,
494+ nullable: false ,
495+ default : None ,
496+ comment: None ,
497+ primary_key: Some ( PrimaryKeySyntax :: Bool ( true ) ) ,
498+ unique: None ,
499+ index: Some ( vespertide_core:: StrOrBoolOrArray :: Bool ( true ) ) ,
500+ foreign_key: Some ( ForeignKeySyntax :: Object ( ForeignKeyDef {
501+ ref_table: "user" . into( ) ,
502+ ref_columns: vec![ "id" . into( ) ] ,
503+ on_delete: Some ( ReferenceAction :: Cascade ) ,
504+ on_update: None ,
505+ } ) ) ,
506+ } ,
507+ ColumnDef {
508+ name: "author_order" . into( ) ,
509+ r#type: ColumnType :: Simple ( SimpleColumnType :: Integer ) ,
510+ nullable: false ,
511+ default : Some ( "1" . into( ) ) ,
512+ comment: None ,
513+ primary_key: None ,
514+ unique: None ,
515+ index: None ,
516+ foreign_key: None ,
517+ } ,
518+ ColumnDef {
519+ name: "role" . into( ) ,
520+ r#type: ColumnType :: Complex ( vespertide_core:: ComplexColumnType :: Varchar { length: 20 } ) ,
521+ nullable: false ,
522+ default : Some ( "'contributor'" . into( ) ) ,
523+ comment: None ,
524+ primary_key: None ,
525+ unique: None ,
526+ index: None ,
527+ foreign_key: None ,
528+ } ,
529+ ColumnDef {
530+ name: "is_lead" . into( ) ,
531+ r#type: ColumnType :: Simple ( SimpleColumnType :: Boolean ) ,
532+ nullable: false ,
533+ default : Some ( "false" . into( ) ) ,
534+ comment: None ,
535+ primary_key: None ,
536+ unique: None ,
537+ index: None ,
538+ foreign_key: None ,
539+ } ,
540+ ColumnDef {
541+ name: "created_at" . into( ) ,
542+ r#type: ColumnType :: Simple ( SimpleColumnType :: Timestamptz ) ,
543+ nullable: false ,
544+ default : Some ( "now()" . into( ) ) ,
545+ comment: None ,
546+ primary_key: None ,
547+ unique: None ,
548+ index: None ,
549+ foreign_key: None ,
550+ } ,
551+ ] ,
552+ constraints: vec![ ] ,
553+ indexes: vec![ ] ,
554+ } ;
555+ // Normalize to convert inline constraints to table-level
556+ table = table. normalize( ) . unwrap( ) ;
557+ table
558+ } ) ]
469559 fn render_entity_snapshots ( #[ case] name : & str , #[ case] table : TableDef ) {
470560 let rendered = render_entity ( & table) ;
471561 with_settings ! ( { snapshot_suffix => format!( "params_{}" , name) } , {
0 commit comments