inspec/lib/utils/object_traversal.rb
Adam Leff 4f2b66302d Fix ObjectTraverser when accessing array values
When attempting to access array values via the `json` resource:

```
describe json('/tmp/test.json') do
      its(['array',0]) { should eq "zero" }
end
```

... the resulting data would be an array of the size of the original array
with all the values replaced with nils:

```
     expected: "zero"
          got: [nil, nil, nil]
```

This was due to a bug in the ObjectTraverser mixin that mapped array values
back through `extract_value` rather than properly handling the passed-in
key(s). This worked fine for the specific data format created by the `csv`
resource but did not work `json` or any other resource that subclassed the
`JsonConfig` resource.

This change fixes the logic when dealing with an array when it's encountered,
and fixes up the `csv` resource with its own `value` method.

This change also adds tests for ObjectTraverser.

Signed-off-by: Adam Leff <adam@leff.co>
2017-03-15 11:35:55 +01:00

24 lines
645 B
Ruby

# encoding: utf-8
# author: Dominik Richter
# author: Christoph Hartmann
module ObjectTraverser
def extract_value(keys, value)
key = keys.shift
return nil if key.nil? || value.nil?
if value.is_a?(Array)
value = if key.is_a?(Fixnum)
value[key]
elsif value.respond_to?(key.to_sym)
value.send(key.to_sym)
end
else
value = value[key.to_s].nil? ? nil : value[key.to_s]
end
# if there are no more keys, just return the value
return value if keys.first.nil?
# if there are more keys, extract more
extract_value(keys.clone, value)
end
end