find.test.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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. describe(Support.getTestDialectTeaser('Hooks'), () => {
  7. beforeEach(async function () {
  8. this.User = this.sequelize.define('User', {
  9. username: {
  10. type: DataTypes.STRING,
  11. allowNull: false,
  12. },
  13. mood: {
  14. type: DataTypes.ENUM(['happy', 'sad', 'neutral']),
  15. },
  16. });
  17. await this.sequelize.sync({ force: true });
  18. });
  19. describe('#find', () => {
  20. beforeEach(async function () {
  21. await this.User.bulkCreate([
  22. { username: 'adam', mood: 'happy' },
  23. { username: 'joe', mood: 'sad' },
  24. ]);
  25. });
  26. it('allow changing attributes via beforeFind #5675', async function () {
  27. this.User.beforeFind(options => {
  28. options.attributes = {
  29. include: [['id', 'my_id']],
  30. };
  31. });
  32. await this.User.findAll({});
  33. });
  34. describe('on success', () => {
  35. it('all hooks run', async function () {
  36. let beforeHook = false;
  37. let beforeHook2 = false;
  38. let beforeHook3 = false;
  39. let afterHook = false;
  40. this.User.beforeFind(() => {
  41. beforeHook = true;
  42. });
  43. this.User.beforeFindAfterExpandIncludeAll(() => {
  44. beforeHook2 = true;
  45. });
  46. this.User.beforeFindAfterOptions(() => {
  47. beforeHook3 = true;
  48. });
  49. this.User.afterFind(() => {
  50. afterHook = true;
  51. });
  52. const user = await this.User.findOne({ where: { username: 'adam' } });
  53. expect(user.mood).to.equal('happy');
  54. expect(beforeHook).to.be.true;
  55. expect(beforeHook2).to.be.true;
  56. expect(beforeHook3).to.be.true;
  57. expect(afterHook).to.be.true;
  58. });
  59. it('beforeFind hook can change options', async function () {
  60. this.User.beforeFind(options => {
  61. options.where.username = 'joe';
  62. });
  63. const user = await this.User.findOne({ where: { username: 'adam' } });
  64. expect(user.mood).to.equal('sad');
  65. });
  66. it('beforeFindAfterExpandIncludeAll hook can change options', async function () {
  67. this.User.beforeFindAfterExpandIncludeAll(options => {
  68. options.where.username = 'joe';
  69. });
  70. const user = await this.User.findOne({ where: { username: 'adam' } });
  71. expect(user.mood).to.equal('sad');
  72. });
  73. it('beforeFindAfterOptions hook can change options', async function () {
  74. this.User.beforeFindAfterOptions(options => {
  75. options.where.username = 'joe';
  76. });
  77. const user = await this.User.findOne({ where: { username: 'adam' } });
  78. expect(user.mood).to.equal('sad');
  79. });
  80. it('afterFind hook can change results', async function () {
  81. this.User.afterFind(user => {
  82. user.mood = 'sad';
  83. });
  84. const user = await this.User.findOne({ where: { username: 'adam' } });
  85. expect(user.mood).to.equal('sad');
  86. });
  87. });
  88. describe('on error', () => {
  89. it('in beforeFind hook returns error', async function () {
  90. this.User.beforeFind(() => {
  91. throw new Error('Oops!');
  92. });
  93. try {
  94. await this.User.findOne({ where: { username: 'adam' } });
  95. } catch (error) {
  96. expect(error.message).to.equal('Oops!');
  97. }
  98. });
  99. it('in beforeFindAfterExpandIncludeAll hook returns error', async function () {
  100. this.User.beforeFindAfterExpandIncludeAll(() => {
  101. throw new Error('Oops!');
  102. });
  103. try {
  104. await this.User.findOne({ where: { username: 'adam' } });
  105. } catch (error) {
  106. expect(error.message).to.equal('Oops!');
  107. }
  108. });
  109. it('in beforeFindAfterOptions hook returns error', async function () {
  110. this.User.beforeFindAfterOptions(() => {
  111. throw new Error('Oops!');
  112. });
  113. try {
  114. await this.User.findOne({ where: { username: 'adam' } });
  115. } catch (error) {
  116. expect(error.message).to.equal('Oops!');
  117. }
  118. });
  119. it('in afterFind hook returns error', async function () {
  120. this.User.afterFind(() => {
  121. throw new Error('Oops!');
  122. });
  123. try {
  124. await this.User.findOne({ where: { username: 'adam' } });
  125. } catch (error) {
  126. expect(error.message).to.equal('Oops!');
  127. }
  128. });
  129. });
  130. });
  131. });