From 7639e9a38d523adc055ca55e45302aee4aa8e5b3 Mon Sep 17 00:00:00 2001 From: Luis Ramos Date: Mon, 10 Feb 2020 13:51:44 +0000 Subject: [PATCH] Extrac ErrorsParser to separate class and make it handle the rails error structure with keys --- .../admin/bulk_product_update.js.coffee | 11 ++++----- .../utils/services/errors_parser.js.coffee | 17 ++++++++++++++ .../admin/bulk_product_update_spec.js.coffee | 23 +++++++++++++------ 3 files changed, 38 insertions(+), 13 deletions(-) create mode 100644 app/assets/javascripts/admin/utils/services/errors_parser.js.coffee diff --git a/app/assets/javascripts/admin/bulk_product_update.js.coffee b/app/assets/javascripts/admin/bulk_product_update.js.coffee index 6d51f2e597..d92bc73566 100644 --- a/app/assets/javascripts/admin/bulk_product_update.js.coffee +++ b/app/assets/javascripts/admin/bulk_product_update.js.coffee @@ -1,4 +1,4 @@ -angular.module("ofn.admin").controller "AdminProductEditCtrl", ($scope, $timeout, $filter, $http, $window, BulkProducts, DisplayProperties, DirtyProducts, VariantUnitManager, StatusMessage, producers, Taxons, Columns, tax_categories, RequestMonitor, SortOptions) -> +angular.module("ofn.admin").controller "AdminProductEditCtrl", ($scope, $timeout, $filter, $http, $window, BulkProducts, DisplayProperties, DirtyProducts, VariantUnitManager, StatusMessage, producers, Taxons, Columns, tax_categories, RequestMonitor, SortOptions, ErrorsParser) -> $scope.StatusMessage = StatusMessage $scope.columns = Columns.columns @@ -230,10 +230,9 @@ angular.module("ofn.admin").controller "AdminProductEditCtrl", ($scope, $timeout BulkProducts.updateVariantLists(data.products || []) $timeout -> $scope.displaySuccess() ).error (data, status) -> - if status == 400 && data.errors? && data.errors.length > 0 - errors = error + "\n" for error in data.errors - alert t("products_update_error") + "\n" + errors - $scope.displayFailure t("products_update_error") + if status == 400 && data.errors? + errorsString = ErrorsParser.toString(data.errors, status) + $scope.displayFailure t("products_update_error") + "\n" + errorsString else $scope.displayFailure t("products_update_error_data") + status @@ -284,7 +283,7 @@ angular.module("ofn.admin").controller "AdminProductEditCtrl", ($scope, $timeout $scope.displayFailure = (failMessage) -> - StatusMessage.display 'failure', t("products_update_error_msg") + "#{failMessage}" + StatusMessage.display 'failure', t("products_update_error_msg") + " #{failMessage}" $scope.displayDirtyProducts = -> diff --git a/app/assets/javascripts/admin/utils/services/errors_parser.js.coffee b/app/assets/javascripts/admin/utils/services/errors_parser.js.coffee new file mode 100644 index 0000000000..12c1682d77 --- /dev/null +++ b/app/assets/javascripts/admin/utils/services/errors_parser.js.coffee @@ -0,0 +1,17 @@ +# Parses a structure of errors that came from the server +angular.module("admin.utils").factory "ErrorsParser", -> + new class ErrorsParser + toString: (errors, defaultContent = "") => + if errors.length > 0 + # it is an array of errors + errorsString = error + "\n" for error in errors + else + # it is a hash of errors + keys = Object.keys(errors) + errorsString = "" + for key in keys + errorsString += error for error in errors[key] + + errorsString = defaultContent if errorsString == "" + + errorsString diff --git a/spec/javascripts/unit/admin/bulk_product_update_spec.js.coffee b/spec/javascripts/unit/admin/bulk_product_update_spec.js.coffee index 40233684ea..600e0c16e4 100644 --- a/spec/javascripts/unit/admin/bulk_product_update_spec.js.coffee +++ b/spec/javascripts/unit/admin/bulk_product_update_spec.js.coffee @@ -710,13 +710,22 @@ describe "AdminProductEditCtrl", -> $httpBackend.flush() expect($scope.displayFailure).toHaveBeenCalled() - it "shows an alert with error information when post returns 400 with an errors array", -> - spyOn(window, "alert") - $scope.products = "updated list of products" - $httpBackend.expectPOST("/admin/products/bulk_update").respond 400, { "errors": ["an error"] } - $scope.updateProducts "updated list of products" - $httpBackend.flush() - expect(window.alert).toHaveBeenCalledWith("Saving failed with the following error(s):\nan error\n") + describe "displaying the error information when post returns 400", -> + beforeEach -> + spyOn $scope, "displayFailure" + $scope.products = "updated list of products" + + it "displays errors in an array", -> + $httpBackend.expectPOST("/admin/products/bulk_update").respond 400, { "errors": ["an error"] } + $scope.updateProducts "updated list of products" + $httpBackend.flush() + expect($scope.displayFailure).toHaveBeenCalledWith("Saving failed with the following error(s):\nan error\n") + + it "displays errors in a hash", -> + $httpBackend.expectPOST("/admin/products/bulk_update").respond 400, { "errors": { "base": ["a basic error"] } } + $scope.updateProducts "updated list of products" + $httpBackend.flush() + expect($scope.displayFailure).toHaveBeenCalledWith("Saving failed with the following error(s):\na basic error") describe "adding variants", ->