update.test.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import { DataTypes, Op, literal } from '@sequelize/core';
  2. import { expect } from 'chai';
  3. import sinon from 'sinon';
  4. import { beforeAll2, expectsql, sequelize } from '../../support';
  5. describe('QueryInterface#update', () => {
  6. const vars = beforeAll2(() => {
  7. const User = sequelize.define(
  8. 'User',
  9. {
  10. firstName: DataTypes.STRING,
  11. },
  12. { timestamps: false },
  13. );
  14. return { User };
  15. });
  16. afterEach(() => {
  17. sinon.restore();
  18. });
  19. // you'll find more replacement tests in query-generator tests
  20. it('does not parse replacements outside of raw sql', async () => {
  21. const { User } = vars;
  22. const stub = sinon.stub(sequelize, 'queryRaw');
  23. const instance = User.build();
  24. await sequelize.queryInterface.update(
  25. instance,
  26. User.table,
  27. { firstName: ':name' },
  28. { firstName: ':firstName' },
  29. {
  30. returning: [':data'],
  31. replacements: {
  32. name: 'Zoe',
  33. data: 'abc',
  34. },
  35. },
  36. );
  37. expect(stub.callCount).to.eq(1);
  38. const firstCall = stub.getCall(0);
  39. expectsql(firstCall.args[0], {
  40. default: 'UPDATE [Users] SET [firstName]=$sequelize_1 WHERE [firstName] = $sequelize_2',
  41. sqlite3:
  42. 'UPDATE `Users` SET `firstName`=$sequelize_1 WHERE `firstName` = $sequelize_2 RETURNING `:data`',
  43. postgres:
  44. 'UPDATE "Users" SET "firstName"=$sequelize_1 WHERE "firstName" = $sequelize_2 RETURNING ":data"',
  45. mssql:
  46. 'UPDATE [Users] SET [firstName]=$sequelize_1 OUTPUT INSERTED.[:data] WHERE [firstName] = $sequelize_2',
  47. db2: `SELECT * FROM FINAL TABLE (UPDATE "Users" SET "firstName"=$sequelize_1 WHERE "firstName" = $sequelize_2);`,
  48. });
  49. expect(firstCall.args[1]?.bind).to.deep.eq({
  50. sequelize_1: ':name',
  51. sequelize_2: ':firstName',
  52. });
  53. });
  54. it('throws if a bind parameter name starts with the reserved "sequelize_" prefix', async () => {
  55. const { User } = vars;
  56. sinon.stub(sequelize, 'queryRaw');
  57. const instance = User.build();
  58. await expect(
  59. sequelize.queryInterface.update(
  60. instance,
  61. User.table,
  62. { firstName: 'newName' },
  63. { id: literal('$sequelize_test') },
  64. {
  65. bind: {
  66. sequelize_test: 'test',
  67. },
  68. },
  69. ),
  70. ).to.be.rejectedWith(
  71. 'Bind parameters cannot start with "sequelize_", these bind parameters are reserved by Sequelize.',
  72. );
  73. });
  74. it('merges user-provided bind parameters with sequelize-generated bind parameters (object bind)', async () => {
  75. const { User } = vars;
  76. const stub = sinon.stub(sequelize, 'queryRaw');
  77. const instance = User.build();
  78. await sequelize.queryInterface.update(
  79. instance,
  80. User.table,
  81. { firstName: 'newName' },
  82. { id: { [Op.eq]: literal('$id') } },
  83. {
  84. bind: {
  85. id: 'test',
  86. },
  87. },
  88. );
  89. expect(stub.callCount).to.eq(1);
  90. const firstCall = stub.getCall(0);
  91. expectsql(firstCall.args[0], {
  92. default: 'UPDATE [Users] SET [firstName]=$sequelize_1 WHERE [id] = $id',
  93. db2: `SELECT * FROM FINAL TABLE (UPDATE "Users" SET "firstName"=$sequelize_1 WHERE "id" = $id);`,
  94. });
  95. expect(firstCall.args[1]?.bind).to.deep.eq({
  96. sequelize_1: 'newName',
  97. id: 'test',
  98. });
  99. });
  100. it('merges user-provided bind parameters with sequelize-generated bind parameters (array bind)', async () => {
  101. const { User } = vars;
  102. const stub = sinon.stub(sequelize, 'queryRaw');
  103. const instance = User.build();
  104. await sequelize.queryInterface.update(
  105. instance,
  106. User.table,
  107. { firstName: 'newName' },
  108. { id: { [Op.eq]: literal('$1') } },
  109. {
  110. bind: ['test'],
  111. },
  112. );
  113. expect(stub.callCount).to.eq(1);
  114. const firstCall = stub.getCall(0);
  115. expectsql(firstCall.args[0], {
  116. default: 'UPDATE [Users] SET [firstName]=$sequelize_1 WHERE [id] = $1',
  117. db2: `SELECT * FROM FINAL TABLE (UPDATE "Users" SET "firstName"=$sequelize_1 WHERE "id" = $1);`,
  118. });
  119. expect(firstCall.args[1]?.bind).to.deep.eq({
  120. sequelize_1: 'newName',
  121. 1: 'test',
  122. });
  123. });
  124. });