require 'spec_helper'

feature "Credit Cards", js: true do
  include AuthenticationWorkflow
  describe "as a logged in user" do
    let(:user) { create(:user) }
    let!(:customer) { create(:customer, user: user) }
    let!(:default_card) { create(:credit_card, user_id: user.id, gateway_customer_profile_id: 'cus_AZNMJ', is_default: true) }
    let!(:non_default_card) { create(:credit_card, user_id: user.id, gateway_customer_profile_id: 'cus_FDTG') }

    before do
      quick_login_as user

      allow(Stripe).to receive(:api_key) { "sk_test_xxxx" }
      allow(Stripe).to receive(:publishable_key) { "some_token" }
      Spree::Config.set(stripe_connect_enabled: true)

      stub_request(:get, "https://api.stripe.com/v1/customers/cus_AZNMJ").
        to_return(status: 200, body: JSON.generate(id: "cus_AZNMJ"))

      stub_request(:delete, "https://api.stripe.com/v1/customers/cus_AZNMJ").
        to_return(status: 200, body: JSON.generate(deleted: true, id: "cus_AZNMJ"))
    end

    it "passes the smoke test" do
      visit "/account"

      click_link I18n.t('spree.users.show.tabs.cards')

      expect(page).to have_content I18n.t(:saved_cards)

      # Lists saved cards
      within(".card#card#{default_card.id}") do
        expect(page).to have_content default_card.cc_type.capitalize
        expect(page).to have_content default_card.last_digits
        expect(find_field('default_card')).to be_checked
      end

      within(".card#card#{non_default_card.id}") do
        expect(page).to have_content non_default_card.cc_type.capitalize
        expect(page).to have_content non_default_card.last_digits
        expect(find_field('default_card')).to_not be_checked
      end

      # Allows switching of default card
      within(".card#card#{non_default_card.id}") do
        find_field('default_card').click
        expect(find_field('default_card')).to be_checked
      end

      expect(page).to have_content I18n.t('js.default_card_updated')

      expect(default_card.reload.is_default).to be false
      within(".card#card#{default_card.id}") do
        expect(find_field('default_card')).to_not be_checked
      end
      expect(non_default_card.reload.is_default).to be true

      # Shows the interface for adding a card
      click_button I18n.t(:add_a_card)
      expect(page).to have_field 'first_name'
      expect(page).to have_selector '#card-element.StripeElement'

      # Allows deletion of cards
      within(".card#card#{default_card.id}") do
        click_link I18n.t(:delete)
      end

      expect(page).to have_content I18n.t(:card_has_been_removed, number: "x-#{default_card.last_digits}")
      expect(page).to have_no_selector ".card#card#{default_card.id}"

      # Allows authorisation of card use by shops
      within "tr#customer#{customer.id}" do
        expect(find_field('allow_charges')).to_not be_checked
        find_field('allow_charges').click
      end
      expect(page).to have_content I18n.t('js.changes_saved')
      expect(customer.reload.allow_charges).to be true
    end
  end
end
