The version of this method in spree 2.1 will break our build
This way we simply bypass this fix in spree: https://github.com/spree/spree/pull/3669
We can get back to this in the future if we ever experience the mentioned bug
Updates the syntax to follow the recommended usage in the code comments of the ActiveModel #validates_with method.
Fixes:
12) Spree::PaymentMethod raises errors when required fields are missing
Failure/Error: expect(pm.errors.to_a).to eq(["Name can't be blank", "At least one hub must be selected"])
expected: ["Name can't be blank", "At least one hub must be selected"]
got: ["Name can't be blank", "At least one hub must be selected", "At least one hub must be selected"]
(compared using ==)
# ./spec/models/spree/payment_method_spec.rb:16:in `block (2 levels) in <module:Spree>'
Rails 4 now throws a fatal error if calling #touch on an object that hasn't been saved yet: c63cfc8722/activerecord/lib/active_record/persistence.rb (L957)
Fixes:
41) Stock::Package#shipping_methods does not return shipping methods not used by the package's order distributor
Failure/Error: distributors.each(&:touch)
ActiveRecord::ActiveRecordError:
can not touch on a new record object
# ./app/models/spree/shipping_method_decorator.rb:81:in `touch_distributors'
# ./spec/models/stock/package_spec.rb:39:in `block (2 levels) in <module:Stock>'
# ./spec/models/stock/package_spec.rb:17:in `block (2 levels) in <module:Stock>'
# ./spec/models/stock/package_spec.rb:32:in `block (2 levels) in <module:Stock>'
# ./spec/models/stock/package_spec.rb:7:in `block (2 levels) in <module:Stock>'
# ./spec/models/stock/package_spec.rb:44:in `block (3 levels) in <module:Stock>'
42) Stock::Package#shipping_categories returns shipping categories that are not shipping categories of the order's products
Failure/Error: distributors.each(&:touch)
ActiveRecord::ActiveRecordError:
can not touch on a new record object
# ./app/models/spree/shipping_method_decorator.rb:81:in `touch_distributors'
# ./spec/models/stock/package_spec.rb:39:in `block (2 levels) in <module:Stock>'
# ./spec/models/stock/package_spec.rb:17:in `block (2 levels) in <module:Stock>'
# ./spec/models/stock/package_spec.rb:32:in `block (2 levels) in <module:Stock>'
# ./spec/models/stock/package_spec.rb:7:in `block (2 levels) in <module:Stock>'
# ./spec/models/stock/package_spec.rb:50:in `block (3 levels) in <module:Stock>'
Responsibility for geocoding has moved from the `gmaps4rails` gem using `acts_as_taggable`, to the `geocoding` gem using `geocoded_by`. We already use this in the Address model.
For some reason some of the superfluous attributes being assigned here have started throwing fatal errors in Rails 4 instead of being silently ignored...
It looks like there are some issues with prepared statements here, where the resulting SQL contains something like: `WHERE "enterprise_roles"."user_id" = $1` in a subquery. The "$1" part is being lost somehow and isn't present if it's used in nested subqueries.
Example fixed spec (there are lots like this one):
59) Spree::Admin::ReportsController Supplier Bulk Coop where I have granted P-OC to the distributor only shows product line items that I am supplying
Failure/Error: produced_line_items.select("spree_line_items.id"))
ActiveRecord::StatementInvalid:
PG::ProtocolViolation: ERROR: bind message supplies 0 parameters, but prepared statement "" requires 1
: SELECT id FROM "spree_line_items" WHERE "spree_line_items"."order_id" IN (SELECT id FROM "spree_orders" WHERE (("spree_orders"."distributor_id" IN (SELECT enterprises.id FROM "enterprises" INNER JOIN "enterprise_roles" ON "enterprise_roles"."enterprise_id" = "enterprises"."id" WHERE (enterprise_roles.user_id = 947)) OR "spree_orders"."order_cycle_id" IN (SELECT id FROM "order_cycles" WHERE "order_cycles"."coordinator_id" IN (SELECT "enterprises"."id" FROM "enterprises" INNER JOIN "enterprise_roles" ON "enterprises"."id" = "enterprise_roles"."enterprise_id" WHERE "enterprise_roles"."user_id" = $1)))))
# ./app/services/permissions/order.rb:28:in `visible_line_items'
# ./lib/open_food_network/reports/line_items.rb:16:in `list'
# ./lib/open_food_network/bulk_coop_report.rb:54:in `table_items'
# ./app/controllers/spree/admin/reports_controller.rb:264:in `order_grouper_table'
# ./app/controllers/spree/admin/reports_controller.rb:101:in `bulk_coop'
# ./spec/controllers/spree/admin/reports_controller_spec.rb:168:in `block (5 levels) in <top (required)>'
# ------------------
# --- Caused by: ---
# PG::ProtocolViolation:
# ERROR: bind message supplies 0 parameters, but prepared statement "" requires 1
# ./app/services/permissions/order.rb:28:in `visible_line_items'
A new custom email validator class was added to Spree::Order, and currently it fails every time (breaking lots of specs). This ugly hack disables it for now.
DEPRECATION WARNING: The :restrict option is deprecated. Please use :restrict_with_exception instead, which provides the same functionality. (called from block in <top (required)> at /home/user/Github/openfoodnetwork/app/models/spree/address_decorator.rb:4)