rename-table-query.test.ts 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import { buildInvalidOptionReceivedError } from '@sequelize/core/_non-semver-use-at-your-own-risk_/utils/check.js';
  2. import { createSequelizeInstance, expectsql, sequelize } from '../../support';
  3. const dialect = sequelize.dialect;
  4. const changeSchemaNotSetError = new Error(
  5. 'To move a table between schemas, you must set `options.changeSchema` to true.',
  6. );
  7. const moveSchemaNotSupportedError = new Error(
  8. `Moving tables between schemas is not supported by ${dialect.name} dialect.`,
  9. );
  10. const moveSchemaWithRenameNotSupportedError = new Error(
  11. `Renaming a table and moving it to a different schema is not supported by ${dialect.name}.`,
  12. );
  13. describe('QueryGenerator#renameTableQuery', () => {
  14. const queryGenerator = sequelize.queryGenerator;
  15. it('produces a query that renames the table', () => {
  16. expectsql(() => queryGenerator.renameTableQuery('oldTable', 'newTable'), {
  17. default: 'ALTER TABLE [oldTable] RENAME TO [newTable]',
  18. mssql: `EXEC sp_rename '[oldTable]', N'newTable'`,
  19. 'db2 ibmi': 'RENAME TABLE "oldTable" TO "newTable"',
  20. });
  21. });
  22. it('produces a query that renames the table from a model', () => {
  23. const OldModel = sequelize.define('oldModel', {});
  24. const NewModel = sequelize.define('newModel', {});
  25. expectsql(() => queryGenerator.renameTableQuery(OldModel, NewModel), {
  26. default: 'ALTER TABLE [oldModels] RENAME TO [newModels]',
  27. mssql: `EXEC sp_rename '[oldModels]', N'newModels'`,
  28. 'db2 ibmi': 'RENAME TABLE "oldModels" TO "newModels"',
  29. });
  30. });
  31. it('produces a query that renames the table from a model definition', () => {
  32. const OldModel = sequelize.define('oldModel', {});
  33. const oldDefinition = OldModel.modelDefinition;
  34. const NewModel = sequelize.define('newModel', {});
  35. const newDefinition = NewModel.modelDefinition;
  36. expectsql(() => queryGenerator.renameTableQuery(oldDefinition, newDefinition), {
  37. default: 'ALTER TABLE [oldModels] RENAME TO [newModels]',
  38. mssql: `EXEC sp_rename '[oldModels]', N'newModels'`,
  39. 'db2 ibmi': 'RENAME TABLE "oldModels" TO "newModels"',
  40. });
  41. });
  42. it('throws an error if `options.changeSchema` is not set when moving table to another schema', () => {
  43. expectsql(
  44. () =>
  45. queryGenerator.renameTableQuery(
  46. { tableName: 'oldTable', schema: 'oldSchema' },
  47. { tableName: 'newTable', schema: 'newSchema' },
  48. ),
  49. {
  50. default: changeSchemaNotSetError,
  51. 'db2 ibmi': moveSchemaNotSupportedError,
  52. },
  53. );
  54. });
  55. it('produces a query that moves a table to a different schema', () => {
  56. expectsql(
  57. () =>
  58. queryGenerator.renameTableQuery(
  59. { tableName: 'oldTable', schema: 'oldSchema' },
  60. { tableName: 'oldTable', schema: 'newSchema' },
  61. { changeSchema: true },
  62. ),
  63. {
  64. default: 'ALTER TABLE [oldSchema].[oldTable] RENAME TO [newSchema].[oldTable]',
  65. mssql: `ALTER SCHEMA [newSchema] TRANSFER [oldSchema].[oldTable]`,
  66. sqlite3: 'ALTER TABLE `oldSchema.oldTable` RENAME TO `newSchema.oldTable`',
  67. postgres: `ALTER TABLE "oldSchema"."oldTable" SET SCHEMA "newSchema"`,
  68. 'db2 ibmi': buildInvalidOptionReceivedError('renameTableQuery', dialect.name, [
  69. 'changeSchema',
  70. ]),
  71. },
  72. );
  73. });
  74. it('produces a query that moves a table to a different schema with a different name', () => {
  75. expectsql(
  76. () =>
  77. queryGenerator.renameTableQuery(
  78. { tableName: 'oldTable', schema: 'oldSchema' },
  79. { tableName: 'newTable', schema: 'newSchema' },
  80. { changeSchema: true },
  81. ),
  82. {
  83. default: 'ALTER TABLE [oldSchema].[oldTable] RENAME TO [newSchema].[newTable]',
  84. sqlite3: 'ALTER TABLE `oldSchema.oldTable` RENAME TO `newSchema.newTable`',
  85. 'db2 ibmi': buildInvalidOptionReceivedError('renameTableQuery', dialect.name, [
  86. 'changeSchema',
  87. ]),
  88. 'mssql postgres': moveSchemaWithRenameNotSupportedError,
  89. },
  90. );
  91. });
  92. it('produces a query that renames the table with default schema', () => {
  93. expectsql(
  94. () =>
  95. queryGenerator.renameTableQuery(
  96. { tableName: 'oldTable', schema: dialect.getDefaultSchema() },
  97. { tableName: 'newTable', schema: dialect.getDefaultSchema() },
  98. ),
  99. {
  100. default: 'ALTER TABLE [oldTable] RENAME TO [newTable]',
  101. mssql: `EXEC sp_rename '[oldTable]', N'newTable'`,
  102. 'db2 ibmi': 'RENAME TABLE "oldTable" TO "newTable"',
  103. },
  104. );
  105. });
  106. it('produces a query that renames the table from a table and globally set schema', () => {
  107. const sequelizeSchema = createSequelizeInstance({ schema: 'mySchema' });
  108. const queryGeneratorSchema = sequelizeSchema.queryGenerator;
  109. expectsql(() => queryGeneratorSchema.renameTableQuery('oldTable', 'newTable'), {
  110. default: 'ALTER TABLE [mySchema].[oldTable] RENAME TO [mySchema].[newTable]',
  111. mssql: `EXEC sp_rename '[mySchema].[oldTable]', N'newTable'`,
  112. sqlite3: 'ALTER TABLE `mySchema.oldTable` RENAME TO `mySchema.newTable`',
  113. postgres: `ALTER TABLE "mySchema"."oldTable" RENAME TO "newTable"`,
  114. 'db2 ibmi': 'RENAME TABLE "mySchema"."oldTable" TO "newTable"',
  115. });
  116. });
  117. it('produces a query that renames the table with schema and custom delimiter argument', () => {
  118. // This test is only relevant for dialects that do not support schemas
  119. if (dialect.supports.schemas) {
  120. return;
  121. }
  122. expectsql(
  123. () =>
  124. queryGenerator.renameTableQuery(
  125. { tableName: 'oldTable', schema: 'oldSchema', delimiter: 'custom' },
  126. { tableName: 'newTable', schema: 'newSchema', delimiter: 'custom' },
  127. { changeSchema: true },
  128. ),
  129. {
  130. sqlite3: 'ALTER TABLE `oldSchemacustomoldTable` RENAME TO `newSchemacustomnewTable`',
  131. },
  132. );
  133. });
  134. });