const passport = require('../../../passport');

const app = require('../../../../../app');
const chai = require('chai');
const expect = chai.expect;

// Setup chai.
chai.should();
chai.use(require('chai-http'));

const AssetModel = require('../../../../../models/asset');
const AssetsService = require('../../../../../services/assets');
const SettingsService = require('../../../../../services/settings');

describe('/api/v1/assets', () => {

  beforeEach(() => {
    const settings = {id: '1', moderation: 'PRE', domains: {whitelist: ['test.com']}};

    return SettingsService.init(settings).then(() => {
      return AssetModel.create([
        {
          url: 'https://coralproject.net/news/asset1',
          title: 'Asset 1',
          description: 'term1',
          closedAt: Date.now()
        },
        {
          url: 'https://coralproject.net/news/asset2',
          title: 'Asset 2',
          description: 'term2',
          closedAt: null
        }
      ]);
    });
  });

  describe('#get', () => {

    it('should return all assets without a search query', () => {
      return chai.request(app)
        .get('/api/v1/assets')
        .set(passport.inject({roles: ['ADMIN']}))
        .then((res) => {
          const body = res.body;
          
          expect(body).to.have.property('count', 2);
          expect(body).to.have.property('result');

          const assets = body.result;

          expect(assets).to.have.length(2);
        });
    });

    it('should return assets that we search for', () => {
      return chai.request(app)
        .get('/api/v1/assets?search=term2')
        .set(passport.inject({roles: ['ADMIN']}))
        .then((res) => {
          const body = res.body;

          expect(body).to.have.property('count', 1);
          expect(body).to.have.property('result');

          const assets = body.result;

          expect(assets).to.have.length(1);

          const asset = assets[0];

          expect(asset).to.have.property('url', 'https://coralproject.net/news/asset2');
          expect(asset).to.have.property('title', 'Asset 2');
        });
    });

    it('should not return assets that we do not search for', () => {
      return chai.request(app)
        .get('/api/v1/assets?search=term3')
        .set(passport.inject({roles: ['ADMIN']}))
        .then((res) => {
          const body = res.body;

          expect(body).to.have.property('count', 0);
          expect(body).to.have.property('result');

          expect(body.result).to.be.empty;
        });
    });

    it('should return only closed assets', () => {
      return chai.request(app)
        .get('/api/v1/assets?filter=closed')
        .set(passport.inject({roles: ['ADMIN']}))
        .then((res) => {
          const body = res.body;

          expect(body).to.have.property('count', 1);
          expect(body).to.have.property('result');

          const assets = body.result;

          expect(assets[0]).to.have.property('title', 'Asset 1');
        });
    });

    it('should return only opened assets', () => {
      return chai.request(app)
        .get('/api/v1/assets?filter=open')
        .set(passport.inject({roles: ['ADMIN']}))
        .then((res) => {
          const body = res.body;

          expect(body).to.have.property('count', 1);
          expect(body).to.have.property('result');

          const assets = body.result;

          expect(assets[0]).to.have.property('title', 'Asset 2');
        });
    });

  });

  describe('#put', () => {
    it('should close the asset', function() {

      const today = Date.now();

      return AssetsService.findOrCreateByUrl('http://test.com')
        .then((asset) => {
          expect(asset).to.have.property('isClosed', null);
          expect(asset).to.have.property('closedAt', null);

          return chai.request(app)
            .put(`/api/v1/assets/${asset.id}/status`)
            .set(passport.inject({roles: ['ADMIN']}))
            .send({closedAt: today});
        })
        .then((res) => {

          expect(res).to.have.status(204);

          return AssetsService.findByUrl('http://test.com');
        })
        .then((asset) => {
          expect(asset).to.have.property('isClosed', true);
          expect(asset).to.have.property('closedAt').and.to.not.equal(null);
        });
    });
  });

});
