mas-rad_core 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +3 -0
- data/Rakefile +14 -0
- data/app/models/accreditation.rb +5 -0
- data/app/models/adviser.rb +61 -0
- data/app/models/allowed_payment_method.rb +7 -0
- data/app/models/authentication.rb +19 -0
- data/app/models/firm.rb +143 -0
- data/app/models/in_person_advice_method.rb +7 -0
- data/app/models/initial_advice_fee_structure.rb +7 -0
- data/app/models/initial_meeting_duration.rb +7 -0
- data/app/models/investment_size.rb +7 -0
- data/app/models/lookup/adviser.rb +10 -0
- data/app/models/lookup/firm.rb +17 -0
- data/app/models/lookup/subsidiary.rb +11 -0
- data/app/models/ongoing_advice_fee_structure.rb +7 -0
- data/app/models/other_advice_method.rb +7 -0
- data/app/models/principal.rb +94 -0
- data/app/models/professional_body.rb +3 -0
- data/app/models/professional_standing.rb +3 -0
- data/app/models/qualification.rb +5 -0
- data/app/models/travel_distance.rb +15 -0
- data/config/routes.rb +2 -0
- data/db/migrate/20141211110031_create_lookup_firms.rb +11 -0
- data/db/migrate/20141221140208_create_principals.rb +23 -0
- data/db/migrate/20141222150416_add_last_sign_in_at_to_principal.rb +5 -0
- data/db/migrate/20141230112136_create_lookup_subsidiaries.rb +10 -0
- data/db/migrate/20150106115732_remove_last_sign_in_at_from_principals.rb +5 -0
- data/db/migrate/20150114144343_create_lookup_advisers.rb +10 -0
- data/db/migrate/20150114151447_create_firms.rb +13 -0
- data/db/migrate/20150115130949_add_address_to_firm.rb +9 -0
- data/db/migrate/20150119102735_create_in_person_advice_methods.rb +15 -0
- data/db/migrate/20150119111754_create_other_advice_methods.rb +15 -0
- data/db/migrate/20150119114218_add_free_initial_meeting_to_firm.rb +5 -0
- data/db/migrate/20150119125208_create_initial_meeting_durations.rb +11 -0
- data/db/migrate/20150119152325_create_initial_advice_fee_structures.rb +15 -0
- data/db/migrate/20150119152336_create_ongoing_advice_fee_structures.rb +15 -0
- data/db/migrate/20150120133717_create_allowed_payment_methods.rb +15 -0
- data/db/migrate/20150120141928_add_minimum_fixed_fee_to_firm.rb +5 -0
- data/db/migrate/20150120150738_create_investment_sizes.rb +15 -0
- data/db/migrate/20150121110757_create_advisers.rb +11 -0
- data/db/migrate/20150121123437_add_business_income_breakdown_fields_to_firm.rb +11 -0
- data/db/migrate/20150121134845_create_qualifications.rb +15 -0
- data/db/migrate/20150121154458_create_accreditations.rb +15 -0
- data/db/migrate/20150121173015_create_professional_standings.rb +15 -0
- data/db/migrate/20150121181341_create_professional_bodies.rb +15 -0
- data/db/migrate/20150121183728_add_confirmed_disclaimer_to_advisers.rb +5 -0
- data/db/migrate/20150124124350_add_geographical_fields_to_adviser.rb +7 -0
- data/db/migrate/20150125145457_add_parent_id_to_firms.rb +5 -0
- data/db/migrate/20150125164156_remove_unique_constraint_from_firms_fca_number.rb +5 -0
- data/db/migrate/20150127084858_add_ordering_on_reference_data.rb +31 -0
- data/db/migrate/20150209144836_remove_covers_whole_of_uk_from_advisers.rb +17 -0
- data/lib/mas/rad_core.rb +4 -0
- data/lib/mas/rad_core/engine.rb +21 -0
- data/lib/mas/rad_core/version.rb +5 -0
- data/lib/mas/stats.rb +19 -0
- data/lib/mas/tasks/rad_core_tasks.rake +4 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +29 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +26 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.example.yml +14 -0
- data/spec/dummy/config/database.yml +13 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +41 -0
- data/spec/dummy/config/environments/production.rb +79 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/db/schema.rb +246 -0
- data/spec/dummy/log/test.log +13097 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/factories/accreditation.rb +5 -0
- data/spec/factories/adviser.rb +21 -0
- data/spec/factories/allowed_payment_method.rb +5 -0
- data/spec/factories/firm.rb +34 -0
- data/spec/factories/in_person_advice_method.rb +5 -0
- data/spec/factories/initial_advice_fee_structure.rb +5 -0
- data/spec/factories/initial_meeting_duration.rb +5 -0
- data/spec/factories/investment_size.rb +5 -0
- data/spec/factories/lookup_firm.rb +6 -0
- data/spec/factories/ongoing_advice_fee_structure.rb +5 -0
- data/spec/factories/other_advice_method.rb +5 -0
- data/spec/factories/principal.rb +15 -0
- data/spec/factories/professional_body.rb +5 -0
- data/spec/factories/professional_standing.rb +5 -0
- data/spec/factories/qualification.rb +5 -0
- data/spec/models/accreditation_spec.rb +3 -0
- data/spec/models/adviser_spec.rb +93 -0
- data/spec/models/allowed_payment_method_spec.rb +3 -0
- data/spec/models/firm_spec.rb +188 -0
- data/spec/models/in_person_advice_method_spec.rb +3 -0
- data/spec/models/initial_advice_fee_structure_spec.rb +3 -0
- data/spec/models/initial_meeting_duration_spec.rb +3 -0
- data/spec/models/investment_size_spec.rb +3 -0
- data/spec/models/lookup/adviser_spec.rb +21 -0
- data/spec/models/lookup/firm_spec.rb +19 -0
- data/spec/models/ongoing_advice_fee_structure_spec.rb +3 -0
- data/spec/models/other_advice_method_spec.rb +3 -0
- data/spec/models/principal_spec.rb +185 -0
- data/spec/models/qualification_spec.rb +3 -0
- data/spec/spec_helper.rb +24 -0
- data/spec/support/shared_examples/reference_data.rb +14 -0
- metadata +361 -0
@@ -0,0 +1,188 @@
|
|
1
|
+
RSpec.describe Firm do
|
2
|
+
subject(:firm) { build(:firm) }
|
3
|
+
|
4
|
+
describe '#in_person_advice?' do
|
5
|
+
context 'when the firm offers in person advice' do
|
6
|
+
it 'is true' do
|
7
|
+
expect(firm).to be_in_person_advice
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
context 'when the firm does not offer in person advice' do
|
12
|
+
it 'is false' do
|
13
|
+
firm.in_person_advice_methods.clear
|
14
|
+
|
15
|
+
expect(firm).to_not be_in_person_advice
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe 'subsidaries' do
|
21
|
+
context 'when the firm has a parent' do
|
22
|
+
it 'is classed as a subsidiary' do
|
23
|
+
expect(build(:subsidiary)).to be_subsidiary
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#subsidiaries' do
|
28
|
+
it 'exposes subsidiaries' do
|
29
|
+
subsidiary = create(:subsidiary)
|
30
|
+
expect(subsidiary.parent.subsidiaries).to contain_exactly(subsidiary)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe 'validation' do
|
36
|
+
it 'is valid with valid attributes' do
|
37
|
+
expect(firm).to be_valid
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'orders fields correctly for dough' do
|
41
|
+
expect(firm.field_order).not_to be_empty
|
42
|
+
end
|
43
|
+
|
44
|
+
describe 'email address' do
|
45
|
+
context 'when not present' do
|
46
|
+
before { firm.email_address = nil }
|
47
|
+
|
48
|
+
it { is_expected.to_not be_valid }
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'when badly formatted' do
|
52
|
+
before { firm.email_address = 'not-valid' }
|
53
|
+
|
54
|
+
it { is_expected.to_not be_valid }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe 'telephone number' do
|
59
|
+
context 'when not present' do
|
60
|
+
before { firm.telephone_number = nil }
|
61
|
+
|
62
|
+
it { is_expected.to_not be_valid }
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'when badly formatted' do
|
66
|
+
before { firm.telephone_number = 'not-valid' }
|
67
|
+
|
68
|
+
it { is_expected.to_not be_valid }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe 'address line 1' do
|
73
|
+
context 'when missing' do
|
74
|
+
before { firm.address_line_one = nil }
|
75
|
+
|
76
|
+
it { is_expected.not_to be_valid }
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe 'address town' do
|
81
|
+
context 'when missing' do
|
82
|
+
before { firm.address_town = nil }
|
83
|
+
|
84
|
+
it { is_expected.not_to be_valid }
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe 'address county' do
|
89
|
+
context 'when missing' do
|
90
|
+
before { firm.address_county = nil }
|
91
|
+
|
92
|
+
it { is_expected.not_to be_valid }
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe 'address postcode' do
|
97
|
+
context 'when missing' do
|
98
|
+
before { firm.address_postcode = nil }
|
99
|
+
|
100
|
+
it { is_expected.not_to be_valid }
|
101
|
+
end
|
102
|
+
|
103
|
+
context 'when invalid' do
|
104
|
+
before { firm.address_postcode = nil }
|
105
|
+
|
106
|
+
it { is_expected.not_to be_valid }
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe 'in person advice methods' do
|
111
|
+
context 'when none assigned' do
|
112
|
+
before { firm.in_person_advice_methods = [] }
|
113
|
+
|
114
|
+
it { is_expected.to be_valid }
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe 'free initial meeting' do
|
119
|
+
context 'when missing' do
|
120
|
+
before { firm.free_initial_meeting = nil }
|
121
|
+
|
122
|
+
it { is_expected.not_to be_valid }
|
123
|
+
end
|
124
|
+
|
125
|
+
context 'when set to true' do
|
126
|
+
before { firm.free_initial_meeting = true }
|
127
|
+
|
128
|
+
describe 'initial meeting duration' do
|
129
|
+
before { firm.initial_meeting_duration = nil }
|
130
|
+
|
131
|
+
context 'when missing' do
|
132
|
+
it { is_expected.not_to be_valid }
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
describe 'initial advice fee structures' do
|
139
|
+
context 'when none assigned' do
|
140
|
+
before { firm.initial_advice_fee_structures = [] }
|
141
|
+
|
142
|
+
it { is_expected.not_to be_valid }
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
describe 'ongoing advice fee structures' do
|
147
|
+
context 'when none assigned' do
|
148
|
+
before { firm.ongoing_advice_fee_structures = [] }
|
149
|
+
|
150
|
+
it { is_expected.not_to be_valid }
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
describe 'allowed payment methods' do
|
155
|
+
context 'when none assigned' do
|
156
|
+
before { firm.allowed_payment_methods = [] }
|
157
|
+
|
158
|
+
it { is_expected.not_to be_valid }
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
describe 'minimum fixed fee' do
|
163
|
+
context 'when not numeric' do
|
164
|
+
before { firm.minimum_fixed_fee = 'not-numeric' }
|
165
|
+
|
166
|
+
it { is_expected.not_to be_valid }
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
describe 'business income breakdown' do
|
171
|
+
context 'when sum not equal to 100' do
|
172
|
+
before do
|
173
|
+
firm.retirement_income_products_percent = 5
|
174
|
+
end
|
175
|
+
|
176
|
+
it { is_expected.not_to be_valid }
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
describe 'investment size' do
|
181
|
+
context 'when none assigned' do
|
182
|
+
before { firm.investment_sizes = [] }
|
183
|
+
|
184
|
+
it { is_expected.not_to be_valid }
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
RSpec.describe Lookup::Adviser do
|
2
|
+
describe 'validation' do
|
3
|
+
it 'is valid with valid attributes' do
|
4
|
+
expect(
|
5
|
+
described_class.new(reference_number: 'AAA00001', name: 'Ben Lovell')
|
6
|
+
).to be_valid
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'Reference number rules' do
|
10
|
+
it 'must be 8 characters' do
|
11
|
+
expect(described_class.new(reference_number: '123A45')).to_not be_valid
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe 'Name rules' do
|
16
|
+
it 'must be provided' do
|
17
|
+
expect(described_class.new(reference_number: 'AAA00001')).to_not be_valid
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
RSpec.describe Lookup::Firm do
|
2
|
+
describe 'validation' do
|
3
|
+
it 'is valid with valid attributes' do
|
4
|
+
expect(
|
5
|
+
described_class.new(fca_number: 123456, registered_name: 'Ben Lovell Ltd')
|
6
|
+
).to be_valid
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'FCA Number rules' do
|
10
|
+
it 'accepts numeric' do
|
11
|
+
expect(described_class.new(fca_number: '123A45')).to_not be_valid
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'accepts only 6 digits' do
|
15
|
+
expect(described_class.new(fca_number: 1234567)).to_not be_valid
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,185 @@
|
|
1
|
+
RSpec.describe Principal do
|
2
|
+
let(:principal) { create(:principal) }
|
3
|
+
|
4
|
+
describe '#lookup_firm' do
|
5
|
+
it 'returns my associated lookup firm' do
|
6
|
+
expect(principal.lookup_firm).to be
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
describe '#subsidiaries?' do
|
11
|
+
context 'when my firm has subsidiaries' do
|
12
|
+
before { principal.lookup_firm.subsidiaries.create! }
|
13
|
+
|
14
|
+
it 'is truthy' do
|
15
|
+
expect(principal.subsidiaries?).to be_truthy
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'when my firm has no subsidiaries' do
|
20
|
+
it 'is falsey' do
|
21
|
+
expect(principal.subsidiaries?).to be_falsey
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'uses the token for ID purposes' do
|
27
|
+
expect(principal.id).to eq(principal.token)
|
28
|
+
expect(Principal.find(principal.token)).to eq(principal)
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'upon creation' do
|
32
|
+
it 'generates an 8 character, 4 byte token' do
|
33
|
+
expect(principal.token.length).to eq(8)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'creates the associated Firm' do
|
37
|
+
expect(principal.firm.fca_number).to eq(principal.lookup_firm.fca_number)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe 'validation' do
|
42
|
+
it 'is valid with valid attributes' do
|
43
|
+
expect(principal).to be_valid
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'must confirm accuracy' do
|
47
|
+
expect(build(:principal, confirmed_disclaimer: false)).to_not be_valid
|
48
|
+
end
|
49
|
+
|
50
|
+
describe 'FCA number' do
|
51
|
+
it 'must be a present' do
|
52
|
+
build(:principal).tap do |p|
|
53
|
+
p.fca_number = nil
|
54
|
+
expect(p).to_not be_valid
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'must be a 6 digit number' do
|
59
|
+
build(:principal).tap do |p|
|
60
|
+
p.fca_number = 12345
|
61
|
+
expect(p).to_not be_valid
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'must match a `Lookup::Firm`' do
|
66
|
+
Lookup::Firm.find_by(fca_number: principal.fca_number).destroy
|
67
|
+
|
68
|
+
expect(principal).to_not be_valid
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'must be unique' do
|
72
|
+
build(:principal).tap do |p|
|
73
|
+
p.fca_number = principal.fca_number
|
74
|
+
expect(p).to_not be_valid
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe 'Email address' do
|
80
|
+
it 'must be present' do
|
81
|
+
expect(build(:principal, email_address: '')).to_not be_valid
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'must be unique' do
|
85
|
+
dupe = build(:principal, email_address: principal.email_address)
|
86
|
+
expect(dupe).to_not be_valid
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'must be a reasonably valid format' do
|
90
|
+
%w(zzz abc@abc a@a.).each do |bad|
|
91
|
+
principal.email_address = bad
|
92
|
+
expect(principal).to_not be_valid
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'must not exceed 50 characters' do
|
97
|
+
long_email = "a@#{'a' * 50}.com"
|
98
|
+
expect(build(:principal, email_address: long_email)).to_not be_valid
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe 'First name' do
|
103
|
+
it 'must be present' do
|
104
|
+
expect(build(:principal, first_name: '')).to_not be_valid
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'must be at least 2 characters' do
|
108
|
+
expect(build(:principal, first_name: 'A')).to_not be_valid
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'must not exceed 80 characters' do
|
112
|
+
expect(build(:principal, first_name: 'A' * 81)).to_not be_valid
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe 'Last name' do
|
117
|
+
it 'must be present' do
|
118
|
+
expect(build(:principal, last_name: '')).to_not be_valid
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'must be at least 2 characters' do
|
122
|
+
expect(build(:principal, last_name: 'A')).to_not be_valid
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'must not exceed 80 characters' do
|
126
|
+
expect(build(:principal, last_name: 'A' * 81)).to_not be_valid
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe 'Job title' do
|
131
|
+
it 'must be present' do
|
132
|
+
expect(build(:principal, job_title: '')).to_not be_valid
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'must be at least 2 characters' do
|
136
|
+
expect(build(:principal, job_title: 'A')).to_not be_valid
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'must not exceed 80 characters' do
|
140
|
+
expect(build(:principal, job_title: 'A' * 81)).to_not be_valid
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe 'Telephone number' do
|
145
|
+
it 'must be present' do
|
146
|
+
expect(build(:principal, telephone_number: '')).to_not be_valid
|
147
|
+
end
|
148
|
+
|
149
|
+
it 'must not exceed 50 characters' do
|
150
|
+
expect(build(:principal, telephone_number: '1' * 51)).to_not be_valid
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'must contain only digits and spaces' do
|
154
|
+
expect(build(:principal, telephone_number: '1 abcd')).to_not be_valid
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
describe 'Website address' do
|
159
|
+
context 'when provided' do
|
160
|
+
it 'must not exceed 100 characters' do
|
161
|
+
expect(build(:principal, website_address: "#{'a' * 100}.com")).not_to be_valid
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
describe 'dough #field_order' do
|
168
|
+
let(:fields) do
|
169
|
+
[
|
170
|
+
:fca_number,
|
171
|
+
:website_address,
|
172
|
+
:first_name,
|
173
|
+
:last_name,
|
174
|
+
:job_title,
|
175
|
+
:email_address,
|
176
|
+
:telephone_number,
|
177
|
+
:confirmed_disclaimer
|
178
|
+
]
|
179
|
+
end
|
180
|
+
|
181
|
+
it 'orders fields per the identification form' do
|
182
|
+
expect(principal.field_order).to contain_exactly(*fields)
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|