Skip to content

Commit ce2a012

Browse files
committed
Add test
1 parent 89e4f1c commit ce2a012

2 files changed

Lines changed: 148 additions & 133 deletions

File tree

crates/vespertide-macro/src/lib.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
// MigrationOptions and MigrationError are now in vespertide-core
22

3+
use std::env;
4+
use std::path::PathBuf;
5+
36
use proc_macro::TokenStream;
47
use quote::quote;
58
use syn::parse::{Parse, ParseStream};
@@ -183,9 +186,16 @@ pub(crate) fn vespertide_migration_impl(
183186
};
184187
let pool = &input.pool;
185188

189+
// Get project root from CARGO_MANIFEST_DIR (same as load_migrations_at_compile_time)
190+
let project_root = match env::var("CARGO_MANIFEST_DIR") {
191+
Ok(dir) => Some(PathBuf::from(dir)),
192+
Err(_) => None,
193+
};
194+
186195
// Load config to get prefix
187-
let config = match load_config_or_default(None) {
196+
let config = match load_config_or_default(project_root) {
188197
Ok(config) => config,
198+
#[cfg(not(tarpaulin_include))]
189199
Err(e) => {
190200
return syn::Error::new(
191201
proc_macro2::Span::call_site(),
Lines changed: 137 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -1,143 +1,148 @@
1-
use vespertide_core::{
2-
ColumnDef, ColumnType, ComplexColumnType, EnumValues, MigrationAction, MigrationPlan,
3-
SimpleColumnType,
4-
};
5-
use vespertide_query::{DatabaseBackend, build_plan_queries};
6-
7-
#[test]
8-
fn test_table_prefixed_enum_names() {
9-
// Test that enum types are created with table-prefixed names to avoid conflicts
10-
let plan = MigrationPlan {
11-
version: 1,
12-
comment: Some("Test enum naming".into()),
13-
created_at: None,
14-
actions: vec![
15-
// Create users table with status enum
16-
MigrationAction::CreateTable {
17-
table: "users".into(),
18-
columns: vec![
19-
ColumnDef {
20-
name: "id".into(),
21-
r#type: ColumnType::Simple(SimpleColumnType::Integer),
22-
nullable: false,
23-
default: None,
24-
comment: None,
25-
primary_key: Some(
26-
vespertide_core::schema::primary_key::PrimaryKeySyntax::Bool(true),
27-
),
28-
unique: None,
29-
index: None,
30-
foreign_key: None,
31-
},
32-
ColumnDef {
33-
name: "status".into(),
34-
r#type: ColumnType::Complex(ComplexColumnType::Enum {
1+
#[cfg(test)]
2+
mod test_utils {
3+
use vespertide_core::{
4+
ColumnDef, ColumnType, ComplexColumnType, EnumValues, MigrationAction, MigrationPlan,
5+
SimpleColumnType,
6+
};
7+
use vespertide_query::{DatabaseBackend, build_plan_queries};
8+
#[test]
9+
fn test_table_prefixed_enum_names() {
10+
// Test that enum types are created with table-prefixed names to avoid conflicts
11+
let plan = MigrationPlan {
12+
version: 1,
13+
comment: Some("Test enum naming".into()),
14+
created_at: None,
15+
actions: vec![
16+
// Create users table with status enum
17+
MigrationAction::CreateTable {
18+
table: "users".into(),
19+
columns: vec![
20+
ColumnDef {
21+
name: "id".into(),
22+
r#type: ColumnType::Simple(SimpleColumnType::Integer),
23+
nullable: false,
24+
default: None,
25+
comment: None,
26+
primary_key: Some(
27+
vespertide_core::schema::primary_key::PrimaryKeySyntax::Bool(true),
28+
),
29+
unique: None,
30+
index: None,
31+
foreign_key: None,
32+
},
33+
ColumnDef {
3534
name: "status".into(),
36-
values: EnumValues::String(vec!["active".into(), "inactive".into()]),
37-
}),
38-
nullable: false,
39-
default: None,
40-
comment: None,
41-
primary_key: None,
42-
unique: None,
43-
index: None,
44-
foreign_key: None,
45-
},
46-
],
47-
constraints: vec![],
48-
},
49-
// Create orders table with status enum (same name, different table)
50-
MigrationAction::CreateTable {
51-
table: "orders".into(),
52-
columns: vec![
53-
ColumnDef {
54-
name: "id".into(),
55-
r#type: ColumnType::Simple(SimpleColumnType::Integer),
56-
nullable: false,
57-
default: None,
58-
comment: None,
59-
primary_key: Some(
60-
vespertide_core::schema::primary_key::PrimaryKeySyntax::Bool(true),
61-
),
62-
unique: None,
63-
index: None,
64-
foreign_key: None,
65-
},
66-
ColumnDef {
67-
name: "status".into(),
68-
r#type: ColumnType::Complex(ComplexColumnType::Enum {
35+
r#type: ColumnType::Complex(ComplexColumnType::Enum {
36+
name: "status".into(),
37+
values: EnumValues::String(vec![
38+
"active".into(),
39+
"inactive".into(),
40+
]),
41+
}),
42+
nullable: false,
43+
default: None,
44+
comment: None,
45+
primary_key: None,
46+
unique: None,
47+
index: None,
48+
foreign_key: None,
49+
},
50+
],
51+
constraints: vec![],
52+
},
53+
// Create orders table with status enum (same name, different table)
54+
MigrationAction::CreateTable {
55+
table: "orders".into(),
56+
columns: vec![
57+
ColumnDef {
58+
name: "id".into(),
59+
r#type: ColumnType::Simple(SimpleColumnType::Integer),
60+
nullable: false,
61+
default: None,
62+
comment: None,
63+
primary_key: Some(
64+
vespertide_core::schema::primary_key::PrimaryKeySyntax::Bool(true),
65+
),
66+
unique: None,
67+
index: None,
68+
foreign_key: None,
69+
},
70+
ColumnDef {
6971
name: "status".into(),
70-
values: EnumValues::String(vec![
71-
"pending".into(),
72-
"shipped".into(),
73-
"delivered".into(),
74-
]),
75-
}),
76-
nullable: false,
77-
default: None,
78-
comment: None,
79-
primary_key: None,
80-
unique: None,
81-
index: None,
82-
foreign_key: None,
83-
},
84-
],
85-
constraints: vec![],
86-
},
87-
],
88-
};
72+
r#type: ColumnType::Complex(ComplexColumnType::Enum {
73+
name: "status".into(),
74+
values: EnumValues::String(vec![
75+
"pending".into(),
76+
"shipped".into(),
77+
"delivered".into(),
78+
]),
79+
}),
80+
nullable: false,
81+
default: None,
82+
comment: None,
83+
primary_key: None,
84+
unique: None,
85+
index: None,
86+
foreign_key: None,
87+
},
88+
],
89+
constraints: vec![],
90+
},
91+
],
92+
};
8993

