不要怂,就是干,撸起袖子干!

query.test.js 3.82 KB
'use strict';

const chai = require('chai'),
  expect = chai.expect,
  Support = require('../../support'),
  dialect = Support.getTestDialect(),
  DataTypes = require('../../../../lib/data-types');

if (dialect.match(/^postgres/)) {
  describe('[POSTGRES] Query', () => {

    const taskAlias = 'AnActualVeryLongAliasThatShouldBreakthePostgresLimitOfSixtyFourCharacters';
    const teamAlias = 'Toto';

    const executeTest = (options, test) => {
      const sequelize = Support.createSequelizeInstance(options);

      const User = sequelize.define('User', { name: DataTypes.STRING, updatedAt: DataTypes.DATE }, { underscored: true });
      const Team = sequelize.define('Team', { name: DataTypes.STRING });
      const Task = sequelize.define('Task', { title: DataTypes.STRING });

      User.belongsTo(Task, { as: taskAlias, foreignKey: 'task_id' });
      User.belongsToMany(Team, { as: teamAlias, foreignKey: 'teamId', through: 'UserTeam' });
      Team.belongsToMany(User, { foreignKey: 'userId', through: 'UserTeam' });

      return sequelize.sync({ force: true }).then(() => {
        return Team.create({ name: 'rocket' }).then(team => {
          return Task.create({ title: 'SuperTask' }).then(task => {
            return User.create({ name: 'test', task_id: task.id, updatedAt: new Date() }).then(user => {
              return user[`add${teamAlias}`](team).then(() => {
                return User.findOne({
                  include: [
                    {
                      model: Task,
                      as: taskAlias
                    },
                    {
                      model: Team,
                      as: teamAlias
                    }
                  ]
                }).then(test);
              });
            });
          });
        });
      });

    };

    it('should throw due to alias being truncated', function() {
      const options = Object.assign({}, this.sequelize.options, { minifyAliases: false });

      return executeTest(options, res => {
        expect(res[taskAlias]).to.not.exist;
      });
    });

    it('should be able to retrieve include due to alias minifying', function() {
      const options = Object.assign({}, this.sequelize.options, { minifyAliases: true });

      return executeTest(options, res => {
        expect(res[taskAlias].title).to.be.equal('SuperTask');
      });
    });

    it('should throw due to table name being truncated', () => {
      const sequelize = Support.createSequelizeInstance({ minifyAliases: true });

      const User = sequelize.define('user_model_name_that_is_long_for_demo_but_also_surpasses_the_character_limit',
        {
          name: DataTypes.STRING,
          email: DataTypes.STRING
        },
        {
          tableName: 'user'
        }
      );
      const Project = sequelize.define('project_model_name_that_is_long_for_demo_but_also_surpasses_the_character_limit',
        {
          name: DataTypes.STRING
        },
        {
          tableName: 'project'
        }
      );
      const Company = sequelize.define('company_model_name_that_is_long_for_demo_but_also_surpasses_the_character_limit',
        {
          name: DataTypes.STRING
        },
        {
          tableName: 'company'
        }
      );
      User.hasMany(Project, { foreignKey: 'userId' });
      Project.belongsTo(Company, { foreignKey: 'companyId' });

      return sequelize.sync({ force: true }).then(() => {
        return Company.create({ name: 'Sequelize' }).then(comp => {
          return User.create({ name: 'standard user' }).then(user => {
            return Project.create({ name: 'Manhattan', companyId: comp.id, userId: user.id }).then(() => {
              return User.findAll({
                include: {
                  model: Project,
                  include: Company
                }
              });
            });
          });
        });
      });
    });
  });
}