const User = require('../../../models/user');
const Context = require('../../../graph/context');
const errors = require('../../../errors');
const SettingsService = require('../../../services/settings');

const { expect } = require('chai');

describe('graph.Context', () => {
  beforeEach(() => SettingsService.init());

  describe('#constructor: with a user', () => {
    let c;

    beforeEach(() => {
      c = new Context({ user: new User({ id: '1', role: 'ADMIN' }) });
    });

    it('creates a context with a user', done => {
      expect(c).to.have.property('user');
      expect(c.user).to.have.property('id', '1');

      done();
    });

    it('does have access to mutators', () => {
      return c.mutators.Tag.add({
        item_type: 'USERS',
        id: '1',
        name: 'Tag',
      });
    });
  });

  describe('#constructor: without a user', () => {
    let c;

    beforeEach(() => {
      c = new Context({ user: undefined });
    });

    it('creates a context without a user', done => {
      expect(c.user).to.be.falsy;

      done();
    });

    it('does not have access to mutators', () => {
      return c.mutators.Tag.add({
        item_type: 'COMMENTS',
        id: '1',
        name: 'Tag',
      })
        .then(() => {
          throw new Error('should not reach this point');
        })
        .catch(err => {
          expect(err).to.be.equal(errors.ErrNotAuthorized);
        });
    });
  });
});
