From e04c258e2482e4629af7b4dd91d73aabcfbed6db Mon Sep 17 00:00:00 2001 From: Miguel Gonzalez Date: Tue, 31 Jul 2018 22:06:41 +0200 Subject: [PATCH] fix: Fix apply_order_updates algorithm With this commit changes detection is improved. It fixes a regression introduced by be66c3270c43f19321832349c8436dce270feb99. --- taiga/projects/services/bulk_update_order.py | 10 +-- tests/unit/test_order_updates.py | 78 ++++++++++++++++++-- 2 files changed, 77 insertions(+), 11 deletions(-) diff --git a/taiga/projects/services/bulk_update_order.py b/taiga/projects/services/bulk_update_order.py index d851ac7e..91359119 100644 --- a/taiga/projects/services/bulk_update_order.py +++ b/taiga/projects/services/bulk_update_order.py @@ -42,11 +42,6 @@ def apply_order_updates(base_orders: dict, new_orders: dict, *, remove_equal_ori invalid_keys = new_orders.keys() - base_orders.keys() [new_orders.pop(id, None) for id in invalid_keys] - # Remove the elements from new_orders contained in base_orders - if remove_equal_original: - common_keys = base_orders.keys() & new_orders.keys() - [new_orders.pop(id, None) for id in common_keys if new_orders[id] == base_orders[id]] - # We will apply the multiple order changes by the new position order sorted_new_orders = [(k, v) for k, v in new_orders.items()] sorted_new_orders = sorted(sorted_new_orders, key=lambda e: e[1]) @@ -74,6 +69,11 @@ def apply_order_updates(base_orders: dict, new_orders: dict, *, remove_equal_ori removing_keys = [id for id in base_orders if id not in updated_order_ids] [base_orders.pop(id, None) for id in removing_keys] + # Remove the elements that remains the same + if remove_equal_original: + common_keys = base_orders.keys() & original_orders.keys() + [base_orders.pop(id, None) for id in common_keys if original_orders[id] == base_orders[id]] + def update_projects_order_in_bulk(bulk_data: list, field: str, user): """ diff --git a/tests/unit/test_order_updates.py b/tests/unit/test_order_updates.py index 1e640e14..dc8b87aa 100644 --- a/tests/unit/test_order_updates.py +++ b/tests/unit/test_order_updates.py @@ -199,16 +199,82 @@ def test_apply_order_not_include_noop(): assert orders == {} -def test_apply_order_does_no_generate_holes(): +def test_apply_order_put_it_first(): orders = { "a": 0, - "b": 2, - "c": 1, + "b": 1, + "c": 2, "z": 99, } new_orders = { - "c": 1, - "z": 99, + "z": 0, } apply_order_updates(orders, new_orders, remove_equal_original=True) - assert orders == {} + assert orders == { + "z": 0, + "a": 1, + "b": 2, + "c": 3, + } + + +def test_apply_order_put_it_first_with_tie(): + orders = { + "a": 0, + "b": 0, + "c": 0, + "d": 1, + "z": 99, + } + new_orders = { + "z": 0, + } + apply_order_updates(orders, new_orders, remove_equal_original=True) + assert orders == { + "z": 0, + "a": 1, + "b": 1, + "c": 1, + "d": 2, + } + + +def test_apply_order_refresh(): + orders = { + "a": 0, + "b": 0, + "c": 0, + "d": 1, + "w": 99, + "z": 0, + } + new_orders = { + "z": 0, + } + apply_order_updates(orders, new_orders, remove_equal_original=True) + assert orders == { + "a": 1, + "b": 1, + "c": 1, + "d": 2, + "w": 100, + } + + +def test_apply_order_maintain_new_values(): + orders = { + "a": 1, + "b": 2, + "c": 3, + "d": 4, + "e": 7, + "f": 6, + "g": 7, + } + new_orders = { + "e": 7, + "g": 8, + } + expected = {"g": 8} + apply_order_updates(orders, new_orders, remove_equal_original=True) + assert expected == orders