describe 'StripeElements Service', ->
  $httpBackend = $q = $rootScope = StripeElements = null
  StripeMock = { createToken: null }
  CardMock = { some: "card" }
  BugsnagMock =
    notify: (arg) ->

  beforeEach ->
    module 'Darkswarm'
    module ($provide) ->
      $provide.value "railsFlash", null
      null

    inject (_StripeElements_, _$httpBackend_, _$q_, _$rootScope_) ->
      $httpBackend = _$httpBackend_
      StripeElements = _StripeElements_
      $q = _$q_
      $rootScope = _$rootScope_

  describe "requestToken", ->
    secrets = {}
    submit = null
    response = null

    beforeEach inject ($window) ->
      StripeElements.stripe = StripeMock
      StripeElements.card = CardMock

    describe "with satifactory data", ->
      beforeEach ->
        submit = jasmine.createSpy()
        response = { token: { id: "token", card: { brand: 'MasterCard', last4: "5678", exp_month: 10, exp_year: 2099 } } }
        StripeMock.createToken = => $q.when(response)

      it "saves the response data to secrets, and submits the form", ->
        StripeElements.requestToken(secrets, submit)
        $rootScope.$digest() # required for #then to by called
        expect(secrets.token).toEqual "token"
        expect(secrets.cc_type).toEqual "MasterCard"
        expect(submit).toHaveBeenCalled()

    describe "with unsatifactory data", ->
      beforeEach ->
        submit = jasmine.createSpy()
        response = { token: {id: "token" }, error: { message: 'There was a problem' } }
        StripeMock.createToken = => $q.when(response)

      it "doesn't submit the form, shows an error message instead", inject (Loading, RailsFlashLoader) ->
        spyOn(Loading, "clear")
        spyOn(RailsFlashLoader, "loadFlash")
        spyOn(BugsnagMock, "notify")
        StripeElements.requestToken(secrets, submit).then (data) ->
          expect(submit).not.toHaveBeenCalled()
          expect(Loading.clear).toHaveBeenCalled()
          expect(RailsFlashLoader.loadFlash).toHaveBeenCalledWith({error: "Error: There was a problem"})
          expect(BugsnagMock.notify).toHaveBeenCalled()
