user_spec.rb 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865
  1. require 'rails_helper'
  2. require 'models/concerns/has_groups_examples'
  3. require 'models/concerns/has_roles_examples'
  4. require 'models/concerns/has_groups_permissions_examples'
  5. require 'models/concerns/can_lookup_examples'
  6. RSpec.describe User do
  7. let(:subject) { create(:user, user_attrs || {}) }
  8. let(:group_access_instance) { create(:agent_user) }
  9. let(:new_group_access_instance) { build(:agent_user) }
  10. let(:group_access_no_permission_instance) { build(:user) }
  11. include_examples 'HasGroups'
  12. include_examples 'HasRoles'
  13. include_examples 'HasGroups and Permissions'
  14. include_examples 'CanLookup'
  15. let(:new_password) { 'N3W54V3PW!' }
  16. context 'password' do
  17. it 'resets login_failed on password change' do
  18. failed_logins = (Setting.get('password_max_login_failed').to_i || 10) + 1
  19. user = create(:user, login_failed: failed_logins)
  20. expect do
  21. user.password = new_password
  22. user.save
  23. end.to change { user.login_failed }.to(0)
  24. end
  25. end
  26. context '#out_of_office_agent' do
  27. it 'responds to out_of_office_agent' do
  28. user = create(:user)
  29. expect(user).to respond_to(:out_of_office_agent)
  30. end
  31. context 'replacement' do
  32. it 'finds assigned' do
  33. user_replacement = create(:user)
  34. user_ooo = create(:user,
  35. out_of_office: true,
  36. out_of_office_start_at: Time.zone.yesterday,
  37. out_of_office_end_at: Time.zone.tomorrow,
  38. out_of_office_replacement_id: user_replacement.id,)
  39. expect(user_ooo.out_of_office_agent).to eq user_replacement
  40. end
  41. it 'finds none for available users' do
  42. user = create(:user)
  43. expect(user.out_of_office_agent).to be nil
  44. end
  45. end
  46. end
  47. context '#max_login_failed?' do
  48. it 'responds to max_login_failed?' do
  49. user = create(:user)
  50. expect(user).to respond_to(:max_login_failed?)
  51. end
  52. it 'checks if a user has reached the maximum of failed logins' do
  53. user = create(:user)
  54. expect(user.max_login_failed?).to be false
  55. user.login_failed = 999
  56. user.save
  57. expect(user.max_login_failed?).to be true
  58. end
  59. end
  60. context '.identify' do
  61. it 'returns users found by login' do
  62. user = create(:user)
  63. found_user = User.identify(user.login)
  64. expect(found_user).to be_an(User)
  65. expect(found_user.id).to eq user.id
  66. end
  67. it 'returns users found by email' do
  68. user = create(:user)
  69. found_user = User.identify(user.email)
  70. expect(found_user).to be_an(User)
  71. expect(found_user.id).to eq user.id
  72. end
  73. end
  74. context '.authenticate' do
  75. it 'authenticates by username and password' do
  76. password = 'zammad'
  77. user = create(:user, password: password)
  78. result = described_class.authenticate(user.login, password)
  79. expect(result).to be_an(User)
  80. end
  81. context 'failure' do
  82. it 'increases login_failed on failed logins' do
  83. user = create(:user)
  84. expect do
  85. described_class.authenticate(user.login, 'wrongpw')
  86. user.reload
  87. end
  88. .to change { user.login_failed }.by(1)
  89. end
  90. it 'fails for unknown users' do
  91. result = described_class.authenticate('john.doe', 'zammad')
  92. expect(result).to be nil
  93. end
  94. it 'fails for inactive users' do
  95. user = create(:user, active: false)
  96. result = described_class.authenticate(user.login, 'zammad')
  97. expect(result).to be nil
  98. end
  99. it 'fails for users with too many failed logins' do
  100. user = create(:user, login_failed: 999)
  101. result = described_class.authenticate(user.login, 'zammad')
  102. expect(result).to be nil
  103. end
  104. it 'fails for wrong passwords' do
  105. user = create(:user)
  106. result = described_class.authenticate(user.login, 'wrongpw')
  107. expect(result).to be nil
  108. end
  109. it 'fails for empty username parameter' do
  110. result = described_class.authenticate('', 'zammad')
  111. expect(result).to be nil
  112. end
  113. it 'fails for empty password parameter' do
  114. result = described_class.authenticate('username', '')
  115. expect(result).to be nil
  116. end
  117. end
  118. end
  119. context '#by_reset_token' do
  120. it 'returns a User instance for existing tokens' do
  121. token = create(:token_password_reset)
  122. expect(described_class.by_reset_token(token.name)).to be_instance_of(described_class)
  123. end
  124. it 'returns nil for not existing tokens' do
  125. expect(described_class.by_reset_token('not-existing')).to be nil
  126. end
  127. end
  128. context '#password_reset_via_token' do
  129. it 'changes the password of the token user and destroys the token' do
  130. token = create(:token_password_reset)
  131. user = User.find(token.user_id)
  132. expect do
  133. described_class.password_reset_via_token(token.name, new_password)
  134. user.reload
  135. end.to change {
  136. user.password
  137. }.and change {
  138. Token.count
  139. }.by(-1)
  140. end
  141. end
  142. context 'import' do
  143. it "doesn't change imported passwords" do
  144. # mock settings calls
  145. expect(Setting).to receive(:get).with('import_mode').and_return(true)
  146. allow(Setting).to receive(:get)
  147. user = build(:user, password: '{sha2}dd9c764fa7ea18cd992c8600006d3dc3ac983d1ba22e9ba2d71f6207456be0ba') # zammad
  148. expect do
  149. user.save
  150. end.to_not change {
  151. user.password
  152. }
  153. end
  154. end
  155. context '.access?' do
  156. let(:role_with_admin_user_permissions) do
  157. create(:role).tap do |role|
  158. role.permission_grant('admin.user')
  159. end
  160. end
  161. let(:admin_with_admin_user_permissions) { create(:user, roles: [role_with_admin_user_permissions]) }
  162. let(:role_without_admin_user_permissions) do
  163. create(:role).tap do |role|
  164. role.permission_grant('admin.tag')
  165. end
  166. end
  167. let(:admin_without_admin_user_permissions) { create(:user, roles: [role_without_admin_user_permissions]) }
  168. context 'read' do
  169. context 'admin' do
  170. let(:requested) { create(:admin_user) }
  171. it 'is possible for admin.user' do
  172. requester = admin_with_admin_user_permissions
  173. access = requested.access?(requester, 'read')
  174. expect(access).to be(true)
  175. end
  176. it 'is possible for sub admin without admin.user' do
  177. requester = admin_without_admin_user_permissions
  178. access = requested.access?(requester, 'read')
  179. expect(access).to be(true)
  180. end
  181. it 'is possible for agent' do
  182. requester = create(:agent_user)
  183. access = requested.access?(requester, 'read')
  184. expect(access).to be(true)
  185. end
  186. it 'is not possible for customer' do
  187. requester = create(:customer_user)
  188. access = requested.access?(requester, 'read')
  189. expect(access).to be(false)
  190. end
  191. end
  192. context 'agent' do
  193. let(:requested) { create(:agent_user) }
  194. it 'is possible for admin.user' do
  195. requester = admin_with_admin_user_permissions
  196. access = requested.access?(requester, 'read')
  197. expect(access).to be(true)
  198. end
  199. it 'is possible for sub admin without admin.user' do
  200. requester = admin_without_admin_user_permissions
  201. access = requested.access?(requester, 'read')
  202. expect(access).to be(true)
  203. end
  204. it 'is possible for agent' do
  205. requester = create(:agent_user)
  206. access = requested.access?(requester, 'read')
  207. expect(access).to be(true)
  208. end
  209. it 'is not possible for customer' do
  210. requester = create(:customer_user)
  211. access = requested.access?(requester, 'read')
  212. expect(access).to be(false)
  213. end
  214. end
  215. context 'customer' do
  216. let(:requested) { create(:customer_user) }
  217. it 'is possible for admin.user' do
  218. requester = admin_with_admin_user_permissions
  219. access = requested.access?(requester, 'read')
  220. expect(access).to be(true)
  221. end
  222. it 'is possible for sub admin without admin.user' do
  223. requester = admin_without_admin_user_permissions
  224. access = requested.access?(requester, 'read')
  225. expect(access).to be(true)
  226. end
  227. it 'is possible for agent' do
  228. requester = create(:agent_user)
  229. access = requested.access?(requester, 'read')
  230. expect(access).to be(true)
  231. end
  232. it 'is possible for same customer' do
  233. access = requested.access?(requested, 'read')
  234. expect(access).to be(true)
  235. end
  236. it 'is possible for same organization' do
  237. organization = create(:organization)
  238. requester = create(:customer_user, organization: organization)
  239. requested.update!(organization: organization)
  240. access = requested.access?(requester, 'read')
  241. expect(access).to be(true)
  242. end
  243. it 'is not possible for different customer' do
  244. requester = create(:customer_user)
  245. access = requested.access?(requester, 'read')
  246. expect(access).to be(false)
  247. end
  248. end
  249. end
  250. context 'change' do
  251. context 'admin' do
  252. let(:requested) { create(:admin_user) }
  253. it 'is possible for admin.user' do
  254. requester = admin_with_admin_user_permissions
  255. access = requested.access?(requester, 'change')
  256. expect(access).to be(true)
  257. end
  258. it 'is not possible for sub admin without admin.user' do
  259. requester = admin_without_admin_user_permissions
  260. access = requested.access?(requester, 'change')
  261. expect(access).to be(false)
  262. end
  263. it 'is not possible for same for sub admin without admin.user' do
  264. access = admin_without_admin_user_permissions.access?(admin_without_admin_user_permissions, 'change')
  265. expect(access).to be(false)
  266. end
  267. it 'is not possible for agent' do
  268. requester = create(:agent_user)
  269. access = requested.access?(requester, 'change')
  270. expect(access).to be(false)
  271. end
  272. it 'is not possible for customer' do
  273. requester = create(:customer_user)
  274. access = requested.access?(requester, 'change')
  275. expect(access).to be(false)
  276. end
  277. end
  278. context 'agent' do
  279. let(:requested) { create(:agent_user) }
  280. it 'is possible for admin.user' do
  281. requester = admin_with_admin_user_permissions
  282. access = requested.access?(requester, 'change')
  283. expect(access).to be(true)
  284. end
  285. it 'is not possible for sub admin without admin.user' do
  286. requester = admin_without_admin_user_permissions
  287. access = requested.access?(requester, 'change')
  288. expect(access).to be(false)
  289. end
  290. it 'is not possible for same agent' do
  291. access = requested.access?(requested, 'change')
  292. expect(access).to be(false)
  293. end
  294. it 'is not possible for other agent' do
  295. requester = create(:agent_user)
  296. access = requested.access?(requester, 'change')
  297. expect(access).to be(false)
  298. end
  299. it 'is not possible for customer' do
  300. requester = create(:customer_user)
  301. access = requested.access?(requester, 'change')
  302. expect(access).to be(false)
  303. end
  304. end
  305. context 'customer' do
  306. let(:requested) { create(:customer_user) }
  307. it 'is possible for admin.user' do
  308. requester = admin_with_admin_user_permissions
  309. access = requested.access?(requester, 'change')
  310. expect(access).to be(true)
  311. end
  312. it 'is not possible for sub admin without admin.user' do
  313. requester = admin_without_admin_user_permissions
  314. access = requested.access?(requester, 'change')
  315. expect(access).to be(false)
  316. end
  317. it 'is possible for agent' do
  318. requester = create(:agent_user)
  319. access = requested.access?(requester, 'change')
  320. expect(access).to be(true)
  321. end
  322. it 'is not possible for same customer' do
  323. access = requested.access?(requested, 'change')
  324. expect(access).to be(false)
  325. end
  326. it 'is not possible for same organization' do
  327. organization = create(:organization)
  328. requester = create(:customer_user, organization: organization)
  329. requested.update!(organization: organization)
  330. access = requested.access?(requester, 'change')
  331. expect(access).to be(false)
  332. end
  333. it 'is not possible for different customer' do
  334. requester = create(:customer_user)
  335. access = requested.access?(requester, 'change')
  336. expect(access).to be(false)
  337. end
  338. end
  339. end
  340. context 'delete' do
  341. context 'admin' do
  342. let(:requested) { create(:admin_user) }
  343. it 'is possible for admin.user' do
  344. requester = admin_with_admin_user_permissions
  345. access = requested.access?(requester, 'delete')
  346. expect(access).to be(true)
  347. end
  348. it 'is not possible for sub admin without admin.user' do
  349. requester = admin_without_admin_user_permissions
  350. access = requested.access?(requester, 'delete')
  351. expect(access).to be(false)
  352. end
  353. it 'is not possible for agent' do
  354. requester = create(:agent_user)
  355. access = requested.access?(requester, 'delete')
  356. expect(access).to be(false)
  357. end
  358. it 'is not possible for customer' do
  359. requester = create(:customer_user)
  360. access = requested.access?(requester, 'delete')
  361. expect(access).to be(false)
  362. end
  363. end
  364. context 'agent' do
  365. let(:requested) { create(:agent_user) }
  366. it 'is possible for admin.user' do
  367. requester = admin_with_admin_user_permissions
  368. access = requested.access?(requester, 'delete')
  369. expect(access).to be(true)
  370. end
  371. it 'is not possible for sub admin without admin.user' do
  372. requester = admin_without_admin_user_permissions
  373. access = requested.access?(requester, 'delete')
  374. expect(access).to be(false)
  375. end
  376. it 'is not possible for agent' do
  377. requester = create(:agent_user)
  378. access = requested.access?(requester, 'delete')
  379. expect(access).to be(false)
  380. end
  381. it 'is not possible for customer' do
  382. requester = create(:customer_user)
  383. access = requested.access?(requester, 'delete')
  384. expect(access).to be(false)
  385. end
  386. end
  387. context 'customer' do
  388. let(:requested) { create(:customer_user) }
  389. it 'is possible for admin.user' do
  390. requester = admin_with_admin_user_permissions
  391. access = requested.access?(requester, 'delete')
  392. expect(access).to be(true)
  393. end
  394. it 'is not possible for sub admin without admin.user' do
  395. requester = admin_without_admin_user_permissions
  396. access = requested.access?(requester, 'delete')
  397. expect(access).to be(false)
  398. end
  399. it 'is not possible for agent' do
  400. requester = create(:agent_user)
  401. access = requested.access?(requester, 'delete')
  402. expect(access).to be(false)
  403. end
  404. it 'is not possible for same customer' do
  405. access = requested.access?(requested, 'delete')
  406. expect(access).to be(false)
  407. end
  408. it 'is not possible for same organization' do
  409. organization = create(:organization)
  410. requester = create(:customer_user, organization: organization)
  411. requested.update!(organization: organization)
  412. access = requested.access?(requester, 'delete')
  413. expect(access).to be(false)
  414. end
  415. it 'is not possible for different customer' do
  416. requester = create(:customer_user)
  417. access = requested.access?(requester, 'delete')
  418. expect(access).to be(false)
  419. end
  420. end
  421. end
  422. end
  423. context 'agent limit' do
  424. def current_agent_count
  425. User.with_permissions('ticket.agent').count
  426. end
  427. let(:agent_role) { Role.lookup(name: 'Agent') }
  428. let(:admin_role) { Role.lookup(name: 'Admin') }
  429. context '#validate_agent_limit_by_role' do
  430. context 'agent creation limit not reached' do
  431. it 'grants agent creation' do
  432. Setting.set('system_agent_limit', current_agent_count + 1)
  433. expect do
  434. create(:agent_user)
  435. end.to change {
  436. current_agent_count
  437. }.by(1)
  438. end
  439. it 'grants role change' do
  440. Setting.set('system_agent_limit', current_agent_count + 1)
  441. future_agent = create(:customer_user)
  442. expect do
  443. future_agent.roles = [agent_role]
  444. end.to change {
  445. current_agent_count
  446. }.by(1)
  447. end
  448. context 'role updates' do
  449. it 'grants update by instances' do
  450. Setting.set('system_agent_limit', current_agent_count + 1)
  451. agent = create(:agent_user)
  452. expect do
  453. agent.roles = [
  454. admin_role,
  455. agent_role
  456. ]
  457. agent.save!
  458. end.not_to raise_error
  459. end
  460. it 'grants update by id (Integer)' do
  461. Setting.set('system_agent_limit', current_agent_count + 1)
  462. agent = create(:agent_user)
  463. expect do
  464. agent.role_ids = [
  465. admin_role.id,
  466. agent_role.id
  467. ]
  468. agent.save!
  469. end.not_to raise_error
  470. end
  471. it 'grants update by id (String)' do
  472. Setting.set('system_agent_limit', current_agent_count + 1)
  473. agent = create(:agent_user)
  474. expect do
  475. agent.role_ids = [
  476. admin_role.id.to_s,
  477. agent_role.id.to_s
  478. ]
  479. agent.save!
  480. end.not_to raise_error
  481. end
  482. end
  483. end
  484. context 'agent creation limit surpassing prevention' do
  485. it 'creation of new agents' do
  486. Setting.set('system_agent_limit', current_agent_count + 2)
  487. create_list(:agent_user, 2)
  488. initial_agent_count = current_agent_count
  489. expect do
  490. create(:agent_user)
  491. end.to raise_error(Exceptions::UnprocessableEntity)
  492. expect(current_agent_count).to eq(initial_agent_count)
  493. end
  494. it 'prevents role change' do
  495. Setting.set('system_agent_limit', current_agent_count)
  496. future_agent = create(:customer_user)
  497. initial_agent_count = current_agent_count
  498. expect do
  499. future_agent.roles = [agent_role]
  500. end.to raise_error(Exceptions::UnprocessableEntity)
  501. expect(current_agent_count).to eq(initial_agent_count)
  502. end
  503. end
  504. end
  505. context '#validate_agent_limit_by_attributes' do
  506. context 'agent creation limit surpassing prevention' do
  507. it 'prevents re-activation of agents' do
  508. Setting.set('system_agent_limit', current_agent_count)
  509. inactive_agent = create(:agent_user, active: false)
  510. initial_agent_count = current_agent_count
  511. expect do
  512. inactive_agent.update!(active: true)
  513. end.to raise_error(Exceptions::UnprocessableEntity)
  514. expect(current_agent_count).to eq(initial_agent_count)
  515. end
  516. end
  517. end
  518. context '#validate_agent_limit_by_role by string' do
  519. context 'agent creation limit not reached' do
  520. it 'grants agent creation' do
  521. Setting.set('system_agent_limit', (current_agent_count + 1).to_s)
  522. expect do
  523. create(:agent_user)
  524. end.to change {
  525. current_agent_count
  526. }.by(1)
  527. end
  528. it 'grants role change' do
  529. Setting.set('system_agent_limit', (current_agent_count + 1).to_s)
  530. future_agent = create(:customer_user)
  531. expect do
  532. future_agent.roles = [agent_role]
  533. end.to change {
  534. current_agent_count
  535. }.by(1)
  536. end
  537. context 'role updates' do
  538. it 'grants update by instances' do
  539. Setting.set('system_agent_limit', (current_agent_count + 1).to_s)
  540. agent = create(:agent_user)
  541. expect do
  542. agent.roles = [
  543. admin_role,
  544. agent_role
  545. ]
  546. agent.save!
  547. end.not_to raise_error
  548. end
  549. it 'grants update by id (Integer)' do
  550. Setting.set('system_agent_limit', (current_agent_count + 1).to_s)
  551. agent = create(:agent_user)
  552. expect do
  553. agent.role_ids = [
  554. admin_role.id,
  555. agent_role.id
  556. ]
  557. agent.save!
  558. end.not_to raise_error
  559. end
  560. it 'grants update by id (String)' do
  561. Setting.set('system_agent_limit', (current_agent_count + 1).to_s)
  562. agent = create(:agent_user)
  563. expect do
  564. agent.role_ids = [
  565. admin_role.id.to_s,
  566. agent_role.id.to_s
  567. ]
  568. agent.save!
  569. end.not_to raise_error
  570. end
  571. end
  572. end
  573. context 'agent creation limit surpassing prevention' do
  574. it 'creation of new agents' do
  575. Setting.set('system_agent_limit', (current_agent_count + 2).to_s)
  576. create_list(:agent_user, 2)
  577. initial_agent_count = current_agent_count
  578. expect do
  579. create(:agent_user)
  580. end.to raise_error(Exceptions::UnprocessableEntity)
  581. expect(current_agent_count).to eq(initial_agent_count)
  582. end
  583. it 'prevents role change' do
  584. Setting.set('system_agent_limit', current_agent_count.to_s)
  585. future_agent = create(:customer_user)
  586. initial_agent_count = current_agent_count
  587. expect do
  588. future_agent.roles = [agent_role]
  589. end.to raise_error(Exceptions::UnprocessableEntity)
  590. expect(current_agent_count).to eq(initial_agent_count)
  591. end
  592. end
  593. end
  594. context '#validate_agent_limit_by_attributes' do
  595. context 'agent creation limit surpassing prevention' do
  596. it 'prevents re-activation of agents' do
  597. Setting.set('system_agent_limit', current_agent_count.to_s)
  598. inactive_agent = create(:agent_user, active: false)
  599. initial_agent_count = current_agent_count
  600. expect do
  601. inactive_agent.update!(active: true)
  602. end.to raise_error(Exceptions::UnprocessableEntity)
  603. expect(current_agent_count).to eq(initial_agent_count)
  604. end
  605. end
  606. end
  607. end
  608. context 'when phone attribute' do
  609. let(:user_attrs) { { phone: orig_number } }
  610. context 'included on create' do
  611. let(:orig_number) { '1234567890' }
  612. it 'adds corresponding CallerId record' do
  613. expect { subject }
  614. .to change { Cti::CallerId.where(caller_id: orig_number).count }.by(1)
  615. end
  616. end
  617. context 'added on update' do
  618. let(:orig_number) { nil }
  619. let(:new_number) { '1234567890' }
  620. before { subject } # create user
  621. it 'adds corresponding CallerId record' do
  622. expect { subject.update(phone: new_number) }
  623. .to change { Cti::CallerId.where(caller_id: new_number).count }.by(1)
  624. end
  625. end
  626. context 'falsely added on update (change: [nil, ""])' do
  627. let(:orig_number) { nil }
  628. let(:new_number) { '' }
  629. before { subject } # create user
  630. it 'does not attempt to update CallerId record' do
  631. allow(Cti::CallerId).to receive(:build).with(any_args)
  632. expect(Cti::CallerId.where(object: 'User', o_id: subject.id).count)
  633. .to eq(0)
  634. expect { subject.update(phone: new_number) }
  635. .to change { Cti::CallerId.where(object: 'User', o_id: subject.id).count }.by(0)
  636. expect(Cti::CallerId).not_to have_received(:build)
  637. end
  638. end
  639. context 'removed on update' do
  640. let(:orig_number) { '1234567890' }
  641. let(:new_number) { nil }
  642. before { subject } # create user
  643. it 'removes corresponding CallerId record' do
  644. expect { subject.update(phone: nil) }
  645. .to change { Cti::CallerId.where(caller_id: orig_number).count }.by(-1)
  646. end
  647. end
  648. context 'changed on update' do
  649. let(:orig_number) { '1234567890' }
  650. let(:new_number) { orig_number.next }
  651. before { subject } # create user
  652. it 'replaces CallerId record' do
  653. # rubocop:disable Layout/MultilineMethodCallIndentation
  654. expect { subject.update(phone: new_number) }
  655. .to change { Cti::CallerId.where(caller_id: orig_number).count }.by(-1)
  656. .and change { Cti::CallerId.where(caller_id: new_number).count }.by(1)
  657. # rubocop:enable Layout/MultilineMethodCallIndentation
  658. end
  659. end
  660. end
  661. end