rename-table.test.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import { DataTypes } from '@sequelize/core';
  2. import { buildInvalidOptionReceivedError } from '@sequelize/core/_non-semver-use-at-your-own-risk_/utils/check.js';
  3. import { expect } from 'chai';
  4. import { sequelize } from '../support';
  5. const dialect = sequelize.dialect;
  6. const queryInterface = sequelize.queryInterface;
  7. describe('QueryInterface#renameTable', () => {
  8. describe('without schema', () => {
  9. beforeEach(async () => {
  10. await queryInterface.createTable('my_test_table', {
  11. name: DataTypes.STRING,
  12. });
  13. });
  14. it('should rename table', async () => {
  15. await queryInterface.renameTable('my_test_table', 'my_test_table_new');
  16. const result = await queryInterface.listTables();
  17. const tableNames = result.map(v => v.tableName);
  18. expect(tableNames).to.contain('my_test_table_new');
  19. expect(tableNames).to.not.contain('my_test_table');
  20. });
  21. });
  22. if (sequelize.dialect.supports.schemas) {
  23. describe('with schemas', () => {
  24. const schema = 'my_schema';
  25. beforeEach(async () => {
  26. await queryInterface.createSchema(schema);
  27. await queryInterface.createTable(
  28. { tableName: 'my_test_table', schema },
  29. {
  30. name: DataTypes.STRING,
  31. },
  32. );
  33. });
  34. it('should rename table with schema', async () => {
  35. await queryInterface.renameTable(
  36. { tableName: 'my_test_table', schema },
  37. { tableName: 'my_test_table_new', schema },
  38. );
  39. const result = await queryInterface.listTables({ schema: 'my_schema' });
  40. const tableNames = result.map(v => v.tableName);
  41. expect(tableNames).to.contain('my_test_table_new');
  42. expect(tableNames).to.not.contain('my_test_table');
  43. });
  44. it('should throw error when moving table to another schema if changeSchema is not set', async () => {
  45. const promise = queryInterface.renameTable(
  46. { tableName: 'my_test_table', schema },
  47. { tableName: 'my_test_table', schema: dialect.getDefaultSchema() },
  48. );
  49. if (dialect.supports.renameTable.changeSchema) {
  50. await expect(promise).to.be.rejectedWith(
  51. 'To move a table between schemas, you must set `options.changeSchema` to true.',
  52. );
  53. } else {
  54. await expect(promise).to.be.rejectedWith(
  55. `Moving tables between schemas is not supported by ${dialect.name} dialect.`,
  56. );
  57. }
  58. });
  59. it('should move table to another schema', async () => {
  60. const promise = queryInterface.renameTable(
  61. { tableName: 'my_test_table', schema },
  62. { tableName: 'my_test_table', schema: dialect.getDefaultSchema() },
  63. { changeSchema: true },
  64. );
  65. if (dialect.supports.renameTable.changeSchema) {
  66. await promise;
  67. const previousSchemaResult = await queryInterface.listTables({ schema });
  68. const previousSchemaTableNames = previousSchemaResult.map(v => v.tableName);
  69. expect(previousSchemaTableNames).to.not.contain('my_test_table');
  70. const defaultSchemaResult = await queryInterface.listTables({
  71. schema: dialect.getDefaultSchema(),
  72. });
  73. const defaultSchemaTableNames = defaultSchemaResult.map(v => v.tableName);
  74. expect(defaultSchemaTableNames).to.contain('my_test_table');
  75. } else {
  76. await expect(promise).to.be.rejectedWith(
  77. buildInvalidOptionReceivedError('renameTableQuery', dialect.name, ['changeSchema'])
  78. .message,
  79. );
  80. }
  81. });
  82. it('should move table to another schema with new table name', async () => {
  83. const promise = queryInterface.renameTable(
  84. { tableName: 'my_test_table', schema },
  85. { tableName: 'my_test_table_new', schema: dialect.getDefaultSchema() },
  86. { changeSchema: true },
  87. );
  88. if (dialect.supports.renameTable.changeSchema) {
  89. if (dialect.supports.renameTable.changeSchemaAndTable) {
  90. await promise;
  91. const previousSchemaResult = await queryInterface.listTables({ schema });
  92. const previousSchemaTableNames = previousSchemaResult.map(v => v.tableName);
  93. expect(previousSchemaTableNames).to.not.contain('my_test_table');
  94. const defaultSchemaResult = await queryInterface.listTables({
  95. schema: dialect.getDefaultSchema(),
  96. });
  97. const defaultSchemaTableNames = defaultSchemaResult.map(v => v.tableName);
  98. expect(defaultSchemaTableNames).to.contain('my_test_table_new');
  99. } else {
  100. await expect(promise).to.be.rejectedWith(
  101. `Renaming a table and moving it to a different schema is not supported by ${dialect.name}.`,
  102. );
  103. }
  104. } else {
  105. await expect(promise).to.be.rejectedWith(
  106. buildInvalidOptionReceivedError('renameTableQuery', dialect.name, ['changeSchema'])
  107. .message,
  108. );
  109. }
  110. });
  111. });
  112. }
  113. });