Skip to content

Commit 883c6f4

Browse files
domenkozarclaude
andcommitted
Fix secretspec-derive tests compilation and execution
- Fix macro to access validation_result.secrets field instead of calling get() directly on ValidationResult - Add missing [secrets] section to empty.toml fixture - Update integration tests to expect correct types (fields with defaults are Option<String>) - Add required description fields to unit test TOML configurations - Update UI test stderr expectations for trybuild The secretspec-derive tests now compile and run successfully as part of cargo test --workspace. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 1ce7114 commit 883c6f4

File tree

7 files changed

+21
-8
lines changed

7 files changed

+21
-8
lines changed

secretspec-derive/src/lib.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,8 @@ pub fn define_secrets(input: TokenStream) -> TokenStream {
306306
Provider::Env => "env",
307307
};
308308

309-
let secrets = spec.validate(Some(provider_str.to_string()), None)?;
309+
let validation_result = spec.validate(Some(provider_str.to_string()), None)?;
310+
let secrets = validation_result.secrets;
310311

311312
Ok(Self {
312313
#(#load_assignments,)*
@@ -325,10 +326,11 @@ pub fn define_secrets(input: TokenStream) -> TokenStream {
325326
#(#profile_to_str,)*
326327
};
327328

328-
let secrets = spec.validate(
329+
let validation_result = spec.validate(
329330
Some(provider_str.to_string()),
330331
Some(profile_str.to_string())
331332
)?;
333+
let secrets = validation_result.secrets;
332334

333335
match profile {
334336
#(#load_profile_arms,)*

secretspec-derive/src/tests.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@ mod tests {
1717
fn test_parse_basic_config() {
1818
let toml_str = r#"
1919
[secrets.API_KEY]
20+
description = "API key"
2021
required = true
2122
2223
[secrets.DATABASE_URL]
24+
description = "Database URL"
2325
required = false
2426
default = "postgres://localhost"
2527
"#;
@@ -46,6 +48,7 @@ name = "test"
4648
fn test_parse_profile_overrides() {
4749
let toml_str = r#"
4850
[secrets.API_KEY]
51+
description = "API key"
4952
required = true
5053
5154
[secrets.API_KEY.development]
@@ -82,6 +85,7 @@ name = "test"
8285
// Test that a field that's optional in any profile becomes Option<String>
8386
let toml_str = r#"
8487
[secrets.SOMETIMES_REQUIRED]
88+
description = "Sometimes required secret"
8589
required = true
8690
8791
[secrets.SOMETIMES_REQUIRED.development]
@@ -123,6 +127,7 @@ name = "test"
123127
fn test_always_required_field() {
124128
let toml_str = r#"
125129
[secrets.ALWAYS_REQUIRED]
130+
description = "Always required secret"
126131
required = true
127132
128133
[secrets.ALWAYS_REQUIRED.development]
@@ -162,6 +167,7 @@ name = "test"
162167
fn test_default_makes_optional() {
163168
let toml_str = r#"
164169
[secrets.HAS_DEFAULT]
170+
description = "Secret with default"
165171
required = true
166172
default = "some-default"
167173
"#;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
[project]
22
name = "empty-project"
33

4+
[secrets]
45
# No secrets defined

secretspec-derive/tests/integration_test.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ mod profile_generation {
4242
redis_url,
4343
} => {
4444
let _: Option<String> = api_key; // Optional in dev
45-
let _: String = database_url; // Required but has default
45+
let _: Option<String> = database_url; // Required but has default
4646
let _: Option<String> = redis_url; // Optional
4747
}
4848
_ => panic!("Expected Development variant"),
@@ -70,7 +70,7 @@ mod profile_generation {
7070
// Verify the union struct has Option for fields that are optional in any profile
7171
fn _test_field_types(s: SecretSpec) {
7272
let _: Option<String> = s.api_key; // Optional in development
73-
let _: String = s.database_url; // Always required (has default in dev)
73+
let _: Option<String> = s.database_url; // Has default in dev, so optional in union type
7474
let _: Option<String> = s.redis_url; // Optional by default
7575
}
7676
}

secretspec-derive/tests/ui/file_not_found.stderr

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@ error: Failed to read this/file/does/not/exist.toml: No such file or directory (
22
--> tests/ui/file_not_found.rs:4:1
33
|
44
4 | define_secrets!("this/file/does/not/exist.toml");
5-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
6+
|
7+
= note: this error originates in the macro `define_secrets` (in Nightly builds, run with -Z macro-backtrace for more info)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use secretspec_derive::define_secrets;
22

33
// This should fail because the TOML is invalid
4-
define_secrets!("tests/fixtures/invalid_toml.txt");
4+
define_secrets!("secretspec-derive/tests/fixtures/invalid_toml.txt");
55

66
fn main() {}

secretspec-derive/tests/ui/valid_generation.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
use secretspec_derive::define_secrets;
2-
use secretspec::codegen::Provider;
32

43
// This should compile successfully
5-
define_secrets!("tests/fixtures/basic.toml");
4+
define_secrets!("secretspec-derive/tests/fixtures/basic.toml");
65

76
fn main() {
87
// Verify the generated types exist
98
let _ = std::mem::size_of::<SecretSpec>();
109

10+
// Verify the Provider enum was generated
11+
let _ = Provider::Keyring;
12+
1113
// Verify the load method exists
1214
fn test_load() -> Result<SecretSpec, secretspec::SecretSpecError> {
1315
SecretSpec::load(Provider::Keyring)

0 commit comments

Comments
 (0)