Skip to content

Commit b7d27a0

Browse files
committed
feat: implement integration test for version formats args
1 parent a806a29 commit b7d27a0

File tree

10 files changed

+375
-139
lines changed

10 files changed

+375
-139
lines changed

.dev/27-integration-tests-revamp-plan.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,12 +140,13 @@ tests/integration_tests/version/
140140
- ✅ Enhanced `TestCommand` with `.stdin()` support for cleaner testing
141141
- ✅ Refactored tests to use `rstest` for cleaner parameterized testing
142142
- ✅ Enhanced `ZervFixture.with_vcs_data()` to accept `Option` types for better flexibility
143-
- **Result**: 7 tests passing (100% success rate)
144-
- **Performance**: Tests run in <0.3 seconds without Docker
143+
- ✅ Implemented `formats.rs`: Comprehensive format conversion tests (30 tests)
144+
- **Result**: 37 tests passing (100% success rate) - 7 source tests + 30 format tests
145+
- **Performance**: Tests run in <0.7 seconds without Docker
145146
146147
**Remaining MainConfig Tests:**
147148
148-
- `formats.rs`: Test `--input-format` (semver/pep440/zerv) and `--output-format` (semver/pep440/zerv) combinations, format validation errors, error message consistency
149+
- `formats.rs`: Test `--input-format` (semver/pep440/auto) and `--output-format` (semver/pep440/zerv) combinations, format validation errors, error message consistency (✅ PASSED - 30 tests)
149150
- ❌ `schemas.rs`: Test `--schema` (tier1/tier2/tier3) and `--schema-ron` (custom RON schema) options
150151
- ❌ `templates.rs`: Test `--output-template` with Handlebars template rendering
151152
- ❌ `directory.rs`: Test `-C` flag for changing working directory before execution

src/cli/version/args/main.rs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -75,16 +75,3 @@ impl Default for MainConfig {
7575
}
7676
}
7777
}
78-
79-
impl MainConfig {
80-
/// Resolve schema selection with default fallback
81-
/// Returns (schema_name, schema_ron) with default applied if neither is provided
82-
pub fn resolve_schema(&self) -> (Option<&str>, Option<&str>) {
83-
match (self.schema.as_deref(), self.schema_ron.as_deref()) {
84-
(Some(name), None) => (Some(name), None),
85-
(None, Some(ron)) => (None, Some(ron)),
86-
(Some(_), Some(_)) => (self.schema.as_deref(), self.schema_ron.as_deref()), // Both provided - let validation handle conflict
87-
(None, None) => (Some("zerv-standard"), None), // Default fallback
88-
}
89-
}
90-
}

src/cli/version/args/mod.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,4 @@ impl VersionArgs {
108108
pub fn dirty_override(&self) -> Option<bool> {
109109
self.overrides.dirty_override()
110110
}
111-
112-
/// Resolve schema selection with default fallback
113-
/// Returns (schema_name, schema_ron) with default applied if neither is provided
114-
pub fn resolve_schema(&self) -> (Option<&str>, Option<&str>) {
115-
self.main.resolve_schema()
116-
}
117111
}

src/cli/version/args/tests/combination_tests.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -340,11 +340,3 @@ fn test_validate_pre_release_flags_no_conflict() {
340340
assert_eq!(args.bumps.bump_pre_release_label, Some("beta".to_string()));
341341
assert!(args.validate().is_ok());
342342
}
343-
344-
#[test]
345-
fn test_resolve_schema() {
346-
let args = VersionArgs::default();
347-
let (schema_name, schema_ron) = args.resolve_schema();
348-
assert_eq!(schema_name, Some("zerv-standard"));
349-
assert_eq!(schema_ron, None);
350-
}