90-
let queries = build_plan_queries(&plan, &[]).unwrap();
94+
let queries = build_plan_queries(&plan, &[]).unwrap();
9195

92-
// Check users table enum type
93-
let users_sql = &queries[0].postgres;
94-
let create_users_enum = users_sql[0].build(DatabaseBackend::Postgres);
95-
assert!(
96-
create_users_enum.contains("CREATE TYPE \"users_status\""),
97-
"Should create users_status enum type. Got: {}",
98-
create_users_enum
99-
);
100-
assert!(
101-
create_users_enum.contains("'active', 'inactive'"),
102-
"Should include user status values"
103-
);
96+
// Check users table enum type
97+
let users_sql = &queries[0].postgres;
98+
let create_users_enum = users_sql[0].build(DatabaseBackend::Postgres);
99+
assert!(
100+
create_users_enum.contains("CREATE TYPE \"users_status\""),
101+
"Should create users_status enum type. Got: {}",
102+
create_users_enum
103+
);
104+
assert!(
105+
create_users_enum.contains("'active', 'inactive'"),
106+
"Should include user status values"
107+
);
104108

105-
let create_users_table = users_sql[1].build(DatabaseBackend::Postgres);
106-
assert!(
107-
create_users_table.contains("users_status"),
108-
"Users table should use users_status type. Got: {}",
109-
create_users_table
110-
);
109+
let create_users_table = users_sql[1].build(DatabaseBackend::Postgres);
110+
assert!(
111+
create_users_table.contains("users_status"),
112+
"Users table should use users_status type. Got: {}",
113+
create_users_table
114+
);
111115

112-
// Check orders table enum type
113-
let orders_sql = &queries[1].postgres;
114-
let create_orders_enum = orders_sql[0].build(DatabaseBackend::Postgres);
115-
assert!(
116-
create_orders_enum.contains("CREATE TYPE \"orders_status\""),
117-
"Should create orders_status enum type. Got: {}",
118-
create_orders_enum
119-
);
120-
assert!(
121-
create_orders_enum.contains("'pending', 'shipped', 'delivered'"),
122-
"Should include order status values"
123-
);
116+
// Check orders table enum type
117+
let orders_sql = &queries[1].postgres;
118+
let create_orders_enum = orders_sql[0].build(DatabaseBackend::Postgres);
119+
assert!(
120+
create_orders_enum.contains("CREATE TYPE \"orders_status\""),
121+
"Should create orders_status enum type. Got: {}",
122+
create_orders_enum
123+
);
124+
assert!(
125+
create_orders_enum.contains("'pending', 'shipped', 'delivered'"),
126+
"Should include order status values"
127+
);
124128

125-
let create_orders_table = orders_sql[1].build(DatabaseBackend::Postgres);
126-
assert!(
127-
create_orders_table.contains("orders_status"),
128-
"Orders table should use orders_status type. Got: {}",
129-
create_orders_table
130-
);
129+
let create_orders_table = orders_sql[1].build(DatabaseBackend::Postgres);
130+
assert!(
131+
create_orders_table.contains("orders_status"),
132+
"Orders table should use orders_status type. Got: {}",
133+
create_orders_table
134+
);
131135

132-
println!("\n=== Users Table SQL ===");
133-
for (i, q) in users_sql.iter().enumerate() {
134-
println!("{}: {}", i + 1, q.build(DatabaseBackend::Postgres));
135-
}
136+
println!("\n=== Users Table SQL ===");
137+
for (i, q) in users_sql.iter().enumerate() {
138+
println!("{}: {}", i + 1, q.build(DatabaseBackend::Postgres));
139+
}
136140

137-
println!("\n=== Orders Table SQL ===");
138-
for (i, q) in orders_sql.iter().enumerate() {
139-
println!("{}: {}", i + 1, q.build(DatabaseBackend::Postgres));
140-
}
141+
println!("\n=== Orders Table SQL ===");
142+
for (i, q) in orders_sql.iter().enumerate() {
143+
println!("{}: {}", i + 1, q.build(DatabaseBackend::Postgres));
144+
}
141145

142-
println!("\n✅ Table-prefixed enum names successfully prevent naming conflicts!");
146+
println!("\n✅ Table-prefixed enum names successfully prevent naming conflicts!");
147+
}
143148
}

0 commit comments

Comments
 (0)