closure_tree icon indicating copy to clipboard operation
closure_tree copied to clipboard

`hash_tree` giving wrong output

Open smoyte opened this issue 8 years ago • 1 comments

Ok this is a very tricky bug so bear with me.

I tried to create a simplified test case to illustrate it but the bug seems to depend on a very particular order of things happening that I haven't been able to reproduce inside the gem source.

Here is how to reproduce:

git clone https://github.com/sassafrastech/madeline_system.git
cd madeline_system
git checkout closure_tree_hash_tree_bug
# Ensure ruby 2.2.3 or greater
bundle install
cp config/database.yml.example config/database.yml
cp config/secrets.yml.example config/secrets.yml
rspec ./spec/models/loan_response_progress_spec.rb:29

Note the output from hash_tree that gets printed to stdout. There are three top level nodes!

Note that if you run the spec individually with rspec ./spec/models/loan_response_progress_spec.rb:53, everything looks correct. The issue seems to be created by the fixtures from earlier tests being rolled back in the database, but I'm not sure how.

I was able to trace this to an issue with the ordering of the fetched nodes. In build_hash_tree, if you echo out the fetched nodes, they are not sorted by depth, and that throws the whole thing off.

For now I was able to fix this with this commit:

https://github.com/sassafrastech/closure_tree/commit/02689da3f186b7412adf648d298afc0614123631

But I don't think that should really be necessary since self_and_descendants is supposed to return nodes in depth order but isn't.

Curious if someone can fix this properly. I think this could be a serious bug as it's not clear when the ordering of self_and_descendants is incorrect and it could affect other parts of the code.

Thanks!

smoyte avatar Aug 04 '16 18:08 smoyte

Any thoughts on this?

smoyte avatar Oct 02 '16 15:10 smoyte