src/cli/version/args/tests/main_tests.rs

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -45,52 +45,3 @@ fn test_main_config_with_overrides() {
4545
assert_eq!(config.output_prefix, Some("version:".to_string()));
4646
assert_eq!(config.directory, Some("/path/to/repo".to_string()));
4747
}
48-
49-
#[test]
50-
fn test_resolve_schema_default() {
51-
let config = MainConfig::default();
52-
let (schema_name, schema_ron) = config.resolve_schema();
53-
assert_eq!(schema_name, Some("zerv-standard"));
54-
assert_eq!(schema_ron, None);
55-
}
56-
57-
#[test]
58-
fn test_resolve_schema_preset() {
59-
let config = MainConfig {
60-
schema: Some("calver".to_string()),
61-
..Default::default()
62-
};
63-
let (schema_name, schema_ron) = config.resolve_schema();
64-
assert_eq!(schema_name, Some("calver"));
65-
assert_eq!(schema_ron, None);
66-
}
67-
68-
#[test]
69-
fn test_resolve_schema_ron() {
70-
let config = MainConfig {
71-
schema_ron: Some("(precedence_order: [Major, Minor, Patch])".to_string()),
72-
..Default::default()
73-
};
74-
let (schema_name, schema_ron) = config.resolve_schema();
75-
assert_eq!(schema_name, None);
76-
assert_eq!(
77-
schema_ron,
78-
Some("(precedence_order: [Major, Minor, Patch])")
79-
);
80-
}
81-
82-
#[test]
83-
fn test_resolve_schema_both_provided() {
84-
let config = MainConfig {
85-
schema: Some("calver".to_string()),
86-
schema_ron: Some("(precedence_order: [Major, Minor, Patch])".to_string()),
87-
..Default::default()
88-
};
89-
let (schema_name, schema_ron) = config.resolve_schema();
90-
// Both provided - let validation handle conflict
91-
assert_eq!(schema_name, Some("calver"));
92-
assert_eq!(
93-
schema_ron,
94-
Some("(precedence_order: [Major, Minor, Patch])")
95-
);
96-
}

src/cli/version/zerv_draft.rs

