Skip to content

Commit 618d5ed

Browse files
committed
make stateAndDiff also respect resource, enhance tests
1 parent 74f4b69 commit 618d5ed

File tree

4 files changed

+34
-29
lines changed

4 files changed

+34
-29
lines changed

dsc/tests/dsc_config_test.tests.ps1

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,13 @@ Describe 'dsc config test tests' {
3333
}
3434
}
3535

36-
It '_inDesiredState returned is used when: <inDesiredState>' -TestCases @(
37-
@{ inDesiredState = $true }
38-
@{ inDesiredState = $false }
36+
It '_inDesiredState returned is used when: inDesiredState = <inDesiredState> and same = <same>' -TestCases @(
37+
@{ inDesiredState = $true; valueOne = 1; valueTwo = 2; same = $true }
38+
@{ inDesiredState = $true; valueOne = 3; valueTwo = 4; same = $false }
39+
@{ inDesiredState = $false; valueOne = 1; valueTwo = 2; same = $true }
40+
@{ inDesiredState = $false; valueOne = 3; valueTwo = 4; same = $false }
3941
) {
40-
param($inDesiredState)
42+
param($inDesiredState, $valueOne, $valueTwo)
4143

4244
$configYaml = @"
4345
`$schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
@@ -46,17 +48,18 @@ Describe 'dsc config test tests' {
4648
type: Test/InDesiredState
4749
properties:
4850
_inDesiredState: $inDesiredState
49-
value: Hello
51+
valueOne: $valueOne
52+
valueTwo: $valueTwo
5053
"@
5154

5255
$out = dsc config test -i $configYaml | ConvertFrom-Json
5356
$LASTEXITCODE | Should -Be 0
5457
$out.results[0].result.inDesiredState | Should -Be $inDesiredState
55-
if ($inDesiredState) {
58+
if ($same) {
5659
$out.results[0].result.differingProperties | Should -BeNullOrEmpty
5760
}
5861
else {
59-
$out.results[0].result.differingProperties | Should -Contain 'value'
62+
$out.results[0].result.differingProperties | Should -Be @('valueOne', 'valueTwo')
6063
}
6164
}
6265
}

dsc_lib/src/dscresources/command_resource.rs

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -283,25 +283,8 @@ pub fn invoke_test(resource: &ResourceManifest, cwd: &str, expected: &str) -> Re
283283
return Err(DscError::Operation(t!("dscresources.commandResource.failedParseJson", executable = &test.executable, stdout = stdout, stderr = stderr, err = err).to_string()))
284284
}
285285
};
286-
// if actual state contains _inDesiredState, we use that to determine if the resource is in desired state
287-
let mut in_desired_state: Option<bool> = None;
288-
if let Some(in_desired_state_value) = actual_value.get("_inDesiredState") {
289-
if let Some(desired_state) = in_desired_state_value.as_bool() {
290-
in_desired_state = Some(desired_state);
291-
} else {
292-
return Err(DscError::Operation(t!("dscresources.commandResource.inDesiredStateNotBool").to_string()));
293-
}
294-
}
295-
296-
let mut diff_properties: Vec<String> = Vec::new();
297-
match in_desired_state {
298-
Some(true) => {
299-
// if _inDesiredState is true, we don't need to check for diff properties
300-
},
301-
Some(false) | None => {
302-
diff_properties = get_diff(&expected_value, &actual_value);
303-
}
304-
}
286+
let in_desired_state = get_desired_state(&actual_value)?;
287+
let diff_properties = get_diff(&expected_value, &actual_value);
305288
Ok(TestResult::Resource(ResourceTestResponse {
306289
desired_state: expected_value,
307290
actual_state: actual_value,
@@ -320,10 +303,11 @@ pub fn invoke_test(resource: &ResourceManifest, cwd: &str, expected: &str) -> Re
320303
return Err(DscError::Command(resource.resource_type.clone(), exit_code, t!("dscresources.commandResource.testNoDiff").to_string()));
321304
};
322305
let diff_properties: Vec<String> = serde_json::from_str(diff_properties)?;
306+
let in_desired_state = get_desired_state(&actual_value)?;
323307
Ok(TestResult::Resource(ResourceTestResponse {
324308
desired_state: expected_value,
325309
actual_state: actual_value,
326-
in_desired_state: diff_properties.is_empty(),
310+
in_desired_state: in_desired_state.unwrap_or(diff_properties.is_empty()),
327311
diff_properties,
328312
}))
329313
},
@@ -353,6 +337,19 @@ pub fn invoke_test(resource: &ResourceManifest, cwd: &str, expected: &str) -> Re
353337
}
354338
}
355339

340+
fn get_desired_state(actual: &Value) -> Result<Option<bool>, DscError> {
341+
// if actual state contains _inDesiredState, we use that to determine if the resource is in desired state
342+
let mut in_desired_state: Option<bool> = None;
343+
if let Some(in_desired_state_value) = actual.get("_inDesiredState") {
344+
if let Some(desired_state) = in_desired_state_value.as_bool() {
345+
in_desired_state = Some(desired_state);
346+
} else {
347+
return Err(DscError::Operation(t!("dscresources.commandResource.inDesiredStateNotBool").to_string()));
348+
}
349+
}
350+
Ok(in_desired_state)
351+
}
352+
356353
fn invoke_synthetic_test(resource: &ResourceManifest, cwd: &str, expected: &str) -> Result<TestResult, DscError> {
357354
let get_result = invoke_get(resource, cwd, expected)?;
358355
let actual_state = match get_result {

tools/dsctest/src/in_desired_state.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@
44
use schemars::JsonSchema;
55
use serde::{Deserialize, Serialize};
66

7+
#[allow(clippy::struct_field_names)]
78
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
89
#[serde(deny_unknown_fields)]
910
pub struct InDesiredState {
1011
#[serde(rename = "_inDesiredState", skip_serializing_if = "Option::is_none")]
1112
pub in_desired_state: Option<bool>,
12-
pub value: String,
13+
#[serde(rename = "valueOne")]
14+
pub value_one: i32,
15+
#[serde(rename = "valueTwo")]
16+
pub value_two: i32,
1317
}

tools/dsctest/src/main.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ fn main() {
7575
std::process::exit(1);
7676
}
7777
};
78-
in_desired_state.value = "SomethingElse".to_string();
78+
in_desired_state.value_one = 1;
79+
in_desired_state.value_two= 2;
7980
serde_json::to_string(&in_desired_state).unwrap()
8081
},
8182
SubCommand::Schema { subcommand } => {

0 commit comments

Comments
 (0)