update_completion is only used internally, so instead test the real public entry point which is schedule_completion_update. This required mocking out QTimer to fire immediately so the test didn't have to do flaky artificial delays.