{
  "filename": "app/services/cancel_order.rb",
  "rule": "- name: submitted-order-version\n  where: \"app/services/cancel_order.rb\"\n  ensure: >-\n    The cancellation must reject when the supplied expected_version differs from order.lock_version before changing status.",
  "corrected": "class CancelOrder\n  def self.call(actor, order_id, expected_version)\n    order = actor.orders.find(order_id)\n    raise \"stale order\" unless order.lock_version == expected_version\n    raise \"not pending\" unless order.status == \"pending\"\n    order.status = \"cancelled\"\n    order.save!\n    order\n  rescue ActiveRecord::StaleObjectError\n    raise \"stale order\"\n  end\nend\n",
  "broken": "class CancelOrder\n  def self.call(actor, order_id, expected_version)\n    order = actor.orders.find(order_id)\n    raise \"not pending\" unless order.status == \"pending\"\n    order.status = \"cancelled\"\n    order.save!\n    order\n  rescue ActiveRecord::StaleObjectError\n    raise \"stale order\"\n  end\nend\n",
  "regression": [
    "    raise \"stale order\" unless order.lock_version == expected_version\n",
    ""
  ],
  "test_scenarios": [
    [
      "Screen version matches pending row",
      "Cancel succeeds"
    ],
    [
      "Screen version is older",
      "Conflict with no mutation"
    ],
    [
      "Another request updates after load",
      "StaleObjectError mapped to conflict"
    ],
    [
      "Another user submits id",
      "Scoped lookup rejects"
    ]
  ],
  "test_source": null,
  "test_command": "bin/rails test test/services/cancel_order_test.rb"
}