Lines changed: 80 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ impl ZervDraft {
3131
self.vars.apply_context_overrides(args)?;
3232

3333
// Then create the Zerv object
34-
let (schema_name, schema_ron) = args.resolve_schema();
35-
let mut zerv = self.create_zerv_version(schema_name, schema_ron)?;
34+
// let (schema_name, schema_ron) = args.resolve_schema();
35+
let mut zerv = self.create_zerv_version(args)?;
3636

3737
// Resolve templates using the current Zerv state
3838
let resolved_args = ResolvedArgs::resolve(args, &zerv)?;
@@ -44,12 +44,9 @@ impl ZervDraft {
4444
Ok(zerv)
4545
}
4646

47-
pub fn create_zerv_version(
48-
self,
49-
schema_name: Option<&str>,
50-
schema_ron: Option<&str>,
51-
) -> Result<Zerv, ZervError> {
52-
// Move the logic from crate::schema::create_zerv_version here
47+
pub fn create_zerv_version(self, args: &VersionArgs) -> Result<Zerv, ZervError> {
48+
let schema_name = args.main.schema.as_deref();
49+
let schema_ron = args.main.schema_ron.as_deref();
5350
let schema = match (schema_name, schema_ron) {
5451
// Custom RON schema
5552
(None, Some(ron_str)) => parse_ron_schema(ron_str)?,
@@ -74,9 +71,7 @@ impl ZervDraft {
7471
if let Some(existing_schema) = self.schema {
7572
existing_schema
7673
} else {
77-
return Err(ZervError::MissingSchema(
78-
"Either schema_name or schema_ron must be provided".to_string(),
79-
));
74+
get_preset_schema("zerv-standard", &self.vars).unwrap()
8075
}
8176
}
8277
};
@@ -88,19 +83,23 @@ impl ZervDraft {
8883
#[cfg(test)]
8984
mod tests {
9085
use super::*;
86+
use crate::cli::version::args::{
87+
MainConfig,
88+
OverridesConfig,
89+
VersionArgs,
90+
};
91+
use crate::version::zerv::bump::precedence::PrecedenceOrder;
92+
use crate::version::zerv::{
93+
Component,
94+
Var,
95+
};
9196

9297
#[test]
9398
fn test_zerv_draft_creation() {
9499
let vars = ZervVars::default();
95100
let draft = ZervDraft::new(vars.clone(), None);
96101
assert_eq!(draft.vars, vars);
97102
assert!(draft.schema.is_none());
98-
99-
use crate::version::zerv::bump::precedence::PrecedenceOrder;
100-
use crate::version::zerv::{
101-
Component,
102-
Var,
103-
};
104103
let schema = ZervSchema::new_with_precedence(
105104
vec![Component::Var(Var::Major)],
106105
vec![],
@@ -114,11 +113,6 @@ mod tests {
114113

115114
#[test]
116115
fn test_to_zerv_with_overrides() {
117-
use crate::cli::version::args::{
118-
OverridesConfig,
119-
VersionArgs,
120-
};
121-
122116
let vars = ZervVars {
123117
major: Some(1),
124118
minor: Some(2),
@@ -152,17 +146,22 @@ mod tests {
152146
..Default::default()
153147
};
154148

155-
// Test that create_zerv_version requires explicit schema (no default)
149+
// Test with no schema (should use default)
156150
let draft = ZervDraft::new(vars.clone(), None);
157-
let result = draft.create_zerv_version(None, None);
158-
assert!(result.is_err());
159-
assert!(matches!(result.unwrap_err(), ZervError::MissingSchema(_)));
151+
let args = VersionArgs::default();
152+
let zerv = draft.create_zerv_version(&args).unwrap();
153+
assert_eq!(zerv.schema, ZervSchema::zerv_standard_tier_1());
160154

161-
// Test with explicit schema (should work)
155+
// Test with explicit schema
162156
let draft = ZervDraft::new(vars, None);
163-
let zerv = draft
164-
.create_zerv_version(Some("zerv-standard"), None)
165-
.unwrap();
157+
let args = VersionArgs {
158+
main: MainConfig {
159+
schema: Some("zerv-standard".to_string()),
160+
..Default::default()
161+
},
162+
..Default::default()
163+
};
164+
let zerv = draft.create_zerv_version(&args).unwrap();
166165
assert_eq!(zerv.schema, ZervSchema::zerv_standard_tier_1());
167166
}
168167

@@ -182,7 +181,14 @@ mod tests {
182181
"#;
183182

184183
let draft = ZervDraft::new(vars, None);
185-
let zerv = draft.create_zerv_version(None, Some(ron_schema)).unwrap();
184+
let args = VersionArgs {
185+
main: MainConfig {
186+
schema_ron: Some(ron_schema.to_string()),
187+
..Default::default()
188+
},
189+
..Default::default()
190+
};
191+
let zerv = draft.create_zerv_version(&args).unwrap();
186192
assert_eq!(zerv.schema.core().len(), 2);
187193
assert_eq!(zerv.schema.build().len(), 1);
188194
}
@@ -192,15 +198,30 @@ mod tests {
192198
let vars = ZervVars::default();
193199
let ron_schema = "ZervSchema(core: [], extra_core: [], build: [], precedence_order: [])";
194200
let draft = ZervDraft::new(vars, None);
195-
let result = draft.create_zerv_version(Some("zerv-standard"), Some(ron_schema));
201+
let args = VersionArgs {
202+
main: MainConfig {
203+
schema: Some("zerv-standard".to_string()),
204+
schema_ron: Some(ron_schema.to_string()),
205+
..Default::default()
206+
},
207+
..Default::default()
208+
};
209+
let result = draft.create_zerv_version(&args);
196210
assert!(matches!(result, Err(ZervError::ConflictingSchemas(_))));
197211
}
198212

199213
#[test]
200214
fn test_unknown_schema_error() {
201215
let vars = ZervVars::default();
202216
let draft = ZervDraft::new(vars, None);
203-
let result = draft.create_zerv_version(Some("unknown"), None);
217+
let args = VersionArgs {
218+
main: MainConfig {
219+
schema: Some("unknown".to_string()),
220+
..Default::default()
221+
},
222+
..Default::default()
223+
};
224+
let result = draft.create_zerv_version(&args);
204225
assert!(matches!(result, Err(ZervError::UnknownSchema(_))));
205226
}
206227

@@ -209,18 +230,19 @@ mod tests {
209230
let vars = ZervVars::default();
210231
let invalid_ron = "invalid ron syntax";
211232
let draft = ZervDraft::new(vars, None);
212-
let result = draft.create_zerv_version(None, Some(invalid_ron));
233+
let args = VersionArgs {
234+
main: MainConfig {
235+
schema_ron: Some(invalid_ron.to_string()),
236+
..Default::default()
237+
},
238+
..Default::default()
239+
};
240+
let result = draft.create_zerv_version(&args);
213241
assert!(matches!(result, Err(ZervError::StdinError(_))));
214242
}
215243

216244
#[test]
217245
fn test_use_existing_schema_from_stdin() {
218-
use crate::version::zerv::bump::precedence::PrecedenceOrder;
219-
use crate::version::zerv::{
220-
Component,
221-
Var,
222-
};
223-
224246
let vars = ZervVars::default();
225247
let existing_schema = ZervSchema::new_with_precedence(
226248
vec![Component::Var(Var::Major)],
@@ -232,19 +254,15 @@ mod tests {
232254

233255
// Test using existing schema when no new schema is provided
234256
let draft = ZervDraft::new(vars, Some(existing_schema));
235-
let zerv = draft.create_zerv_version(None, None).unwrap();
257+
let args = VersionArgs::default();
258+
let zerv = draft.create_zerv_version(&args).unwrap();
236259
assert_eq!(zerv.schema.core().len(), 1);
237260
assert_eq!(zerv.schema.extra_core().len(), 0);
238261
assert_eq!(zerv.schema.build().len(), 0);
239262
}
240263

241264
#[test]
242265
fn test_zerv_schema_structure() {
243-
use crate::version::zerv::{
244-
Component,
245-
Var,
246-
};
247-
248266
// Create a simple ZervVars for tier 1 (tagged, clean)
249267
let vars = ZervVars {
250268
major: Some(1),
@@ -256,9 +274,14 @@ mod tests {
256274
};
257275

258276
let draft = ZervDraft::new(vars, None);
259-
let zerv = draft
260-
.create_zerv_version(Some("zerv-standard"), None)
261-
.unwrap();
277+
let args = VersionArgs {
278+
main: MainConfig {
279+
schema: Some("zerv-standard".to_string()),
280+
..Default::default()
281+
},
282+
..Default::default()
283+
};
284+
let zerv = draft.create_zerv_version(&args).unwrap();
262285

263286
// Test the actual schema structure
264287
println!("Core components: {:?}", zerv.schema.core());
@@ -274,11 +297,6 @@ mod tests {
274297

275298
#[test]
276299
fn test_zerv_ron_roundtrip_schema() {
277-
use crate::version::zerv::{
278-
Component,
279-
Var,
280-
};
281-
282300
let vars = ZervVars {
283301
major: Some(1),
284302
minor: Some(2),
@@ -289,9 +307,14 @@ mod tests {
289307
};
290308

291309
let draft = ZervDraft::new(vars, None);
292-
let original = draft
293-
.create_zerv_version(Some("zerv-standard"), None)
294-
.unwrap();
310+
let args = VersionArgs {
311+
main: MainConfig {
312+
schema: Some("zerv-standard".to_string()),
313+
..Default::default()
314+
},
315+
..Default::default()
316+
};
317+
let original = draft.create_zerv_version(&args).unwrap();
295318
let ron_string = original.to_string();
296319
let parsed: Zerv = ron_string.parse().unwrap();
297320

src/test_utils/zerv/zerv.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ impl ZervFixture {
7373
self
7474
}
7575

76+
/// Set dirty flag (chainable)
77+
pub fn with_dirty(mut self, dirty: bool) -> Self {
78+
self.zerv.vars.dirty = Some(dirty);
79+
self
80+
}
81+
7682
/// Add build component (chainable)
7783
pub fn with_build(mut self, component: Component) -> Self {
7884
let mut build = self.zerv.schema.build().clone();

0 commit comments

Comments
 (0)