diff --git a/app/assets/javascripts/darkswarm/services/cart.js.coffee b/app/assets/javascripts/darkswarm/services/cart.js.coffee index 55f7f6da1a..b8aa5c8727 100644 --- a/app/assets/javascripts/darkswarm/services/cart.js.coffee +++ b/app/assets/javascripts/darkswarm/services/cart.js.coffee @@ -1,4 +1,4 @@ -Darkswarm.factory 'Cart', (CurrentOrder, Variants, $timeout, $http, $modal, $rootScope, $resource, localStorageService, RailsFlashLoader) -> +Darkswarm.factory 'Cart', (CurrentOrder, Variants, $timeout, $http, $modal, $rootScope, $resource, localStorageService, Messages) -> # Handles syncing of current cart/order state to server new class Cart dirty: false @@ -50,7 +50,7 @@ Darkswarm.factory 'Cart', (CurrentOrder, Variants, $timeout, $http, $modal, $roo @popQueue() if @update_enqueued .error (response, status)=> - RailsFlashLoader.loadFlash({error: t('js.cart.add_to_cart_failed')}) + Messages.flash({error: t('js.cart.add_to_cart_failed')}) @update_running = false compareAndNotifyStockLevels: (stockLevels) => diff --git a/app/assets/javascripts/darkswarm/services/checkout.js.coffee b/app/assets/javascripts/darkswarm/services/checkout.js.coffee index d74f075ea3..69c484ccb4 100644 --- a/app/assets/javascripts/darkswarm/services/checkout.js.coffee +++ b/app/assets/javascripts/darkswarm/services/checkout.js.coffee @@ -1,4 +1,4 @@ -Darkswarm.factory 'Checkout', ($injector, CurrentOrder, ShippingMethods, StripeElements, PaymentMethods, $http, Navigation, CurrentHub, RailsFlashLoader, Loading)-> +Darkswarm.factory 'Checkout', ($injector, CurrentOrder, ShippingMethods, StripeElements, PaymentMethods, $http, Navigation, CurrentHub, Messages)-> new class Checkout errors: {} secrets: {} @@ -13,7 +13,7 @@ Darkswarm.factory 'Checkout', ($injector, CurrentOrder, ShippingMethods, StripeE @submit() submit: => - Loading.message = t 'submitting_order' + Messages.loading(t 'submitting_order') $http.put('/checkout.json', {order: @preprocess()}) .then (response) => Navigation.go response.data.path @@ -39,8 +39,7 @@ Darkswarm.factory 'Checkout', ($injector, CurrentOrder, ShippingMethods, StripeE @loadFlash(response.data.flash) loadFlash: (flash) => - Loading.clear() - RailsFlashLoader.loadFlash(flash) + Messages.flash(flash) # Rails wants our Spree::Address data to be provided with _attributes preprocess: -> diff --git a/app/assets/javascripts/darkswarm/services/credit_card.js.coffee b/app/assets/javascripts/darkswarm/services/credit_card.js.coffee index 28c2cde5f3..becb7498fb 100644 --- a/app/assets/javascripts/darkswarm/services/credit_card.js.coffee +++ b/app/assets/javascripts/darkswarm/services/credit_card.js.coffee @@ -1,4 +1,4 @@ -Darkswarm.factory 'CreditCard', ($injector, $rootScope, CreditCards, StripeElements, Navigation, $http, RailsFlashLoader, Loading)-> +Darkswarm.factory 'CreditCard', ($injector, $rootScope, CreditCards, StripeElements, Navigation, $http, Messages)-> new class CreditCard visible: false errors: {} @@ -12,16 +12,15 @@ Darkswarm.factory 'CreditCard', ($injector, $rootScope, CreditCards, StripeEleme params = @process_params() $http.put('/credit_cards/new_from_token', params ) .success (data, status) => - Loading.clear() + Messages.clear() @reset() CreditCards.add(data) .error (response, status) => if response.path Navigation.go response.path else - Loading.clear() @errors = response.errors - RailsFlashLoader.loadFlash(response.flash) + Messages.flash(response.flash) setFullName: -> @secrets.name = "#{@secrets.first_name} #{@secrets.last_name}" diff --git a/app/assets/javascripts/darkswarm/services/credit_cards.js.coffee b/app/assets/javascripts/darkswarm/services/credit_cards.js.coffee index d217a7a7bd..6b68ef983f 100644 --- a/app/assets/javascripts/darkswarm/services/credit_cards.js.coffee +++ b/app/assets/javascripts/darkswarm/services/credit_cards.js.coffee @@ -1,4 +1,4 @@ -Darkswarm.factory 'CreditCards', ($http, $filter, savedCreditCards, RailsFlashLoader)-> +Darkswarm.factory 'CreditCards', ($http, $filter, savedCreditCards, Messages)-> new class CreditCard saved: $filter('orderBy')(savedCreditCards,'-is_default') @@ -10,6 +10,6 @@ Darkswarm.factory 'CreditCards', ($http, $filter, savedCreditCards, RailsFlashLo for othercard in @saved when othercard != card othercard.is_default = false $http.put("/credit_cards/#{card.id}", is_default: true).then (data) -> - RailsFlashLoader.loadFlash({success: t('js.default_card_updated')}) + Messages.success(t('js.default_card_updated')) , (response) -> - RailsFlashLoader.loadFlash({error: response.data.flash.error}) + Messages.flash(response.data.flash) diff --git a/app/assets/javascripts/darkswarm/services/customer.js.coffee b/app/assets/javascripts/darkswarm/services/customer.js.coffee index ac27945c54..d9e0804d8b 100644 --- a/app/assets/javascripts/darkswarm/services/customer.js.coffee +++ b/app/assets/javascripts/darkswarm/services/customer.js.coffee @@ -1,4 +1,4 @@ -angular.module("Darkswarm").factory 'Customer', ($resource, RailsFlashLoader) -> +angular.module("Darkswarm").factory 'Customer', ($resource, Messages) -> Customer = $resource('/api/customers/:id/:action.json', {}, { 'index': method: 'GET' @@ -13,8 +13,8 @@ angular.module("Darkswarm").factory 'Customer', ($resource, RailsFlashLoader) -> Customer.prototype.update = -> @$update().then (response) => - RailsFlashLoader.loadFlash({success: t('js.changes_saved')}) + Messages.success(t('js.changes_saved')) , (response) => - RailsFlashLoader.loadFlash({error: response.data.error}) + Messages.error(response.data.error) Customer diff --git a/app/assets/javascripts/darkswarm/services/loading.js.coffee b/app/assets/javascripts/darkswarm/services/loading.js.coffee index af46487cd3..b44e86de0f 100644 --- a/app/assets/javascripts/darkswarm/services/loading.js.coffee +++ b/app/assets/javascripts/darkswarm/services/loading.js.coffee @@ -1,5 +1,5 @@ Darkswarm.factory "Loading", -> new class Loading - message: null + message: null clear: => @message = null diff --git a/app/assets/javascripts/darkswarm/services/messages.js.coffee b/app/assets/javascripts/darkswarm/services/messages.js.coffee new file mode 100644 index 0000000000..f05811ac5c --- /dev/null +++ b/app/assets/javascripts/darkswarm/services/messages.js.coffee @@ -0,0 +1,17 @@ +Darkswarm.factory "Messages", (Loading, RailsFlashLoader)-> + new class Messages + loading: (message) -> + Loading.message = message + + success: (message) -> + @flash(success: message) + + error: (message) -> + @flash(error: message) + + flash: (flash) -> + @clear() + RailsFlashLoader.loadFlash(flash) + + clear: -> + Loading.clear() diff --git a/app/assets/javascripts/darkswarm/services/stripe_elements.js.coffee b/app/assets/javascripts/darkswarm/services/stripe_elements.js.coffee index 46a6babf0d..90720a4fdb 100644 --- a/app/assets/javascripts/darkswarm/services/stripe_elements.js.coffee +++ b/app/assets/javascripts/darkswarm/services/stripe_elements.js.coffee @@ -1,4 +1,4 @@ -Darkswarm.factory 'StripeElements', ($rootScope, Loading, RailsFlashLoader) -> +Darkswarm.factory 'StripeElements', ($rootScope, Messages) -> new class StripeElements # These are both set from the StripeElements directive stripe: null @@ -8,13 +8,12 @@ Darkswarm.factory 'StripeElements', ($rootScope, Loading, RailsFlashLoader) -> requestToken: (secrets, submit, loading_message = t("processing_payment")) -> return unless @stripe? && @card? - Loading.message = loading_message + Messages.loading loading_message cardData = @makeCardData(secrets) @stripe.createToken(@card, cardData).then (response) => if(response.error) - Loading.clear() - RailsFlashLoader.loadFlash({error: t("error") + ": #{response.error.message}"}) + Messages.error(t("error") + ": #{response.error.message}") @triggerAngularDigest() console.error(JSON.stringify(response.error)) else @@ -27,13 +26,12 @@ Darkswarm.factory 'StripeElements', ($rootScope, Loading, RailsFlashLoader) -> createPaymentMethod: (secrets, submit, loading_message = t("processing_payment")) -> return unless @stripe? && @card? - Loading.message = loading_message + Messages.loading loading_message cardData = @makeCardData(secrets) @stripe.createPaymentMethod({ type: 'card', card: @card }, @card, cardData).then (response) => if(response.error) - Loading.clear() - RailsFlashLoader.loadFlash({error: t("error") + ": #{response.error.message}"}) + Messages.error(t("error") + ": #{response.error.message}") @triggerAngularDigest() console.error(JSON.stringify(response.error)) else diff --git a/spec/javascripts/unit/darkswarm/services/credit_card_spec.js.coffee b/spec/javascripts/unit/darkswarm/services/credit_card_spec.js.coffee index f6b6993859..f0ebc8f061 100644 --- a/spec/javascripts/unit/darkswarm/services/credit_card_spec.js.coffee +++ b/spec/javascripts/unit/darkswarm/services/credit_card_spec.js.coffee @@ -1,5 +1,9 @@ describe 'CreditCard service', -> CreditCard = null + CreditCards = null + $http = null + Loading = null + RailsFlashLoader = null beforeEach -> module 'Darkswarm' @@ -8,19 +12,43 @@ describe 'CreditCard service', -> $provide.value "railsFlash", null null - inject (_CreditCard_)-> + inject (_CreditCard_, _CreditCards_, _$httpBackend_, _Loading_, _RailsFlashLoader_)-> CreditCard = _CreditCard_ + CreditCards = _CreditCards_ + $http = _$httpBackend_ + Loading = _Loading_ + RailsFlashLoader = _RailsFlashLoader_ + + CreditCard.secrets = + card: + exp_month: "12" + exp_year: "2030" + last4: "1234" + cc_type: 'mastercard' + token: "token123" + + describe "submit", -> + it "adds a credit card", -> + $http.expectPUT("/credit_cards/new_from_token").respond(200, {}) + spyOn(CreditCards, "add") + + CreditCard.submit() + $http.flush() + + expect(CreditCards.add).toHaveBeenCalled() + + it "reports errors", -> + $http.expectPUT("/credit_cards/new_from_token").respond(500, {}) + spyOn(Loading, "clear") + spyOn(RailsFlashLoader, "loadFlash") + + CreditCard.submit() + $http.flush() + + expect(Loading.clear).toHaveBeenCalled() + expect(RailsFlashLoader.loadFlash).toHaveBeenCalled() describe "process_params", -> - beforeEach -> - CreditCard.secrets = - card: - exp_month: "12" - exp_year: "2030" - last4: "1234" - cc_type: 'mastercard' - token: "token123" - it "uses cc_type, rather than fetching the brand from the card", -> # This is important for processing the card with activemerchant process_params = CreditCard.process_params() diff --git a/spec/javascripts/unit/darkswarm/services/messages_spec.js.coffee b/spec/javascripts/unit/darkswarm/services/messages_spec.js.coffee new file mode 100644 index 0000000000..6bcf1bc237 --- /dev/null +++ b/spec/javascripts/unit/darkswarm/services/messages_spec.js.coffee @@ -0,0 +1,41 @@ +describe 'Messages service', -> + Messages = null + Loading = null + RailsFlashLoader = null + + beforeEach -> + module 'Darkswarm' + + module ($provide)-> + $provide.value "railsFlash", null + null + + inject (_Messages_, _Loading_, _RailsFlashLoader_)-> + Messages = _Messages_ + Loading = _Loading_ + RailsFlashLoader = _RailsFlashLoader_ + + it "shows a loading message", -> + Messages.loading("Hang on...") + expect(Loading.message).toEqual "Hang on..." + + it "shows a success message", -> + spyOn(RailsFlashLoader, "loadFlash") + Messages.success("Yay!") + expect(RailsFlashLoader.loadFlash).toHaveBeenCalledWith({success: "Yay!"}) + + it "shows a error message", -> + spyOn(RailsFlashLoader, "loadFlash") + Messages.error("Boo!") + expect(RailsFlashLoader.loadFlash).toHaveBeenCalledWith({error: "Boo!"}) + + it "shows a flash message", -> + data = {info: "thinking"} + spyOn(RailsFlashLoader, "loadFlash") + Messages.flash(data) + expect(RailsFlashLoader.loadFlash).toHaveBeenCalledWith(data) + + it "clears a loading message", -> + Messages.loading("Hang on...") + Messages.success("Done.") + expect(Loading.message).toEqual null