123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- 'use strict';
- const { expect } = require('chai');
- const { EmptyResultError, UniqueConstraintError } = require('@sequelize/core');
- const { beforeAll2, sequelize } = require('../../support');
- const sinon = require('sinon');
- describe('Model#findCreateFind', () => {
- const vars = beforeAll2(() => {
- const TestModel = sequelize.define('TestModel', {});
- return { TestModel };
- });
- beforeEach(function () {
- this.sinon = sinon.createSandbox();
- });
- afterEach(function () {
- this.sinon.restore();
- });
- it('should return the result of the first find call if not empty', async function () {
- const { TestModel } = vars;
- const result = {};
- const where = { prop: Math.random().toString() };
- const findSpy = this.sinon.stub(TestModel, 'findOne').resolves(result);
- await expect(
- TestModel.findCreateFind({
- where,
- }),
- ).to.eventually.eql([result, false]);
- expect(findSpy).to.have.been.calledOnce;
- expect(findSpy.getCall(0).args[0].where).to.equal(where);
- });
- it('should create if first find call is empty', async function () {
- const { TestModel } = vars;
- const result = {};
- const where = { prop: Math.random().toString() };
- const createSpy = this.sinon.stub(TestModel, 'create').resolves(result);
- this.sinon.stub(TestModel, 'findOne').resolves(null);
- await expect(
- TestModel.findCreateFind({
- where,
- }),
- ).to.eventually.eql([result, true]);
- expect(createSpy).to.have.been.calledWith(where);
- });
- for (const Error of [EmptyResultError, UniqueConstraintError]) {
- it(`should do a second find if create failed due to an error of type ${Error.name}`, async function () {
- const { TestModel } = vars;
- const result = {};
- const where = { prop: Math.random().toString() };
- const findSpy = this.sinon.stub(TestModel, 'findOne');
- this.sinon.stub(TestModel, 'create').rejects(new Error());
- findSpy.onFirstCall().resolves(null);
- findSpy.onSecondCall().resolves(result);
- await expect(
- TestModel.findCreateFind({
- where,
- }),
- ).to.eventually.eql([result, false]);
- expect(findSpy).to.have.been.calledTwice;
- expect(findSpy.getCall(1).args[0].where).to.equal(where);
- });
- }
- });
|