import config from '../../config/config'
import Auction from '../../server/models/auction.model'
import mongoose from 'mongoose'

describe("Leilao", () => {
  const bidStart = new Date();
  const bidEnd = new Date((new Date()).setHours(bidStart.getHours() + 1));
  const leilao = {
    itemName: 'Item name is required',
    bidStart: bidStart,
    bidEnd: bidEnd,
  };

  beforeAll(async () => {
    await mongoose.connect(config.mongoUri, { useNewUrlParser: true, useCreateIndex: true, useUnifiedTopology: true, useFindAndModify: true },
      (err) => {
        if (err) {
          console.error(err);
          process.exit(1);
        } 
    });
    mongoose.connection.db.dropDatabase();
  });

  it('inserir leilao com sucesso', async () => {
    const leilao_valido = new Auction(leilao);
    const leilao_salvo = await leilao_valido.save();
    expect(leilao_salvo._id).toBeDefined();
    expect(leilao_salvo.itemName).toBe(leilao.itemName);
    expect(leilao_salvo.bidStart).toBe(leilao.bidStart);
    expect(leilao_salvo.bidEnd).toBe(leilao.bidEnd);
  });

  it('inserir leilao com sucesso, mas campo nao definido no schema deve estar undefined', async () => {
    const leilao_com_campo_invalido = new Auction({...leilao, tempo: Date.now()});
    const leilao_salvo_com_campo_invalido = await leilao_com_campo_invalido.save();
    expect(leilao_salvo_com_campo_invalido._id).toBeDefined();
    expect(leilao_salvo_com_campo_invalido.tempo).toBeUndefined();
  });

  it('criar leilao sem campos obrigatorios deve falhar', async () => {
    const leilao_sem_campo_obrigatorio = new Auction({ itemName: 'leilao2' });
    let erro;
    try {
      const leilao_salvo_sem_campo_obrigatorio = await leilao_sem_campo_obrigatorio.save();
      error = leilao_salvo_sem_campo_obrigatorio;
    } catch (error) {
      erro = error
    }
    expect(erro).toBeInstanceOf(mongoose.Error.ValidationError)
    expect(erro.errors.bidEnd).toBeDefined();
  });

  afterAll(() => {
    mongoose.connection.close()
  })
});
