Welcome to mirror list, hosted at ThFree Co, Russian Federation.

upsert_credit_card_validation_service_spec.rb « users « services « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 4e23b51cae24199ee9f4498b8070bfd9983a50e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Users::UpsertCreditCardValidationService, feature_category: :user_profile do
  let_it_be(:user) { create(:user) }

  let(:user_id) { user.id }
  let(:credit_card_validated_time) { Time.utc(2020, 1, 1) }
  let(:expiration_year) { Date.today.year + 10 }
  let(:params) do
    {
      user_id: user_id,
      credit_card_validated_at: credit_card_validated_time,
      credit_card_expiration_year: expiration_year,
      credit_card_expiration_month: 1,
      credit_card_holder_name: 'John Smith',
      credit_card_type: 'AmericanExpress',
      credit_card_mask_number: '1111'
    }
  end

  describe '#execute' do
    subject(:service) { described_class.new(params) }

    context 'successfully set credit card validation record for the user' do
      context 'when user does not have credit card validation record' do
        it 'creates the credit card validation and returns a success' do
          expect(user.credit_card_validated_at).to be nil

          result = service.execute

          expect(result.status).to eq(:success)

          user.reload

          expect(user.credit_card_validation).to have_attributes(
            credit_card_validated_at: credit_card_validated_time,
            network: 'AmericanExpress',
            holder_name: 'John Smith',
            last_digits: 1111,
            expiration_date: Date.new(expiration_year, 1, 31)
          )
        end
      end

      context 'when user has credit card validation record' do
        let(:old_time) { Time.utc(1999, 2, 2) }

        before do
          create(:credit_card_validation, user: user, credit_card_validated_at: old_time)
        end

        it 'updates the credit card validation and returns a success' do
          expect(user.credit_card_validated_at).to eq(old_time)

          result = service.execute

          expect(result.status).to eq(:success)
          expect(user.reload.credit_card_validated_at).to eq(credit_card_validated_time)
        end
      end
    end

    shared_examples 'returns an error without tracking the exception' do
      it do
        expect(Gitlab::ErrorTracking).not_to receive(:track_exception)

        result = service.execute

        expect(result.status).to eq(:error)
      end
    end

    shared_examples 'returns an error, tracking the exception' do
      it do
        expect(Gitlab::ErrorTracking).to receive(:track_exception)

        result = service.execute

        expect(result.status).to eq(:error)
      end
    end

    context 'when user id does not exist' do
      let(:user_id) { non_existing_record_id }

      it_behaves_like 'returns an error without tracking the exception'
    end

    context 'when missing credit_card_validated_at' do
      let(:params) { { user_id: user_id } }

      it_behaves_like 'returns an error, tracking the exception'
    end

    context 'when missing user id' do
      let(:params) { { credit_card_validated_at: credit_card_validated_time } }

      it_behaves_like 'returns an error, tracking the exception'
    end

    context 'when unexpected exception happen' do
      let(:exception) { StandardError.new }

      before do
        allow_next_instance_of(::Users::CreditCardValidation) do |instance|
          allow(instance).to receive(:save).and_raise(exception)
        end
      end

      it 'tracks the exception and returns an error' do
        logged_params = {
          credit_card_validated_at: credit_card_validated_time,
          expiration_date: Date.new(expiration_year, 1, 31),
          holder_name: "John Smith",
          last_digits: 1111,
          network: "AmericanExpress",
          user_id: user_id
        }

        expect(Gitlab::ErrorTracking).to receive(:track_exception).with(exception, class: described_class.to_s, params: logged_params)

        result = service.execute

        expect(result.status).to eq(:error)
      end
    end
  end
end