updateAttributes.test.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. 'use strict';
  2. const chai = require('chai');
  3. const expect = chai.expect;
  4. const Support = require('../support');
  5. const { DataTypes } = require('@sequelize/core');
  6. const sinon = require('sinon');
  7. describe(Support.getTestDialectTeaser('Hooks'), () => {
  8. beforeEach(async function () {
  9. this.User = this.sequelize.define('User', {
  10. username: {
  11. type: DataTypes.STRING,
  12. allowNull: false,
  13. },
  14. mood: {
  15. type: DataTypes.ENUM(['happy', 'sad', 'neutral']),
  16. },
  17. });
  18. await this.sequelize.sync({ force: true });
  19. });
  20. describe('#update', () => {
  21. describe('on success', () => {
  22. it('should run hooks', async function () {
  23. const beforeHook = sinon.spy();
  24. const afterHook = sinon.spy();
  25. const beforeSave = sinon.spy();
  26. const afterSave = sinon.spy();
  27. this.User.beforeUpdate(beforeHook);
  28. this.User.afterUpdate(afterHook);
  29. this.User.beforeSave(beforeSave);
  30. this.User.afterSave(afterSave);
  31. const user = await this.User.create({ username: 'Toni', mood: 'happy' });
  32. const user0 = await user.update({ username: 'Chong' });
  33. expect(beforeHook).to.have.been.calledOnce;
  34. expect(afterHook).to.have.been.calledOnce;
  35. expect(beforeSave).to.have.been.calledTwice;
  36. expect(afterSave).to.have.been.calledTwice;
  37. expect(user0.username).to.equal('Chong');
  38. });
  39. });
  40. describe('on error', () => {
  41. it('should return an error from before', async function () {
  42. const beforeHook = sinon.spy();
  43. const afterHook = sinon.spy();
  44. const beforeSave = sinon.spy();
  45. const afterSave = sinon.spy();
  46. this.User.beforeUpdate(() => {
  47. beforeHook();
  48. throw new Error('Whoops!');
  49. });
  50. this.User.afterUpdate(afterHook);
  51. this.User.beforeSave(beforeSave);
  52. this.User.afterSave(afterSave);
  53. const user = await this.User.create({ username: 'Toni', mood: 'happy' });
  54. await expect(user.update({ username: 'Chong' })).to.be.rejected;
  55. expect(beforeHook).to.have.been.calledOnce;
  56. expect(beforeSave).to.have.been.calledOnce;
  57. expect(afterHook).not.to.have.been.called;
  58. expect(afterSave).to.have.been.calledOnce;
  59. });
  60. it('should return an error from after', async function () {
  61. const beforeHook = sinon.spy();
  62. const afterHook = sinon.spy();
  63. const beforeSave = sinon.spy();
  64. const afterSave = sinon.spy();
  65. this.User.beforeUpdate(beforeHook);
  66. this.User.afterUpdate(() => {
  67. afterHook();
  68. throw new Error('Whoops!');
  69. });
  70. this.User.beforeSave(beforeSave);
  71. this.User.afterSave(afterSave);
  72. const user = await this.User.create({ username: 'Toni', mood: 'happy' });
  73. await expect(user.update({ username: 'Chong' })).to.be.rejected;
  74. expect(beforeHook).to.have.been.calledOnce;
  75. expect(afterHook).to.have.been.calledOnce;
  76. expect(beforeSave).to.have.been.calledTwice;
  77. expect(afterSave).to.have.been.calledOnce;
  78. });
  79. });
  80. describe('preserves changes to instance', () => {
  81. it('beforeValidate', async function () {
  82. this.User.beforeValidate(user => {
  83. user.mood = 'happy';
  84. });
  85. const user0 = await this.User.create({ username: 'fireninja', mood: 'invalid' });
  86. const user = await user0.update({ username: 'hero' });
  87. expect(user.username).to.equal('hero');
  88. expect(user.mood).to.equal('happy');
  89. });
  90. it('afterValidate', async function () {
  91. this.User.afterValidate(user => {
  92. user.mood = 'sad';
  93. });
  94. const user0 = await this.User.create({ username: 'fireninja', mood: 'neutral' });
  95. const user = await user0.update({ username: 'spider' });
  96. expect(user.username).to.equal('spider');
  97. expect(user.mood).to.equal('sad');
  98. });
  99. it('beforeSave', async function () {
  100. let hookCalled = 0;
  101. this.User.beforeSave(user => {
  102. user.mood = 'happy';
  103. hookCalled++;
  104. });
  105. const user0 = await this.User.create({ username: 'fireninja', mood: 'neutral' });
  106. const user = await user0.update({ username: 'spider', mood: 'sad' });
  107. expect(user.username).to.equal('spider');
  108. expect(user.mood).to.equal('happy');
  109. expect(hookCalled).to.equal(2);
  110. });
  111. it('beforeSave with beforeUpdate', async function () {
  112. let hookCalled = 0;
  113. this.User.beforeUpdate(user => {
  114. user.mood = 'sad';
  115. hookCalled++;
  116. });
  117. this.User.beforeSave(user => {
  118. user.mood = 'happy';
  119. hookCalled++;
  120. });
  121. const user0 = await this.User.create({ username: 'akira' });
  122. const user = await user0.update({ username: 'spider', mood: 'sad' });
  123. expect(user.mood).to.equal('happy');
  124. expect(user.username).to.equal('spider');
  125. expect(hookCalled).to.equal(3);
  126. });
  127. });
  128. });
  129. });