'use strict';

require('./common');

const Schema = require('../lib/schema');
const assert = require('assert');
const queryhelpers = require('../lib/queryHelpers');

describe('queryhelpers', function() {
  describe('applyPaths', function() {
    it('adds select: true paths unless excluded using minus path (gh-11694)', function() {
      const schema = new Schema({
        name: { type: String, select: true },
        age: Number,
        other: String
      });

      let fields = { age: 1 };
      queryhelpers.applyPaths(fields, schema);
      assert.deepStrictEqual(fields, { age: 1, name: 1 });

      fields = { age: 1, name: 1 };
      queryhelpers.applyPaths(fields, schema);
      assert.deepStrictEqual(fields, { age: 1, name: 1 });

      fields = {};
      queryhelpers.applyPaths(fields, schema);
      assert.deepStrictEqual(fields, {});

      fields = { other: 0 };
      queryhelpers.applyPaths(fields, schema);
      assert.deepStrictEqual(fields, { other: 0 });

      fields = { age: 1, '-name': 0 };
      queryhelpers.applyPaths(fields, schema);
      assert.deepStrictEqual(fields, { age: 1 });

      fields = { age: 1, '-name': 1 };
      queryhelpers.applyPaths(fields, schema);
      assert.deepStrictEqual(fields, { age: 1 });
    });

    it('supports nested minus path (gh-11694)', function() {
      const schema = new Schema({
        nested: {
          name: { type: String, select: true },
          age: Number,
          other: String
        }
      });

      const fields = { nested: 1 };
      queryhelpers.applyPaths(fields, schema);
      assert.deepStrictEqual(fields, { nested: 1 });
    });
  });
});