update-query.test.ts 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. import { DataTypes, literal } from '@sequelize/core';
  2. import { expect } from 'chai';
  3. import { beforeAll2, expectsql, sequelize } from '../../support';
  4. describe('QueryGenerator#updateQuery', () => {
  5. const queryGenerator = sequelize.queryGenerator;
  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. // you'll find more replacement tests in query-generator tests
  17. it('parses named replacements in literals', async () => {
  18. const { User } = vars;
  19. const { query, bind } = queryGenerator.updateQuery(
  20. User.table,
  21. {
  22. firstName: literal(':name'),
  23. },
  24. literal('name = :name'),
  25. {
  26. replacements: {
  27. name: 'Zoe',
  28. },
  29. },
  30. );
  31. expectsql(query, {
  32. default: `UPDATE [Users] SET [firstName]='Zoe' WHERE name = 'Zoe'`,
  33. mssql: `UPDATE [Users] SET [firstName]=N'Zoe' WHERE name = N'Zoe'`,
  34. db2: `SELECT * FROM FINAL TABLE (UPDATE "Users" SET "firstName"='Zoe' WHERE name = 'Zoe');`,
  35. });
  36. expect(bind).to.deep.eq({});
  37. });
  38. it('generates extra bind params', async () => {
  39. const { User } = vars;
  40. const { query, bind } = queryGenerator.updateQuery(
  41. User.table,
  42. {
  43. firstName: 'John',
  44. lastName: literal('$1'),
  45. username: 'jd',
  46. },
  47. {},
  48. );
  49. // lastName's bind position being changed from $1 to $2 is intentional
  50. expectsql(query, {
  51. default: 'UPDATE [Users] SET [firstName]=$sequelize_1,[lastName]=$1,[username]=$sequelize_2',
  52. db2: `SELECT * FROM FINAL TABLE (UPDATE "Users" SET "firstName"=$sequelize_1,"lastName"=$1,"username"=$sequelize_2);`,
  53. });
  54. expect(bind).to.deep.eq({
  55. sequelize_1: 'John',
  56. sequelize_2: 'jd',
  57. });
  58. });
  59. it('does not generate extra bind params with bindParams: false', async () => {
  60. const { User } = vars;
  61. const { query, bind } = queryGenerator.updateQuery(
  62. User.table,
  63. {
  64. firstName: 'John',
  65. lastName: literal('$1'),
  66. username: 'jd',
  67. },
  68. literal('first_name = $2'),
  69. {
  70. bindParam: false,
  71. },
  72. );
  73. // lastName's bind position being changed from $1 to $2 is intentional
  74. expectsql(query, {
  75. default: `UPDATE [Users] SET [firstName]='John',[lastName]=$1,[username]='jd' WHERE first_name = $2`,
  76. mssql: `UPDATE [Users] SET [firstName]=N'John',[lastName]=$1,[username]=N'jd' WHERE first_name = $2`,
  77. db2: `SELECT * FROM FINAL TABLE (UPDATE "Users" SET "firstName"='John',"lastName"=$1,"username"='jd' WHERE first_name = $2);`,
  78. });
  79. expect(bind).to.be.undefined;
  80. });
  81. it('binds date values', () => {
  82. const result = queryGenerator.updateQuery(
  83. 'myTable',
  84. {
  85. date: new Date('2011-03-27T10:01:55Z'),
  86. },
  87. { id: 2 },
  88. );
  89. expectsql(result, {
  90. query: {
  91. default: 'UPDATE [myTable] SET [date]=$sequelize_1 WHERE [id] = $sequelize_2',
  92. db2: 'SELECT * FROM FINAL TABLE (UPDATE "myTable" SET "date"=$sequelize_1 WHERE "id" = $sequelize_2);',
  93. },
  94. bind: {
  95. mysql: {
  96. sequelize_1: '2011-03-27 10:01:55.000',
  97. sequelize_2: 2,
  98. },
  99. mariadb: {
  100. sequelize_1: '2011-03-27 10:01:55.000',
  101. sequelize_2: 2,
  102. },
  103. db2: {
  104. sequelize_1: '2011-03-27 10:01:55.000',
  105. sequelize_2: 2,
  106. },
  107. ibmi: {
  108. sequelize_1: '2011-03-27 10:01:55.000',
  109. sequelize_2: 2,
  110. },
  111. snowflake: {
  112. sequelize_1: '2011-03-27 10:01:55.000',
  113. sequelize_2: 2,
  114. },
  115. sqlite3: {
  116. sequelize_1: '2011-03-27 10:01:55.000 +00:00',
  117. sequelize_2: 2,
  118. },
  119. postgres: {
  120. sequelize_1: '2011-03-27 10:01:55.000 +00:00',
  121. sequelize_2: 2,
  122. },
  123. mssql: {
  124. sequelize_1: '2011-03-27 10:01:55.000 +00:00',
  125. sequelize_2: 2,
  126. },
  127. },
  128. });
  129. });
  130. it('binds boolean values', () => {
  131. const result = queryGenerator.updateQuery(
  132. 'myTable',
  133. {
  134. positive: true,
  135. negative: false,
  136. },
  137. { id: 2 },
  138. );
  139. expectsql(result, {
  140. query: {
  141. default:
  142. 'UPDATE [myTable] SET [positive]=$sequelize_1,[negative]=$sequelize_2 WHERE [id] = $sequelize_3',
  143. db2: 'SELECT * FROM FINAL TABLE (UPDATE "myTable" SET "positive"=$sequelize_1,"negative"=$sequelize_2 WHERE "id" = $sequelize_3);',
  144. },
  145. bind: {
  146. sqlite3: {
  147. sequelize_1: 1,
  148. sequelize_2: 0,
  149. sequelize_3: 2,
  150. },
  151. mysql: {
  152. sequelize_1: 1,
  153. sequelize_2: 0,
  154. sequelize_3: 2,
  155. },
  156. mariadb: {
  157. sequelize_1: 1,
  158. sequelize_2: 0,
  159. sequelize_3: 2,
  160. },
  161. mssql: {
  162. sequelize_1: 1,
  163. sequelize_2: 0,
  164. sequelize_3: 2,
  165. },
  166. postgres: {
  167. sequelize_1: true,
  168. sequelize_2: false,
  169. sequelize_3: 2,
  170. },
  171. db2: {
  172. sequelize_1: true,
  173. sequelize_2: false,
  174. sequelize_3: 2,
  175. },
  176. ibmi: {
  177. sequelize_1: 1,
  178. sequelize_2: 0,
  179. sequelize_3: 2,
  180. },
  181. snowflake: {
  182. sequelize_1: true,
  183. sequelize_2: false,
  184. sequelize_3: 2,
  185. },
  186. },
  187. });
  188. });
  189. // TODO: Should we ignore undefined values instead? undefined is closer to "missing property" than null
  190. it('treats undefined as null', () => {
  191. const { query, bind } = queryGenerator.updateQuery(
  192. 'myTable',
  193. {
  194. value: undefined,
  195. name: 'bar',
  196. },
  197. { id: 2 },
  198. );
  199. expectsql(query, {
  200. default:
  201. 'UPDATE [myTable] SET [value]=$sequelize_1,[name]=$sequelize_2 WHERE [id] = $sequelize_3',
  202. db2: 'SELECT * FROM FINAL TABLE (UPDATE "myTable" SET "value"=$sequelize_1,"name"=$sequelize_2 WHERE "id" = $sequelize_3);',
  203. });
  204. expect(bind).to.deep.eq({
  205. sequelize_1: null,
  206. sequelize_2: 'bar',
  207. sequelize_3: 2,
  208. });
  209. });
  210. });