upsert.test.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. if (Support.sequelize.dialect.supports.upserts) {
  8. describe(Support.getTestDialectTeaser('Hooks'), () => {
  9. beforeEach(async function () {
  10. this.User = this.sequelize.define('User', {
  11. username: {
  12. type: DataTypes.STRING,
  13. allowNull: false,
  14. unique: true, // Either Primary Key/Unique Keys should be passed to upsert
  15. },
  16. mood: {
  17. type: DataTypes.ENUM(['happy', 'sad', 'neutral']),
  18. },
  19. });
  20. await this.sequelize.sync({ force: true });
  21. });
  22. describe('#upsert', () => {
  23. describe('on success', () => {
  24. it('should run hooks', async function () {
  25. const beforeHook = sinon.spy();
  26. const afterHook = sinon.spy();
  27. this.User.beforeUpsert(beforeHook);
  28. this.User.afterUpsert(afterHook);
  29. await this.User.upsert({ username: 'Toni', mood: 'happy' });
  30. expect(beforeHook).to.have.been.calledOnce;
  31. expect(afterHook).to.have.been.calledOnce;
  32. });
  33. });
  34. describe('on error', () => {
  35. it('should return an error from before', async function () {
  36. const beforeHook = sinon.spy();
  37. const afterHook = sinon.spy();
  38. this.User.beforeUpsert(() => {
  39. beforeHook();
  40. throw new Error('Whoops!');
  41. });
  42. this.User.afterUpsert(afterHook);
  43. await expect(this.User.upsert({ username: 'Toni', mood: 'happy' })).to.be.rejected;
  44. expect(beforeHook).to.have.been.calledOnce;
  45. expect(afterHook).not.to.have.been.called;
  46. });
  47. it('should return an error from after', async function () {
  48. const beforeHook = sinon.spy();
  49. const afterHook = sinon.spy();
  50. this.User.beforeUpsert(beforeHook);
  51. this.User.afterUpsert(() => {
  52. afterHook();
  53. throw new Error('Whoops!');
  54. });
  55. await expect(this.User.upsert({ username: 'Toni', mood: 'happy' })).to.be.rejected;
  56. expect(beforeHook).to.have.been.calledOnce;
  57. expect(afterHook).to.have.been.calledOnce;
  58. });
  59. });
  60. describe('preserves changes to values', () => {
  61. it('beforeUpsert', async function () {
  62. let hookCalled = 0;
  63. const valuesOriginal = { mood: 'sad', username: 'leafninja' };
  64. this.User.beforeUpsert(values => {
  65. values.mood = 'happy';
  66. hookCalled++;
  67. });
  68. await this.User.upsert(valuesOriginal);
  69. expect(valuesOriginal.mood).to.equal('happy');
  70. expect(hookCalled).to.equal(1);
  71. });
  72. });
  73. });
  74. });
  75. }