findOrBuild.test.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. 'use strict';
  2. const chai = require('chai');
  3. const expect = chai.expect;
  4. const Support = require('../support');
  5. const { DataTypes } = require('@sequelize/core');
  6. describe('Model#findOrBuild', () => {
  7. context('test-shared models', () => {
  8. beforeEach(async function () {
  9. this.User = this.sequelize.define('User', {
  10. username: DataTypes.STRING,
  11. age: DataTypes.INTEGER,
  12. });
  13. this.Project = this.sequelize.define('Project', {
  14. name: DataTypes.STRING,
  15. });
  16. this.User.hasMany(this.Project);
  17. this.Project.belongsTo(this.User);
  18. await this.sequelize.sync({ force: true });
  19. });
  20. describe('returns an instance if it already exists', () => {
  21. it('with a single find field', async function () {
  22. const user = await this.User.create({ username: 'Username' });
  23. const [_user, initialized] = await this.User.findOrBuild({
  24. where: { username: user.username },
  25. });
  26. expect(_user.id).to.equal(user.id);
  27. expect(_user.username).to.equal('Username');
  28. expect(initialized).to.be.false;
  29. });
  30. it('with multiple find fields', async function () {
  31. const user = await this.User.create({ username: 'Username', age: 27 });
  32. const [_user, initialized] = await this.User.findOrBuild({
  33. where: {
  34. username: user.username,
  35. age: user.age,
  36. },
  37. });
  38. expect(_user.id).to.equal(user.id);
  39. expect(_user.username).to.equal('Username');
  40. expect(_user.age).to.equal(27);
  41. expect(initialized).to.be.false;
  42. });
  43. it('builds a new instance with default value.', async function () {
  44. const [user, initialized] = await this.User.findOrBuild({
  45. where: { username: 'Username' },
  46. defaults: { age: 27 },
  47. });
  48. expect(user.id).to.be.null;
  49. expect(user.username).to.equal('Username');
  50. expect(user.age).to.equal(27);
  51. expect(initialized).to.be.true;
  52. expect(user.isNewRecord).to.be.true;
  53. });
  54. });
  55. it('initialize with includes', async function () {
  56. const [, user2] = await this.User.bulkCreate(
  57. [
  58. { username: 'Mello', age: 10 },
  59. { username: 'Mello', age: 20 },
  60. ],
  61. { returning: true },
  62. );
  63. const project = await this.Project.create({
  64. name: 'Investigate',
  65. });
  66. await user2.setProjects([project]);
  67. const [user, created] = await this.User.findOrBuild({
  68. defaults: {
  69. username: 'Mello',
  70. age: 10,
  71. },
  72. where: {
  73. age: 20,
  74. },
  75. include: [
  76. {
  77. model: this.Project,
  78. },
  79. ],
  80. });
  81. expect(created).to.be.false;
  82. expect(user.get('id')).to.be.ok;
  83. expect(user.get('username')).to.equal('Mello');
  84. expect(user.get('age')).to.equal(20);
  85. expect(user.projects).to.have.length(1);
  86. expect(user.projects[0].get('name')).to.equal('Investigate');
  87. });
  88. });
  89. context('test-specific models', () => {
  90. if (Support.sequelize.dialect.supports.transactions) {
  91. it('supports transactions', async function () {
  92. const sequelize = await Support.createSingleTransactionalTestSequelizeInstance(
  93. this.sequelize,
  94. );
  95. const User = sequelize.define('User', {
  96. username: DataTypes.STRING,
  97. foo: DataTypes.STRING,
  98. });
  99. await User.sync({ force: true });
  100. const t = await sequelize.startUnmanagedTransaction();
  101. await User.create({ username: 'foo' }, { transaction: t });
  102. const [user1] = await User.findOrBuild({
  103. where: { username: 'foo' },
  104. });
  105. const [user2] = await User.findOrBuild({
  106. where: { username: 'foo' },
  107. transaction: t,
  108. });
  109. const [user3] = await User.findOrBuild({
  110. where: { username: 'foo' },
  111. defaults: { foo: 'asd' },
  112. transaction: t,
  113. });
  114. expect(user1.isNewRecord).to.be.true;
  115. expect(user2.isNewRecord).to.be.false;
  116. expect(user3.isNewRecord).to.be.false;
  117. await t.commit();
  118. });
  119. }
  120. });
  121. });