create-table.test.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import { DataTypes, JSON_NULL, sql } from '@sequelize/core';
  2. import { expect } from 'chai';
  3. import sinon from 'sinon';
  4. import { createSequelizeInstance, expectsql, sequelize } from '../../support';
  5. const dialect = sequelize.dialect;
  6. describe('QueryInterface#createTable', () => {
  7. afterEach(() => {
  8. sinon.restore();
  9. });
  10. it('supports sql.uuidV4 default values', async () => {
  11. const localSequelize =
  12. dialect.name === 'postgres'
  13. ? createSequelizeInstance({
  14. databaseVersion: '13.0.0',
  15. })
  16. : sequelize;
  17. const stub = sinon.stub(localSequelize, 'queryRaw');
  18. await localSequelize.queryInterface.createTable('table', {
  19. id: {
  20. type: DataTypes.UUID,
  21. primaryKey: true,
  22. defaultValue: sql.uuidV4,
  23. },
  24. });
  25. expect(stub.callCount).to.eq(1);
  26. const firstCall = stub.getCall(0);
  27. expectsql(firstCall.args[0], {
  28. postgres:
  29. 'CREATE TABLE IF NOT EXISTS "table" ("id" UUID DEFAULT gen_random_uuid(), PRIMARY KEY ("id"));',
  30. 'mariadb mysql':
  31. 'CREATE TABLE IF NOT EXISTS `table` (`id` CHAR(36) BINARY, PRIMARY KEY (`id`)) ENGINE=InnoDB;',
  32. mssql: `IF OBJECT_ID(N'[table]', 'U') IS NULL CREATE TABLE [table] ([id] UNIQUEIDENTIFIER DEFAULT NEWID(), PRIMARY KEY ([id]));`,
  33. sqlite3: 'CREATE TABLE IF NOT EXISTS `table` (`id` TEXT PRIMARY KEY);',
  34. snowflake: 'CREATE TABLE IF NOT EXISTS "table" ("id" VARCHAR(36), PRIMARY KEY ("id"));',
  35. db2: 'CREATE TABLE IF NOT EXISTS "table" ("id" CHAR(36) FOR BIT DATA NOT NULL, PRIMARY KEY ("id"));',
  36. ibmi: `BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE VALUE '42710' BEGIN END; CREATE TABLE "table" ("id" CHAR(36), PRIMARY KEY ("id")); END`,
  37. });
  38. });
  39. if (dialect.name === 'postgres') {
  40. // gen_random_uuid was added in postgres 13
  41. it('supports sql.uuidV4 default values (postgres < 13)', async () => {
  42. const localSequelize = createSequelizeInstance({
  43. databaseVersion: '12.0.0',
  44. });
  45. const stub = sinon.stub(localSequelize, 'queryRaw');
  46. await localSequelize.queryInterface.createTable('table', {
  47. id: {
  48. type: DataTypes.UUID,
  49. primaryKey: true,
  50. defaultValue: sql.uuidV4,
  51. },
  52. });
  53. expect(stub.callCount).to.eq(1);
  54. const firstCall = stub.getCall(0);
  55. expectsql(firstCall.args[0], {
  56. postgres:
  57. 'CREATE TABLE IF NOT EXISTS "table" ("id" UUID DEFAULT uuid_generate_v4(), PRIMARY KEY ("id"));',
  58. });
  59. });
  60. }
  61. it('supports sql.uuidV1 default values', async () => {
  62. const stub = sinon.stub(sequelize, 'queryRaw');
  63. await sequelize.queryInterface.createTable('table', {
  64. id: {
  65. type: DataTypes.UUID,
  66. primaryKey: true,
  67. defaultValue: sql.uuidV1,
  68. },
  69. });
  70. expect(stub.callCount).to.eq(1);
  71. const firstCall = stub.getCall(0);
  72. expectsql(firstCall.args[0], {
  73. postgres:
  74. 'CREATE TABLE IF NOT EXISTS "table" ("id" UUID DEFAULT uuid_generate_v1(), PRIMARY KEY ("id"));',
  75. mysql:
  76. 'CREATE TABLE IF NOT EXISTS `table` (`id` CHAR(36) BINARY DEFAULT (UUID()), PRIMARY KEY (`id`)) ENGINE=InnoDB;',
  77. mariadb:
  78. 'CREATE TABLE IF NOT EXISTS `table` (`id` CHAR(36) BINARY DEFAULT UUID(), PRIMARY KEY (`id`)) ENGINE=InnoDB;',
  79. mssql: `IF OBJECT_ID(N'[table]', 'U') IS NULL CREATE TABLE [table] ([id] UNIQUEIDENTIFIER, PRIMARY KEY ([id]));`,
  80. sqlite3: 'CREATE TABLE IF NOT EXISTS `table` (`id` TEXT PRIMARY KEY);',
  81. snowflake: 'CREATE TABLE IF NOT EXISTS "table" ("id" VARCHAR(36), PRIMARY KEY ("id"));',
  82. db2: 'CREATE TABLE IF NOT EXISTS "table" ("id" CHAR(36) FOR BIT DATA NOT NULL, PRIMARY KEY ("id"));',
  83. ibmi: `BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE VALUE '42710' BEGIN END; CREATE TABLE "table" ("id" CHAR(36), PRIMARY KEY ("id")); END`,
  84. });
  85. });
  86. it('supports JSON_NULL default values', async () => {
  87. if (!dialect.supports.dataTypes.JSON) {
  88. return;
  89. }
  90. const stub = sinon.stub(sequelize, 'queryRaw');
  91. await sequelize.queryInterface.createTable('table', {
  92. json: {
  93. type: DataTypes.JSON,
  94. defaultValue: JSON_NULL,
  95. },
  96. });
  97. expect(stub.callCount).to.eq(1);
  98. const firstCall = stub.getCall(0);
  99. expectsql(firstCall.args[0], {
  100. postgres: `CREATE TABLE IF NOT EXISTS "table" ("json" JSON DEFAULT 'null');`,
  101. 'mariadb mysql': 'CREATE TABLE IF NOT EXISTS `table` (`json` JSON) ENGINE=InnoDB;',
  102. mssql: `IF OBJECT_ID(N'[table]', 'U') IS NULL CREATE TABLE [table] ([json] NVARCHAR(MAX) DEFAULT N'null');`,
  103. sqlite3: "CREATE TABLE IF NOT EXISTS `table` (`json` TEXT DEFAULT 'null');",
  104. });
  105. });
  106. });