change-column.test.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. 'use strict';
  2. const sinon = require('sinon');
  3. const { beforeAll2, expectsql, sequelize } = require('../../support');
  4. const { DataTypes } = require('@sequelize/core');
  5. describe('QueryInterface#changeColumn', () => {
  6. if (sequelize.dialect.name === 'sqlite3') {
  7. return;
  8. }
  9. const vars = beforeAll2(() => {
  10. const User = sequelize.define(
  11. 'users',
  12. {
  13. id: {
  14. type: DataTypes.INTEGER,
  15. primaryKey: true,
  16. autoIncrement: true,
  17. },
  18. level_id: {
  19. type: DataTypes.INTEGER,
  20. },
  21. },
  22. { timestamps: false },
  23. );
  24. const stub = sinon.stub(sequelize, 'queryRaw').resolvesArg(0);
  25. return { User, stub };
  26. });
  27. beforeEach(() => {
  28. vars.stub.resetHistory();
  29. });
  30. after(() => {
  31. vars.stub.restore();
  32. });
  33. it('properly generate alter queries', async () => {
  34. const { User } = vars;
  35. const sql = await sequelize.queryInterface.changeColumn(User.table, 'level_id', {
  36. type: DataTypes.FLOAT,
  37. allowNull: false,
  38. });
  39. expectsql(sql, {
  40. ibmi: 'ALTER TABLE "users" ALTER COLUMN "level_id" SET DATA TYPE REAL NOT NULL',
  41. mssql: 'ALTER TABLE [users] ALTER COLUMN [level_id] REAL NOT NULL;',
  42. db2: 'ALTER TABLE "users" ALTER COLUMN "level_id" SET DATA TYPE REAL ALTER COLUMN "level_id" SET NOT NULL;',
  43. mariadb: 'ALTER TABLE `users` CHANGE `level_id` `level_id` FLOAT NOT NULL;',
  44. mysql: 'ALTER TABLE `users` CHANGE `level_id` `level_id` FLOAT NOT NULL;',
  45. postgres:
  46. 'ALTER TABLE "users" ALTER COLUMN "level_id" SET NOT NULL;ALTER TABLE "users" ALTER COLUMN "level_id" DROP DEFAULT;ALTER TABLE "users" ALTER COLUMN "level_id" TYPE REAL;',
  47. snowflake:
  48. 'ALTER TABLE "users" ALTER COLUMN "level_id" SET NOT NULL;ALTER TABLE "users" ALTER COLUMN "level_id" DROP DEFAULT;ALTER TABLE "users" ALTER COLUMN "level_id" TYPE FLOAT;',
  49. });
  50. });
  51. it('properly generate alter queries for foreign keys', async () => {
  52. const { User } = vars;
  53. const sql = await sequelize.queryInterface.changeColumn(User.table, 'level_id', {
  54. type: DataTypes.INTEGER,
  55. references: {
  56. table: 'level',
  57. key: 'id',
  58. },
  59. onUpdate: 'cascade',
  60. onDelete: 'cascade',
  61. });
  62. expectsql(sql, {
  63. ibmi: 'ALTER TABLE "users" ADD CONSTRAINT "level_id" FOREIGN KEY ("level_id") REFERENCES "level" ("id") ON DELETE CASCADE',
  64. mssql:
  65. 'ALTER TABLE [users] ADD FOREIGN KEY ([level_id]) REFERENCES [level] ([id]) ON DELETE CASCADE;',
  66. db2: 'ALTER TABLE "users" ADD CONSTRAINT "level_id_foreign_idx" FOREIGN KEY ("level_id") REFERENCES "level" ("id") ON DELETE CASCADE;',
  67. mariadb:
  68. 'ALTER TABLE `users` ADD FOREIGN KEY (`level_id`) REFERENCES `level` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;',
  69. mysql:
  70. 'ALTER TABLE `users` ADD FOREIGN KEY (`level_id`) REFERENCES `level` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;',
  71. postgres:
  72. 'ALTER TABLE "users" ADD FOREIGN KEY ("level_id") REFERENCES "level" ("id") ON DELETE CASCADE ON UPDATE CASCADE;',
  73. snowflake:
  74. 'ALTER TABLE "users" ADD FOREIGN KEY ("level_id") REFERENCES "level" ("id") ON DELETE CASCADE ON UPDATE CASCADE;',
  75. });
  76. });
  77. });